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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.09.2010, 12:16   #1  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
можно ли в Аксапте сделать такой Query
можно ли в Аксапте сделать такой Query?

Для заданного Поставщика находить Закупки со статусом «открыто», у которых либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»

по условию query минимальный для выборки данных во временную таблицу

но нельзя делать вложенные while select { while select {


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

Для заданного Поставщика находить Закупки со статусом «открыто», у которых
не должны попадаться закупки где в строках есть указанная номенклатура и статус строк не открыто или строки заблокированы

и при этом как то надо умудриться получить sum(количества) из purchline чтобы там где нет строк было бы 0
Старый 23.09.2010, 12:29   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
в AX2009 можно попробовать решить, используя Union. В предыдущих версиях, если без while, то можно за два последовательных запроса.
Старый 23.09.2010, 12:32   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
" либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»"
=>
нет строк, клоторая блокированна или закрыта?
Старый 23.09.2010, 13:07   #4  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
" либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»"
=>
нет строк, клоторая блокированна или закрыта?


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

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

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

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

вообщем попробую
Старый 23.09.2010, 13:30   #5  
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   #6  
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   #7  
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)
                     )
             )       ; 
иногда очень, очень редко пользуюсь, если "ооочень" надо
Старый 23.09.2010, 16:15   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (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).
Старый 23.09.2010, 16:40   #9  
Evgeniy2020 is offline
Evgeniy2020
Участник
 
309 / 68 (3) ++++
Регистрация: 10.04.2007
Адрес: Москва, САО, СЗАО
ну сам запрос получился лучше с View и как запрос select отрабатывает правильно, но через Query и QueryRun система не возврщает записи,
значит что то работает не правильно.

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

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

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

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

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

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

так что только двумя запросами знаю как решить, но одним не получается.
Старый 23.09.2010, 17:14   #10  
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)
                     )
             )       ;
Старый 24.09.2010, 02:57   #11  
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   #12  
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   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от titov Посмотреть сообщение
Но речь о том, что возвращает info(qbdsPurchLineSum.toString());
Это проблема только отображения текста запроса. Выполняться всё равно будет правильный запрос.
Старый 25.09.2010, 10:55   #14  
titov is offline
titov
Участник
 
73 / 87 (3) ++++
Регистрация: 23.12.2005
Адрес: Казань
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Это проблема только отображения текста запроса. Выполняться всё равно будет правильный запрос.
Действительно работает. Но вьюха взята не с потолка, именно она очень давно помогла выполнить "замысловатый" запрос. Не могу вспомнить ситуацию, может это было на тройке, или на форме.
Старый 25.09.2010, 14:02   #15  
Волчара is offline
Волчара
Участник
 
210 / 29 (1) +++
Регистрация: 08.02.2003
Адрес: Москва
Больно навороченный запрос получается - тормозить может...
__________________
Благодарю за поддержку ИЦ Кариатиду и Koder Logic
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Слетают 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, время: 17:23.