|
20.06.2008, 14:38 | #1 |
MCTS
|
Передать временную таблицу из формы в класс
Есть класс, в котором объявлен курсор на НЕВРЕМЕННУЮ таблицу. При инициализации класса делаем этому курсору setTmp. Есть диалоговая форма, в которой датасорс - также по этой таблице. При инициализации ставим ее в setTmp.
В методе closeOk: X++: public void closeOk() { DialogRunbase dialog = element.args().caller(); ; SmmLineCreate.parmTmpData(SmmResponsible); // SmmResponsible - та самая таблица dialog.updateServer(); if( SmmLineCreate.checkCloseDialog(this) ) super(); } X++: Common parmTmpData(Common _tmpResponsible = tmpResponsible)
{
;
tmpResponsible.setTmpData(_tmpResponsible);
return tmpResponsible;
} вызов X++: boolean checkTmp() { Boolean ret = true; ; select count(RecId) from tmpResponsible; if (!tmpResponsible.RecId) ret = checkFailed(strfmt("@SYS77621", "@ACL85")); return ret; } |
|
20.06.2008, 15:00 | #2 |
Moderator
|
Запрос идет по постоянной таблице или все же по неинициализированной временной?
__________________
Андрей. |
|
20.06.2008, 15:03 | #3 |
MCTS
|
X++: ? |
|
20.06.2008, 15:15 | #4 |
Moderator
|
Что-то с tmpResponsible не так, проверяйте инициализацию класса.
__________________
Андрей. |
|
20.06.2008, 15:10 | #5 |
MCTS
|
Подход правильный. Все должно работать. Где-то ошибка в реализации.
Покажите код метода init() диалоговой формы.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
20.06.2008, 15:12 | #6 |
MCTS
|
X++: public void init() { if( !element.args().caller() ) throw error("@SYS79604"); smmLineCreate = element.args().caller().runbase(); super(); element.setDesign(); SmmTmpDeliverCreate.setTmp(); // это еще один датасорс на таблице. Но сейчас он не используется. SmmResponsible.setTmp(); } |
|
20.06.2008, 15:24 | #7 |
MCTS
|
В случае с SmmTmpDeliverCreate все нормально, даже SmmLineCreate.parmTmpData(SmmTmpDeliverCreate) в closeOK не надо делать... Единственное отличие - SmmTmpDeliverCreate на самом деле временная
Последний раз редактировалось Eldar9x; 20.06.2008 в 15:27. |
|
20.06.2008, 15:42 | #8 |
MCTS
|
Давайте уж заодоно и init() класса.
__________________
С уважением, Павел Цераниди. На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага. |
|
20.06.2008, 15:51 | #9 |
MCTS
|
public boolean init()
{ boolean ret; ; this.checkSelection(); ret = super(); tmpResponsible.setTmp(); this.initParmDefault(); this.fillTmpData(); // можно считать пустым return ret; } |
|
20.06.2008, 15:55 | #10 |
MCTS
|
пробовал в filltmpdata():
X++: tmpResponsible.setTmp();
tmpResponsible.EmplType = SmmEmplType::Direct;
tmpResponsible.EmplId = "000016";
tmpResponsible.insert(); |
|
20.06.2008, 16:23 | #11 |
Сенбернар
|
Вопросы:
- форма "настоящая" (в AOT нарисованная)? Или это диалог? - как вы ее (форму) поднимаете из класса (код)?
__________________
Best Regards, Roman |
|
20.06.2008, 16:28 | #12 |
MCTS
|
Форма в АОТе
X++: protected Object dialog() { DialogRunbase dialog = Dialog::newFormnameRunbase(this.dialogFormName(),this); ; dialog = super(dialog); dialog.caption(this.caption()); dgDeliver = dialog.addGroup("@ACL95"); dgDeliver.columns(2); dfDeliverDate = dialog.addFieldValue(typeid(SmmWorkDate), deliverDate, this.dateLabel()); return dialog; } |
|
20.06.2008, 16:34 | #13 |
Сенбернар
|
Попробуйте форму через classFactory.formRunClass() поднять. Мне помогло в свое время
__________________
Best Regards, Roman |
|
20.06.2008, 16:41 | #14 |
Боец
|
Скорее всего проблема в том что класс живет на сервере, а временная таблица на клиенте.
Нужно паковать тавлицу и передавать через pack() unpack(). Проблема обсуждалась много раз, ищите на форуме. |
|
20.06.2008, 16:53 | #15 |
Участник
|
или в перекрыть метод canSwapBetweenCS и вернуть false. Тогда можно не замарачивать с передачей временной таблицы с клиента на сервер.
|
|
|
За это сообщение автора поблагодарили: Eldar9x (1). |
20.06.2008, 17:12 | #16 |
Боец
|
Цитата:
или в перекрыть метод canSwapBetweenCS и вернуть false. Тогда можно не замарачивать с передачей временной таблицы с клиента на сервер.
1. Функционал не требует больших вычислительных ресурсов 2. Функционал запускается сразу, без поддержки Batch А вообще нестандартный подход перекрытия canSwapBetweenCS() [IMHO] |
|
20.06.2008, 17:25 | #17 |
MCTS
|
X++: classFactory.formRunClass() X++: canSwapBetweenCS false Класс, действительно, живет на сервере. Видимо временный курсор диалога (датасорса) - на клиенте, а временный курсор класса - на сервере. Но ведь в случае с таблицей, которая на самом деле временная, это не вызывает проблем Последний раз редактировалось Eldar9x; 20.06.2008 в 17:28. |
|
20.06.2008, 17:26 | #18 |
Участник
|
Если используется временная таблица, значит в диалоге пользователь должен что-то менять, изменять, выбирать - следовательно о пакетном режиме речь уже не идет.
Был у меня один класс, где я временную таблицу паковал, передавал с клиента на сервер, выглядело это уж больно извращено, много лишних телодвижений. Без этого код выглядит более аккуратно и логично. Пример из стандарта - класс SalesCreateReleaseOrder Использовать данный подход никого не агитирую, просто для богатства выбора привел... |
|
20.06.2008, 17:36 | #19 |
MCTS
|
а что он делает этот метод?
|
|
20.06.2008, 17:41 | #20 |
Боец
|
canSwapBetweenCS = can Swap Between Client Server
|
|