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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.11.2011, 11:42   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Отображение переменной на диалоге из серверного объекта
Обычный класс RunBase, у которого выставлено св-во CalledFrom.
У MenuItem это св-во выставлено в Server.
Таким образом класс будет запущен на сервере.

В методе Main() до Promt() происходит задание переменной transDate:
X++:
    purchLinkUpdate = new GRD_PurchLinkUpdate();

    purchTable = _args.record();
    purchLinkUpdate.parmTransDate(purchTable.DeliveryDate);  

    if (purchLinkUpdate.prompt())
        purchLinkUpdate.run();
В методе Dialog():
X++:
dfTransDate = ret.addFieldValue(typeId(TransDate), transDate, "Дата документа");
Но при этом эта переменная не должна сохранятся/восстанавливаться pack/unpack, поэтому в макрос в ClassDeclaration мы ее не добавляем.

Как добиться того, чтобы эта переменная отобразилась на диалоге (без использования canSwapBetweenCS())? Сейчас туда выставляется значение transDate клиентской копии класса.
Старый 07.11.2011, 11:57   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
может в диалоге написать что-то типа:
X++:
dialogFieldTransDate  = dialog.addFieldValue(typeId(TransDate), purchLinkUpdate.parmTransDate());
тогда по идее в поле диалога подтянется проинициализированное значение метода - параметра parmTransDate().
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 07.11.2011, 11:57   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Предлагаю добавить вызов getLast(), а также добавить эту переменную в макрос чтобы она сохранялась. Но в диалоге игнорировать сохраненное значение.
В таком случае она будет передаваться с клиента на сервер и обратно, но при показе диалога значение будет проигнорировано. И в getFromDialog вы получите значение введенное пользователем. Например пустое. И оно уже будет передано в серверную часть и обработано.

X++:
    purchLinkUpdate = new GRD_PurchLinkUpdate();
    [B]purchLinkUpdate.getLast();[/B]
    purchTable = _args.record();
    purchLinkUpdate.parmTransDate(purchTable.DeliveryDate);  

    if (purchLinkUpdate.prompt())
        purchLinkUpdate.run();
Старый 07.11.2011, 12:03   #4  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от lev Посмотреть сообщение
может в диалоге написать что-то типа:
X++:
dialogFieldTransDate  = dialog.addFieldValue(typeId(TransDate), purchLinkUpdate.parmTransDate());
тогда по идее в поле диалога подтянется проинициализированное значение метода - параметра parmTransDate().
нее, это вызов клиентской копии, тоже самое получается.
Старый 07.11.2011, 12:05   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от Logger Посмотреть сообщение
Но в диалоге игнорировать сохраненное значение.
Каким образом? Мне нужно на диалоге чтобы выводилось transDate то, которое было установлено в Main():
X++:
purchLinkUpdate.parmTransDate(purchTable.DeliveryDate);
Старый 07.11.2011, 12:13   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Каким образом? Мне нужно на диалоге чтобы выводилось transDate то, которое было установлено в Main():
X++:
purchLinkUpdate.parmTransDate(purchTable.DeliveryDate);
Не понял сразу что вам нужно.
Тогда в диалоге надо написать что-то типа
X++:
dialogFieldTransDate  = dialog.addFieldValue(typeId(TransDate), TransDate);
где
TransDate
переменная вашего класса с нужным значением.

Вы попробуйте и убедитесь что все будет работать.
Ключевой момент в данном случае - вызов getLast() до вызова Prompt()

Суть модификации в том что prompt проверяет некий флажок на уровне класса который означает считывались ли значения из sysLastValue вызово getLast или нет. Поэтому если не сделать вызов getLast() после создания класса, то нет смысла перед вызовом prompt инициализировать какие либо значения в классе, - они перезатрутся внутри prompt считыванием своих значений из sysLastValue.

Если же getLast() вызван хотя бы раз, то prompt заново из sysLastValue ничего не начитывает и все хорошо работает.
За это сообщение автора поблагодарили: Eldar9x (5).
Старый 07.11.2011, 13:03   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Работает. А можно ли в методе dialog() получить серверный объект класса? То есть обращаясь в методе dialog() к this (если класс запущен на сервере, и не перекрыт метод canSwap...) - мы обращаемся к клиентской копии. Как обратиться к серверному варианту?
Старый 07.11.2011, 13:40   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Работает. А можно ли в методе dialog() получить серверный объект класса? То есть обращаясь в методе dialog() к this (если класс запущен на сервере, и не перекрыт метод canSwap...) - мы обращаемся к клиентской копии. Как обратиться к серверному варианту?
Не знаю. Если сильно захотеть то, наверно, можно.
Только зачем ?
Старый 07.11.2011, 13:47   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Но при этом эта переменная не должна сохранятся/восстанавливаться pack/unpack, поэтому в макрос в ClassDeclaration мы ее не добавляем.
Наравне с методами pack и unpack можно иcпользовать методы promptPack и promptUnpack. С их помощию можно расширить список переменных переаваемых с клиента на сервер, не меняя список переменных сохраняемых в SysLastValue.
За это сообщение автора поблагодарили: Eldar9x (5).
Старый 07.11.2011, 14:06   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от Logger Посмотреть сообщение
Не знаю. Если сильно захотеть то, наверно, можно.
Только зачем ?
Ну, как зачем... В dialog() можно бы было вызывать методы серверного объекта.

promptPack/prompUnpack тож вариант, но с getLast() как-то проще.
Старый 07.11.2011, 14:10   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Стандартная архитектура этого не предполагает.
Есть подозрение что вы что-то не так делаете и нужной вам цели можно достичь другим способом.
Старый 08.11.2011, 09:38   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Вот и очередной вопрос с серверными классами.

Вот код на форме, которая используется в RunBase в качестве диалога:
X++:
void closeOk()
{
    DialogRunbase dialog = element.args().caller();
    ;

    purchLinkUpdate.initParms(CtrlDataAreaId.valueStr(), CtrlDocNum.valueStr(), CtrlDlvDate.dateValue());

    dialog.updateServer();

    if (purchLinkUpdate.checkCloseDialog())
        super();
}
Ctrl... это имена контролов, созданных на этой форме. Edit методы использовать нельзя.
Так вот purchLinkUpdate.initParms обновит только переменные клиентской копии класса.
Каким образом обновить переменные серверного объекта?
Старый 08.11.2011, 09:48   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Каким образом обновить переменные серверного объекта?
Нужно добавить их в список сериализуемых переменных. Тогда после окончания работы метода prompt они попадут на серверную сторону и вы сможете ими воспользоваться в методе run.

P.S.: А почему "Edit методы использовать нельзя..."? Правда в контексте вашего вопроса это нечего не изменит, просто интересно откуда у вас появилось такое ограничение. Посмотрите Tutorial_RunbaseForm, там прекрасно работает edit метод.

Последний раз редактировалось S.Kuskov; 08.11.2011 в 09:54.
Старый 08.11.2011, 09:51   #14  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,690 / 405 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Каким образом обновить переменные серверного объекта?
pack/unpack
За это сообщение автора поблагодарили: Eldar9x (5).
Старый 08.11.2011, 09:58   #15  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Емае, точно!
Старый 08.11.2011, 10:01   #16  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
P.S.: А почему "Edit методы использовать нельзя..."? Правда в контексте вашего вопроса это нечего не изменит, просто интересно откуда у вас появилось такое ограничение. Посмотрите Tutorial_RunbaseForm, там прекрасно работает edit метод.
Запретили , хотя я раньше всегда только через них и делал.
Старый 08.11.2011, 10:12   #17  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
И все таки мне не дает покоя возможность получения серверного объекта на форме.
Судя по всему, единственная возможность - это в RunBase.promptPrim() вместо:

X++:
 [clientPrompt,clientPacked] = RunBase::promptOnClient(classidget(this),this.promptPack());
писать что-то вроде:

X++:
 [clientPrompt,clientPacked] = RunBase::promptOnClient(classidget(this),this.promptPack(), this);
Таким образом, у клиентской копии была бы возможность получить ссылку на серверный объект и потом использовать ее.
Но, конечно, это пришлось бы много переделывать. Да еще и не понятно, передастся ли эта ссылка...

ЗЫ:

И это, как оказалось, работает. Странно, что не сделали возможность обращаться к оригинальному объекту на сервере... Всего-то пару строчек кода.

Последний раз редактировалось Eldar9x; 08.11.2011 в 10:34.
Старый 08.11.2011, 15:02   #18  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Странно, что не сделали возможность обращаться к оригинальному объекту на сервере... Всего-то пару строчек кода.
Всего-то пару строчек кода, а сколько лишнего траффика между клиентом и сервером!
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 09.11.2011, 19:21   #19  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Всего-то пару строчек кода, а сколько лишнего траффика между клиентом и сервером!
если использовать, где действительно оно необходимо, например, для передачи переменной на сервер при нажатии ok (без сохранения в pack), то никакого лишнего трафика не будет. Зато бы не пришлось извращаться, как, например, с принудительным вызовом getLast().
Старый 09.11.2011, 19:49   #20  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,887 / 3152 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Ну это еще вопрос что считать извращением
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отображение связи n:n на форме mazzy DAX: Программирование 22 16.03.2011 16:19
AXGoToDeclarationXRef - утилита перехода к объявлению переменной alex55 DAX: Программирование 4 13.06.2010 15:24
получение значения переменной окружения leva DAX: Программирование 3 07.10.2005 17:57
Отображение номера Документа ГК gaenar DAX: Программирование 0 11.05.2005 12:00
Есть ли таблица соответствий ID -объекта - Имя объекта в Аксапта? coja DAX: Администрирование 5 26.04.2005 15:25

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

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

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