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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2006, 10:23   #1  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
? Проблема с controlMethodOverload при выполнении на Сервере.
Здравствуйте. В этой теме есть пример использования метода formRun().controlMethodOverload(). Однако, если сделать в том проекте небольшое изменение, а именно место выполнения класса заменить с "Called from" на "Server" и запустить его в трехуровневой конфигурации, то все сразу валится. Объясните пожалуйста, в чем дело и можно ли этого избежать?

Последний раз редактировалось oip; 04.04.2006 в 10:26.
Старый 04.04.2006, 12:59   #2  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
imho, forma eto klientskaja chast'...
Старый 04.04.2006, 13:03   #3  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Т.е. если класс выполняется на сервере, то ничего не поделаешь? На конкретном примере (проект в той теме) хочу узнать.
Старый 05.04.2006, 10:54   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Класс может исполняться где угодно. Форма может быть только на клиенте. Наследник RunBase - может исполняться на сервере - но форма, которая рисуется этим классом - создается на клиенте. FormRun должен быть проинициализирован на КЛИЕНТЕ. В частности - RunBase - несмотря на то, что создается на сервере - он сам делает клиентскую копию себя, откуда и работает с формой. А данные просто передает через контейнер между экземплярами классов.
__________________
Возможно сделать все. Вопрос времени
Старый 05.04.2006, 11:19   #5  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от sukhanchik
... RunBase - несмотря на то, что создается на сервере - он сам делает клиентскую копию себя, откуда и работает с формой. А данные просто передает через контейнер между экземплярами классов.
Хм... Думаю, что 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;
}
...
Если "Run on" равно "Server", то создается клиентская копия Dialog - см. Dialog.doRun() и Dialog::runOnClient(). Соответственно в метод RunBase.dialogPostRun() передается серверный Dialog у которого формы нет, а клиентский (c формой) остается 'в тени'.
Цитата:
Сообщение от oip
Т.е. если класс выполняется на сервере, то ничего не поделаешь?
IMHO лучше "Run on" выставлять в "Called from" и создавать экземпляр RunBase на сервере принудительно. Получим и Dialog на клиенте (со всеми DialogField и формой) и выполнение RunBase.run() на сервере.
Старый 05.04.2006, 11:25   #6  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
vallys, у того класса, с которым я имею дело (LedgerJournalCopyPeriodic) и где я хотел применить controlMethodOverload стоит "Server".
Старый 05.04.2006, 11:48   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от 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;
}
...
ага ... согласен... только тут нигде нет упоминание свойства RunOn. Только проверка - создан ли экземпляр класса на сервере или нет. А значит без разницы - какое значение принимает свойство RunOn - лишь бы оно позволло создать класс на сервере
__________________
Возможно сделать все. Вопрос времени
Старый 05.04.2006, 11:51   #8  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от sukhanchik
ага ... согласен... только тут нигде нет упоминание свойства RunOn. Только проверка - создан ли экземпляр класса на сервере или нет. А значит без разницы - какое значение принимает свойство RunOn - лишь бы оно позволло создать класс на сервере
Есть проверка - в 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;
}
Старый 05.04.2006, 12:10   #9  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от oip
vallys, у того класса, с которым я имею дело (LedgerJournalCopyPeriodic) и где я хотел применить controlMethodOverload стоит "Server".
Тогда придется иметь дело с Dialog на клиенте ... Думаю без модификации Dialog или RunBase не обойтись...
Например, можно у Dialog создать методы Dialog.dialogOnClient() и Dialog.setDialogOnClient():
Код:
Dialog dialogOnClient()
{
    return dialogOnClient;
}

void setDialogOnClient(Dialog dialog)
{
    dialogOnClient = dialog;
}
переменную dialogOnClient, естественно, добавить в ClassDeclaration, добавить вызов Dialog.setDialogOnClient() в Dialog::runOnClient():
Код:
...
dialogClient.unpack(dialogCon);
dialogClient.setDialogOnServer(dialogServer);
// тут -->
dialogServer.setDialogOnClient(dialogClient);
// <--
Dialog::addControls(
...
Тогда в RunBase.dialogPostRun(_dialog) имеем доступ к клиентскому Dialog
Код:
public void dialogPostRun(DialogRunbase _dialog)
{
    ;
    super(_dialog);
    _dialog.dialogOnClient().dialogForm().formRun().controlMethodOverload(true);
    _dialog.dialogOnClient().dialogForm().formRun().controlMethodOverloadObject(this);
}
В медодах fld1_1_modified() и fld2_1_lookup() тоже использовать клиентский Dialog, не забывая что все экземпляры DialogField, созданные в RunBase.dialog() принадлежат серверному Dialog
Код:
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  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
Старый 05.04.2006, 12:43   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от 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;
}
Эх... придется посыпать голову пеплом.... по крайней мере сейчас - и повнимательнее посмотреть RunBase....
В общем - был неправ.
__________________
Возможно сделать все. Вопрос времени
Старый 07.04.2006, 10:05   #12  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от oip
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
Блин, ёмаё! Забыл совсем Для того, чтобы Dialog создавался на клиенте достаточно в методе Runbase.dialog() в super() вторым параметром (forceOnClient) подставлять true. И все!
За это сообщение автора поблагодарили: Sergey Petrov (1).
Старый 07.04.2006, 11:15   #13  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Thumbs up
Оп-па... На проекте msk_TutorialRunBase все отлично работает! Спасибо! Неужели все так просто было? Во вторник проверю на рабочем приложении на нужном мне классе.

ЗЫ Жаль не могу репутацию поднять, т.к. уже поднимал.
Теги
dialog, runbase

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с единицей измерения longson DAX: Программирование 4 16.07.2007 14:35
Проблема с путями к шаблонам Deep Dreamer DAX: Программирование 10 22.11.2005 14:49
Проблема с созданием объекта Lelya DAX: Администрирование 33 27.06.2005 16:38
Формат даты на сервере и клиенте bio_unit DAX: Администрирование 2 25.08.2004 16:44
Проблема: русские шрифты в отчетах, формируемых на сервере. Anais DAX: Администрирование 3 17.11.2003 13:20

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:49.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.