07.11.2011, 11:42 | #1 |
MCTS
|
Отображение переменной на диалоге из серверного объекта
Обычный класс RunBase, у которого выставлено св-во CalledFrom.
У MenuItem это св-во выставлено в Server. Таким образом класс будет запущен на сервере. В методе Main() до Promt() происходит задание переменной transDate: X++: purchLinkUpdate = new GRD_PurchLinkUpdate(); purchTable = _args.record(); purchLinkUpdate.parmTransDate(purchTable.DeliveryDate); if (purchLinkUpdate.prompt()) purchLinkUpdate.run(); X++: dfTransDate = ret.addFieldValue(typeId(TransDate), transDate, "Дата документа"); Как добиться того, чтобы эта переменная отобразилась на диалоге (без использования canSwapBetweenCS())? Сейчас туда выставляется значение transDate клиентской копии класса. |
|
07.11.2011, 11:57 | #2 |
Ищущий знания...
|
может в диалоге написать что-то типа:
X++: dialogFieldTransDate = dialog.addFieldValue(typeId(TransDate), purchLinkUpdate.parmTransDate());
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
07.11.2011, 11:57 | #3 |
Участник
|
Предлагаю добавить вызов 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 |
MCTS
|
нее, это вызов клиентской копии, тоже самое получается.
|
|
07.11.2011, 12:05 | #5 |
MCTS
|
|
|
07.11.2011, 12:13 | #6 |
Участник
|
Цитата:
Тогда в диалоге надо написать что-то типа 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 |
MCTS
|
Работает. А можно ли в методе dialog() получить серверный объект класса? То есть обращаясь в методе dialog() к this (если класс запущен на сервере, и не перекрыт метод canSwap...) - мы обращаемся к клиентской копии. Как обратиться к серверному варианту?
|
|
07.11.2011, 13:40 | #8 |
Участник
|
Цитата:
Только зачем ? |
|
07.11.2011, 13:47 | #9 |
Участник
|
Наравне с методами pack и unpack можно иcпользовать методы promptPack и promptUnpack. С их помощию можно расширить список переменных переаваемых с клиента на сервер, не меняя список переменных сохраняемых в SysLastValue.
|
|
|
За это сообщение автора поблагодарили: Eldar9x (5). |
07.11.2011, 14:06 | #10 |
MCTS
|
|
|
07.11.2011, 14:10 | #11 |
Участник
|
Стандартная архитектура этого не предполагает.
Есть подозрение что вы что-то не так делаете и нужной вам цели можно достичь другим способом. |
|
08.11.2011, 09:38 | #12 |
MCTS
|
Вот и очередной вопрос с серверными классами.
Вот код на форме, которая используется в RunBase в качестве диалога: X++: void closeOk() { DialogRunbase dialog = element.args().caller(); ; purchLinkUpdate.initParms(CtrlDataAreaId.valueStr(), CtrlDocNum.valueStr(), CtrlDlvDate.dateValue()); dialog.updateServer(); if (purchLinkUpdate.checkCloseDialog()) super(); } Так вот purchLinkUpdate.initParms обновит только переменные клиентской копии класса. Каким образом обновить переменные серверного объекта? |
|
08.11.2011, 09:48 | #13 |
Участник
|
Нужно добавить их в список сериализуемых переменных. Тогда после окончания работы метода prompt они попадут на серверную сторону и вы сможете ими воспользоваться в методе run.
P.S.: А почему "Edit методы использовать нельзя..."? Правда в контексте вашего вопроса это нечего не изменит, просто интересно откуда у вас появилось такое ограничение. Посмотрите Tutorial_RunbaseForm, там прекрасно работает edit метод. Последний раз редактировалось S.Kuskov; 08.11.2011 в 09:54. |
|
08.11.2011, 09:51 | #14 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Eldar9x (5). |
08.11.2011, 09:58 | #15 |
MCTS
|
Емае, точно!
|
|
08.11.2011, 10:01 | #16 |
MCTS
|
Запретили , хотя я раньше всегда только через них и делал.
|
|
08.11.2011, 10:12 | #17 |
MCTS
|
И все таки мне не дает покоя возможность получения серверного объекта на форме.
Судя по всему, единственная возможность - это в 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 |
Administrator
|
Всего-то пару строчек кода, а сколько лишнего траффика между клиентом и сервером!
__________________
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 |
MCTS
|
если использовать, где действительно оно необходимо, например, для передачи переменной на сервер при нажатии ok (без сохранения в pack), то никакого лишнего трафика не будет. Зато бы не пришлось извращаться, как, например, с принудительным вызовом getLast().
|
|
09.11.2011, 19:49 | #20 |
Участник
|
Ну это еще вопрос что считать извращением
|
|