11.01.2006, 16:00 | #1 |
Участник
|
Доступ к DataSource формы из класса ... (+)
Прошу сильно не ругать за вероятно простой вопрос.
Однако только начал разбираться с Axapta. На форме по кнопке вызываю класс. В нем добавляю строки в таблицу на форме. Как после добавления, перечитать данные в таблице? Спасибо. |
|
11.01.2006, 16:08 | #2 |
NavAx
|
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе. На кнопке, переопредели 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 |
Участник
|
Цитата:
Сообщение от macklakov
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе.
PHP код:
|
|
11.01.2006, 17:34 | #4 |
NavAx
|
Цитата:
Сообщение от 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 |
NavAx
|
Цитата:
Сообщение от otkudao
Как раз тот случай, не находишь?
__________________
Isn't it nice when things just work? |
|
11.01.2006, 17:56 | #6 |
NavAx
|
Цитата:
Сообщение от topgun
Т.е. вот такой код, это моветон?
PHP код:
__________________
Isn't it nice when things just work? |
|
11.01.2006, 17:59 | #7 |
Administrator
|
2topgun:
Есть понятие Best Practice. Это рекомендации по стилю программирования. Им не всегда следуют, не все следуют, однако следует учитывать: 1. Сам факт наличия Best Practice означает что Аксапта заточена под определенный механизм решения проблем. И отклонение от Best Practice может приводить к выявлению ряда случаев когда Аксапта "глючит". При максимальном следовании Best Practice - ни пользователь ни программист не будут сталкиваться (ну или максимально редко) с неожиданными никому неизвестными невоспроизводимым поведением. 2. Ваш код могут читать впоследствии другие люди. Которым привычен Best Practice. И Ваше отклонение - только затруднит чтение. Резюме: Что предлагал Юра (macklakov): Идем в форму - доходим до контрольки (MenuItemButton), перекрываем метод clicked, пишем код: X++: super(); MyDataSource_ds.executeQuery(); // Или reread, refresh Что имелось ввиду под фразой "это используется сплошь и рядом": Аксапту писали люди. Не везде следуя единому стилю. Местами даже может быть криво. Местами - нормально. Поэтому: Если изначально создается новая форма, к ней новый класс и т.д. - то нужно следовать рекомендациям Best Practice. Если приходится править уже написанный код (как в этом случае) - то в каждом случае надо разбираться отдельно и стараться сделать в стиле уже написанного кода не забывая про производительность (клиент-сервер). Но по возможности следует вспоминать про Best Practice
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 11.01.2006 в 18:03. |
|
11.01.2006, 18:11 | #8 |
NavAx
|
Цитата:
Сообщение от otkudao
Вполне возможно, что create-ом и сохранением строки или нескольких строк формы траффик будет намного ниже.
__________________
Isn't it nice when things just work? |
|
11.01.2006, 18:24 | #9 |
NavAx
|
Да, выложи, пожалуйста :-)
__________________
Isn't it nice when things just work? |
|
11.01.2006, 18:52 | #10 |
----------------
|
BP - не догма
Примеров, когда в main вытаскивается DS переданого курсора и после обработки обновляется его содержимое в коде Аксапты много (SalesFormLetter, PurchFormLetter) Сделайте поиск по методам main содержащим FormDataSource |
|
12.01.2006, 09:59 | #11 |
Участник
|
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 |
NavAx
|
Цитата:
Сообщение от belugin
X++: if(_args && _args.dataset()==tableNum(TheTable)) Никто не говорит, что это невозможно, но в данном случае, это не желательно. Ведь этот класс может быть вызыван не из формы, либо из совсем другой формы и мы получим неприятную runtime ошибку. Либо мы получим монструозный код, типа SalesFormLetter::main, большей частью написанный с помощью copy/paste и опять таки он остается опасным, т.к. на форме может оказаться несколько dataSources на основании одной и той же таблицы. IMHO: Подобные конструкции оправданны лишь в классах, которые отвечают за внешний вид формы, к примеру, InventDimCtrl_Frm
__________________
Isn't it nice when things just work? |
|
12.01.2006, 13:05 | #13 |
Участник
|
мне кажется что существует распространенный частный случай, когда в форме только один датасурс такого типа.
Как альтернатива, предлагаю реализовать небольшой фреймворк на основе паттерна Observer который бы позволял подписываться на изменения такого рода и подписывать все формы из SysSetupFormRun.run |
|
12.01.2006, 13:21 | #14 |
NavAx
|
Цитата:
Сообщение от belugin
Как альтернатива, предлагаю реализовать небольшой фреймворк на основе паттерна Observer который бы позволял подписываться на изменения такого рода и подписывать все формы из
SysSetupFormRun.run Поправьте, если я ошибся.
__________________
Isn't it nice when things just work? |
|
13.01.2006, 09:50 | #15 |
Участник
|
я пошутил
|
|
19.01.2006, 14:06 | #16 |
Участник
|
Цитата:
Сообщение от macklakov
Объекту знать, кто его вызвал, такой же плохой стиль, как отношение многие ко многим в базе. На кнопке, переопредели clicked, и обновляй ds, после super.
P.S. Более того, по идее, класс должен исполняться на сервере, а форма на клиенте и передача лишних данных между ними не желательна.
__________________
Ax 3.0 SP3 |
|