|
|
#1 |
|
Участник
|
SQL в QueryBuildDataSource
Доброго времени суток!
Пытаюсь разобраться с Query и QueryBuildDataSource в Х++. Есть SQL запрос такого вида: PHP код:
PHP код:
Вот мой код X++: Query q;
QueryBuildDataSource qbMA;
QueryBuildDataSource qbDAVC;
QueryBuildDataSource qbDH;
QueryBuildDataSource qbDHL;
QueryBuildDataSource qbDA;
q = new Query();
qbMA = q.addDataSource(tablenum(MainAccount));
qbMA.relations(false);
qbDAVC = qbMA.addDataSource(tablenum(DimensionAttributeValueCombination));
qbDAVC.relations(false);
qbDAVC.addLink(fieldNum(DimensionAttributeValueCombination,MainAccount),fieldNum(MainAccount,RecId));
qbDAVC.joinMode(JoinMode::InnerJoin);
qbDH = qbDAVC.addDataSource(tablenum(DimensionHierarchy));
qbDH.relations(false);
qbDH.addLink(fieldNum(DimensionHierarchy,RecId),fieldNum(DimensionAttributeValueCombination,AccountStructure));
qbDH.joinMode(JoinMode::InnerJoin);
qbDHL = qbDH.addDataSource(tablenum(DimensionHierarchyLevel));
qbDHL.relations(false);
qbDHL.addLink(fieldNum(DimensionHierarchyLevel,DimensionHierarchy),fieldNum(DimensionHierarchy,RecId));
qbDHL.joinMode(JoinMode::InnerJoin);
qbDA = qbDHL.addDataSource(tablenum(DimensionAttribute));
qbDA.relations(false);
qbDA.addLink(fieldNum(DimensionAttribute,RecId),fieldNum(DimensionHierarchyLevel,DimensionAttribute));
qbDA.joinMode(JoinMode::InnerJoin); |
|
|
|
|
#2 |
|
Дмитрий Ерин
|
Первое, что бросилось в глаза - в .addLink() параметры перепутаны. Там должно быть сначала parent, потом - this. У Вас вроде наоборот.
|
|
|
|
|
#3 |
|
Участник
|
А что насчет условий выборки?
|
|
|
|
|
#4 |
|
Участник
|
X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value("632.000"); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value("Поставщик"); В общем случае, для задания значений лучше использовать статический метод SysQuery::value("Поставщик"), который конвертирует любой тип данных в нужную символьную строку. Но здесь это не обязательно. Хотя для порядка можно так X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value(SysQuery::value("632.000")); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value(SysQuery::value("Поставщик")); Обратите внимание, что AddRange() выполняется на том DataSource к которому относятся поля с условиями. Цитата:
Сообщение от syl
как его выполнить и узнать результат (меня интересует факт наличия строк удовлетворяющих условия запроса а не сами строки)?
X++: queryRun = new QueryRun(q); if (queryRun.next()) { // Есть хотя бы одна запись, удовлетворяющая условиям выборки }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
|
| За это сообщение автора поблагодарили: syl (1). | |
|
|
#5 |
|
Участник
|
Цитата:
Сообщение от Владимир Максимов
X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value("632.000"); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value("Поставщик"); В общем случае, для задания значений лучше использовать статический метод SysQuery::value("Поставщик"), который конвертирует любой тип данных в нужную символьную строку. Но здесь это не обязательно. Хотя для порядка можно так удобно просто) хотя и не всегда бывает нужным.И строковые величины лучше бы метками или же макросами на худой конец, чтобы БП не ругался (переработал я с БП, да ) |
|
|
|
|
#6 |
|
Участник
|
X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value("632.000"); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value("Поставщик"); А с этим кодом все ОК ) X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value(SysQuery::value("632.000")); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value(SysQuery::value("Поставщик")); X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value(SysQuery::value("632.000")); X++: SELECT * FROM MainAccount(MainAccount_1) WHERE ((MainAccountId = N'632.000')) ... Последний раз редактировалось syl; 02.09.2015 в 10:12. |
|
|
|
|
#7 |
|
Участник
|
Как оказалось, в Ax2012 метод SysQuery::value() выполняет разбор символьной строки и экранирует ряд спец.символов наклонной чертой. В данном случае, экранируется символ точки в значении "632.000"
X++: SELECT * FROM MainAccount(MainAccount_1) WHERE ((MainAccountId = N'632\.000')) ... PS: Кстати, проверил. Действительно, без экранировки спец.символов через SysQuery::value() соответствующие значения не находятся в таблице. Ошибок не возникает, просто запись не находит...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 02.09.2015 в 16:18. |
|
|
|
| За это сообщение автора поблагодарили: AlGol (2). | |
|
|
|