06.04.2007, 12:23 | #1 |
MCTS
|
Grid и display-метод
Здравствуйте!
Помогите разобраться. Понимаю что вопрос ламерский, но... Возник вопрос по работе с display-методами. display-метод на гриде. Итак, как известно, display-методы определяемые на источнике данных формы, имеют источник данных в качестве параметра: display IventQty method1(MyTable _myTable) В некоем методе на источнике данных рассчитываются несколько параметров, например: X++: void calculate(MyTable _myTable)
{
var1+=_myTable.blahBlah1;
var2+=_myTable.blahBlah2;
var3+=_myTable.blahBlah3;
} X++: display IventQty displayVar1(MyTable _myTable) { this.calculate(_myTable); return var1; } display IventQty displayVar2(MyTable _myTable) { this.calculate(_myTable); return var2; } display IventQty displayVar3(MyTable _myTable) { this.calculate(_myTable); return var3; } Выскажите своё мнение, pls.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
06.04.2007, 12:26 | #2 |
Moderator
|
Он будет вызываться не 3, а 333 раза - при каждом обновлении формы и срабатывании display. В результате получите ерунду.
__________________
Андрей. |
|
06.04.2007, 12:31 | #3 |
MCTS
|
Цитата:
В результате получите ерунду
А как в таком случае избежать множественный вызов рассчитывающей функции?
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
06.04.2007, 12:42 | #4 |
Banned
|
|
|
|
За это сообщение автора поблагодарили: Geo (1). |
06.04.2007, 12:42 | #5 |
Moderator
|
Ну, для начала предлагаю обсудить не реализацию, а задачу
__________________
Андрей. |
|
06.04.2007, 13:02 | #6 |
MCTS
|
Задача собственно и обозначена в первом посте.
Если свести её к двум словам, то: есть некий метод, который рассчитывает сразу несколько параметров. Эти параметры надо потом отобразить в гриде. Хотелось бы, чтобы при каждом обращении к строке рассчётный метод вызывался один раз. Однако из-за того, чтобы дисплей-метод на форме корректно отображал данные, ему (дисплей-методу) необходимо передавать источник данных, и каждый раз результат перерассчитывать. За примером далеко ходить не надо. Берём первую попавшуюся на глаза форму AssetSum X++: display AssetDisposalScrap budgetDisposalScrapValue() { return assetSumBudget.disposalScrapValue(); } X++: AmountMST disposalScrapValue()
{
this.[B]calc[/B]();
return disposalScrapValue;
} Эту тему я завёл только из опасений, что я что-то не улавливаю. Однако мои худшие предположения подтверждаются. При выводе параметра, каждый раз будет вызываться рассчётный метод.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
06.04.2007, 13:11 | #7 |
Участник
|
|
|
06.04.2007, 21:55 | #8 |
Участник
|
Цитата:
Сообщение от otkudao
посмотрите, как вычисляются дисплей-методы на закладке Проводки формы SalesTable (написано EVGL)
Идея: на сервере выполняется 1 метод для каждой строки. Метод возвращает контейнер значений. Которые присваиваются локальным переменным формы. Которые выводятся локальными дисплей-методами формы. усе + для Grid не катит, а вопрос как раз про это. |
|
07.04.2007, 10:47 | #9 |
Участник
|
Цитата:
|
|
07.04.2007, 12:25 | #10 |
Участник
|
Array vs Map
Вообще, это похожие структуры - коллекции. Насколько можно судить из работы класса Array, при вставке записи по большому индекску, генерируются дефолтные значения для всех индексов с незаполненными значениями до него. То есть если в качестве индекса для массива использовать recId текущей записи (потому что нам все таки нужно уникальная идентификация строки), то массив будет всегда получаться очень большой. Можно выполнить нижеприведенный job для сравнения. И как говорится, извините, если Ваша Ахапта упадёт из-за Out of Memory во втором случае X++: static void Job35(Args _args) { Array arr = new Array(Types::Integer); Map map = new Map(Types::Integer, Types::Integer); ; map.insert(92332432, 32432); print "map inserted"; pause; print map.lookup(92332432); print map.exists(32432); print map.exists(1); pause; arr.value(92332432, 32432); print "Array inserted"; pause; print arr.value(32432); print arr.value(1); print arr.exists(250); pause; } С Map таких проблем нет, так как мы сами указываем тип ключевого поля. и они вставляются последовательно (сортированно), и значение ключевого поля не пугает величиной. ------ Но, и в том и в другом случае при переходе между строками, необходимо делать проверку существования значения, что сказывается на производительности. + кушает память (при большом кол-ве записей, если мы пройдемся по ним) Я использую Map, когда необходимо выбрать небольшое кол-во значений. Но это - IMHO. Последний раз редактировалось kashperuk; 07.04.2007 в 12:42. Причина: Добавил шутку :) |
|
|
За это сообщение автора поблагодарили: belugin (6). |
07.04.2007, 15:35 | #11 |
Administrator
|
Да уж. Ответили бы сначала человеку, а потом бы рассуждали. При чем тут Array?! При чем тут Map?!
Russland, Вы правильный пример нашли (я имеею ввиду форму AssetSum). Только смотрите, метод calc() - это метод класса AssetSum (точнее, одного из двух его наследников). И если в него посмотреть, то увидим: X++: void calc() { ... if (calculated) { return; }
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
07.04.2007, 16:09 | #12 |
Участник
|
Цитата:
С Map таких проблем нет, так как мы сами указываем тип ключевого поля. и они вставляются последовательно (сортированно), и значение ключевого поля не пугает величиной.
|
|
07.04.2007, 17:40 | #13 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Да уж. Ответили бы сначала человеку, а потом бы рассуждали. При чем тут Array?! При чем тут Map?!
Цитата:
Сообщение от Maxim Gorbunov
X++: void calc() { ... if (calculated) { return; } |
|
07.04.2007, 18:24 | #14 |
Administrator
|
Ed1K, первоначально вопрос о чем был?
Цитата:
Цитата:
Цитата:
Сообщение от Russland
Задача собственно и обозначена в первом посте.
Если свести её к двум словам, то: есть некий метод, который рассчитывает сразу несколько параметров. Эти параметры надо потом отобразить в гриде. Хотелось бы, чтобы при каждом обращении к строке рассчётный метод вызывался один раз. Однако из-за того, чтобы дисплей-метод на форме корректно отображал данные, ему (дисплей-методу) необходимо передавать источник данных, и каждый раз результат перерассчитывать. За примером далеко ходить не надо. Берём первую попавшуюся на глаза форму AssetSum ... Итак, метод calc() дёргают каждый раз при выводе того или иного значения. Эту тему я завёл только из опасений, что я что-то не улавливаю. Однако мои худшие предположения подтверждаются. При выводе параметра, каждый раз будет вызываться рассчётный метод.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
07.04.2007, 18:38 | #15 |
Участник
|
Только работает оно исключительно для дисплейных методов на таблицах
__________________
Axapta v.3.0 sp5 kr2 |
|
07.04.2007, 18:52 | #16 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Ed1K, первоначально вопрос о чем был?
от трёх неизменяемых параметров не считая три раза, то display-методы вместе со своим гридом идут лесом, они здесь не причём. Цитата:
Сообщение от Maxim Gorbunov
Что же касается рассуждений о Map и Array, то и тут Вы изобретаете велосипед. В Аксапте есть стандартное кэширование дисплей-методов.
|
|
07.04.2007, 18:58 | #17 |
Administrator
|
Цитата:
Кроме того, если посмотреть-таки на форму AssetSum, приведенную в качестве примера, можно заметить, что там и грида-то, вообще-то, нет. Так что же Вам мешает сделать их на таблице? Кстати, задумывались ли Вы, по какой причине разработчики не стали заморачиваться с кэшированием методов на формах/источниках данных?
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
07.04.2007, 19:32 | #18 |
Участник
|
Цитата:
Сообщение от Ed1k
Если вопрос был в том, как получить значение три раза
от трёх неизменяемых параметров не считая три раза, то display-методы вместе со своим гридом идут лесом, они здесь не причём. Цитата:
Сообщение от Maxim Gorbunov
И тем не менее вопрос был именно об этом.
Цитата:
Сообщение от Maxim Gorbunov
Кроме того, если посмотреть-таки на форму AssetSum, приведенную в качестве примера, можно заметить, что там и грида-то, вообще-то, нет.
Цитата:
Сообщение от Russland
Однако из-за того, чтобы дисплей-метод на форме корректно отображал данные, ему (дисплей-методу) необходимо передавать источник данных, и каждый раз результат перерассчитывать.
Цитата:
Сообщение от Maxim Gorbunov
Так что же Вам мешает сделать их на таблице?
Цитата:
Сообщение от Maxim Gorbunov
Кстати, задумывались ли Вы, по какой причине разработчики не стали заморачиваться с кэшированием методов на формах/источниках данных?
|
|
|
За это сообщение автора поблагодарили: EVGL (4). |
08.04.2007, 10:58 | #19 |
Administrator
|
Пожалуй, выйду из этой дискуссии. Делайте, как Вам вздумается. Пусть наступает всеобщее 1С
Напоследок: Дла переноса display-метода с источника данных на таблицу обычно используется подход copy/paste После переноса в методе на таблице все обращения к параметру метода заменяются на this, а сам параметр удаляется. Методы формы всегда выполняются на клиенте, в отличие от методов таблиц, место исполнения которых можно указать. Таким образом, если Ваш display-метод несет в себе значительный объем вычислений, следует расположить его на таблице и выполнять его на сервере. Логика здесь такая: если display-метод прост и заключается, например, в простом суммировании некоторых полей таблицы, можно распологать его на форме, чтобы не увеличивать без нужды траффик между клиентом и сервером; иначе метод следует располагать на таблице и выполнять на сервере. Разумеется, большой необходимости в кэшировании простых методов нет. Кстати, создание своего кэша все же имеет смысл, но только в случае edit-методов.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
08.04.2007, 14:52 | #20 |
Участник
|
Цитата:
Сообщение от Maxim Gorbunov
Дла переноса display-метода с источника данных на таблицу обычно используется подход copy/paste После переноса в методе на таблице все обращения к параметру метода заменяются на this, а сам параметр удаляется.
|
|
|
За это сообщение автора поблагодарили: EVGL (-5). |