AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.05.2008, 00:06   #1  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
разная скорость отработки display методов на источнике данных формы
Делаю форму DynLinkCustTransForm с двумя связанными источниками данных CustTable -> CustTrans, расквартированными на двух гридах: сверху прыгаю по строкам заказчиков - соответственно внизу отображаются их транзакции, дата и сумма.

Определяю табличный буфер:

X++:
public class FormRun extends ObjectRun
{
    CustTrans       ctr;
}
Добавляю на форму два поля для отображения суммы всех транзакций текущего клиента и рисую для них два display метода на источнике данных CustTrans:

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;
}
Так вот, невооружённым глазом видно, что второе поле отрисовывается намного быстрее первого. Почему? Ведь, если я правильно понимаю, CustTable уже отфильтрован по текущему значению AccountNum?
__________________
Felix nihil admirari
Старый 02.05.2008, 01:12   #2  
Dozer is offline
Dozer
Участник
AxAssist
Соотечественники
 
107 / 24 (1) +++
Регистрация: 16.11.2004
Адрес: г. Калгари, Канада
Попробуйте сделать так:
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  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Dozer Посмотреть сообщение
Попробуйте сделать так:
X++:
display AmountCurDebCred getTotalAmountCur(CutsTrans _curCustTrans)
и разместите их на разных датасоурсах соответственно параметру, а на полях кроме названия дисплей метода укажите используемый датасоурс, и сравните еще раз.
Не уверен что будет работать быстрее, но так по крайней мере идеологически правильнее.
а разве в дисплей-методы можно передавать параметры?

и вопрос второй, а зачем тут вообще нужна привязка к источнику данных, если выборка идёт по табличному буферу, а торможение как раз в случае, когда AccountNum берётся не по текущему источнику?

именно идеология интересует.
__________________
Felix nihil admirari
Старый 02.05.2008, 11:57   #4  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
а разве в дисплей-методы можно передавать параметры?
если дисплэй метод находится на датасорсе, то в качестве параметра можно (а в вашем случае нужно) указывать таблицу этого датасорса. Но ещё лучше эти методы перенести на таблицу (тогда параметр указывать не нужно, да и нельзя). Если дисплэй метод написан на датасорсе, то при вызове его туда автоматически передается тот буфер таблицы, который в данный момент перерисовывается на форме. Если же этот параметр не использовать, а брать
X++:
... where ctr.AccountNum == CustTrans.AccountNum;
, то CustTrans - это активный курсор, который одинаков до тех пор пока пользователь не перепраыгнет на другую запись в форме. Т.е. если использовать этот вариант, то у Вас в гриде отобразится одна и та же сумма для всех записей в гриде. Поэтому обязательно использовать буфер из параметра дисплэй метода, а не брать курсорный буфер (как и показал Dozer )

Второй вопрос не понял

Да, ещё если есть проблемы с производительностью, то в Вашем случае ничего не мешает дисплэй методы закэшировать, но для этого они должны находиться на таблице, а не на датасорсе.

Последний раз редактировалось DSPIC; 02.05.2008 в 12:04.
Старый 02.05.2008, 12:01   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да, в дисплей методы можно передавать параметры - точнее один параметр, и только в том случае, если дисплей метод объявлен на источнике данных формы.

Привязка к источнику данных нужна, чтобы дисплей метод правильно работал при помещении его в грид (в противном случае, у вас значения во всех строках будут одинаковыми)

Предположу, почему наблюдается поведение, указанное Вами в первом после - возможно на источниках данных установлен тип связи Delayed. Это значит, что перед тем, как производится выборка записей из CustTrans, должно пройти определенное время. Видимо, дисплей метод на это реагирует тоже. Попробуйте изменить тип связи на Active и расскажите, какие результаты получились.
Старый 05.05.2008, 19:59   #6  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Да, в дисплей методы можно передавать параметры - точнее один параметр, и только в том случае, если дисплей метод объявлен на источнике данных формы.

Привязка к источнику данных нужна, чтобы дисплей метод правильно работал при помещении его в грид (в противном случае, у вас значения во всех строках будут одинаковыми)

Предположу, почему наблюдается поведение, указанное Вами в первом после - возможно на источниках данных установлен тип связи Delayed. Это значит, что перед тем, как производится выборка записей из CustTrans, должно пройти определенное время. Видимо, дисплей метод на это реагирует тоже. Попробуйте изменить тип связи на Active и расскажите, какие результаты получились.
изменение на актив, конечно, немного ускоряет, но сути не меняет - второй вариант так же отрабатывает быстрее первого.
__________________
Felix nihil admirari
Старый 05.05.2008, 21:00   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
А как вы замеряете скорость?
__________________
С уважением,
glibs®
Старый 05.05.2008, 21:23   #8  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от glibs Посмотреть сообщение
А как вы замеряете скорость?
спасибо за вопрос! он как раз кстати, так как замерял на глаз, а сейчас задумался, как сделать по науке.
__________________
Felix nihil admirari
Старый 05.05.2008, 21:30   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Вопрос возник из-за того, что насколько я понял, в СУБД уходят два одинаковых запроса. Второй может объективно отрабатывать быстрее из-за кэширования.

В общем, опишите почетче что вы там в дизайне формы натворили. И будет ли скорость отработки запроса изменяться, если по очереди оставить одно из полей на форме.

А замерить скорость можно либо с помощью встроенных средств мониторинга запросов к БД, либо с помощью профайлера кода (в более тяжелых случаях).
__________________
С уважением,
glibs®
Старый 05.05.2008, 22:12   #10  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Даже с Active, перед тем, как на сервер отсылается запрос для обработки дисплей метода, должен выполнится запрос для выборки строк. Из-за этого, вероятно, и задержка.
Старый 05.05.2008, 23:53   #11  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
\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\Designs\Design\[Group:Group]\[Group:Group2]\RealEdit:getTotalAmountCurByCustTrans (DS: CustTrans)
\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\Designs\Design\[Group:Group]\[Group:Group2]\RealEdit:getTotalAmountCurByCustTable1 (DS: CustTrans)
\Forms\DynLinkCustTransForm\Data Sources\CustTrans\Methods\getTotalAmountCurByCustTable
----------------------------------------------------------------------------------------------------------------------------------------------
X++:
display AmountCurDebCred getTotalAmountCurByCustTable()
{
    ;
    select sum(AmountCur) from ctr
        where ctr.AccountNum == CustTable.AccountNum;

    return ctr.AmountCur;
}
\Forms\DynLinkCustTransForm\Designs\Design\[Group:Group]\[Group:Group2]\RealEdit:totalAmountCur (DS: CustTable)
\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
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Изменение свойства Table источника данных формы vasiliy DAX: Программирование 6 26.04.2005 12:16
Обновление данных формы из другой формы DiZ DAX: Программирование 4 14.10.2004 11:39
Метод findValue у источника данных формы demID DAX: Программирование 3 01.10.2004 10:19
Display-метод формы Paul_ST DAX: Программирование 6 11.02.2004 12:14
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:58.