23.09.2010, 12:16 | #1 |
Участник
|
можно ли в Аксапте сделать такой Query
можно ли в Аксапте сделать такой Query?
Для заданного Поставщика находить Закупки со статусом «открыто», у которых либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто» по условию query минимальный для выборки данных во временную таблицу но нельзя делать вложенные while select { while select { после анализа я кажется попробовал перефразировать условие в результате получилось Для заданного Поставщика находить Закупки со статусом «открыто», у которых не должны попадаться закупки где в строках есть указанная номенклатура и статус строк не открыто или строки заблокированы и при этом как то надо умудриться получить sum(количества) из purchline чтобы там где нет строк было бы 0 |
|
23.09.2010, 12:29 | #2 |
Участник
|
в AX2009 можно попробовать решить, используя Union. В предыдущих версиях, если без while, то можно за два последовательных запроса.
|
|
23.09.2010, 12:32 | #3 |
Участник
|
" либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»"
=> нет строк, клоторая блокированна или закрыта? |
|
23.09.2010, 13:07 | #4 |
Участник
|
" либо нет строк с определённой номенклатурой, либо есть неблокированные строки с этой номенклатурой и все они находятся в статусе «открыто»"
=> нет строк, клоторая блокированна или закрыта? получается можно перефразировать как получить сумма количества в строках закупок для данной номенклатуры для всех открытых закупок для данного поставщика, кроме тех закупок где есть хотя бы одна закрытая или заблокированная строка с данной номенклатурой. по идее будет тот же набор записей только через другой запрос. первый вариант как я понял мжно сделать при помощи union но в 4-ке и тройке такого типа вроде нет. вообщем попробую |
|
23.09.2010, 13:30 | #5 |
Участник
|
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)); } } |
|
|
За это сообщение автора поблагодарили: Evgeniy2020 (2), jeky (2). |
23.09.2010, 14:54 | #6 |
Участник
|
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 |
Участник
|
Цитата:
стандартно не знаю способа, да и нет кажется но есть один "хитрый" путь создать вьюху PurchLineView1 с полями PurchId, PurchStatus, Blocked, RecId1, ItemId и в моем джобе сделать так PHP код:
|
|
23.09.2010, 16:15 | #8 |
Участник
|
Цитата:
Сообщение от 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'); } 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 |
Участник
|
ну сам запрос получился лучше с View и как запрос select отрабатывает правильно, но через Query и QueryRun система не возврщает записи,
значит что то работает не правильно. да, я мог бы долго мучаться с такими ограничениями, но решил поинтересоваться там где я действительно не пользовался View. но увы задачу пока что это не решает, хотя я самостоятельно упростил первоначальное условия выборки. но пока что цель не достигнута, и я пока не знаю как это сделать в одном запросе, хотя теоритически может и возможно. а вот QueryRun не возвращает значений на 4-ке почему то не работает и через вьюшку а сам запрос я проверил получается правильный. так что задачка по прежнему не решена. я лишь пока что убедился, что в один запрос ее как не решить. так как даже в такой выборке запрос не вернет тех закупок где строк с такой номенклатурой нет. так что только двумя запросами знаю как решить, но одним не получается. |
|
23.09.2010, 17:14 | #10 |
Участник
|
Цитата:
ниже "проверенный" код 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 |
Участник
|
Цитата:
X++: qbds = qbdsPurchTable.addDataSource(tableNum(PurchLine), 'PurchLine_1_1'); |
|
24.09.2010, 10:24 | #12 |
Участник
|
Цитата:
Но речь о том, что возвращает 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 |
Участник
|
|
|
25.09.2010, 10:55 | #14 |
Участник
|
Действительно работает. Но вьюха взята не с потолка, именно она очень давно помогла выполнить "замысловатый" запрос. Не могу вспомнить ситуацию, может это было на тройке, или на форме.
|
|
25.09.2010, 14:02 | #15 |
Участник
|
Больно навороченный запрос получается - тормозить может...
|
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|