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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.06.2007, 12:49   #1  
Antonuch is offline
Antonuch
Участник
 
41 / 15 (1) ++
Регистрация: 21.06.2007
! join-ы
Доброго всем времени суток. Просьба помочь разобраться с отчетом. Есть три таблицы (InventSum состояние склада, InventTable картотека номенклатуры, ConfigChoice выбор нн в зависимости от конфигурации оборудования.) Схема данных в файле. Данные выводятся на грид из InventSum как добиться того, чтобы в отдельном поле формы были нн деталей (которые в зависимости от сопоставлений с ConfigChoice выхватывались бы из InventTable), если это комплект (соответственно нн всего комплекта повторялся бы) Заранее благодарю.
сорри за банальность
Изображения
 
Старый 22.06.2007, 13:30   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Вчера был задан вопрос, как написать join. Сегодня, как и ожидалось, - второй шаг: join написан, как сделать так, чтобы он выдавал то, что хочется?

Скучно. И не хватает связки с ConfigId через InventDim.

Последний раз редактировалось EVGL; 22.06.2007 в 13:33.
Старый 22.06.2007, 13:33   #3  
Antonuch is offline
Antonuch
Участник
 
41 / 15 (1) ++
Регистрация: 21.06.2007
))) EVGL да вы юморист, сударь, тот join, что был написан вчера не работает, к сожалению, пришлось мне кое-что переосмыслить, теперь заново бьюсь
Старый 22.06.2007, 13:36   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
InventSum.InventDimId -> InventDim.ConfigId == ConfigChoice.ConfigId AND
InventSum.ItemId == ConfigChoice.ItemId

Таблицы, подобные ConfigTable, довольно неприятные. Связка получается по двум путям разной длины:

InventSum -> InventDim -> ConfigTable
InventSum -> ConfigTable

Такой запрос для формы построить нельзя. Остаются варианты типа временных таблиц или шатких предположений, что идентификаторы конфигураций уникальны.

Последний раз редактировалось EVGL; 22.06.2007 в 13:48.
Старый 22.06.2007, 13:45   #5  
Antonuch is offline
Antonuch
Участник
 
41 / 15 (1) ++
Регистрация: 21.06.2007
Был бы сам рад, да в InventDim поле ConfigID пустое, и заполняться не планирует
нужен курсор по InventSum чтобы в случае комплекта нн в форме разбивалась на несколько строк подетально ( апривязка по комплектам только через СС.ItemId->CC.ChosenItemID
Старый 22.06.2007, 16:16   #6  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Сообщение от Antonuch Посмотреть сообщение
Был бы сам рад, да в InventDim поле ConfigID пустое, и заполняться не планирует
нужен курсор по InventSum чтобы в случае комплекта нн в форме разбивалась на несколько строк подетально ( апривязка по комплектам только через СС.ItemId->CC.ChosenItemID
Я что то наверное не понимаю, Вы что переделали функционал конфигурирования? Если нет, то без InventDim не обойтись...
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 22.06.2007, 16:36   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от EVGL Посмотреть сообщение
Такой запрос для формы построить нельзя.

Точно?

А если так

InventSum -> InventDim --> ConfigTable

X++:
ConfigTable.addRange(fieldNum(ConfigTable, RecID, '(ConfigTable.ItemId==InventSum.ItemID)');

Последний раз редактировалось belugin; 22.06.2007 в 17:35.
Старый 22.06.2007, 16:44   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Вот так прокатывает, а если заменить на Outer, то нет

X++:
static void Test3Tables(Args _args)
{
    QueryRun qr =
        SYS_ExpressionQueryBuilder::addDataSource(tableNum(InventSum), 'InventSum')
            .join(tableNum(InventDim))
            .link(fieldNum(InventSum, InventDimID), 
                  fieldNum(InventDim, InventDimID))
            .join(tableNum(ConfigTable), 'ConfigTable')
                .link(fieldNum(InventDim, ConfigId),
                      fieldNum(ConfigTable, ConfigId))
            .matches(fieldNum(ConfigTable, RecID), '(ConfigTable.ItemId==InventSum.ItemID)')
            .run();
    ;
    qr.next();
}
Старый 22.06.2007, 16:45   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Невозможно выбрать запись в 'Таблица конфигурации' ('ConfigTable')
Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами.
X++:
static void Test3Tables(Args _args)
{
    QueryRun qr =
        SYS_ExpressionQueryBuilder::addDataSource(tableNum(InventSum), 'InventSum')
            .join(tableNum(InventDim))
            .link(fieldNum(InventSum, InventDimID),
                  fieldNum(InventDim, InventDimID))
            .outerJoin(tableNum(ConfigTable), 'ConfigTable')
                .link(fieldNum(InventDim, ConfigId),
                      fieldNum(ConfigTable, ConfigId))
            .matches(fieldNum(ConfigTable, RecID), '(ConfigTable.ItemId==InventSum.ItemID)')
            .run();
    ;
    qr.next();
}
Старый 22.06.2007, 18:12   #10  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
По-моему, на картине изображена ненормализованная структура данных, раз связи замкнулись в кольцо. Вообще не удивлюсь, если такой запрос нельзя написать на SQL в принципе (одним запросом).

Тем не менее, Antonuch, вы работаете со стандартной функциональностью или с авторской?
__________________
С уважением,
glibs®
Старый 22.06.2007, 21:51   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
мне в-общем не очень понятно, как присоединяется ConfigChoice, по inner join или по outer, но может попробовать innerJoin во view запихать?

Может напишете запрос на обычном SQL а мы его попробуем транслировать?
Старый 19.01.2018, 11:33   #12  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Сообщение от belugin Посмотреть сообщение
Невозможно выбрать запись в 'Таблица конфигурации' ('ConfigTable')
Использован оператор объединения таблиц join, но выражение WHERE не содержит связи между таблицами.
X++:
static void Test3Tables(Args _args)
{
    QueryRun qr =
        SYS_ExpressionQueryBuilder::addDataSource(tableNum(InventSum), 'InventSum')
            .join(tableNum(InventDim))
            .link(fieldNum(InventSum, InventDimID),
                  fieldNum(InventDim, InventDimID))
            .outerJoin(tableNum(ConfigTable), 'ConfigTable')
                .link(fieldNum(InventDim, ConfigId),
                      fieldNum(ConfigTable, ConfigId))
            .matches(fieldNum(ConfigTable, RecID), '(ConfigTable.ItemId==InventSum.ItemID)')
            .run();
    ;
    qr.next();
}
Встретился с фирменным стилем belugin в классе CustVendPaymERExport. Кратко, изящно, все нужные методы private, невозможно вклиниться и расширить. Спасибо огромное, продолжайте в том же духе и мы останемся на 7.2.
Старый 19.01.2018, 12:54   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Можно ли узнать, что именно необходимо расширить и какой код в 7.2?

См. также обсуждение некоторых изменений модуля в 7.3

Последний раз редактировалось belugin; 19.01.2018 в 13:00.
Старый 19.01.2018, 16:07   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,929 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
Можно ли узнать, что именно необходимо расширить и какой код в 7.2?
Максим, а вот такое выражение
X++:
            .link(fieldNum(InventSum, InventDimID),
                  fieldNum(InventDim, InventDimID))
можно заменить чем то типа
X++:
            .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim')
?

Так бы лучше инкапсуляция была и можно было бы проверку от опечаток сделать внутри вызова linkRelation(). Тогда не было бы ситуации когда в имени таблицы или поля опечатался и запрос работает, но неправильно.
Старый 19.01.2018, 16:08   #15  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Изменили режим, в котором создаются строки платежей, с "много дебет-кредит" на "много дебетов - один кредит", но указанный класс всегда фильтрует по Offset account, которого нет, и и который на самом деле не требуется для создания файла. Вклиниться в query невозможно, изменить класс context - невозможно, поскольку он в одной строке и создается, и передается в итоговый класс. По уму надо было разбить на несколько методов, создать hooks.

P.S. В конечном итоге, нашел с программистом вариант, как сломать через extensions. Много позже в ходе исполнения отловить query и сделать .clearLinks() если попадается таблица LedgerJournalTrans. Ненадежно, опасно, трудно отлаживать, может вылезти в неожиданном месте при попытке создать новый электронный отчет, зато Microsoft доволен. Вполне себе типичное решение через extensions, где делается предположение о внутренней структуре, а после нас - хоть потоп.

Последний раз редактировалось EVGL; 19.01.2018 в 16:27.
За это сообщение автора поблагодарили: gl00mie (2).
Старый 19.01.2018, 16:37   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Logger Посмотреть сообщение
X++:
            .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim')
Так бы лучше инкапсуляция была и можно было бы проверку от опечаток сделать внутри вызова linkRelation(). Тогда не было бы ситуации когда в имени таблицы или поля опечатался и запрос работает, но неправильно.
Теоретически я бы делал так:

X++:
.linkRelation(tableStr(InventSum), relationStr(InventSum, InventDim))
Но у нас нет relationStr так, что если кто-то переименует relation, мы узнаем только в runtime. Если вы пишете тесты, то это небольшое неудобство, но если нет, вам могут сломать код, а узнает об этом только пользователь.
Старый 19.01.2018, 16:58   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,929 / 3227 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
Но у нас нет relationStr так, что если кто-то переименует relation, мы узнаем только в runtime.
Это намного лучше, чем если отработает, но не с теми полями. Уж лучше пусть ошибка в рантайм.
Старый 19.01.2018, 20:58   #18  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Насколько я понял, смысл кода в том, чтобы, если внутри журнала есть платежи относящиеся к нескольким счетам компании, а пользователь выбрал один, то надо вывести в файл только платежи отнсящиесиеся к заданному счету.

То есть в вашем случае надо либо передать backAccountID == '' (там есть обработка этого случая) либо обеспечить корректную филтрацию, вычисляя OffsetAccount по ваучеру. Либо каким-то образом запретить создание платежей по нескольким банковским счетам компании (насколько я помню этот функционал).
Верно. Однако, случай, когда один и тот же метод платежа применяется к нескольким банковским счетам достаточно экзотичен и мы можем это исключить правильной конфигурацией.

P.S. Ой, извините, я - EVGL - по ошибке отредактировал ваш текст. Надо отнять у меня права модератора, что-ли?

Последний раз редактировалось EVGL; 20.01.2018 в 02:05.
За это сообщение автора поблагодарили: EVGL (5).
Старый 20.01.2018, 02:05   #19  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
В конечном итоге, нашел с программистом вариант, как сломать через extensions, не дай бог
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 20.01.2018, 02:05   #20  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
кошмар
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2 while select или join? _scorp_ DAX: Программирование 9 23.01.2009 16:02
AX UK: Join the Virtual Partner Community Blog bot DAX Blogs 0 26.03.2008 04:17
Глюки в Query с разными типами Join (в т.ч. NonExistsJoin) к одной таблице gl00mie DAX: Программирование 10 14.02.2007 13:22
2 и более OUTER JOIN к одному паренту Ronin DAX: Программирование 21 19.12.2005 13:42

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.