24.09.2008, 20:53 | #1 |
Модератор
|
SUM по Amount в Query. С динамическими фильтрами по Grid
На форме есть Grid получающий данные из DS таблички.
Есть столбец Amount - сумма. Под Гридом есть контрол RealEdit- "Сумма всего". Как в него скидывать сумма по столбцу "Сумма" в зависимости от Фильтров, которые накладывает пользователь при работе с гридом. Какие пользователь наложет фильтры загадка. Понятно что надо сделать: 1) Создать Query, добавить addDataSource с такой же табличкой. 2) Скопировать Range у единственного DataSource формы, значение динамически меняющиеся от воли пользователя. 3) По полю Amount сделать addSelectionField с SelectionField::Sum 4) query.next() и взять результат по get и вывести это значение в RealEdit. Как лучше отслеживать измение в Range у DS формы и вовремя пересчитывать значение SUM? Какой правильный способ взять Range у DS? Вызываю собственный метод для расчета сумма из executeQuery() у DS формы. P.S. Grid должен так же отображать строки как и раньше.. |
|
24.09.2008, 21:53 | #2 |
Участник
|
|
|
24.09.2008, 22:48 | #3 |
Участник
|
Посмотрите, как реализован метод SysQuery::countPrim() и его вызов в SysQuery::countTotal().
Фактически, вам надо будет организовать только передачу идентификатора поля, по которому будет считаться сумма и задавать для него SelectionField с типом SUM. Обратите внимание, что в этом методе учитывается кол-во датасорсов в Query и если их больше единицы, то подсчет кол-ва идет путем пробега в цикле по всем записям датасорса. Что бы избежать этого, можно проверить наличие датасорсов, присоединенных по inner или outer join и для них так же сделать сброс настроек, а так же добавить в SelectionFields подсчет кол-ва по recId (или, вместо этого, добавить tableID) Еще, остается возможное наличие группировок, которые так же необходимо будет отключать Ну и сам подсчет будет заключаться в передаче в такой метод QueryRun().Query() вашего датасорса с формы, а его вызов вставить в QueryExecute() после super()
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 24.09.2008 в 22:54. |
|
25.09.2008, 13:49 | #4 |
Модератор
|
что то как то не совсем получается задачка
X++: display real mSumAll() { CashflowFactTrans_MCFR CFT; TransDate dateF,dateT; Query q =new Query(); QueryBuildDataSource qbds=q.addDataSource(tableNum(CashflowFactTrans_MCFR)), qbdsCopy; QueryRun qr; ; qbds=cashflowFactTrans_ds.queryRun().query().dataSourceNo(1); qbdsCopy=qbds; if(cashflowFactTrans_ds.queryRun().query().dataSourceNo(1).findRange(fieldnum(CashflowFactTrans_MCFR, recId))) { qbds.addRange(fieldnum(CashflowFactTrans_MCFR, recId)).value( cashflowFactTrans_ds.queryRun().query().dataSourceNo(1).findRange(fieldnum(CashflowFactTrans_MCFR, recId)).value()); } qbds.addSelectionField(fieldNum(CashflowFactTrans_MCFR, Amount), SelectionField::Sum); qr= new QueryRun(q); qr.next(); CFT = qr.get(tableNum(CashflowFactTrans_MCFR)); // qbds=qbdsCopy; //qr.next(); return CFT.Amount; } X++: public void executeQuery() { super(); SumAll.realValue(element.mSumAll()); } |
|
25.09.2008, 13:57 | #5 |
Участник
|
|
|
25.09.2008, 14:19 | #6 |
NavAx
|
X++: display real mSumAll() { CashflowFactTrans_MCFR CFT; Query q =new Query(cashflowFactTrans_ds.queryRun().query()); ; qbds=q.dataSourceNo(1); qbds.addSelectionField(fieldNum(CashflowFactTrans_MCFR, Amount), SelectionField::Sum); qr= new QueryRun(q); qr.next(); CFT = qr.get(tableNum(CashflowFactTrans_MCFR)); return CFT.Amount; } |
|
25.09.2008, 15:33 | #7 |
Модератор
|
Проблемка то скорее не в том что считается. А в том что Grid сворачивается.
Считает то все отлично. И моим способом. Просто мне надо обойти проблему, чтоб и DS формы для Grida не суммировался X++: display real mSumAll2() { CashflowFactTrans_MCFR CFT; Query q =new Query(cashflowFactTrans_ds.queryRun().query()); QueryBuildDataSource qbds; QueryRun qr; ; qbds=q.dataSourceNo(1); qbds.addSelectionField(fieldNum(CashflowFactTrans_MCFR, Amount), SelectionField::Sum); qr= new QueryRun(q); qr.next(); CFT = qr.get(tableNum(CashflowFactTrans_MCFR)); return CFT.Amount; } |
|
25.09.2008, 15:42 | #8 |
Участник
|
Цитата:
X++: //Query q =new Query(cashflowFactTrans_ds.queryRun().query()); Query q = new Query(cashflowFactTrans_ds.queryRun().query().pack()); ; |
|
|
За это сообщение автора поблагодарили: Poleax (1). |
25.09.2008, 16:04 | #9 |
Модератор
|
Да да да.. именно .pack()
Респект Lemming |
|
|
Похожие темы | ||||
Тема | Ответов | |||
select sum(amount) | 33 | |||
select sum(amount) from временная таблица | 6 | |||
query grid | 16 | |||
query->DataSource->grid | 2 | |||
Query to Grid ? | 4 |
|