02.05.2008, 00:06 | #1 |
Участник
|
разная скорость отработки display методов на источнике данных формы
Делаю форму DynLinkCustTransForm с двумя связанными источниками данных CustTable -> CustTrans, расквартированными на двух гридах: сверху прыгаю по строкам заказчиков - соответственно внизу отображаются их транзакции, дата и сумма.
Определяю табличный буфер: X++: public class FormRun extends ObjectRun { CustTrans ctr; } X++: display AmountCurDebCred getTotalAmountCur() { ; select sum(AmountCur) from ctr where ctr.AccountNum == CustTrans.AccountNum; return ctr.AmountCur; } X++: display AmountCurDebCred getTotalAmountCur2() { ; select sum(AmountCur) from ctr where ctr.AccountNum == CustTable.AccountNum; return ctr.AmountCur; }
__________________
Felix nihil admirari |
|
02.05.2008, 01:12 | #2 |
Участник
|
Попробуйте сделать так:
X++: display AmountCurDebCred getTotalAmountCur(CutsTrans _curCustTrans) { ; select sum(AmountCur) from ctr where ctr.AccountNum == _curCustTrans.AccountNum; return ctr.AmountCur; } X++: display AmountCurDebCred getTotalAmountCur(CustTable _curCustTable) { ; select sum(AmountCur) from ctr where ctr.AccountNum == _curCustTable.AccountNum; return ctr.AmountCur; } Не уверен что будет работать быстрее, но так по крайней мере идеологически правильнее.
__________________
С уважением, Dozer |
|
02.05.2008, 07:19 | #3 |
Участник
|
Цитата:
Сообщение от Dozer
Попробуйте сделать так:
X++: display AmountCurDebCred getTotalAmountCur(CutsTrans _curCustTrans) Не уверен что будет работать быстрее, но так по крайней мере идеологически правильнее. и вопрос второй, а зачем тут вообще нужна привязка к источнику данных, если выборка идёт по табличному буферу, а торможение как раз в случае, когда AccountNum берётся не по текущему источнику? именно идеология интересует.
__________________
Felix nihil admirari |
|
02.05.2008, 11:57 | #4 |
Боец
|
Цитата:
а разве в дисплей-методы можно передавать параметры?
X++: ... where ctr.AccountNum == CustTrans.AccountNum; Второй вопрос не понял Да, ещё если есть проблемы с производительностью, то в Вашем случае ничего не мешает дисплэй методы закэшировать, но для этого они должны находиться на таблице, а не на датасорсе. Последний раз редактировалось DSPIC; 02.05.2008 в 12:04. |
|
02.05.2008, 12:01 | #5 |
Участник
|
Да, в дисплей методы можно передавать параметры - точнее один параметр, и только в том случае, если дисплей метод объявлен на источнике данных формы.
Привязка к источнику данных нужна, чтобы дисплей метод правильно работал при помещении его в грид (в противном случае, у вас значения во всех строках будут одинаковыми) Предположу, почему наблюдается поведение, указанное Вами в первом после - возможно на источниках данных установлен тип связи Delayed. Это значит, что перед тем, как производится выборка записей из CustTrans, должно пройти определенное время. Видимо, дисплей метод на это реагирует тоже. Попробуйте изменить тип связи на Active и расскажите, какие результаты получились. |
|
05.05.2008, 19:59 | #6 |
Участник
|
Цитата:
Сообщение от kashperuk
Да, в дисплей методы можно передавать параметры - точнее один параметр, и только в том случае, если дисплей метод объявлен на источнике данных формы.
Привязка к источнику данных нужна, чтобы дисплей метод правильно работал при помещении его в грид (в противном случае, у вас значения во всех строках будут одинаковыми) Предположу, почему наблюдается поведение, указанное Вами в первом после - возможно на источниках данных установлен тип связи Delayed. Это значит, что перед тем, как производится выборка записей из CustTrans, должно пройти определенное время. Видимо, дисплей метод на это реагирует тоже. Попробуйте изменить тип связи на Active и расскажите, какие результаты получились.
__________________
Felix nihil admirari |
|
05.05.2008, 21:00 | #7 |
Member
|
А как вы замеряете скорость?
__________________
С уважением, glibs® |
|
05.05.2008, 21:23 | #8 |
Участник
|
спасибо за вопрос! он как раз кстати, так как замерял на глаз, а сейчас задумался, как сделать по науке.
__________________
Felix nihil admirari |
|
05.05.2008, 21:30 | #9 |
Member
|
Вопрос возник из-за того, что насколько я понял, в СУБД уходят два одинаковых запроса. Второй может объективно отрабатывать быстрее из-за кэширования.
В общем, опишите почетче что вы там в дизайне формы натворили. И будет ли скорость отработки запроса изменяться, если по очереди оставить одно из полей на форме. А замерить скорость можно либо с помощью встроенных средств мониторинга запросов к БД, либо с помощью профайлера кода (в более тяжелых случаях).
__________________
С уважением, glibs® |
|
05.05.2008, 22:12 | #10 |
Участник
|
Даже с Active, перед тем, как на сервер отсылается запрос для обработки дисплей метода, должен выполнится запрос для выборки строк. Из-за этого, вероятно, и задержка.
|
|
05.05.2008, 23:53 | #11 |
Участник
|
\Forms\DynLinkCustTransForm\Designs\Design\[Group:Group]\[Group:Group2]\RealEdit:getTotalAmountCurByCustTable (DS: CustTable)
\Forms\DynLinkCustTransForm\Data Sources\CustTable\Methods\getTotalAmountCurByCustTable ------------------------------------------------------------------------------------------------------------------------------------------------ X++: display AmountCurDebCred getTotalAmountCurByCustTable(CustTable _CustTable) { ; select sum(AmountCur) from ctr where ctr.AccountNum == _CustTable.AccountNum; return ctr.AmountCur; } \Forms\DynLinkCustTransForm\Data Sources\CustTrans\Methods\getTotalAmountCurByCustTrans ------------------------------------------------------------------------------------------------------------------------------------------------ X++: display AmountCurDebCred getTotalAmountCurByCustTrans(CustTrans _CustTrans) { ; select sum(AmountCur) from ctr where ctr.AccountNum == _CustTrans.AccountNum; return ctr.AmountCur; } \Forms\DynLinkCustTransForm\Data Sources\CustTrans\Methods\getTotalAmountCurByCustTable ---------------------------------------------------------------------------------------------------------------------------------------------- X++: display AmountCurDebCred getTotalAmountCurByCustTable() { ; select sum(AmountCur) from ctr where ctr.AccountNum == CustTable.AccountNum; return ctr.AmountCur; } \Data Dictionary\Tables\CustTable\Methods\totalAmountCur -------------------------------------------------------------------------------------- X++: display AmountCur totalAmountCur() { CustTrans custTrans; ; select sum (AmountCur) from custTrans where custTrans.AccountNum == this.accountnum; return custTrans.AmountCur; }
__________________
Felix nihil admirari |
|