![]() |
#8 |
Участник
|
Моделируем ситуацию с переиспользованием упакованный и "красивого" Query из 9-ки в 12-ке.
Создаём 2 таблицы в 9-ке: - DimQueryPack, с полем value типа container. Хранит в себе упакованный query; - DimTableTest, с полем Dimension типа string (array) от EDT Dimension. Нужна для выверки (Dimension Id идентичный между версиями). Запускаем джоб в 9-ке: X++: static void JobDimQueryCreate_Ax5(Args _args) { DimQueryPack dqp; Query query; QueryBuildDataSource qbds; int code2ArrayIdx(SysDimension _sysDimension) { return new SysDictEnum(enumnum(SysDimension)).value2Index(_sysDimension) + 1; } select firstOnly RecId from dqp; if (!dqp.RecId) { query = new query(); query.literals(1); qbds = query.addDataSource(tableNum(DimTableTest)); qbds.addSelectionField(fieldNum(DimTableTest, Dimension)); //qbds.addRange(fieldNum(DimTableTest, RecId)).value(QueryBuildRangeCondition::create(qbds, fieldId2Name(tableNum(DimTableTest), fieldId2ext(fieldNum(DimTableTest, Dimension), 2))).value(QueryBuildRangeOperator::Equal, '1929').toString()); qbds.addRange(fieldNum(DimTableTest, RecId)).value( strFmt('(( %1.Dimension[2]=="1929" ))', qbds.name(), fieldid2name(tablenum(DimTableTest), fieldid2ext(fieldnum(DimTableTest, Dimension), code2ArrayIdx(SysDimension::Center))), SysQuery::value('1929') ) ); ttsBegin; dqp.initValue(); dqp.value = query.pack(); dqp.insert(); ttsCommit; } } X++: static void JobDimQueryCreate_Ax6(Args _args) { DimQueryPack dqp; ; ttsBegin; dqp.initValue(); dqp.insert(); ttsCommit; } Запускаем на обеих средах джоб: X++: static void JobDimTableTest(Args _args) { DimQueryPack dqp; DimTableTest dtt; QueryRun queryRun; ; select firstOnly RecId from dtt; if (!dtt.RecId) { ttsBegin; dtt.initValue(); dtt.Dimension[1] = '1929'; dtt.doInsert(); dtt.clear(); dtt.initValue(); dtt.Dimension[2] = '1929'; dtt.doInsert(); ttsCommit; } setPrefix(strFmt("Test")); while select dqp { queryRun = new SysQueryRun(dqp.value); if (queryRun.next()) { info(strFmt("%1", queryRun.get(tableNum(DimTableTest)).RecId)); } else { warning(strFmt("Нет записей")); } } } Наверняка есть и иной способ решения, например анализ и отладка низкоуровневых функций. Они начинаются с префикса qe (что в 9-ке, что в 12-ке). Например, при работе с функцией QueryBuildRange.value интересует функция qeRangeNode :: propChanged. Последний раз редактировалось Товарищ ♂uatr; 19.09.2025 в 01:25. |
|
Теги |
bug, extended query, extended query syntax |
|
|