AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.02.2006, 17:51   #1  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Сравнение полей в запросе
Добрый вечер!

Хотел бы сравнивть в запросе два поля по абсолютной величине (inventJournalTrans.Qty[оно в рамках задачи всегда меньше нуля] и inventJournalTrans.QtyRegistered)

Написал:

PHP код:
   while select inventJournalTrans
        where   inventJournalTrans
.JournalId == _inventJournalTable.JournalId &&
                - 
inventJournalTrans.Qty       <   inventJournalTrans.QtyRegistered 
Ругается: Описание ошибки SQL: [Microsoft][ODBC SQL Server Driver]Недопустимое символьное значение для указания отклонения


Написал:

PHP код:
    qbds query.addDataSource(tableNum(InventJournalTrans));
    
qbrJournalId qbds.addRange(fieldNum(InventJournalTrans,JournalId));
    
qbrJournalId.value(_inventJournalTable.JournalId);

    
qbrQty qbds.addRange(fieldNum(InventJournalTrans,JournalId));
    
qbrQty.value("(  inventJournalTrans.Qty > - inventJournalTrans.QtyRegistered)");

    
queryRun = new queryRun(query);

    while (
queryRun.next())
    {
        
inventJournalTrans queryRun.get(tableNum(InventJournalTrans));
        
info(inventJournalTrans.ItemId);
    } 
Ругается Ошибка расширенного диапазона запроса: inventJournalTrans.Qty не является корректной парой datasource.field рядом с 29.

Ну, второе еще понятно - заведомо. Но решения не нашел..
Старый 08.02.2006, 18:01   #2  
mit is offline
mit
Участник
Аватар для mit
 
386 / 36 (2) +++
Регистрация: 15.01.2003
Адрес: Moscow
а так?
PHP код:
 while select inventJournalTrans 
        where   inventJournalTrans
.JournalId == _inventJournalTable.JournalId  
         
{
                if(
abs(inventJournalTrans.Qty)       <   abs(inventJournalTrans.QtyRegistered ))
                {...}
         } 
Старый 08.02.2006, 18:13   #3  
Ivan Mischenko is offline
Ivan Mischenko
NavAx
Аватар для Ivan Mischenko
NavAx Club
 
87 / 19 (1) ++
Регистрация: 30.10.2002
Адрес: Проживания?
Попробуйте скобочек добавить... так вроде.
__________________
Особые лекарства... меня не прут!..
Старый 08.02.2006, 18:29   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Thumbs up
Во-первых,
X++:
qbds = query.addDataSource(tableNum(InventJournalTrans),"InventJournalTrans");
Во-вторых, JournalId надо тоже добавлять в расширенный диапазон, иначе соединение получается ч/з OR, а не AND

В-третьих, слегка извращенно это получится так
X++:
qbrQty.value("((inventJournalTrans.JournalId == \"" + _inventJournalTable.JournalId + "\") &&  
(inventJournalTrans.Qty - inventJournalTrans.Qty < inventJournalTrans.Qty + inventJournalTrans.QtyRegistered))");
PS. Select можно построить по этому-же принципу
X++:
 while select inventJournalTrans
        where   inventJournalTrans.JournalId == _inventJournalTable.JournalId &&
                inventJournalTrans.Qty - inventJournalTrans.Qty       <   
                inventJournalTrans.Qty + inventJournalTrans.QtyRegistered
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 08.02.2006 в 18:35.
За это сообщение автора поблагодарили: DreamCreator (2).
Старый 08.02.2006, 18:31   #5  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Это что-то у вас с полем QtyRegistered не то. Если написать глупый запрос
Код:
while select inventJournalTrans 
        where   inventJournalTrans.JournalId == _inventJournalTable.JournalId && 
                - inventJournalTrans.Qty       <   inventJournalTrans.SalesAmount
- не ругается.

Во втором случае в скобках не нужно указывать "inventJournalTrans":
PHP код:
    qbrQty.value("(Qty > -QtyRegistered)"); 
__________________
Андрей.
Старый 09.02.2006, 09:41   #6  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Спасибо за советы -- сейчас пробую!

Цитата:
Сообщение от mit
а так?
Так вчера и сделал, но хочется оптимальнее выборку!

2 Ivan Mischenko, AndyD

Сейчас пробую. Спасибо!

2 Dron AKA andy

У меня и на этот запрос ругается аналогично!
Старый 09.02.2006, 10:20   #7  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Цитата:
Сообщение от AndyD
Во-вторых, JournalId надо тоже добавлять в расширенный диапазон, иначе соединение получается ч/з OR, а не AND
..
PS. Select можно построить по этому-же принципу
X++:
 while select inventJournalTrans
        where   inventJournalTrans.JournalId == _inventJournalTable.JournalId &&
                inventJournalTrans.Qty - inventJournalTrans.Qty       <   
                inventJournalTrans.Qty + inventJournalTrans.QtyRegistered
С циклом получилось! Написал так:

PHP код:
 while select inventJournalTrans
        where   inventJournalTrans
.JournalId == _inventJournalTable.JournalId &&
                
inventJournalTrans.Qty inventJournalTrans.QtyRegistered 
Через query не получилось -- Ошибка расширенного диапазона запроса: Синтаксическая ошибка рядом с 52.

PHP код:
static void testMatchingFieldsByQuery(Args _args)
{
    
Query                   query = new Query();
    
QueryBuildDataSource    qbds;
    
QueryBuildRange         qbrQty;
    
QueryRun                queryRun;
    
InventJournalTrans      inventJournalTrans;
    
InventJournalTable      inventJournalTable InventJournalTable::find('075221_090');
    ;

    
qbds query.addDataSource(tableNum(InventJournalTrans),"InventJournalTrans");
    
qbds.addRange(fieldNum(InventJournalTrans,JournalId)).value(inventJournalTable.JournalId);
    
qbds.addRange(fieldNum(InventJournalTrans,IncompleteDelivery)).value(queryValue(NoYes::No));
    
qbrQty qbds.addRange(fieldNum(InventJournalTrans,JournalId));
    
qbrQty.value("((inventJournalTrans.JournalId == \"" inventJournalTable.JournalId + @"\) &&
        (inventJournalTrans.Qty - inventJournalTrans.Qty < inventJournalTrans.Qty + inventJournalTrans.QtyRegistered))"
);

    
queryRun = new queryRun(query);

    while (
queryRun.next())
    {
        
inventJournalTrans queryRun.get(tableNum(InventJournalTrans));
        
info(inventJournalTrans.ItemId);
    }

Немного переписал -- но без этого не компилировалось, думаю идею сохранил.
Старый 09.02.2006, 10:47   #8  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Уже когда-то писал
PHP код:
 while select inventJournalTrans 
        where   inventJournalTrans
.JournalId == _inventJournalTable.JournalId && 
                -
inventJournalTrans.Qty       <   inventJournalTrans.QtyRegistered 
Кстати, на Оракле и без этого работает
Старый 09.02.2006, 10:55   #9  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Работает!
Старый 09.02.2006, 10:57   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Аналогично
PHP код:
static void testMatchingFieldsByQuery(Args _args

    
Query                   query = new Query(); 
    
QueryBuildDataSource    qbds
    
QueryBuildRange         qbrQty
    
QueryRun                queryRun
    
InventJournalTrans      inventJournalTrans
    
InventJournalTable      inventJournalTable InventJournalTable::find('075221_090'); 
    ; 

    
qbds query.addDataSource(tableNum(InventJournalTrans),"InventJournalTrans"); 
    
qbds.addRange(fieldNum(InventJournalTrans,JournalId)).value(inventJournalTable.JournalId); 
    
qbds.addRange(fieldNum(InventJournalTrans,IncompleteDelivery)).value(queryValue(NoYes::No)); 
    
qbrQty qbds.addRange(fieldNum(InventJournalTransQty)); 
    
qbrQty.value("(-1*inventJournalTrans.Qty < inventJournalTrans.QtyRegistered)"); 

    
queryRun = new queryRun(query); 

    while (
queryRun.next()) 
    { 
        
inventJournalTrans queryRun.get(tableNum(InventJournalTrans)); 
        
info(inventJournalTrans.ItemId); 
    } 

Старый 09.02.2006, 11:01   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Это не надо. Уже включено в расширенный диапазон
qbds.addRange(fieldNum(InventJournalTrans,JournalId)).value(inventJournalTable.JournalId);

Прошу прощения, перенос я вставил только для того, чтобы строка нормально читалась в браузере. На самом деле надо так
X++:
qbrQty.value("((inventJournalTrans.JournalId == " +
    "\"" + _inventJournalTable.JournalId + "\") && " + 
    "(inventJournalTrans.Qty - inventJournalTrans.Qty < " +
    "inventJournalTrans.Qty + inventJournalTrans.QtyRegistered))");
либо убрать перенос.

Если IncompleteDelivery тоже должно быть ч/з AND, то его необходимо внести в расширенный Range
__________________
Axapta v.3.0 sp5 kr2
Старый 09.02.2006, 11:07   #12  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
AndyD Не надо ничего добавлять в расширенный range. Надо просто его сделать по правильному полю и тогда все условия будут через AND
За это сообщение автора поблагодарили: axaLearner (2), DreamCreator (2), AndyD (2).
Старый 09.02.2006, 11:17   #13  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Оба варианта с query корректно сработали!

Wamr и AndyD спасибо и респект!
Теги
query, запрос (query)

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Изменение идентификаторов(id) полей Dron AKA andy DAX: База знаний и проекты 30 17.06.2009 10:11
выбор полей в запросе (не все поля видны) mdconsult DAX: Программирование 12 02.02.2009 09:21
Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map? LRA DAX: База знаний и проекты 15 02.04.2007 13:37
Сравнение двух полей в Query Lucky13 DAX: Программирование 3 17.08.2005 11:42
очистка полей. простой вопрос Антон Солдатов DAX: Программирование 4 04.04.2003 10:28
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:10.