07.12.2007, 14:10 | #1 |
Участник
|
if (record) в случае join с использованием group by
Выполните у себя такое вот задание - только убедитесь что номенклатура, которая указана в макросе выше, есть в остатках на каком-то складе.
X++: static void testIfCursorBuffer(Args _args) { InventSum inventSum; InventDim inventDim; #define.ItemId("ESB-009") ; select inventDim group by InventLocationId join sum(AvailPhysical) from inventSum group by ItemId where inventSum.ItemId == #ItemId && inventDim.inventDimId == inventSum.InventDimId; print inventSum.AvailPhysical; print inventDim.InventLocationId; if (inventSum) print "InventSum"; if (inventDim) print "InventDim"; pause; select sum(AvailPhysical) from inventSum group by ItemId where inventSum.ItemId == #ItemId join inventDim group by InventLocationId where inventDim.inventDimId == inventSum.InventDimId; print inventSum.AvailPhysical; print inventDim.InventLocationId; if (inventSum) print "InventSum"; if (inventDim) print "InventDim"; pause; } 1) before first pause: 4500 MW InventDim 2) before second pause: 4500 MW InventSum Кто что думает про такое поведение? В смысле про то, что вторая запись из join является не-проинициализированной с точки зрения АХ? |
|
07.12.2007, 14:24 | #2 |
Участник
|
Судя по всему, вторая таблица в запросе не ассоциируется с курсором для такого запроса и проверяется по recId.
Как выход - добавлять агрегирующую функцию для recId
__________________
Axapta v.3.0 sp5 kr2 |
|
07.12.2007, 14:29 | #3 |
Участник
|
Цитата:
значения в полях, не указаных в group by и в агрегирующих функциях, не определены. Т.е. в указанных запросах recid может иметь любое значение, в том числе и нулевое. |
|
07.12.2007, 14:30 | #4 |
Участник
|
Я работаю с запросом с формы, то есть с содержимым грида, если быть более точным.
И запрос менять не могу. Получается, когда я беру inventDim_ds.cursor() а потом проверяю if (inventDim) - получаю, что нету InventDim Меня интересует в этом контексте - должно ли так быть? Или АХ должна учитывать эту ситуацию? |
|
07.12.2007, 14:32 | #5 |
Участник
|
Цитата:
но проверка if (record) работает по-другому, не через RecId |
|
07.12.2007, 14:43 | #6 |
Участник
|
Любопытно почему все таки Аксапта не проверила непустоту значений во втором датасорсе. Мне всегда казалось, что если в запросе с группировками есть хоть одно поле непустое, то проверка
X++: if (common) |
|
07.12.2007, 14:47 | #7 |
Участник
|
2 kashperuk
Ну, так как запрос соединяется по inner join, то достаточно проверить InventSum.
__________________
Axapta v.3.0 sp5 kr2 |
|
07.12.2007, 14:54 | #8 |
Участник
|
Цитата:
Где-то здесь писали про ошибку в каких-то сервис-паках о том, что отрицательное четное целое неправильно преобразуется в true/false. |
|
07.12.2007, 15:04 | #9 |
Участник
|
X++: static void Job306(Args _args) { inventSum inventSum; ; select inventSum group by InventDimId ; if (inventSum) info('inventSum'); if (inventSum.data()) info('inventSum.data()'); select inventSum group by InventDimId , recid ; if (inventSum) info('inventSum recID'); if (inventSum.data()) info('inventSum.data() recID'); } if (common) проверяет есть ли связанный с буфером курсор или отличное от нуля значение recId - тогда возвращает true иначе false Последний раз редактировалось Logger; 07.12.2007 в 16:31. |
|
07.12.2007, 15:11 | #10 |
Участник
|
Цитата:
Цитата:
Может быть - но тут, имхо, проблема не в этом. А в том, что АХ использует другую проверку для основной таблицы и для подчиненных в соединении по иннержоин |
|
|
|