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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.09.2010, 13:07   #1  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
" либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»"
=>
нет строк, клоторая блокированна или закрыта?


получается можно перефразировать как

получить
сумма количества в строках закупок для данной номенклатуры
для
всех открытых закупок для данного поставщика,
кроме тех закупок где есть хотя бы одна закрытая или заблокированная
строка с данной номенклатурой.

по идее будет тот же набор записей только через другой запрос.

первый вариант как я понял мжно сделать при помощи union
но в 4-ке и тройке такого типа вроде нет.

вообщем попробую
Старый 23.09.2010, 13:30   #2  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
X++:
static void PurchLineQuery(Args _args)
{
    QueryBuildDataSource        qbdsPurchLineSum,qbdsPurchTable,qbds;
    QueryBuildRange             qbr;
    Query                       q = new Query();
    QueryRun                    qr;
    PurchLine                   PurchLine;
    #define.itemIdParm('123')
    ;
    qbdsPurchLineSum    = q.addDataSource(tableNum(PurchLine));
    qbdsPurchLineSum.addSelectionField(fieldNum(PurchLine,PurchQty),SelectionField::Sum);//внимание на единицы измерения! может даже лучше идти по inventTrans
    qbr                 = sysQuery::findOrCreateRange(qbdsPurchLineSum,fieldNum(PurchLine,PurchStatus));
    qbr.value(queryValue(PurchStatus::Backorder));
    qbr                 = sysQuery::findOrCreateRange(qbdsPurchLineSum,fieldNum(PurchLine,ItemId));
    qbr.value(queryValue(#itemIdParm));

    qbdsPurchTable      = qbdsPurchLineSum.addDataSource(tableNum(PurchTable));
    qbdsPurchTable.joinMode(joinMode::ExistsJoin);
    qbdsPurchTable.fetchMode(QueryFetchMode::One2One);
    qbdsPurchTable.relations(true);
    qbr                 = sysQuery::findOrCreateRange(qbdsPurchTable,fieldNum(PurchTable,PurchStatus));
    qbr.value(queryValue(PurchStatus::Backorder));
    qbds                = qbdsPurchTable.addDataSource(tableNum(PurchLine));
    qbds.joinMode(joinMode::NoExistsJoin);
    qbds.fetchMode(QueryFetchMode::One2One);
    qbds.relations(true);
    qbr                 = sysQuery::findOrCreateRange(qbds,fieldNum(PurchLine,ItemId));
    qbr.value(queryValue(#itemIdParm));
    qbr                 = sysQuery::findOrCreateRange(qbds,fieldNum(PurchLine,RecId));
    qbr.value(strFmt('((%1.%2 != "%3") || (%4.%5 == "%5"))',
                        qbds.name(),
                        fieldId2name(tableNum(PurchLine),fieldNum(PurchLine,PurchStatus)),
                        queryValue(PurchStatus::Backorder),
                        qbds.name(),
                        fieldId2name(tableNum(PurchLine),fieldNum(PurchLine,Blocked)),
                        queryValue(NoYes::Yes)
                     )
             )       ;
    info(qbdsPurchLineSum.toString());
    qr              = new QueryRun(q);
    while (qr.next())
    {
        PurchLine       = qr.get(PurchLine.TableId);
        info(strFmt("%1 %2",PurchLine.PurchId,PurchLine.PurchQty));
    }
}
примерно так (4.0 в т.ч.)
За это сообщение автора поблагодарили: Evgeniy2020 (2), jeky (2).
Старый 23.09.2010, 14:54   #3  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
2 Titiov:

спасибо подход правильный, только немного не правильный получается запрос и естественно ничего не возвращает, хотя запись есть.
это из за того что получается вот такой запрос

PurchLine PurchLine;
PurchLine PurchLine_1_1;
PurchTable PurchTable;
;
while SELECT SUM(PurchQty) FROM PurchLine
WHERE ((PurchLine.PurchStatus == 1))
&& ((PurchLine.ItemId == 'ФТ-018'))
EXISTS JOIN * FROM PurchTable
WHERE PurchLine.PurchId == PurchTable.PurchId && ((PurchTable.PurchStatus == 1))
NOTEXISTS JOIN * FROM PurchLine
WHERE PurchTable.PurchId ==
PurchLine.PurchId && ((PurchLine.ItemId == 'ФТ-018'))
&& ((((PurchLine_1_1.PurchStatus != 1)
|| (PurchLine_1_1.Blocked == 1))))
{
info('1');
}


если ручками потредактировать то вот такой запрос возвращает данные


PurchLine PurchLine;
PurchLine PurchLine_1_1;
PurchTable PurchTable;
;
while SELECT SUM(PurchQty) FROM PurchLine
WHERE ((PurchLine.PurchStatus == 1))
&& ((PurchLine.ItemId == 'ФТ-018'))
EXISTS JOIN * FROM PurchTable
WHERE PurchLine.PurchId == PurchTable.PurchId && ((PurchTable.PurchStatus == 1))
NOTEXISTS JOIN * FROM PurchLine_1_1
WHERE PurchTable.PurchId ==
PurchLine_1_1.PurchId && ((PurchLine_1_1.ItemId == 'ФТ-018'))
&& ((((PurchLine_1_1.PurchStatus != 1)
|| (PurchLine_1_1.Blocked == 1))))
{
info('1');
}


а как эти изменения внести в код Query который указан выше (предыдущий пост) ?
Старый 23.09.2010, 15:42   #4  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Evgeniy2020 Посмотреть сообщение
а как эти изменения внести в код Query который указан выше (предыдущий пост) ?
никак - упустил такой момент - две одинаковые таблицы
стандартно не знаю способа, да и нет кажется
но есть один "хитрый" путь
создать вьюху PurchLineView1 с полями PurchId, PurchStatus, Blocked, RecId1, ItemId и в моем джобе сделать так
PHP код:
    qbds                qbdsPurchTable.addDataSource(tableNum(PurchLineView1));
    
qbds.joinMode(joinMode::NoExistsJoin);
    
qbds.fetchMode(QueryFetchMode::One2One);
    
qbds.relations(true);
    
qbr                 sysQuery::findOrCreateRange(qbds,fieldNum(PurchLineView1,ItemId));
    
qbr.value(queryValue(#itemIdParm));
    
qbr                 sysQuery::findOrCreateRange(qbds,fieldNum(PurchLineView1,RecId));
    
qbr.value(strFmt('((%1.%2 != "%3") || (%4.%5 == "%5"))',
                        
qbds.name(),
                        
fieldId2name(tableNum(PurchLineView1),fieldNum(PurchLineView1,PurchStatus)),
                        
queryValue(PurchStatus::Backorder),
                        
qbds.name(),
                        
fieldId2name(tableNum(PurchLineView1),fieldNum(PurchLineView1,Blocked)),
                        
queryValue(NoYes::Yes)
                     )
             )       ; 
иногда очень, очень редко пользуюсь, если "ооочень" надо
Старый 24.09.2010, 02:57   #5  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от titov Посмотреть сообщение
никак - упустил такой момент - две одинаковые таблицы
стандартно не знаю способа, да и нет кажется
почему же, есть способ - вторым параметром указываете имя таблицы:

X++:
qbds = qbdsPurchTable.addDataSource(tableNum(PurchLine), 'PurchLine_1_1');
потом берете в условии qbds.name()
Старый 24.09.2010, 10:24   #6  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от vanokh Посмотреть сообщение
почему же, есть способ - вторым параметром указываете имя таблицы:

X++:
qbds = qbdsPurchTable.addDataSource(tableNum(PurchLine), 'PurchLine_1_1');
потом берете в условии qbds.name()
qbds.name() действительно вернет то, что нужно.
Но речь о том, что возвращает info(qbdsPurchLineSum.toString());
а именно:
SELECT SUM(PurchQty) FROM PurchLine WHERE ((PurchStatus = 1)) AND ((ItemId = N'123')) EXISTS JOIN * FROM PurchTable WHERE PurchLine.PurchId = PurchTable.PurchId AND ((PurchStatus = 1)) NOTEXISTS JOIN * FROM PurchLine WHERE PurchTable.PurchId = PurchLine.PurchId AND ((ItemId = N'123')) AND ((((PurchLine_1_1.PurchStatus != 1) || (PurchLine_1_1.Blocked == 1))))
даже если применить qbds = qbdsPurchTable.addDataSource(tableNum(PurchLine), 'PurchLine_1_1');
4.0 и ах2009
Старый 24.09.2010, 14:51   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от titov Посмотреть сообщение
Но речь о том, что возвращает info(qbdsPurchLineSum.toString());
Это проблема только отображения текста запроса. Выполняться всё равно будет правильный запрос.
Старый 23.09.2010, 16:40   #8  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
ну сам запрос получился лучше с View и как запрос select отрабатывает правильно, но через Query и QueryRun система не возврщает записи,
значит что то работает не правильно.

да, я мог бы долго мучаться с такими ограничениями, но решил поинтересоваться там где я действительно не пользовался View.

но увы задачу пока что это не решает, хотя я самостоятельно упростил
первоначальное условия выборки.

но пока что цель не достигнута, и я пока не знаю как это сделать в одном запросе, хотя теоритически может и возможно.

а вот QueryRun не возвращает значений на 4-ке почему то не работает и через вьюшку а сам запрос я проверил получается правильный.

так что задачка по прежнему не решена. я лишь пока что убедился,
что в один запрос ее как не решить.

так как даже в такой выборке запрос не вернет тех закупок где строк с такой номенклатурой нет.

так что только двумя запросами знаю как решить, но одним не получается.
Старый 23.09.2010, 17:14   #9  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от Evgeniy2020 Посмотреть сообщение
ну сам запрос получился лучше с View и как запрос select отрабатывает правильно, но через Query и QueryRun система не возврщает записи,
значит что то работает не правильно.
до этого писал только "рыбу" без проверки, важно было направление
ниже "проверенный" код

X++:
    qbr.value(strFmt('((%1.%2 != %3) || (%4.%5 == %6))',
                        qbds.name(),
                        fieldId2name(tableNum(PurchLineView1),fieldNum(PurchLineView1,PurchStatus)),
                        enum2int(PurchStatus::Backorder),
                        qbds.name(),
                        fieldId2name(tableNum(PurchLineView1),fieldNum(PurchLineView1,Blocked)),
                        enum2int(NoYes::Yes)
                     )
             )       ;
Старый 23.09.2010, 16:15   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Evgeniy2020 Посмотреть сообщение
PurchLine PurchLine;
PurchLine PurchLine_1_1;
PurchTable PurchTable;
;
while SELECT SUM(PurchQty) FROM PurchLine
WHERE ((PurchLine.PurchStatus == 1))
&& ((PurchLine.ItemId == 'ФТ-018'))
EXISTS JOIN * FROM PurchTable
WHERE PurchLine.PurchId == PurchTable.PurchId && ((PurchTable.PurchStatus == 1))
NOTEXISTS JOIN * FROM PurchLine_1_1
WHERE PurchTable.PurchId ==
PurchLine_1_1.PurchId && ((PurchLine_1_1.ItemId == 'ФТ-018'))
&& ((((PurchLine_1_1.PurchStatus != 1)
|| (PurchLine_1_1.Blocked == 1))))
{
info('1');
}
PurchTable в этом запросе абсолютно лишний. Запрос эквивалентен следующему
X++:
PurchLine PurchLine;
PurchLine PurchLine_1_1;
;
while select sum(PurchQty) from PurchLine
where 
    PurchLine.PurchStatus == 1 && PurchLine.ItemId == 'ФТ-018'
notexists join PurchLine_1_1
where 
    PurchLine_1_1.PurchId == PurchLine.PurchId && 
    PurchLine_1_1.ItemId == PurchLine.ItemId && 
   (PurchLine_1_1.PurchStatus != 1 || PurchLine_1_1.Blocked == 1)
{
    info('1');
}
За это сообщение автора поблагодарили: titov (2).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Слетают SecurityKey. Что можно сделать? chanchala DAX: Программирование 9 16.02.2009 17:14
Где можно почитать про RFID в Аксапте Hans DAX: Функционал 7 19.12.2008 10:43
Можно ли в аксапте реализовать такой SQL запрос: Sergey_1972 DAX: Программирование 14 18.03.2004 16:33
Сводное планирование в Аксапте PSA DAX: Функционал 2 02.02.2004 15:24
можно ли сделать с помощью join следующий запрос: SergAY DAX: Программирование 1 29.07.2003 11:39

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

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

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