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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.07.2019, 17:41   #1  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
LedgerJournalTable создание записи
Всем доброго дня.

Что имеем. Ax12 R3
Создали MI который ссылается на форму LedgerJournalTable. Прописали EnumTypeParameter LedgerJournalType, EnumParameter CustPayment. В справочнике "Наименование журнала" прикрутили новое поле "Подмодуль". Казалось бы все просто, при нажатии на MI хотим чтобы открылась форма с типами журналов "Клиентский платеж" и с определенным Подмодулем. Для этого есть класс наследник от LedgerJournalFormTable, в нем перекрыт queryAddRange и имеется следующий код
X++:
    super();

    qbds = SysFormDataSource::fds2Qbds(journalTable_ds);
    
    while select ledgerJournalName
        where ledgerJournalName.JournalType == LedgerJournalType::CustPayment
            && ledgerJournalName.SysSubModule_MRC == SysSubModule_MRC::Disribution
    {
        qbrJournalName = qbds.addRange(fieldnum(LedgerJournalTable, JournalName));
        qbrJournalName.value(SysQuery::value(ledgerJournalName.JournalName));
        qbrJournalName.status(RangeStatus::Locked);*/
    }
при открытии формы, все красиво, показываются только те журналы которые нужны, но есть одно но при создании записи она создается с типом "Ежедневно", хотя вроде как должна создаваться с типом "Клиентский платеж". Если в перекрытом методе закоментить наложение range либо вообще убрать этот метод, то все работает как надо. Запись создается с типом "Клиентский платеж". кто-нибудь сталкивался с такой проблемой?

Последний раз редактировалось smailik; 30.07.2019 в 19:05.
Старый 31.07.2019, 06:24   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от smailik Посмотреть сообщение
при создании записи она создается с типом "Ежедневно", хотя вроде как должна создаваться с типом "Клиентский платеж"
datasourceInitValuePost() у наследника LedgerJournalFormTable не корежили ?
Смотрите состояние записи в initValue() у источника данных до и после вызовов super() и вышеназванного метода - там будет ясно, где собака порылась ...
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 31.07.2019 в 06:26.
Старый 31.07.2019, 07:03   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Скорее всего у вас сломалось построение запроса, поскольку вы вероятно несколько раз добавляете QBR по одному и тому же полю.
Создайте аккумулирующую переменную и через запятую добавляйте туда все ваши JournalName. За пределами цикла создайте рендж и присвойте ему значение и статус.
__________________
// no comments

Последний раз редактировалось dech; 31.07.2019 в 07:06.
Старый 31.07.2019, 07:26   #4  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от dech Посмотреть сообщение
сломалось построение запроса.
И сломанный запрос корректные данные по типу журнала на гриде отображает ?

Цитата:
Сообщение от dech Посмотреть сообщение
поскольку вы вероятно несколько раз добавляете QBR по одному и тому же полю
Так делать разве нельзя?

Цитата:
Сообщение от dech Посмотреть сообщение
Создайте аккумулирующую переменную и через запятую добавляйте туда все ваши JournalName.
И потом не удивляйтесь, когда принятое значение ограничения (value() у QueryBuildRange принимает длиннющий str) после вызова/обновления диалога расширенного запроса обрубится да размерности EDT Range и часть отображаемых ранее данных исчезнет.
Тут проще за-join'ить LedgerJournalName ограничением по требуемому полю - даже при добавлении нового наименования журнала и создания записей журналов по нему, при обновлении запроса в форме отобразятся актуальные данные, чего не будет ни в рассматриваемом , ни в предлагаемом Вами примерах.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: dech (1), smailik (2).
Старый 31.07.2019, 08:16   #5  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Да, вы правы. Не было аксапты под рукой, чтобы проверить. Я обычно делаю через запятую, если надо несколько фильтров по одному полю. У меня обычно ренджи не такие большие.
__________________
// no comments
Старый 31.07.2019, 10:38   #6  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Я так и понял что заспро как-то ломается. Вчера несколько часов дебажил. Если это Range не накладывать, то перед super DS.LedgerJournalTable.initValue() тип Daily, а сразу после CustPayment. Хотя в этом супере ничего нет. Это еще все до datasourceInitValuePost(), но стоит наложить Range как все после супера Daily. Ради интереса пробовал в цикле в одну переменную загнать все значения и накладывать Range после цикла, но тоже результата не дало. Хотя это конечно помогла кое в чем другом разобраться, но к задаче это не относится.
Вот тоже как раз думал просто джойнить LedgerJournalName и вообще проблем не будет. Скорее всего так и сделаю. Главное в Ах4 работает, но там я не успел вчера отдебажить как и что, может там код какой-есть, так что не факт что там все гладко. Спасибо за советы.
Старый 31.07.2019, 11:20   #7  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
А если получать QueryBuildDataSource классическим способом:
X++:
journalTable_ds.query().dataSourceNo(1)
(ну или dataSourceTable, раз уж мы её уже знаем)
а не при помощи
X++:
SysFormDataSource::fds2Qbds
Старый 31.07.2019, 11:22   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
То что, подставляется CustPayment внутри super понятно - там фильтр по нему в стандартном приложении. Судя по всему, этот фильтр слетает и просто подставляется значение Daily которое равно нулю..
Можно посмотреть через персонализацию формы какой там запрос в случае дополнительных фильтров и без них.
Старый 31.07.2019, 11:42   #9  
smailik is offline
smailik
Участник
Аватар для smailik
 
250 / 70 (3) ++++
Регистрация: 10.04.2012
Адрес: Москва
Пробовал через
X++:
journalTable_ds.query().dataSourceTable(tableNum(LedgerJournalTable))
LedgerJournalTable все равно одна на форме, результата не дало.
Да в super подставляется значение из фильтра. И да он слетает и ставится Daily = 0.
Старый 31.07.2019, 15:17   #10  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Интересное поведение.
Даже если не наследовать, а просто в LedgerJournalFormTable в методе queryAddRange добавить range по полю JournalName, то получается:
  • Если сделать фильтр только по одному наименованию журнала, то все хорошо.
  • Если в фильтр запихнуть несколько наименований (не важно делая несколько addRange или один со строкой наименований через запятую), то получаем именно описываемую проблему - тип журнала внутри super не прописывается.
При этом в initValue и create и до и после super, получая хоть query, хоть queryRun, фильтр по типу журнала есть.
Понятно, что после выбора наименования журнала все пропишется, но указанному поведению пока разумного объяснения не нахожу.
Старый 31.07.2019, 15:31   #11  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Все еще интереснее.
Если в LedgerJournalFormTable.queryAddRange добавить фильтр по JournalName не после, а до super(), то тоже работает установка типа журнала из фильтра.
Теги
journaltype, ledgerjournaltable

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
dynamics AX 2012 создание записи в таблице с наследованием skuull DAX: Программирование 0 04.10.2013 22:53
Создание новой записи + Фильтр (3.0 SP5 KR2 SQL) polygris DAX: Программирование 7 03.01.2008 16:17
4.0SP2: Создание записи в ForecastSales через API Jab Straight DAX: Программирование 8 30.11.2007 11:39
Создание новой записи в таблице Andrux DAX: Программирование 28 01.06.2007 10:23
Возможно ли создание записи ядром на 2-ом датасорсе? zipo DAX: Программирование 9 25.05.2006 10:21
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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