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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.01.2018, 11:33   #1  
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   #2  
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   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,987 / 3273 (117) ++++++++++
Регистрация: 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:37   #4  
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   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,987 / 3273 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от belugin Посмотреть сообщение
Но у нас нет relationStr так, что если кто-то переименует relation, мы узнаем только в runtime.
Это намного лучше, чем если отработает, но не с теми полями. Уж лучше пусть ошибка в рантайм.
Старый 22.01.2018, 17:52   #6  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от EVGL Посмотреть сообщение
Встретился с фирменным стилем belugin в классе CustVendPaymERExport.
Кстати да, не в обиду, но хорошее замечание. т.е. нарушается одно из правил кодеревью что код не должен быть персонализирован(а так в АХ больше никто не пишет)
читать такой код на мой взгляд сложно(непонятно на каком классе вызывается методы), да и отлаживать подозреваю тоже
как вообще такое пропускают
Старый 23.01.2018, 09:04   #7  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
За несколько лет никто не жаловался именно на это. Это не фирменный стиль belugin это FluentInterface - распространенный прием в языках, где нет property и collection initializers (например в java, с которой слизали X++).

Их не надо отлаживать особо - там никакой логики нет, только передача параметров.

BTW у отладчика в VS гораздо больше возможностей, чем то, к чему мы привыкли на предыдущих версиях AX (step into specific, tracepoints, conditional breakpoints, etc) если вдруг кто-то не знает что-то из этого, рекомендую почитать доку.
За это сообщение автора поблагодарили: Link (5).
Старый 23.01.2018, 19:22   #8  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от belugin Посмотреть сообщение
За несколько лет никто не жаловался именно на это. Это не фирменный стиль belugin это FluentInterface - распространенный прием в языках, где нет property и collection initializers (например в java, с которой слизали X++).

Их не надо отлаживать особо - там никакой логики нет, только передача параметров.

BTW у отладчика в VS гораздо больше возможностей, чем то, к чему мы привыкли на предыдущих версиях AX (step into specific, tracepoints, conditional breakpoints, etc) если вдруг кто-то не знает что-то из этого, рекомендую почитать доку.
Бить по рукам надо линейкой за FluentInterface
X++:
c1.FirstName("vinod").LastName("srivastav").Sex("male").Address("bangalore").Print();
И категорически запрещать. Каждый раз проклинаю. И ни разу не порадовался.

А по теме, раз отчет то делайте временную таблицу и забудьте о нюансах join, делайте максимально тупо.
Вот на форме, да стоит думать, но для отчета нет смысла. Для отчета нужна гибкость, а это временная таблица.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 23.01.2018, 20:56   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Бить по рукам надо линейкой за FluentInterface
X++:
c1.FirstName("vinod").LastName("srivastav").Sex("male").Address("bangalore").Print();
Почему в одну строчку и не со значимым именем? Слишком читаемо?

Цитата:
И категорически запрещать. Каждый раз проклинаю. И ни разу не порадовался.
Можно включить левое полушарие и вместо эмоций привести аргументы?

Цитата:
А по теме, раз отчет то делайте временную таблицу и забудьте о нюансах join, делайте максимально тупо.
А как данные будут приходить во временную таблицу? За каждой связанной записью ходить на SQL Server? Или тот же join?
Старый 23.01.2018, 22:50   #10  
ax_mct is offline
ax_mct
Banned
 
2,548 / 1091 (0) ++++++++
Регистрация: 10.10.2005
Адрес: Westlands
Цитата:
Сообщение от belugin Посмотреть сообщение
Почему в одну строчку и не со значимым именем? Слишком читаемо?
Можно включить левое полушарие и вместо эмоций привести аргументы?

А как данные будут приходить во временную таблицу? За каждой связанной записью ходить на SQL Server? Или тот же join?
Ни один "системный" программист не может вообразить всех потребностей "прикладного".
Сам каждый раз поражаюсь требованиям и ситуациям.

Возможность дебажить и расширять. Вот что нужно "прикладному" программисту.
Экономия на переменных и строках, для красоты - это говнокод на самом деле. То есть красиво придавленное но г@вно.

Даже инициализацию параметров требуется дебажить и иногда менять. А когда иерархия и все в строку да с запуском в конце то уматываешься проходить по всем параметрам пока до нужного метода доберешься. Часто приходиться переписывать такой код добавляя переменные для удобства дебага.

Те же join это примерно такая же "оптимизация" как и сокращенный код. В топку такую оптимизацию.
Лучше лишний раз сходить на SQL Server. Не нужно ничего оптимизировать заранее и без реальной на то необходимости.
За это сообщение автора поблагодарили: Link (5), Pandasama (1), Stitch_MS (2).
Старый 24.01.2018, 19:02   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от ax_mct Посмотреть сообщение
Возможность дебажить и расширять.
Про возможность дебажить я согласен, что она меньше. На практике жалоб от коллег, что это сильно мешает не слышал (может слышал, но забыл) но это не тот вопрос, которые регулярно всплывает.

У нас не очень много такого кода в production но много такого в тестах.

Учтите, что в AX7 можно просто провалиться по F12 в метод и поставить breakpoint уже там.

К сожалению, в X++ (в отличие от C#) не работает "step into specific" и бряки по имени функции.

Собственно те же проблемы возникают при отладке вызова с несколькими аргументами, только там нет имен параметров.

Про возможность расширять, я не очень понял. EVGL сказал, нашел две проблемы:
1. private методы
2. создание запроса не выделено в отдельный метод

По-моему, это ортогонально стилю заполнения параметров.

Цитата:
Вот что нужно "прикладному" программисту.
Экономия на переменных и строках, для красоты - это говнокод на самом деле. То есть красиво придавленное но г@вно.
Никакой красоты нет. Есть время на чтение и удобство анализа кода. Если есть дублирование, то для анализа надо сканить дубли на предмет различий. Я много раз ловил ошибки типа "скопировали, но забли поменять имя переменной".

Цитата:
Даже инициализацию параметров требуется дебажить и иногда менять. А когда иерархия и все в строку
В каком смысле "иерархия и все строку" обычно разбивается по нескольким строкам?

Цитата:
да с запуском в конце то уматываешься проходить по всем параметрам пока до нужного метода доберешься. Часто приходиться переписывать такой код добавляя переменные для удобства дебага.
Как я уже говорил, можно поставить бряку внутрь метода. Учтите, что VS позволяет смотреть возвращаемое в методе значение.

Цитата:
Те же join это примерно такая же "оптимизация" как и сокращенный код. В топку такую оптимизацию.
Лучше лишний раз сходить на SQL Server. Не нужно ничего оптимизировать заранее и без реальной на то необходимости.
А если 200000 раз?
Старый 24.01.2018, 00:34   #12  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от belugin Посмотреть сообщение
Можно включить левое полушарие и вместо эмоций привести аргументы?
Коллега конечно излишне эмоционален, но я тоже считаю, что такого кода не должно быть в стандарте. Ну и сам X++ Coding Standards:

General Guidelines
  • Only one statement per line.
  • Break up complex expressions that are more than one line - make it visually clear.
  • Use a single blank line to separate entities.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
За это сообщение автора поблагодарили: skuull (1), Stitch_MS (2), Vadik (1), AlGol (3).
Старый 24.01.2018, 19:17   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от Link Посмотреть сообщение
Коллега конечно излишне эмоционален, но я тоже считаю, что такого кода не должно быть в стандарте.
Моя претензия не к тому что есть эмоции, а к тому, что в исходном сообщении не было ничего кроме них. А так, лично для меня, пусть хоть матом ругается только по делу.

Цитата:
Only one statement per line.
Не очень совместимо с длинными именами (если читать как one and only one - я прочитал как "на каждую строчку должен приходиться только один statement (но он может быть и несколько строчек)") - нельзя разбивать вызов на несколько строчек.

Цитата:
Break up complex expressions that are more than one line - make it visually clear.
Если речь идет про выделение переменных, мне кажется, вложенность описанная отступами более визуальна, чем несколькими присваиваниями на одном уровне.

Цитата:
Use a single blank line to separate entities.
Непонятно, при чем тут это.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 08:07.