|  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). | |