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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.06.2008, 14:38   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Передать временную таблицу из формы в класс
Есть класс, в котором объявлен курсор на НЕВРЕМЕННУЮ таблицу. При инициализации класса делаем этому курсору 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;
}
После того как на диалоге создаю строку в таблице, сохраняю и жму OK, в классе :
вызов
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  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Запрос идет по постоянной таблице или все же по неинициализированной временной?
__________________
Андрей.
Старый 20.06.2008, 15:03   #3  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
          ?
значение smmResponsible.RecId после checkTmp в отладчике оказывается равно 4, это столько настоящих записей в самой таблице. Хотя в диалоге введена 1 строка. Значит, по постоянной.
Старый 20.06.2008, 15:10   #4  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Подход правильный. Все должно работать. Где-то ошибка в реализации.
Покажите код метода init() диалоговой формы.
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.
Старый 20.06.2008, 15:12   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
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:15   #6  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Что-то с tmpResponsible не так, проверяйте инициализацию класса.
__________________
Андрей.
Старый 20.06.2008, 15:24   #7  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
В случае с SmmTmpDeliverCreate все нормально, даже SmmLineCreate.parmTmpData(SmmTmpDeliverCreate) в closeOK не надо делать... Единственное отличие - SmmTmpDeliverCreate на самом деле временная

Последний раз редактировалось Eldar9x; 20.06.2008 в 15:27.
Старый 20.06.2008, 15:42   #8  
e@gle is offline
e@gle
MCTS
MCBMSS
 
164 / 72 (3) ++++
Регистрация: 11.04.2005
Адрес: Минск
Давайте уж заодоно и init() класса.
__________________
С уважением, Павел Цераниди.
На пути к совершенству нет конца. Каждое новое достижение является отправной точкой для следующего крупного шага.
Старый 20.06.2008, 15:51   #9  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
public boolean init()
{
boolean ret;
;

this.checkSelection();

ret = super();

tmpResponsible.setTmp();

this.initParmDefault();
this.fillTmpData(); // можно считать пустым


return ret;
}
Старый 20.06.2008, 15:55   #10  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
пробовал в filltmpdata():
X++:
    tmpResponsible.setTmp();
    tmpResponsible.EmplType = SmmEmplType::Direct;
    tmpResponsible.EmplId   = "000016";
    tmpResponsible.insert();
несмотря на setTmp() данные ложаться в постоянную таблицу... То есть setTmp может и не работать? Или повторный вызов setTmp отключает временность...
Старый 20.06.2008, 16:23   #11  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Есть диалоговая форма, в которой датасорс
Вопросы:
- форма "настоящая" (в AOT нарисованная)? Или это диалог?
- как вы ее (форму) поднимаете из класса (код)?
__________________
Best Regards,
Roman
Старый 20.06.2008, 16:28   #12  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Форма в АОТе
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  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Попробуйте форму через classFactory.formRunClass() поднять. Мне помогло в свое время
__________________
Best Regards,
Roman
Старый 20.06.2008, 16:41   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Скорее всего проблема в том что класс живет на сервере, а временная таблица на клиенте.
Нужно паковать тавлицу и передавать через pack() unpack().
Проблема обсуждалась много раз, ищите на форуме.
Старый 20.06.2008, 16:53   #15  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
или в перекрыть метод canSwapBetweenCS и вернуть false. Тогда можно не замарачивать с передачей временной таблицы с клиента на сервер.
За это сообщение автора поблагодарили: Eldar9x (1).
Старый 20.06.2008, 17:12   #16  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
или в перекрыть метод canSwapBetweenCS и вернуть false. Тогда можно не замарачивать с передачей временной таблицы с клиента на сервер.
Это в случае, если
1. Функционал не требует больших вычислительных ресурсов
2. Функционал запускается сразу, без поддержки Batch
А вообще нестандартный подход перекрытия canSwapBetweenCS() [IMHO]
Старый 20.06.2008, 17:25   #17  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
X++:
   classFactory.formRunClass()
так как в АОТе не выходит - ругается что у объекта нет метода addGroup;
X++:
  canSwapBetweenCS   false
заработал как положено filltmpdata, но вызов SmmLineCreate.parmTmpData() в диалоге затирает эти данные.
Класс, действительно, живет на сервере. Видимо временный курсор диалога (датасорса) - на клиенте, а временный курсор класса - на сервере. Но ведь в случае с таблицей, которая на самом деле временная, это не вызывает проблем

Последний раз редактировалось Eldar9x; 20.06.2008 в 17:28.
Старый 20.06.2008, 17:26   #18  
petr is offline
petr
Участник
Соотечественники
 
561 / 201 (8) ++++++
Регистрация: 30.05.2005
Адрес: Швейцария
Если используется временная таблица, значит в диалоге пользователь должен что-то менять, изменять, выбирать - следовательно о пакетном режиме речь уже не идет.

Был у меня один класс, где я временную таблицу паковал, передавал с клиента на сервер, выглядело это уж больно извращено, много лишних телодвижений. Без этого код выглядит более аккуратно и логично.

Пример из стандарта - класс SalesCreateReleaseOrder

Использовать данный подход никого не агитирую, просто для богатства выбора привел...
Старый 20.06.2008, 17:36   #19  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
а что он делает этот метод?
Старый 20.06.2008, 17:41   #20  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
canSwapBetweenCS = can Swap Between Client Server
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с передачей контролов из формы в класс matew DAX: Программирование 0 28.04.2008 17:37
создать и передать временную таблицу kitty DAX: Программирование 11 13.07.2006 14:40
Как передать временную таблицу Aslan DAX: Программирование 15 23.05.2006 17:34
Как при вызове класса передать в него таблицу? ArturK DAX: Программирование 7 09.04.2004 12:15
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:30.