01.09.2015, 17:16 | #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); |
|
01.09.2015, 17:49 | #2 |
Дмитрий Ерин
|
Первое, что бросилось в глаза - в .addLink() параметры перепутаны. Там должно быть сначала parent, потом - this. У Вас вроде наоборот.
|
|
01.09.2015, 17:59 | #3 |
Участник
|
А что насчет условий выборки?
|
|
01.09.2015, 20:08 | #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). |
01.09.2015, 21:50 | #5 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
X++: qbMA.addRange(fieldnum(MainAccount, MainAccountId)).value("632.000"); qbDA.addRange(fieldnum(DimensionAttribute, Name)).value("Поставщик"); В общем случае, для задания значений лучше использовать статический метод SysQuery::value("Поставщик"), который конвертирует любой тип данных в нужную символьную строку. Но здесь это не обязательно. Хотя для порядка можно так И строковые величины лучше бы метками или же макросами на худой конец, чтобы БП не ругался (переработал я с БП, да ) |
|
02.09.2015, 09:56 | #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. |
|
02.09.2015, 15:58 | #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). |
|
|