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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.01.2006, 16:00   #1  
topgun is offline
topgun
Участник
 
2 / 10 (1) +
Регистрация: 11.01.2006
? Доступ к DataSource формы из класса ... (+)
Прошу сильно не ругать за вероятно простой вопрос.
Однако только начал разбираться с Axapta.

На форме по кнопке вызываю класс.
В нем добавляю строки в таблицу на форме.
Как после добавления, перечитать данные в таблице?

Спасибо.
Старый 11.01.2006, 16:08   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе. На кнопке, переопредели clicked, и обновляй ds, после super.
P.S. Более того, по идее, класс должен исполняться на сервере, а форма на клиенте и передача лишних данных между ними не желательна.
__________________
Isn't it nice when things just work?

Последний раз редактировалось macklakov; 11.01.2006 в 16:18.
Старый 11.01.2006, 16:29   #3  
topgun is offline
topgun
Участник
 
2 / 10 (1) +
Регистрация: 11.01.2006
Цитата:
Сообщение от macklakov
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе.
Т.е. вот такой код, это моветон?
PHP код:
static void main(Args _args)
{
    
LedgerJournalTransCopy ledgerJournalTransCopy;
    
LedgerJournalEngine     ledgerJournalEngine _args.caller().ledgerJournalEngine();
    ;
 
    
ledgerJournalTransCopy = new LedgerJournalTransCopy(_args);
    if (
ledgerJournalTransCopy.prompt())
        
ledgerJournalTransCopy.run();
 
    
ledgerJournalEngine.refreshWhenPosted(); -- <-- ВОТ ЭТО

Старый 11.01.2006, 17:34   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от otkudao
2 macklacov

я не знаю, чем тебе насолили отношения многие-ко-многим, скажу лишь, что никакой это не плохой стиль. Может быть, ты не знаешь как они организуются или не точно выразился, разве.
в том то и дело, что приходится дополнительные сущности добавлять, чтоб их разрулить
Цитата:
Сообщение от otkudao
А то, что класс ДОЛЖЕН исполняться на сервере, будь любезен, расскажи по-подробнее, пож. Откуда такие сведения?
Цитата:
Сообщение от Axapta Application Development Best Practices
Where to place the Code

Object Server
This is the home of the business application logic. Transaction oriented database updating jobs should be paced to run here; close to the database.
__________________
Isn't it nice when things just work?
Старый 11.01.2006, 17:52   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от otkudao
Как раз тот случай, не находишь?
Не нахожу, т.к. в изначальном посте указывается, что класс создает несколько записей в базе
__________________
Isn't it nice when things just work?
Старый 11.01.2006, 17:56   #6  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от topgun
Т.е. вот такой код, это моветон?
PHP код:
static void main(Args _args)
{
    
LedgerJournalTransCopy ledgerJournalTransCopy;
    
LedgerJournalEngine     ledgerJournalEngine _args.caller().ledgerJournalEngine();
    ;
 
    
ledgerJournalTransCopy = new LedgerJournalTransCopy(_args);
    if (
ledgerJournalTransCopy.prompt())
        
ledgerJournalTransCopy.run();
 
    
ledgerJournalEngine.refreshWhenPosted(); -- <-- ВОТ ЭТО

У меня нет класса LedgerJournalTransCopy, но насколько я понимаю, этот метод вызывается не из ledgerJournalEngine, а из другого объекта.
__________________
Isn't it nice when things just work?
Старый 11.01.2006, 17:59   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
2topgun:
Есть понятие Best Practice. Это рекомендации по стилю программирования. Им не всегда следуют, не все следуют, однако следует учитывать:
1. Сам факт наличия Best Practice означает что Аксапта заточена под определенный механизм решения проблем. И отклонение от Best Practice может приводить к выявлению ряда случаев когда Аксапта "глючит". При максимальном следовании Best Practice - ни пользователь ни программист не будут сталкиваться (ну или максимально редко) с неожиданными никому неизвестными невоспроизводимым поведением.
2. Ваш код могут читать впоследствии другие люди. Которым привычен Best Practice. И Ваше отклонение - только затруднит чтение.

Резюме:
Что предлагал Юра (macklakov):
Идем в форму - доходим до контрольки (MenuItemButton), перекрываем метод clicked, пишем код:
X++:
        super();
        MyDataSource_ds.executeQuery(); // Или reread, refresh
При этом к MenuItemButton прилеплена менюшка, вызывающая класс. Обычно (согласно Best Practice) - этот класс должен вызываться на сервере - тк подразумевает себе некую обработку, а если есть обработка - значит она д.б. на сервере. И с сервера обращаться к форме (к клиенту) - не есть правильно.

Что имелось ввиду под фразой "это используется сплошь и рядом":
Аксапту писали люди. Не везде следуя единому стилю. Местами даже может быть криво. Местами - нормально. Поэтому:
Если изначально создается новая форма, к ней новый класс и т.д. - то нужно следовать рекомендациям Best Practice.
Если приходится править уже написанный код (как в этом случае) - то в каждом случае надо разбираться отдельно и стараться сделать в стиле уже написанного кода не забывая про производительность (клиент-сервер). Но по возможности следует вспоминать про Best Practice
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 11.01.2006 в 18:03.
Старый 11.01.2006, 18:11   #8  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от otkudao
Вполне возможно, что create-ом и сохранением строки или нескольких строк формы траффик будет намного ниже.
Необычная техника. Можешь привести мне примеры в коде, где так делают?
__________________
Isn't it nice when things just work?
Старый 11.01.2006, 18:24   #9  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Да, выложи, пожалуйста :-)
__________________
Isn't it nice when things just work?
Старый 11.01.2006, 18:52   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
BP - не догма
Примеров, когда в main вытаскивается DS переданого курсора и после обработки обновляется его содержимое в коде Аксапты много (SalesFormLetter, PurchFormLetter)
Сделайте поиск по методам main содержащим FormDataSource
Старый 12.01.2006, 09:59   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
X++:
static void main(Args _args)
{
    MyClass action=new MyClass();
    FormDataSource ds;
    ;
    if(action.prompt())
    {
        action.run();
        if(_args && _args.dataset()==tableNum(TheTable))
        {
            ds=_args.record().dataSource();
            ds.research();
        }
    }
}

Последний раз редактировалось belugin; 12.01.2006 в 10:28.
Старый 12.01.2006, 12:44   #12  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от belugin
X++:
        if(_args && _args.dataset()==tableNum(TheTable))
А если на форме несколько dataSources, на основании таблицы TheTable? К примеру, форма InventTable, таблица InventTableModule
Никто не говорит, что это невозможно, но в данном случае, это не желательно. Ведь этот класс может быть вызыван не из формы, либо из совсем другой формы и мы получим неприятную runtime ошибку. Либо мы получим монструозный код, типа SalesFormLetter::main, большей частью написанный с помощью copy/paste и опять таки он остается опасным, т.к. на форме может оказаться несколько dataSources на основании одной и той же таблицы.
IMHO: Подобные конструкции оправданны лишь в классах, которые отвечают за внешний вид формы, к примеру, InventDimCtrl_Frm
__________________
Isn't it nice when things just work?
Старый 12.01.2006, 13:05   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
мне кажется что существует распространенный частный случай, когда в форме только один датасурс такого типа.

Как альтернатива, предлагаю реализовать небольшой фреймворк на основе паттерна Observer который бы позволял подписываться на изменения такого рода и подписывать все формы из
SysSetupFormRun.run
Старый 12.01.2006, 13:21   #14  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,257 / 980 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от belugin
Как альтернатива, предлагаю реализовать небольшой фреймворк на основе паттерна Observer который бы позволял подписываться на изменения такого рода и подписывать все формы из
SysSetupFormRun.run
Интересная идея. Но по какому событию мы будем обновлять подписанные формы? Наверное, по изменению данных в таблице. Таблица может обновляться на сервере, а подписанные формы на клиентах. Теперь предположим, что два пользователя находятся в одной форме и один из них редактирует/просматривает данные, а другой запускает обработчик, котрый по исполнении обновит подписанные формы, при этом первый пользователь ругается.
Поправьте, если я ошибся.
__________________
Isn't it nice when things just work?
Старый 13.01.2006, 09:50   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
я пошутил
Старый 19.01.2006, 14:06   #16  
st_msav is offline
st_msav
Участник
Аватар для st_msav
 
49 / 14 (1) ++
Регистрация: 24.08.2005
Адрес: Moscow City
Цитата:
Сообщение от macklakov
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе. На кнопке, переопредели clicked, и обновляй ds, после super.
P.S. Более того, по идее, класс должен исполняться на сервере, а форма на клиенте и передача лишних данных между ними не желательна.
А если пунктов меню, вызавающих класс будет много, то для каждого из них надо переопределять. По-моему проще это сделать в классе.
__________________
Ax 3.0 SP3
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как программно добавить DataSource в процессе работы формы Владимир Максимов DAX: Программирование 1 29.11.2006 18:28
обращение к методам датасоурса формы из класса simply DAX: Программирование 5 03.06.2004 12:02
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Как получить доступ к записям в Datasource отчета? Anton Sk. DAX: Программирование 1 05.06.2002 15:43
Как получить доступ к текущей строке в DataSource формы Maxim Gorbunov DAX: База знаний и проекты 0 28.11.2001 13:46

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

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

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