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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.04.2013, 06:34   #1  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Очередная попытка связать 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)
Но чтобы придумать в X++ .. ?

Последний раз редактировалось Perc; 26.04.2013 в 06:37.
Старый 26.04.2013, 07:05   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Perc Посмотреть сообщение
Нужно выбрать все операции по складу, но при этом еще и вытянуть данные по партии если партия была указанна для какой то номенклатуры.
1.
у вас логическая ошибка.
нужно выбирать данные по партии, если партия ВКЛЮЧЕНА в группах аналитики.
партионный учет по номенклатуре могут выключить и после того, как ввели данные с партиями.

2.
outer join должен быть последним. или вырубайте forcenested.
в общем, читайте по форуму - обсуждалась проблема с outer join.

3.
вообще говоря, номер партии находится в inventDim.
делать выборку из invetnBatch нужно только тогда, когда вам нужны дополнительные параметры именно партии - срок годности или что вы туда добавили.
в связи с этим соображением, желание "сделать один запрос на три таблицы" выглядит странным. А нужно ли вам одним запросом то?

Разбейте на два:
* InventTrans+InventDim нужны всегда (номер партии можно найти в inventDim)
* InventBatch (и другие аналитики) нужны только когда понадобятся расширенные параметры из аналитик. тогда и выбирайте отдельным запросом.
Старый 26.04.2013, 07:34   #3  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
1.
у вас логическая ошибка.
нужно выбирать данные по партии, если партия ВКЛЮЧЕНА в группах аналитики.
партионный учет по номенклатуре могут выключить и после того, как ввели данные с партиями.
Я понимаю вашу теоретическую подкованность). И что нужно иногда обращать внимание настройки в группах аналитики. Но даже если партии и выключили после. Мы же можем когда то захотеть посмотреть данные с партиями за прошлые периоды?
Такая же история может быть и серийными номерами и еще с чем то... Данные таблицы я привел в качестве удобного примера ситуации для запроса.

Цитата:
2.
outer join должен быть последним. или вырубайте forcenested.
в общем, читайте по форуму - обсуждалась проблема с outer join.
Уверен был что тема должна была обсуждаться, но что то за час поиска ни на что подходящее не наткнулся. Поищу по ключевому слову forcenested. Спсб).
Ну и кстате насчет того что outer join должен быть последним - совершенно не верно по моему. Даже если и ткнем в конце outer, при переводе в SQL outer все равно однообразно переводиться в left outer join с условием вперед. Но я еще почитаю форум)
Цитата:
3.
вообще говоря, номер партии находится в inventDim.
делать выборку из invetnBatch нужно только тогда, когда вам нужны дополнительные параметры именно партии - срок годности или что вы туда добавили.
в связи с этим соображением, желание "сделать один запрос на три таблицы" выглядит странным. А нужно ли вам одним запросом то?
Разбейте на два:
* InventTrans+InventDim нужны всегда (в inventDim можно найти номер партии)
* InventBatch (и другие аналитики) нужны только когда понадобятся расширенные параметры из аналитик. тогда и выбирайте отдельным запросом.
Конечно тыкая запрос в форум я отчистил его от дополнительных хламов. Чтобы так сказать проблема программистская была не замутнена). Нужно именно одним запросом. Конечно эту проблему всегда в прошлом так и решали. Делали вложенные запросы, потом собирали группировали и еще как либо обрабатывали, но тем неменее один запрос упростил бы мне работу, да и подозреваю и серверу в смысле быстродействия.
Старый 26.04.2013, 07:44   #4  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
1.
Разбейте на два:
* InventTrans+InventDim нужны всегда (в inventDim можно найти номер партии)
* InventBatch (и другие аналитики) нужны только когда понадобятся расширенные параметры из аналитик. тогда и выбирайте отдельным запросом.
Пардон. Я видимо не правильно понял ваше предложение про 2 запроса в предыдущем посте и воспринял его как намек на вложенные запрос по inventbatch )
Предложение видимо сделать именно 2 запроса. По тем операциям где нет партии, потом по тем где есть партии. Это вариант конечно согласен. Ноо.. )) не ответ на тему вопроса)
Старый 26.04.2013, 07:46   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Perc Посмотреть сообщение
Конечно тыкая запрос в форум я отчистил его от дополнительных хламов. Чтобы так сказать проблема программистская была не замутнена).
а... понятно.
тогда копайте в сторону проблем с outer join.

а про какую версию спрашиваете?
просто в 2012 многое сильно изменилось.
Старый 26.04.2013, 07:51   #6  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
а про какую версию спрашиваете?
просто в 2012 многое сильно изменилось.
Да мы ретрограды) DAX4..
Старый 26.04.2013, 07:52   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Perc Посмотреть сообщение
Даже если и ткнем в конце outer, при переводе в SQL outer все равно однообразно переводиться в left outer join с условием вперед.
насколько я помню программистскую суть проблемы:
* проблема не в том, как отправляется запрос
* проблема в том, как аксапта интерпретирует ответ. аксапта не работает с null. поэтому ей нужно помогать
Старый 26.04.2013, 07:55   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Perc Посмотреть сообщение
Даже если и ткнем в конце outer, при переводе в SQL outer все равно однообразно переводиться в left outer join с условием вперед.
Не понял вас.

Вам какой запрос нужен? В вашем примере вы джойните 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  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от mazzy Посмотреть сообщение
насколько я помню программистскую суть проблемы:
* проблема не в том, как отправляется запрос
* проблема в том, как аксапта интерпретирует ответ. аксапта не работает с null. поэтому ей нужно помогать
Ну до интерпретации ответа нужно сначала вопрос поставить правильно. Если вопрос глядя в трассировку SQL получается такой что данные возвращенные сервером как не интерпретируй.. лошадку не слепишь)
Но я понял что вы имеете ввиду, посмотрю еще варианты.
Старый 26.04.2013, 08:12   #10  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Perc Посмотреть сообщение
Не удалось привязать составной идентификатор "A.ITEMID".
Т.е. он вот это условие не может проглатить && InventBatch.itemId == inventTrans.itemId;

Возможно поможет сделать промежуточный View = InventTrans join InventDim. И уже к нему outer join InventBatch.
Старый 26.04.2013, 08:55   #12  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
FROM {oj
Oracle?
Старый 26.04.2013, 09:31   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Нет, {} - это как раз MS SQL Server
За это сообщение автора поблагодарили: belugin (3).
Старый 26.04.2013, 09:50   #14  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Да, подзабыл, в 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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Всё просто.
Сделайте View {inventTrans+InventDim} и к этой view по OuterJoin подцепите InventBatch.
Должно работать.
За это сообщение автора поблагодарили: mazzy (2).
Старый 26.04.2013, 10:23   #16  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от Perc Посмотреть сообщение
...Конечно тыкая запрос в форум я отчистил его от дополнительных хламов. Чтобы так сказать проблема программистская была не замутнена). Нужно именно одним запросом...
Если в одном из условий хлама будет так, что известна к примеру номеклатура, и хочется просто поупражняться в программировании, то вариант такой:
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));
PS: без указания номенклатуры не рекомендую запускать - будет очень долго
PSS: правильно подсказывают выход - View, 2 запроса, запрос на синтаксисе SQL
Старый 26.04.2013, 10:33   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Player1 Посмотреть сообщение
вариант такой:
Без условия InventBatch.InventBatchId == inventDim.InventBatchId достаточно странная выборка получается Каждая проводка будет соединена со всеми партиями номенклатуры, а не только с собственной
Старый 26.04.2013, 10:36   #18  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Без условия InventBatch.InventBatchId == inventDim.InventBatchId достаточно странная выборка получается Каждая проводка будет соединена со всеми партиями номенклатуры, а не только с собственной
if (InventBatch.InventBatchId == inventDim.InventBatchId)...
Старый 26.04.2013, 12:13   #19  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Всё просто.
Сделайте View {inventTrans+InventDim} и к этой view по OuterJoin подцепите InventBatch.
Должно работать.
Да, действительно с view замечательно вроде все работает. Вариант хороший. К тому же связка inventTrans+InventDim очень популярна обычно. Спсб)
Старый 26.04.2013, 12:17   #20  
Perc is offline
Perc
Участник
 
194 / 57 (2) ++++
Регистрация: 05.03.2005
Цитата:
Сообщение от 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));
Не-е, конечно здесь все плохо. Это не наш метод). Вьюшка работает.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Очередная проблемка с закрытием склада Alexius DAX: Функционал 4 08.04.2011 11:02
InventDim::findOrCreate ice DAX: Программирование 24 23.12.2010 10:43
Вопросы по ReleaseUpdate DAX 2009 ansoft DAX: Программирование 7 31.08.2010 12:21
Очередные грабли while select CasperSKY DAX: Программирование 14 23.03.2008 12:30
Связь таблиц InventTrans и PurchLine Pustik DAX: Программирование 2 25.11.2004 12:23

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

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

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