AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

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

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

void setDialogOnClient(Dialog dialog)
{
    dialogOnClient = dialog;
}
переменную dialogOnClient, естественно, добавить в ClassDeclaration, добавить вызов Dialog.setDialogOnClient() в Dialog::runOnClient():
Code:
...
dialogClient.unpack(dialogCon);
dialogClient.setDialogOnServer(dialogServer);
// тут -->
dialogServer.setDialogOnClient(dialogClient);
// <--
Dialog::addControls(
...
Тогда в RunBase.dialogPostRun(_dialog) имеем доступ к клиентскому Dialog
Code:
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
Code:
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;
}
Написал из головы - на практике не проверял
This post has been rated by: Zick-Zibn (2), oip (1).
Old 05.04.2006, 12:12   #10  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Join Date: 28.11.2005
Blog Entries: 1
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
Old 05.04.2006, 12:43   #11  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
Quote:
Originally Posted by vallys
Есть проверка - в RunBase.canSwapBetweenCSPrim
Code:
/*
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....
В общем - был неправ.
__________________
Возможно сделать все. Вопрос времени
Old 07.04.2006, 10:05   #12  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Join Date: 18.01.2005
Quote:
Originally Posted by oip
Понятно. Если все так сложно, то проще нарисовать собственную лукап форму и не мучиться. Спасибо! Обязательно попробую на своем локальном приложении то, что Вы написали, но для рабочего приложения это точно не приемлимо, думаю.
Блин, ёмаё! Забыл совсем Для того, чтобы Dialog создавался на клиенте достаточно в методе Runbase.dialog() в super() вторым параметром (forceOnClient) подставлять true. И все!
This post has been rated by: Sergey Petrov (1).
Old 07.04.2006, 11:15   #13  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Join Date: 28.11.2005
Blog Entries: 1
Thumbs up
Оп-па... На проекте msk_TutorialRunBase все отлично работает! Спасибо! Неужели все так просто было? Во вторник проверю на рабочем приложении на нужном мне классе.

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

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Проблема с единицей измерения 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 17:31.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.