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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2020, 06:33   #1  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Проблема с Query в классе RunBaseBatch в AX 2012
Доброго времени суток!!! Столкнулся с такой проблемой в динамическом запросе класса RunBaseBatch при добавления метода InitQuery() в класс и выборкой критериев не работает запрос ( приведен ниже). т.е. не находит запись хотя тот же запрос в джобе работает на ура. Сначала думал что проблема в запаковке, наткнулся на то что влияет на неработоспособность запроса кол-во выбранных критериев по одному полю из таблицы. если добавить на форме диалога еще критерий то при этом на диалоговом окне класса запрос обрезает критерии. Но если смотреть строку запроса то она не обрезанная.
Запрос
protected void initQuery()

{

Query query = new Query();

QueryBuildDataSource qbdsCustEtranInvoices, qbdsEtranInvoicesStateTable;

QueryBuildRange qbrCustEtranInvoices, qbrEtranInvoicesStateTable;

;

qbdsCustEtranInvoices = query.addDataSource(tableNum(CustEtranInvoices));

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, GU27Num));

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, GU27NumForClaim));//ЭУ091220

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldNum(CustEtranInvoices, TypeRelationship));

qbrCustEtranInvoices.value(queryValue(EtranTypeRelationship::Cust));

qbrCustEtranInvoices.status(RangeStatus::Locked);

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, SendPost));

qbrCustEtranInvoices.value(queryValue(NoYes::No));

qbrCustEtranInvoices.status(RangeStatus::Locked);

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, TicketPost));

qbrCustEtranInvoices.value(queryValue(NoYes::No));

qbrCustEtranInvoices.status(RangeStatus::Locked);

/*qbdsEtranInvoicesStateTable = qbdsCustEtranInvoices.addDataSource(tableNum(EtranInvoicesStateTable));

qbdsEtranInvoicesStateTable.joinMode(JoinMode::InnerJoin);

qbdsEtranInvoicesStateTable.relations(true);*/ // Джоин таблицы названий енумов пока не в приоритете

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::vputi)));

qbrCustEtranInvoices.status(RangeStatus::Locked);

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::rabotasdokumentomokonchena)));

qbrCustEtranInvoices.status(RangeStatus::Locked);

qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gruzpribyl)));

qbrCustEtranInvoices.status(RangeStatus::Locked);


qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState:oluchateluvedomlen)));

qbrCustEtranInvoices.status(RangeStatus::Locked);


qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::raskreditovan)));

qbrCustEtranInvoices.status(RangeStatus::Locked);


qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gotovkomplektdokumentov)));

qbrCustEtranInvoices.status(RangeStatus::Locked);


qbrCustEtranInvoices = qbdsCustEtranInvoices.addRange(fieldnum(CustEtranInvoices, EtranInvoiceState));

qbrCustEtranInvoices.value(queryValue(enum2int(EtranInvoiceState::gruzprinjatkperevozke)));

qbrCustEtranInvoices.status(RangeStatus::Locked); //TODO:MNI какой то баг нашел разбираться нужно.

//info(strFmt("%1", query.dataSourceNo(1).toString()));

queryRun = new SysQueryRun(query);

}

Последний раз редактировалось Nick42; 25.12.2020 в 06:39. Причина: уменьшение кол-ва пробелов в запросе
Старый 25.12.2020, 06:48   #2  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Прилагаю скриншоты.
https://yadi.sk/i/RlsyMAYsM_za5Q
во втором видно что на диалоге запрос обрезан
https://yadi.sk/i/R8dGJrg_1biPmA

Последний раз редактировалось Nick42; 25.12.2020 в 06:50. Причина: не загрузились картинки
Старый 25.12.2020, 08:04   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Похоже где то идет усечение до 20 символов, как раз до длины номера накладной. Проверяйте, возможно где то в цепочке вызовов идет присвоение переменной или параметру функции с типом invoiceid или еще каким наследником edt Num.
Старый 25.12.2020, 08:44   #4  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Цитата:
Сообщение от Logger Посмотреть сообщение
Похоже где то идет усечение до 20 символов, как раз до длины номера накладной. Проверяйте, возможно где то в цепочке вызовов идет присвоение переменной или параметру функции с типом invoiceid или еще каким наследником edt Num.
Номер накладной 10 знаков и в запросе не указываю его.
Может поможет SQL запрос.
SELECT * FROM CustEtranInvoices(CustEtranInvoices_1) WHERE ((TypeRelationship = 0)) AND ((SendPost = 0)) AND ((TicketPost = 0)) AND ((EtranInvoiceState = 35) OR (EtranInvoiceState = 44) OR (EtranInvoiceState = 36) OR (EtranInvoiceState = 38) OR (EtranInvoiceState = 42) OR (EtranInvoiceState = 32) OR (EtranInvoiceState = 4))
Старый 25.12.2020, 12:02   #5  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Logger Посмотреть сообщение
Похоже где то идет усечение до 20 символов, как раз до длины номера накладной. Проверяйте, возможно где то в цепочке вызовов идет присвоение переменной или параметру функции с типом invoiceid или еще каким наследником edt Num.
Не, там поле не с типом InvoiceId, просто у них видимо метка для поля EtranInvoiceState "Накладная".
То что на диалоге отображение усекается проблемы не должно вызывать. Там используется EDT RunBaseRange, у которого длина отображения 20. Если подсчитать что перечислено на скриншоте это 18 символов, остальные просто не показываются в диалоговом окне.
Главное, что есть по кнопке "Выбрать", ну и что в запросе. Судя по последнему приведенному запросу с условием все в порядке, ничего не обрезается.
Старый 25.12.2020, 12:06   #6  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,158 / 1286 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Так что в своем InitQuery смотрите что в переменной qbdsCustEtranInvoices , а еще лучше перед пробегом по QueryRun получите этот qbdsCustEtranInvoices из Query (типа qbdsCustEtranInvoices.query().dataSourceTable(tableNum(CustEtranInvoices))) и смотрите что там.
Старый 25.12.2020, 13:03   #7  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Так что в своем InitQuery смотрите что в переменной qbdsCustEtranInvoices , а еще лучше перед пробегом по QueryRun получите этот qbdsCustEtranInvoices из Query (типа qbdsCustEtranInvoices.query().dataSourceTable(tableNum(CustEtranInvoices))) и смотрите что там.
QueryRun пуст вот именно. заметили что в диалоге обрезает вот и я это заметил убрал критерии до того как он обрезает и все заработало. т.е 5 значений EtranInvoiceState и 2 критерия индификатор накладной и номер и того 7 все работает только стоит добавить еще 1 и все 0 записей. есть мысль что пакует queryRun уже урезанный с диалога.
З.Ы. EtranInvoiceState метка на енум там есть таблица со значениями.
Старый 25.12.2020, 14:19   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Вот несколько вариантов, которые надо попробовать

1) Выведите текст запроса, который генерирует ваш QueryRun не в методе initQuery(), а в том методе, который уже реально выбирает данные. Вот такой командой
Цитата:
throw error(queryRun.query().dataSourceNo(1).toString());
И анализируйте его.
2) После модификации метода initQuery вы забыли увеличить #currentVersion в декларации класса, и поэтому у вас распаковывается старая версия запроса.
3) В методе initQuery() добавьте строку
X++:
queryRun.saveUserSetup(false);
И не забудьте увеличивать #currentVersion после каждой модификации метода initQuery()
UPD:
4) Проверьте, что метод initQuery() вызывается. И вызывается только при первом запуске после увеличения #currentVersion. Начиная со второго запуска он уже не должен вызываться.
UPD2:
5) Проверьте, что ваш QueryRun запаковывается в методе pack() и распаковывается в методе unpack()
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/

Последний раз редактировалось Ace of Database; 25.12.2020 в 14:27.
Старый 27.12.2020, 08:13   #9  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
1. Уже пробовал но еще раз сделал чтобы показать запрос до цикла.

total = SysQuery::countTotal(queryRun);

info(strFmt(queryRun.query().dataSourceNo(1).toString()));
if(total)
{

this.progressInit(this.caption(), total, "104.avi");

this.parmProgress().setText("Обработка данных");

while (queryRun.next())
{
Запрос
SELECT * FROM CustEtranInvoices(CustEtranInvoices_1) WHERE ((TypeRelationship = 0)) AND ((SendPost = 0)) AND ((TicketPost = 0)) AND ((EtranInvoiceState = 35) OR (EtranInvoiceState = 44) OR (EtranInvoiceState = 36) OR (EtranInvoiceState = 38) OR (EtranInvoiceState = 42) OR (EtranInvoiceState = 32) OR (EtranInvoiceState = 4))
Параметры
https://yadi.sk/i/aTvrYaxRSn4FNg
Старый 27.12.2020, 08:15   #10  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
2. Не забыл, версию изменяю при любом изменение Query.

Последний раз редактировалось Nick42; 27.12.2020 в 08:21.
Старый 27.12.2020, 08:34   #11  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
3. Тоже пробовал только иначе перекрытием метода allowSaveLast.
Старый 27.12.2020, 08:36   #12  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
4 Все верно 1 раз при смене версии заходит.
5 Все методы pack() и unpack() работают исправно.
Мне интересно почему после вызова расширенного фильтра и введение в него номера в 3 рисунке его обрезает на форме?
1 до https://yadi.sk/i/aTvrYaxRSn4FNg
2 во время https://yadi.sk/i/B9xhvHPelOzKeg
3 после нажатия ОК https://yadi.sk/i/Qm8h0XBDy5FdHQ

Последний раз редактировалось Nick42; 27.12.2020 в 08:41.
Старый 27.12.2020, 22:27   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,651 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Глубоко не копал, но, "на вскидку" сразу же наткнулся на ограничение количества отображаемых Range на форме диалога в классе \Classes\RunBaseDialogModify

X++:
// \Classes\RunBaseDialogModify\addQueryDatasource - здесь инициализация при открытии диалога

    // Add ranges defined in datasource
    while (curRangeFields <= #MAXRANGES && currentRange <= rangeCount)

(...)

// Add the specific element of the array field
// that has been specified by the query.

// Тут все правильно. Если поле то же самое, то счетчик curRangeFields не увеличивается

curRangeFields += this.addField(
		sysDictField, 
		fieldNameSet, 
		sysDictField.label(), 
		queryBuildRange.value());

(...)
Как следствие, при первом открытии формы - все значения на месте. Нигде ничего не потеряли.

Теперь жмем кнопку расширенного фильтра и после сохранения попадаем вот сюда

X++:
// \Classes\RunBaseDialogModify\updateQuery - это обновление после кнопки расширенного фильтра

        // Loop through the ranges for the data source.
        while (curRangeFields <= #MAXRANGES && currentRange <= rangeCount)

(...)

fieldNameEnabledSet  = this.addRangeAndFilterToDialog(
		sysDictField, 
		queryBuildRange.value(),
		fieldNameEnabledSet,
		dialogGroupTable,
		curRangeFields);

// И вот здесь безусловное увеличение счетчика
curRangeFields++;

(...)
И вот насколько я вижу, здесь счетчик curRangeFields увеличивается вне зависимости от того, есть уже это поле на форме или нет.

Т.е. отображать-то отображает, но не более указанного количества. По умолчанию, не более 8 Range. Причем в данном синтаксисе каждое значение пойдет как отдельный Range. Вот их и обрезали. Просто достигли предела цикла

Видимо, тут надо добавить проверку на количество элементов в возвращенном fieldNameEnabledSet. Т.е. цикл ограничить не переменной curRangeFields, а как-то так

X++:
        // Loop through the ranges for the data source.
        while (fieldNameEnabledSet.elements() <= #MAXRANGES && currentRange <= rangeCount)
Но это "на вскидку". Могу и ошибаться. Тут надо более внимательно анализировать метод \Classes\RunBaseDialogModify\updateQuery()
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 28.12.2020, 12:02   #14  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Попробуйте в методе initQuery в команде qbrCustEtranInvoices.value() передать сразу все значения через запятую. И опять увеличьте currentVersion. Т.е. передавайте значения перечисления сразу все через запятую, а не через новый range.
__________________
Мои утилиты для Аксапты версий 3.0-2012: http://aceofdatabase.blogspot.com/
Старый 28.12.2020, 12:10   #15  
Nick42 is offline
Nick42
Участник
 
12 / 10 (1) +
Регистрация: 11.06.2019
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Попробуйте в методе initQuery в команде qbrCustEtranInvoices.value() передать сразу все значения через запятую. И опять увеличьте currentVersion. Т.е. передавайте значения перечисления сразу все через запятую, а не через новый range.
Спасибо! Это я уже раньше сделал так работает если сделать его открытым и перечислить все элементы через запятую то работает на ура! Вопрос то почему так не работает а после урезания меняется Query. Хотя по строке запрос не урезан но строк не находит т.е. QueryRun пуст)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Performance - Analyzing key SQL Server configuration and database settings Blog bot DAX Blogs 0 28.09.2015 14:11
DAX: Microsoft Dynamics AX 2012 R3 is now available! Blog bot DAX Blogs 1 02.05.2014 23:00
DAX: How to gain additional value from the Microsoft application platform with Microsoft Dynamics AX 2012 R2 Blog bot DAX Blogs 3 21.06.2013 15:16
ax-erp: Get underlying SQL query using getSQLStatement [Dynamics AX 2012] Blog bot DAX Blogs 0 19.07.2012 18:11
Dynamics AX Sustained Engineering: Servicing of Dynamics AX 2012 and Dynamics AX 2012 Feature Pack Blog bot DAX Blogs 0 08.05.2012 23:12
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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