22.06.2007, 12:49 | #1 |
Участник
|
join-ы
Доброго всем времени суток. Просьба помочь разобраться с отчетом. Есть три таблицы (InventSum состояние склада, InventTable картотека номенклатуры, ConfigChoice выбор нн в зависимости от конфигурации оборудования.) Схема данных в файле. Данные выводятся на грид из InventSum как добиться того, чтобы в отдельном поле формы были нн деталей (которые в зависимости от сопоставлений с ConfigChoice выхватывались бы из InventTable), если это комплект (соответственно нн всего комплекта повторялся бы) Заранее благодарю.
сорри за банальность |
|
22.06.2007, 13:30 | #2 |
Banned
|
Вчера был задан вопрос, как написать join. Сегодня, как и ожидалось, - второй шаг: join написан, как сделать так, чтобы он выдавал то, что хочется?
Скучно. И не хватает связки с ConfigId через InventDim. Последний раз редактировалось EVGL; 22.06.2007 в 13:33. |
|
22.06.2007, 13:33 | #3 |
Участник
|
))) EVGL да вы юморист, сударь, тот join, что был написан вчера не работает, к сожалению, пришлось мне кое-что переосмыслить, теперь заново бьюсь
|
|
22.06.2007, 13:36 | #4 |
Banned
|
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 |
Участник
|
Был бы сам рад, да в InventDim поле ConfigID пустое, и заполняться не планирует
нужен курсор по InventSum чтобы в случае комплекта нн в форме разбивалась на несколько строк подетально ( апривязка по комплектам только через СС.ItemId->CC.ChosenItemID |
|
22.06.2007, 16:16 | #6 |
Пенсионер
|
Я что то наверное не понимаю, Вы что переделали функционал конфигурирования? Если нет, то без InventDim не обойтись...
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
22.06.2007, 16:36 | #7 |
Участник
|
Точно? А если так 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 |
Участник
|
Вот так прокатывает, а если заменить на 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 |
Участник
|
Невозможно выбрать запись в 'Таблица конфигурации' ('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 |
Member
|
По-моему, на картине изображена ненормализованная структура данных, раз связи замкнулись в кольцо. Вообще не удивлюсь, если такой запрос нельзя написать на SQL в принципе (одним запросом).
Тем не менее, Antonuch, вы работаете со стандартной функциональностью или с авторской?
__________________
С уважением, glibs® |
|
22.06.2007, 21:51 | #11 |
Участник
|
мне в-общем не очень понятно, как присоединяется ConfigChoice, по inner join или по outer, но может попробовать innerJoin во view запихать?
Может напишете запрос на обычном SQL а мы его попробуем транслировать? |
|
19.01.2018, 11:33 | #12 |
Banned
|
Цитата:
Сообщение от 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(); } |
|
19.01.2018, 12:54 | #13 |
Участник
|
Можно ли узнать, что именно необходимо расширить и какой код в 7.2?
См. также обсуждение некоторых изменений модуля в 7.3 Последний раз редактировалось belugin; 19.01.2018 в 13:00. |
|
19.01.2018, 16:07 | #14 |
Участник
|
Максим, а вот такое выражение
X++: .link(fieldNum(InventSum, InventDimID), fieldNum(InventDim, InventDimID)) X++: .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim') Так бы лучше инкапсуляция была и можно было бы проверку от опечаток сделать внутри вызова linkRelation(). Тогда не было бы ситуации когда в имени таблицы или поля опечатался и запрос работает, но неправильно. |
|
19.01.2018, 16:08 | #15 |
Banned
|
Изменили режим, в котором создаются строки платежей, с "много дебет-кредит" на "много дебетов - один кредит", но указанный класс всегда фильтрует по 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 |
Участник
|
Цитата:
Сообщение от Logger
X++: .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim') X++: .linkRelation(tableStr(InventSum), relationStr(InventSum, InventDim)) |
|
19.01.2018, 16:58 | #17 |
Участник
|
|
|
19.01.2018, 20:58 | #18 |
Участник
|
Цитата:
Насколько я понял, смысл кода в том, чтобы, если внутри журнала есть платежи относящиеся к нескольким счетам компании, а пользователь выбрал один, то надо вывести в файл только платежи отнсящиесиеся к заданному счету.
То есть в вашем случае надо либо передать backAccountID == '' (там есть обработка этого случая) либо обеспечить корректную филтрацию, вычисляя OffsetAccount по ваучеру. Либо каким-то образом запретить создание платежей по нескольким банковским счетам компании (насколько я помню этот функционал). P.S. Ой, извините, я - EVGL - по ошибке отредактировал ваш текст. Надо отнять у меня права модератора, что-ли? Последний раз редактировалось EVGL; 20.01.2018 в 02:05. |
|
|
За это сообщение автора поблагодарили: EVGL (5). |
20.01.2018, 02:05 | #19 |
Участник
|
В конечном итоге, нашел с программистом вариант, как сломать через extensions, не дай бог
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
20.01.2018, 02:05 | #20 |
Участник
|
кошмар
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|