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

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

Возможно поможет сделать промежуточный View = InventTrans join InventDim. И уже к нему outer join InventBatch.
Старый 26.04.2013, 10:23   #9  
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   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Player1 Посмотреть сообщение
вариант такой:
Без условия InventBatch.InventBatchId == inventDim.InventBatchId достаточно странная выборка получается Каждая проводка будет соединена со всеми партиями номенклатуры, а не только с собственной
Старый 26.04.2013, 10:36   #11  
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:17   #12  
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, время: 07:41.