08.10.2012, 16:25 | #1 |
Участник
|
Запрос одного отчета присутствует в другом
Надеюсь это в эту ветку.
Обнаружена следующая бага. Имеются два класса, наследники RunBase, построения отчета. Строят по одинаковым таблицам, но выводят разные данные. При сохранении запроса в одно отчете, он виден в другом. Не могу понять в чем причина. |
|
08.10.2012, 16:44 | #2 |
Ищущий знания...
|
Цитата:
например: X++: query.name(classstr(MyReportClass));
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: Dimitry (1). |
08.10.2012, 17:02 | #3 |
Участник
|
Понял... Спасибо.
Придется создавать кверики, а то они у меня в классе прописаны. |
|
08.10.2012, 17:12 | #4 |
Ищущий знания...
|
А можно поподробней? Как в классе прописаны?
Идеально было бы пример привести
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
08.10.2012, 17:16 | #5 |
Участник
|
Вот в одном классе:
(на подобии в другом) X++: public void initParmDefault() { QueryBuildDataSource qbdsTrans, qbdsPosting; QueryBuildRange qbr; ; super(); query = new Query(); qbdsTrans = query.addDataSource(tableNum(InventTrans)); qbdsTrans.addRange(fieldNum(InventTrans,DateFinancial)); qbr = qbdsTrans.addRange(fieldNum(InventTRans, TransType)); qbr.value(queryValue(InventTransType::Sales)); qbr.status(RangeStatus::Locked); qbdsTrans.addGroupByField(fieldNum(InventTRans,TransRefId)); //qbdsTrans.addGroupByField(fieldNum(InventTRans,DatePhysical)); qbdsTrans.addGroupByField(fieldNum(InventTRans,DateFinancial)); qbdsTrans.addGroupByField(fieldNum(InventTRans,InvoiceId)); qbdsTrans.addSelectionField(fieldNum(InventTRans,Qty), SelectionField::Sum); qbdsTrans.addSelectionField(fieldNum(InventTRans,TaxAmountPhysical), SelectionField::Sum); qbdsPosting = qbdsTrans.addDataSource(tableNum(InventTransPosting)); //qbdsPosting.addRange(fieldNum(InventTransPosting, InventTransPostingType)).value(queryValue(InventTransPostingType::Physical)); qbdsPosting.addRange(fieldNum(InventTransPosting, InventTransPostingType)).value(queryValue(InventTransPostingType::Financial)); //qbdsPosting.addLink(fieldNum(InventTRans,DatePhysical), fieldNum(InventTransPosting, TransDate)); qbdsPosting.addLink(fieldNum(InventTRans,DateFinancial), fieldNum(InventTransPosting, TransDate)); qbdsPosting.addLink(fieldNum(InventTRans,Voucher), fieldNum(InventTransPosting, Voucher)); qbdsPosting.addLink(fieldNum(InventTRans,InventTransId), fieldNum(InventTransPosting, InventTransId)); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),1), SelectionField::Max); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),2), SelectionField::Max); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),8), SelectionField::Max); queryRun = new SysQueryRun(query); } |
|
08.10.2012, 17:24 | #6 |
Ищущий знания...
|
Цитата:
Сообщение от Dimitry
Вот в одном классе:
(на подобии в другом) X++: public void initParmDefault() { QueryBuildDataSource qbdsTrans, qbdsPosting; QueryBuildRange qbr; ; super(); query = new Query(); qbdsTrans = query.addDataSource(tableNum(InventTrans)); qbdsTrans.addRange(fieldNum(InventTrans,DateFinancial)); qbr = qbdsTrans.addRange(fieldNum(InventTRans, TransType)); qbr.value(queryValue(InventTransType::Sales)); qbr.status(RangeStatus::Locked); qbdsTrans.addGroupByField(fieldNum(InventTRans,TransRefId)); //qbdsTrans.addGroupByField(fieldNum(InventTRans,DatePhysical)); qbdsTrans.addGroupByField(fieldNum(InventTRans,DateFinancial)); qbdsTrans.addGroupByField(fieldNum(InventTRans,InvoiceId)); qbdsTrans.addSelectionField(fieldNum(InventTRans,Qty), SelectionField::Sum); qbdsTrans.addSelectionField(fieldNum(InventTRans,TaxAmountPhysical), SelectionField::Sum); qbdsPosting = qbdsTrans.addDataSource(tableNum(InventTransPosting)); //qbdsPosting.addRange(fieldNum(InventTransPosting, InventTransPostingType)).value(queryValue(InventTransPostingType::Physical)); qbdsPosting.addRange(fieldNum(InventTransPosting, InventTransPostingType)).value(queryValue(InventTransPostingType::Financial)); //qbdsPosting.addLink(fieldNum(InventTRans,DatePhysical), fieldNum(InventTransPosting, TransDate)); qbdsPosting.addLink(fieldNum(InventTRans,DateFinancial), fieldNum(InventTransPosting, TransDate)); qbdsPosting.addLink(fieldNum(InventTRans,Voucher), fieldNum(InventTransPosting, Voucher)); qbdsPosting.addLink(fieldNum(InventTRans,InventTransId), fieldNum(InventTransPosting, InventTransId)); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),1), SelectionField::Max); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),2), SelectionField::Max); qbdsPosting.addSelectionField(fieldId2ext(fieldNum(InventTransPosting, Dimension),8), SelectionField::Max); queryRun = new SysQueryRun(query); } X++: query = new Query(); X++: query.name(classstr()); P.S. только это надо сделать и во втором классе... да и вообще лучше это делать во всех классах где формируете запросы в коде, что бы в будущем аксапта находила нужный запрос в кэше по имени
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 08.10.2012 в 17:26. |
|
08.10.2012, 17:34 | #7 |
Участник
|
Спасибо. Помогло.
|
|
08.10.2012, 17:43 | #8 |
Участник
|
Цитата:
Сообщение от lev
можете прям здесь после строки:
X++: query = new Query(); X++: query.name(classstr()); P.S. только это надо сделать и во втором классе... да и вообще лучше это делать во всех классах где формируете запросы в коде, что бы в будущем аксапта находила нужный запрос в кэше по имени X++: query.name(classstr()); Может быть все таки проблема в другом? |
|
08.10.2012, 17:47 | #9 |
Ищущий знания...
|
Цитата:
проверено на своем опыте. всегда использовал, когда формировал в коде запросы, которые выводятся пользователям в диалоге. проблема, которая возникает, если не именовать запросы, описана в первом посте автора темы.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
08.10.2012, 20:53 | #10 |
Участник
|
Надеюсь, Вы в курсе, что initParmDefault() выполняется только в том случае, если в кеше ничего не было найдено. Это значит, что если Вы хотя бы раз выполнили Ваш отчет, то он попал в кеш и все последующие запуски запрос будет браться из кеша, а все то, что написано в initParmDefault() будет игнорироваться. Точнее, initParmDefault() просто не будет выполняться. Разумеется, если Вы реализовали кеширование Вашего запроса в методах pack/unpack.
Как следствие, в случае модификации структуры Query в методе initParmDefault() необходимо либо очистить кеш по данному классу, либо увеличить значение константы CurrentVersion в методе classDeclaration. Кроме того, если Вы создали класс как наследнико от RunBaseReport, то возможны дополнительные "заморчки" связанные с кешированием собственно отчета.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
08.10.2012, 21:26 | #11 |
Участник
|
Цитата:
Описанный прием просто явным образом присваивает уникальное имя Query и подобной не однозначности не возникает. Если же сделать сохранение query в кеше явным образом в методах pack/unpack, то уже не имеет значения, будет ли query автоматически сохраняться или нет. Он будет браться из кеша класса, а не из кеша query. Вне зависимости от его имени.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: dn (1), Pustik (3), ice (1). |