20.11.2007, 21:39 | #1 |
Участник
|
Query и Map
А возможно ли использовать Map в Query? Что-то с ходу не получилось...
Можно ли такой код переписать, используя Query/QueryRun? X++: CustVendTrans custVendTrans; VendTrans vendTrans; ; custVendTrans = vendTrans; while select AccountNum, sum(AmountMST) from custVendTrans group by AccountNum { print custVendTrans.AccountNum; } |
|
20.11.2007, 21:56 | #2 |
Banned
|
Query же и так динамический. Если нужно извратиться, сформируйте его интеллигентно, с использованием MappingsInfo_RU.
|
|
28.01.2013, 17:50 | #3 |
Участник
|
А подробнее?
Столкнулась с такой ситуацией: Есть мап, и есть запрос с группировкой. X++: //запись информации в таблицу логов void InsertLog(FactureJour_RU _fJour, FactureTransLines _fTrans, //map сопоставляющий FactureTrans_RU //и аналогичную таблицу, где поля называются по-другому str _calledFrom) { FactureTransLines factureTransLines=(_ftrans); ; this.FactureId = _fJour.FactureId; this.RefTableId = _ftrans.TableId; // так работает if (this.RefTableId == tableNum(FactureLines)) { this.ZEU_LineAmountMST = (select firstonly sum(ZEU_LineAmountMST) from factureLines where factureLines.ZEU_FactureId == _fjour.FactureId && factureLines.ZEU_Module == _fjour.Module).ZEU_LineAmountMST; } else { this.ZEU_LineAmountMST = (select firstonly sum(LineAmountMST) from factureTrans_RU where factureTrans_RU.FactureId == _fjour.FactureId && factureTrans_RU.Module == _fjour.Module).LineAmountMST; } //А так не работает. Ошибки нет, но запрос выдает нули /* this.ZEU_LineAmountMST = (select firstonly sum(LineAmountMST) from factureTransLines where factureTransLines.FactureId == _fjour.FactureId && factureTransLines.Module == _fjour.Module).LineAmountMST; */ this.CalledFrom = _calledFrom; this.insert(); } И сопутствующий вопрос: Как правильно из запроса получить сразу 3 переменные, как-нибудь так (т.е. не выполняя запрос для каждой переменной): X++: [s1,s2,s3] = (select firstonly sum( s1 ), sum( s2 ), sum( s3 ) from factureLines where factureLines.ZEU_FactureId == _fjour.FactureId); Последний раз редактировалось alicedr; 28.01.2013 в 18:32. |
|
28.01.2013, 22:07 | #4 |
Участник
|
Просто, таким образом селект не использует табличную переменную, определенную вами
Надо делать так X++: //запись информации в таблицу логов void InsertLog(FactureJour_RU _fJour, FactureTransLines _fTrans, //map сопоставляющий FactureTrans_RU //и аналогичную таблицу, где поля называются по-другому str _calledFrom) { FactureTransLines factureTransLines=(_ftrans); ; this.FactureId = _fJour.FactureId; this.RefTableId = _ftrans.TableId; select firstonly sum(LineAmountMST) from factureTransLines where factureTransLines.FactureId == _fjour.FactureId && factureTransLines.Module == _fjour.Module; this.ZEU_LineAmountMST = factureTransLines.LineAmountMST; this.CalledFrom = _calledFrom; this.insert(); } Цитата:
И сопутствующий вопрос: Как правильно из запроса получить сразу 3 переменные, как-нибудь так (т.е. не выполняя запрос для каждой переменной)
X++: select sum( s1 ), sum( s2 ), sum( s3 ) from factureLines where factureLines.ZEU_FactureId == _fjour.FactureId; s1 = factureLines.s1; s2 = factureLines.s2; s3 = factureLines.s3;
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: alicedr (1). |
29.01.2013, 15:24 | #5 |
Участник
|
а firstonly вместе с sum() точно правильно?
|
|
29.01.2013, 15:43 | #6 |
Участник
|
копипаст
не нужен он там, конечно
__________________
Axapta v.3.0 sp5 kr2 |
|
29.01.2013, 18:31 | #7 |
Участник
|
Согласна, firstonly там действительно не нужен
Усложняем задачу. X++: //qbds = query.addDataSource(tablenum(FactureTrans_RU)); qbds = query.addDataSource(tablenum(FactureTransLines)); //заменили на мап qbds.orderMode(OrderMode::GroupBy); qbds.addSelectionField(fieldnum(FactureTransLines, LineAmountMST), SelectionField::Sum); qbds.addRange(fieldnum(FactureTransLines, FactureId)).value(_factureJour.FactureId); qbds.addRange(fieldnum(FactureTransLines, Module)).value(SysQuery::value(_factureJour.Module)); // и другие addRange qr = new QueryRun(query); while(qr.next()) { factureTrans = qr.get(tablenum(FactureTransLines)); //разные действия } Аналогичная конструкция с просто таблицей, а не мапом, работает. |
|
29.01.2013, 18:53 | #8 |
Ищущий знания...
|
Цитата:
Сообщение от alicedr
Согласна, firstonly там действительно не нужен
Усложняем задачу. X++: //qbds = query.addDataSource(tablenum(FactureTrans_RU)); qbds = query.addDataSource(tablenum(FactureTransLines)); //заменили на мап qbds.orderMode(OrderMode::GroupBy); qbds.addSelectionField(fieldnum(FactureTransLines, LineAmountMST), SelectionField::Sum); qbds.addRange(fieldnum(FactureTransLines, FactureId)).value(_factureJour.FactureId); qbds.addRange(fieldnum(FactureTransLines, Module)).value(SysQuery::value(_factureJour.Module)); // и другие addRange qr = new QueryRun(query); while(qr.next()) { factureTrans = qr.get(tablenum(FactureTransLines)); //разные действия } Аналогичная конструкция с просто таблицей, а не мапом, работает. X++: info(qbds.toString());
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
29.01.2013, 18:55 | #9 |
Участник
|
И какую из двух замапленных таблиц вы ожидаете квери должен кверить?
|
|
29.01.2013, 19:43 | #10 |
Участник
|
Мап не содержит данных, данные хранятся в таблицах. Поэтому запросы работают корректно, возвращают пусто.
Если вы хотите сделать с помощью query, то воспользуйтесь советом EVGL - использование объекта MappingsInfo_RU. Посмотрите использование в стандарте метода MappingsInfo_RU::createMapWithFieldId. В вашем случае будет примерно так : X++: Map map = MappingsInfo_RU::createMapWithFieldId(_fTrans.TableId,tablenum(FactureTransLines)); ; ... qbds.query.addDataSource(_fTrans.tableId); if (map.exists(fieldIdpname(FactureTransLines, FactureId))) { qbds.addRange(map.lookup(fieldIdpname(FactureTransLines, FactureId))).value(_factureJour.FactureId) } ...
__________________
Sergey Nefedov Последний раз редактировалось SRF; 29.01.2013 в 19:47. |
|
|
За это сообщение автора поблагодарили: alicedr (1). |
Теги |
group by, map, query |
|
|