|
![]() |
#1 |
Участник
|
Невозможно выбрать запись в 'Таблица конфигурации' ('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(); } |
|
![]() |
#2 |
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(); } |
|
![]() |
#3 |
Участник
|
Можно ли узнать, что именно необходимо расширить и какой код в 7.2?
См. также обсуждение некоторых изменений модуля в 7.3 Последний раз редактировалось belugin; 19.01.2018 в 13:00. |
|
![]() |
#4 |
Участник
|
Максим, а вот такое выражение
X++: .link(fieldNum(InventSum, InventDimID), fieldNum(InventDim, InventDimID)) X++: .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim') Так бы лучше инкапсуляция была и можно было бы проверку от опечаток сделать внутри вызова linkRelation(). Тогда не было бы ситуации когда в имени таблицы или поля опечатался и запрос работает, но неправильно. |
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от Logger
![]() X++: .linkRelation('\Data Dictionary\Tables\InventSum\Relations\InventDim') X++: .linkRelation(tableStr(InventSum), relationStr(InventSum, InventDim)) |
|
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
Участник
|
Кстати да, не в обиду, но хорошее замечание. т.е. нарушается одно из правил кодеревью что код не должен быть персонализирован(а так в АХ больше никто не пишет)
читать такой код на мой взгляд сложно(непонятно на каком классе вызывается методы), да и отлаживать подозреваю тоже как вообще такое пропускают ![]() |
|
![]() |
#8 |
Участник
|
За несколько лет никто не жаловался именно на это. Это не фирменный стиль belugin это FluentInterface - распространенный прием в языках, где нет property и collection initializers (например в java, с которой слизали X++).
Их не надо отлаживать особо - там никакой логики нет, только передача параметров. BTW у отладчика в VS гораздо больше возможностей, чем то, к чему мы привыкли на предыдущих версиях AX (step into specific, tracepoints, conditional breakpoints, etc) если вдруг кто-то не знает что-то из этого, рекомендую почитать доку. |
|
|
За это сообщение автора поблагодарили: Link (5). |
![]() |
#9 |
Banned
|
Цитата:
Сообщение от belugin
![]() За несколько лет никто не жаловался именно на это. Это не фирменный стиль belugin это FluentInterface - распространенный прием в языках, где нет property и collection initializers (например в java, с которой слизали X++).
Их не надо отлаживать особо - там никакой логики нет, только передача параметров. BTW у отладчика в VS гораздо больше возможностей, чем то, к чему мы привыкли на предыдущих версиях AX (step into specific, tracepoints, conditional breakpoints, etc) если вдруг кто-то не знает что-то из этого, рекомендую почитать доку. X++: c1.FirstName("vinod").LastName("srivastav").Sex("male").Address("bangalore").Print(); А по теме, раз отчет то делайте временную таблицу и забудьте о нюансах join, делайте максимально тупо. Вот на форме, да стоит думать, но для отчета нет смысла. Для отчета нужна гибкость, а это временная таблица. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
![]() |
#10 |
Участник
|
Цитата:
Цитата:
И категорически запрещать. Каждый раз проклинаю. И ни разу не порадовался.
Цитата:
А по теме, раз отчет то делайте временную таблицу и забудьте о нюансах join, делайте максимально тупо.
|
|
![]() |
#11 |
Banned
|
Цитата:
Сам каждый раз поражаюсь требованиям и ситуациям. Возможность дебажить и расширять. Вот что нужно "прикладному" программисту. Экономия на переменных и строках, для красоты - это говнокод на самом деле. То есть красиво придавленное но г@вно. Даже инициализацию параметров требуется дебажить и иногда менять. А когда иерархия и все в строку да с запуском в конце то уматываешься проходить по всем параметрам пока до нужного метода доберешься. Часто приходиться переписывать такой код добавляя переменные для удобства дебага. Те же join это примерно такая же "оптимизация" как и сокращенный код. В топку такую оптимизацию. Лучше лишний раз сходить на SQL Server. Не нужно ничего оптимизировать заранее и без реальной на то необходимости. |
|
|
За это сообщение автора поблагодарили: Link (5), Pandasama (1), Stitch_MS (2). |
![]() |
#12 |
Британский учённый
|
Коллега конечно излишне эмоционален, но я тоже считаю, что такого кода не должно быть в стандарте. Ну и сам X++ Coding Standards:
General Guidelines
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: skuull (1), Stitch_MS (2), Vadik (1), AlGol (3). |