04.04.2006, 10:23 | #1 |
Axapta
|
Проблема с controlMethodOverload при выполнении на Сервере.
Здравствуйте. В этой теме есть пример использования метода formRun().controlMethodOverload(). Однако, если сделать в том проекте небольшое изменение, а именно место выполнения класса заменить с "Called from" на "Server" и запустить его в трехуровневой конфигурации, то все сразу валится. Объясните пожалуйста, в чем дело и можно ли этого избежать?
Последний раз редактировалось oip; 04.04.2006 в 10:26. |
|
04.04.2006, 12:59 | #2 |
Участник
|
imho, forma eto klientskaja chast'...
|
|
04.04.2006, 13:03 | #3 |
Axapta
|
Т.е. если класс выполняется на сервере, то ничего не поделаешь? На конкретном примере (проект в той теме) хочу узнать.
|
|
05.04.2006, 10:54 | #4 |
Administrator
|
Класс может исполняться где угодно. Форма может быть только на клиенте. Наследник RunBase - может исполняться на сервере - но форма, которая рисуется этим классом - создается на клиенте. FormRun должен быть проинициализирован на КЛИЕНТЕ. В частности - RunBase - несмотря на то, что создается на сервере - он сам делает клиентскую копию себя, откуда и работает с формой. А данные просто передает через контейнер между экземплярами классов.
__________________
Возможно сделать все. Вопрос времени |
|
05.04.2006, 11:19 | #5 |
Developer
|
Цитата:
Сообщение от sukhanchik
... RunBase - несмотря на то, что создается на сервере - он сам делает клиентскую копию себя, откуда и работает с формой. А данные просто передает через контейнер между экземплярами классов.
Код: ... // Move prompt to client when running on server and the class is swappable if (isRunningOnServer() && this.canSwapBetweenCS() && this.canSwapBetweenCSPrim()) { [clientPrompt,clientPacked] = runbase::promptOnClient(classidget(this),this.promptPack()); this.promptUnpack(clientPacked,clientPrompt); return clientPrompt; } ... Цитата:
Сообщение от oip
Т.е. если класс выполняется на сервере, то ничего не поделаешь?
|
|
05.04.2006, 11:25 | #6 |
Axapta
|
vallys, у того класса, с которым я имею дело (LedgerJournalCopyPeriodic) и где я хотел применить controlMethodOverload стоит "Server".
|
|
05.04.2006, 11:48 | #7 |
Administrator
|
Цитата:
Сообщение от vallys
Хм... Думаю, что RunBase (вернее его наследник) делает клиентскую копию себя только если "Run on" равно "Called from" и экземпляр RunBase создан на сервере. Это можно увидеть в RunBase.PrompPrim():
Код: ... // Move prompt to client when running on server and the class is swappable if (isRunningOnServer() && this.canSwapBetweenCS() && this.canSwapBetweenCSPrim()) { [clientPrompt,clientPacked] = runbase::promptOnClient(classidget(this),this.promptPack()); this.promptUnpack(clientPacked,clientPrompt); return clientPrompt; } ...
__________________
Возможно сделать все. Вопрос времени |
|
05.04.2006, 11:51 | #8 |
Developer
|
Цитата:
Сообщение от sukhanchik
ага ... согласен... только тут нигде нет упоминание свойства RunOn. Только проверка - создан ли экземпляр класса на сервере или нет. А значит без разницы - какое значение принимает свойство RunOn - лишь бы оно позволло создать класс на сервере
Код: /* Returns whether it is possible to pack the class, reinstantiate a new class, and unpack it on the "other" side. */ private boolean canSwapBetweenCSPrim() { return new dictClass(classIdget(this)).runMode() == ClassRunMode::Called; } |
|
05.04.2006, 12:10 | #9 |
Developer
|
Цитата:
Сообщение от oip
vallys, у того класса, с которым я имею дело (LedgerJournalCopyPeriodic) и где я хотел применить controlMethodOverload стоит "Server".
Например, можно у Dialog создать методы Dialog.dialogOnClient() и Dialog.setDialogOnClient(): Код: Dialog dialogOnClient() { return dialogOnClient; } void setDialogOnClient(Dialog dialog) { dialogOnClient = dialog; } Код: ... dialogClient.unpack(dialogCon); dialogClient.setDialogOnServer(dialogServer); // тут --> dialogServer.setDialogOnClient(dialogClient); // <-- Dialog::addControls( ... Код: public void dialogPostRun(DialogRunbase _dialog) { ; super(_dialog); _dialog.dialogOnClient().dialogForm().formRun().controlMethodOverload(true); _dialog.dialogOnClient().dialogForm().formRun().controlMethodOverloadObject(this); } Код: public boolean fld1_1_modified() // fieldUpdateMethod { Boolean ret; Object control = dialog.dialogOnClient().formRun().controlCallingMethod(); ; ret = control.modified(); if (ret) { dialog.dialogOnClient().name2dialogClass().lookup(DialogRContractAccount.name()).value(''); } return ret; } public boolean fld2_1_lookup() // fieldUpdateMethod { Boolean ret; Object control = dialog.dialogOnClient().formRun().controlCallingMethod(); ; RContractTable::lookupByCust(control, dialog.dialogOnClient().name2dialogClass().lookup(DialogRContractAccount.name()).value()); return true; } |
|
|
За это сообщение автора поблагодарили: Zick-Zibn (2), oip (1). |
05.04.2006, 12:12 | #10 |
Axapta
|
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
|
|
05.04.2006, 12:43 | #11 |
Administrator
|
Цитата:
Сообщение от vallys
Есть проверка - в RunBase.canSwapBetweenCSPrim
Код: /* Returns whether it is possible to pack the class, reinstantiate a new class, and unpack it on the "other" side. */ private boolean canSwapBetweenCSPrim() { return new dictClass(classIdget(this)).runMode() == ClassRunMode::Called; } В общем - был неправ.
__________________
Возможно сделать все. Вопрос времени |
|
07.04.2006, 10:05 | #12 |
Developer
|
Цитата:
Сообщение от oip
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
|
|
|
За это сообщение автора поблагодарили: Sergey Petrov (1). |
07.04.2006, 11:15 | #13 |
Axapta
|
Оп-па... На проекте msk_TutorialRunBase все отлично работает! Спасибо! Неужели все так просто было? Во вторник проверю на рабочем приложении на нужном мне классе.
ЗЫ Жаль не могу репутацию поднять, т.к. уже поднимал. |
|