|  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 или RunBase не обойтись... Например, можно у 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
			
			 Понятно.   Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.  Для того, чтобы Dialog создавался на клиенте достаточно в методе Runbase.dialog() в super() вторым параметром (forceOnClient) подставлять true. И все! | 
|  | |
| За это сообщение автора поблагодарили: Sergey Petrov (1). | |
|  07.04.2006, 11:15 | #13 | 
| Axapta |   
			
			Оп-па...   На проекте msk_TutorialRunBase все отлично работает! Спасибо! Неужели все так просто было?  Во вторник проверю на рабочем приложении на нужном мне классе. ЗЫ Жаль не могу репутацию поднять, т.к. уже поднимал.   | 
|  |