26.04.2013, 06:34 | #1 |
Участник
|
Очередная попытка связать InventTrans, InventDim, InventBatch
В очередной раз наткнулся на проблему невозможности создать один запрос на все эти таблицы. Ну и решил спросить, может ктото чтото всеатки знает)
X++: select inventTrans outer join InventBatch where InventBatch.itemId == inventTrans.itemId join InventDim where inventDim.InventBatchId == invendBatch.inventBatchId && inventDim.InventLocationId == "склад1" Проблема в том что есть номенклатуры с партионным учетом, а есть без него. В данном виде запрос выбирает только те операции где есть партия. Можно ли все таки как либо выбрать все нужные операции? В SQL я бы просто поставил дополнительное условие: X++: (inventDim.InventBatchId == invendBatch.inventBatchId || invendBatch.inventBatchId is null) Последний раз редактировалось Perc; 26.04.2013 в 06:37. |
|
26.04.2013, 07:05 | #2 |
Участник
|
Цитата:
у вас логическая ошибка. нужно выбирать данные по партии, если партия ВКЛЮЧЕНА в группах аналитики. партионный учет по номенклатуре могут выключить и после того, как ввели данные с партиями. 2. outer join должен быть последним. или вырубайте forcenested. в общем, читайте по форуму - обсуждалась проблема с outer join. 3. вообще говоря, номер партии находится в inventDim. делать выборку из invetnBatch нужно только тогда, когда вам нужны дополнительные параметры именно партии - срок годности или что вы туда добавили. в связи с этим соображением, желание "сделать один запрос на три таблицы" выглядит странным. А нужно ли вам одним запросом то? Разбейте на два: * InventTrans+InventDim нужны всегда (номер партии можно найти в inventDim) * InventBatch (и другие аналитики) нужны только когда понадобятся расширенные параметры из аналитик. тогда и выбирайте отдельным запросом. |
|
26.04.2013, 07:34 | #3 |
Участник
|
Цитата:
1.
у вас логическая ошибка. нужно выбирать данные по партии, если партия ВКЛЮЧЕНА в группах аналитики. партионный учет по номенклатуре могут выключить и после того, как ввели данные с партиями. Такая же история может быть и серийными номерами и еще с чем то... Данные таблицы я привел в качестве удобного примера ситуации для запроса. Цитата:
2.
outer join должен быть последним. или вырубайте forcenested. в общем, читайте по форуму - обсуждалась проблема с outer join. Ну и кстате насчет того что outer join должен быть последним - совершенно не верно по моему. Даже если и ткнем в конце outer, при переводе в SQL outer все равно однообразно переводиться в left outer join с условием вперед. Но я еще почитаю форум) Цитата:
3.
вообще говоря, номер партии находится в inventDim. делать выборку из invetnBatch нужно только тогда, когда вам нужны дополнительные параметры именно партии - срок годности или что вы туда добавили. в связи с этим соображением, желание "сделать один запрос на три таблицы" выглядит странным. А нужно ли вам одним запросом то? Разбейте на два: * InventTrans+InventDim нужны всегда (в inventDim можно найти номер партии) * InventBatch (и другие аналитики) нужны только когда понадобятся расширенные параметры из аналитик. тогда и выбирайте отдельным запросом. |
|
26.04.2013, 07:44 | #4 |
Участник
|
Цитата:
Предложение видимо сделать именно 2 запроса. По тем операциям где нет партии, потом по тем где есть партии. Это вариант конечно согласен. Ноо.. )) не ответ на тему вопроса) |
|
26.04.2013, 07:46 | #5 |
Участник
|
|
|
26.04.2013, 07:51 | #6 |
Участник
|
|
|
26.04.2013, 07:52 | #7 |
Участник
|
Цитата:
* проблема не в том, как отправляется запрос * проблема в том, как аксапта интерпретирует ответ. аксапта не работает с null. поэтому ей нужно помогать |
|
26.04.2013, 07:55 | #8 |
Участник
|
Цитата:
Вам какой запрос нужен? В вашем примере вы джойните InventDim по условию "inventDim.InventBatchId == invendBatch.inventBatchId", т.е. только к тем проводкам у которых есть номер партии. Это не ошибка, это специально так? Вот так вас не устроит? X++: select inventTrans join InventDim where inventDim.InventDimId == inventTrans.InventDimId && inventDim.InventLocationId == "склад1" outer join InventBatch where InventBatch.InventBatchId == inventDim.InventBatchId && InventBatch.itemId == inventTrans.itemId; |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
26.04.2013, 07:58 | #9 |
Участник
|
Цитата:
Но я понял что вы имеете ввиду, посмотрю еще варианты. |
|
26.04.2013, 08:12 | #10 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Не понял вас.
Вам какой запрос нужен? В вашем примере вы джойните InventDim по условию "inventDim.InventBatchId == invendBatch.inventBatchId", т.е. только к тем проводкам у которых есть номер партии. Это не ошибка, это специально так? Вот так вас не устроит? X++: select inventTrans join InventDim where inventDim.InventDimId == inventTrans.InventDimId && inventDim.InventLocationId == "склад1" outer join InventBatch where InventBatch.InventBatchId == inventDim.InventBatchId && InventBatch.itemId == inventTrans.itemId; Не удалось привязать составной идентификатор "A.ITEMID". Вот конец самого SQL: FROM {oj INVENTDIM B LEFT OUTER JOIN INVENTBATCH C ON ((C.DATAAREAID=?) AND ((B.INVENTBATCHID=C.INVENTBATCHID) AND (A.ITEMID=C.ITEMID)))},INVENTTRANS A WHERE ((A.DATAAREAID=?) AND (A.ITEMID=?)) AND ((B.DATAAREAID=?) AND ((B.INVENTDIMID=A.INVENTDIMID) AND (B.INVENTLOCATIONID=?))) |
|
26.04.2013, 08:20 | #11 |
Участник
|
|
|
26.04.2013, 08:55 | #12 |
Участник
|
X++: FROM {oj |
|
26.04.2013, 09:31 | #13 |
Участник
|
Нет, {} - это как раз MS SQL Server
|
|
|
За это сообщение автора поблагодарили: belugin (3). |
26.04.2013, 09:50 | #14 |
Участник
|
Да, подзабыл, в 2012 это выглядит вот так и ошибки не возникает. Мне кажется, в 2009 тоже должно работать
X++: FROM INVENTTRANS T1 CROSS JOIN INVENTDIM T2 LEFT OUTER JOIN INVENTBATCH T3 ON (((T3.PARTITION=?) AND (T3.DATAAREAID=?)) AND ((T2.INVENTBATCHID=T3.INVENTBATCHID) AND (T1.ITEMID=T3.ITEMID))) WHERE ((T1.PARTITION=?) AND (T1.DATAAREAID=?)) AND (((T2.PARTITION=?) AND (T2.DATAAREAID=?)) AND ((T2.INVENTDIMID=T1.INVENTDIMID) AND (T2.INVENTLOCATIONID=?)) |
|
26.04.2013, 09:58 | #15 |
Боец
|
Всё просто.
Сделайте View {inventTrans+InventDim} и к этой view по OuterJoin подцепите InventBatch. Должно работать. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
26.04.2013, 10:23 | #16 |
Участник
|
Цитата:
X++: inventTrans inventTrans; InventBatch InventBatch; InventDim InventDim; int yes,no; ; while select InventDim where inventDim.InventLocationId == "склад1" join inventTrans where inventTrans.inventDimId == InventDim.inventDimId && inventTrans.ItemId == "известна" outer join InventBatch where InventBatch.itemId == inventTrans.itemId { if (InventBatch) { yes++; } else { no++; } } info(strfmt("yes:%1; no:%2", yes, no)); PSS: правильно подсказывают выход - View, 2 запроса, запрос на синтаксисе SQL |
|
26.04.2013, 10:33 | #17 |
Участник
|
|
|
26.04.2013, 10:36 | #18 |
Участник
|
|
|
26.04.2013, 12:13 | #19 |
Участник
|
|
|
26.04.2013, 12:17 | #20 |
Участник
|
Цитата:
Сообщение от Player1
Если в одном из условий хлама будет так, что известна к примеру номеклатура, и хочется просто поупражняться в программировании, то вариант такой:
X++: inventTrans inventTrans; InventBatch InventBatch; InventDim InventDim; int yes,no; ; while select InventDim where inventDim.InventLocationId == "склад1" join inventTrans where inventTrans.inventDimId == InventDim.inventDimId && inventTrans.ItemId == "известна" outer join InventBatch where InventBatch.itemId == inventTrans.itemId { if (InventBatch) { yes++; } else { no++; } } info(strfmt("yes:%1; no:%2", yes, no)); |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Очередная проблемка с закрытием склада | 4 | |||
InventDim::findOrCreate | 24 | |||
Вопросы по ReleaseUpdate DAX 2009 | 7 | |||
Очередные грабли while select | 14 | |||
Связь таблиц InventTrans и PurchLine | 2 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|