AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 11.01.2006, 16:00   #1  
topgun is offline
topgun
Участник
 
2 / 10 (1) +
Join Date: 11.01.2006
? Доступ к DataSource формы из класса ... (+)
Прошу сильно не ругать за вероятно простой вопрос.
Однако только начал разбираться с Axapta.

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

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

Last edited by macklakov; 11.01.2006 at 16:18.
Old 11.01.2006, 16:29   #3  
topgun is offline
topgun
Участник
 
2 / 10 (1) +
Join Date: 11.01.2006
Quote:
Originally Posted by macklakov
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе.
Т.е. вот такой код, это моветон?
PHP Code:
static void main(Args _args)
{
    
LedgerJournalTransCopy ledgerJournalTransCopy;
    
LedgerJournalEngine     ledgerJournalEngine _args.caller().ledgerJournalEngine();
    ;
 
    
ledgerJournalTransCopy = new LedgerJournalTransCopy(_args);
    if (
ledgerJournalTransCopy.prompt())
        
ledgerJournalTransCopy.run();
 
    
ledgerJournalEngine.refreshWhenPosted(); -- <-- ВОТ ЭТО

Old 11.01.2006, 17:34   #4  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Quote:
Originally Posted by otkudao
2 macklacov

я не знаю, чем тебе насолили отношения многие-ко-многим, скажу лишь, что никакой это не плохой стиль. Может быть, ты не знаешь как они организуются или не точно выразился, разве.
в том то и дело, что приходится дополнительные сущности добавлять, чтоб их разрулить
Quote:
Originally Posted by otkudao
А то, что класс ДОЛЖЕН исполняться на сервере, будь любезен, расскажи по-подробнее, пож. Откуда такие сведения?
Quote:
Originally Posted by 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?
Old 11.01.2006, 17:52   #5  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Quote:
Originally Posted by otkudao
Как раз тот случай, не находишь?
Не нахожу, т.к. в изначальном посте указывается, что класс создает несколько записей в базе
__________________
Isn't it nice when things just work?
Old 11.01.2006, 17:56   #6  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Quote:
Originally Posted by topgun
Т.е. вот такой код, это моветон?
PHP Code:
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?
Old 11.01.2006, 17:59   #7  
sukhanchik is offline
sukhanchik
Administrator
sukhanchik's Avatar
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Join Date: 13.06.2004
Location: Москва
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
__________________
Возможно сделать все. Вопрос времени

Last edited by sukhanchik; 11.01.2006 at 18:03.
Old 11.01.2006, 18:11   #8  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Quote:
Originally Posted by otkudao
Вполне возможно, что create-ом и сохранением строки или нескольких строк формы траффик будет намного ниже.
Необычная техника. Можешь привести мне примеры в коде, где так делают?
__________________
Isn't it nice when things just work?
Old 11.01.2006, 18:24   #9  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Да, выложи, пожалуйста :-)
__________________
Isn't it nice when things just work?
Old 11.01.2006, 18:52   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 868 (32) +++++++
Join Date: 15.01.2002
Location: Москва
Blog Entries: 7
BP - не догма
Примеров, когда в main вытаскивается DS переданого курсора и после обработки обновляется его содержимое в коде Аксапты много (SalesFormLetter, PurchFormLetter)
Сделайте поиск по методам main содержащим FormDataSource
Old 12.01.2006, 09:59   #11  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 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();
        }
    }
}

Last edited by belugin; 12.01.2006 at 10:28.
Old 12.01.2006, 12:44   #12  
macklakov is offline
macklakov
NavAx
macklakov's Avatar
 
2,347 / 996 (38) +++++++
Join Date: 03.04.2002
Quote:
Originally Posted by 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?
Old 12.01.2006, 13:05   #13  
belugin is offline
belugin
Участник
belugin's Avatar
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Join Date: 16.01.2004
Blog Entries: 5
мне кажется что существует распространенный частный случай, когда в форме только один датасурс такого типа.

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

Similar Threads
Thread Thread Starter Forum Replies Last Post
Как программно добавить 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 00:50.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.