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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.12.2011, 18:33   #1  
alexkrut is offline
alexkrut
Участник
 
20 / 33 (2) +++
Регистрация: 19.12.2011
Переопределение методов у FormDataSource созданного в классе
Есть класс, который создает форму, добавляет контролы, создает и прикручивает к ним датасорс. Как у этого датасорса переопределить методы active(), init() и т. д. ?
Старый 19.12.2011, 20:57   #2  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Регистрация: 02.02.2004
Адрес: г. Москва
Такого инструмента нет.
Возможно, если создавать программно форму в дереве АОТ, то это может получиться...
Старый 19.12.2011, 21:05   #3  
alexkrut is offline
alexkrut
Участник
 
20 / 33 (2) +++
Регистрация: 19.12.2011
Не думаю
Подобный функционал есть для контролов, должен скорее всего быть и для датасорсов. Вообще проблему можно было решить наследованием от FormDataSource и переопределением методов там, но такое наследование запрещено разработчиками axapta: (
Старый 19.12.2011, 21:26   #4  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Быть может проблему проще решить, накидав форму в АОТ. А контролы скрывать или показывать в зависимости от условий. Это как-то более "по-аксаптовски"...
Старый 19.12.2011, 21:41   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Есть класс, который создает форму, добавляет контролы, создает и прикручивает к ним датасорс. Как у этого датасорса переопределить методы active(), init() и т. д. ?
какая версия аксапты?

Посмотрел в AX2009 RU5 у класса FormDataSourse есть и метод active() и метод init() и пр.
X++:
static void Job27(Args _args)
{
    FormDataSource  fds;
    ;

    fds.active();
    fds.init();

    fds.validateWrite();
    fds.write();

    fds.validateDelete();
    fds.delete();
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 19.12.2011, 21:42   #6  
alexkrut is offline
alexkrut
Участник
 
20 / 33 (2) +++
Регистрация: 19.12.2011
Использовать АОТ не хотелось бы, потому что форм много, и они примерно одинаковые. Слишком много кода приходится копипастить из формы в форму, изменения минимальны. Да и best practices опять же.
Старый 19.12.2011, 21:47   #7  
alexkrut is offline
alexkrut
Участник
 
20 / 33 (2) +++
Регистрация: 19.12.2011
Цитата:
Сообщение от lev Посмотреть сообщение

Посмотрел в AX2009 RU5 у класса FormDataSourse есть и метод active() и метод init() и пр.
Вам слово переопределить говорит о чем - нибудь? Мне не не нужны методы в чистом виде, мне нужно дописать туда свой код до и после super();.
Старый 19.12.2011, 22:38   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Использовать АОТ не хотелось бы, потому что форм много, и они примерно одинаковые. Слишком много кода приходится копипастить из формы в форму, изменения минимальны. Да и best practices опять же.
Используйте одну форму и семейство классов для управления ею, посмотрите, как работают формы шапок журналов, посмотрите, как работает форма итогов по закупкам в 2009-й (там датасорс в дизайне формы - по таблице Common).
Старый 19.12.2011, 23:40   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Вам слово переопределить говорит о чем - нибудь? Мне не не нужны методы в чистом виде, мне нужно дописать туда свой код до и после super();.
ага, не сразу заметил слово "переопределить" в Вашем первом сообщении, простите великодушно

Если я правильно понимаю, то вы делаете программируемую форму (ну т.е. форма создается из кода), так? Если да, то:
1. Все, что нужно сделать при инициализации формы можно сделать в том месте (наверное классе) откуда Вы эту форму создаете.
2. Все методы датасорса формы, можно перекрыть на самой таблице (например, write, update, insert, delete, validateWrite, validateDelete, изменения по полям можно отлавливать в методе modifiedField()). И уже на таблице выполнять какие либо бизнес требования. Если эти требования специфичны для Вашей форме, добавьте параметр на входе.

Вообще конечно какой то немного извращенный способ создания формы. Может вы опишите какую цель преследуете? Возможно её можно решить как то иначе (проще).
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 20.12.2011 в 00:25.
Старый 20.12.2011, 01:28   #10  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Есть класс, который создает форму, добавляет контролы, создает и прикручивает к ним датасорс. Как у этого датасорса переопределить методы active(), init() и т. д. ?
никак
Старый 22.12.2011, 11:56   #11  
shogel is offline
shogel
Участник
MCBMSS
Соотечественники
 
132 / 169 (6) ++++++
Регистрация: 21.02.2007
Адрес: Finland
В AX2012 можно унаследоваться от FormObjectSetNotify, перекрыть методы onActive/onRefresh и после создания датасорса:
X++:
formDS.addNotifyHandler(this);
Насчет AX2009 не уверен.
__________________
The 50-50-90 rule: Any time you have a 50-50 chance of getting something right, there’s a 90% probability you’ll get it wrong.

Последний раз редактировалось shogel; 22.12.2011 в 11:59.
Старый 22.12.2011, 15:57   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Да и best practices опять же.
Вы не могли бы дать ссылку на соответствующую статью best practices, которая призывает создавать форым из класса? Ну, или на ту статью, которая показалась Вам соответствующей данному случаю?

А вообще-то, присоединяюсь к вопросу lev. Может, Вы все-таки опишите саму задачу, а не выбранный Вами способ ее решения? Просто подобный способ решения противоречит стандартной идеологии Axapta.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 22.12.2011, 19:32   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Best Practice не в том, чтобы создавать формы из класса, а в том, чтобы не умножать сущности без необходимости и не пользоваться пунктом "Дублировать" контекстного меню в AOT. В некоторых случаях без создания форм на лету не обойтись - посмотрите на тот же конфигуратор продукции и класс PBABuildForm.
За это сообщение автора поблагодарили: Pustik (2), alexkrut (1).
Старый 22.12.2011, 20:48   #14  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Может быть, человек столкнулся с тем, что кто-то до него, на этом месте работы строил формы программно. Написано куча кода. И сейчас просят "кое-что отшлифовать". И без указанных выше переопределения методов в решении задачи не обойтись.Что делать? Переписывать все с нуля? Объяснить заказчику, что это фактически перекодирование проекта, которое займет уйму времени? Если так, то ситуация не самая приятная.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 23.12.2011, 10:38   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ребята, может, мы все-таки сначала послушаем "начальника транспортного цеха"? В смысле, автора темы.

Понятно, что ситуации бывают разные. Однако очевидно, что в Axapta форма - это не класс. Следовательно субклассирование невозможно, а все "обходные маневры" - это уже крайний случай, когда по другому не обойтись. Точнее, когда это "стоит дешевле", чем дублирование формы.

Вопрос в том, а действительно ли в данной конкретной задаче по другому не обойтись? Или автор просто по неопытности пытается применить к Axapta навыки, полученные в других языках программирования?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 27.12.2011, 08:44   #16  
alexkrut is offline
alexkrut
Участник
 
20 / 33 (2) +++
Регистрация: 19.12.2011
По просьбам трудящихся
Про задачу.

На работе автоматизируем один из отделов предприятия. Отдел занимается документами. Документы эти на 70-80 процентов похожи. Формы уже есть. Создавались в AOT. В формах соответственно 70-80 процентов повторяющегося кода. Если кто-то вдруг не понимает зачем нужно избавляться от повторения кода - книжка по рефакторингу вам в помощь.

Про ответы.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Понятно, что ситуации бывают разные. Однако очевидно, что в Axapta форма - это не класс. Следовательно субклассирование невозможно, а все "обходные маневры" - это уже крайний случай, когда по другому не обойтись.
А никто и не предлагал считать форму классом. Нужен класс, который рисует форму. И наследование уже от него, а не от созданной им формы.

Цитата:
Сообщение от lev Посмотреть сообщение
2. Все методы датасорса формы, можно перекрыть на самой таблице (например, write, update, insert, delete, validateWrite, validateDelete, изменения по полям можно отлавливать в методе modifiedField()). И уже на таблице выполнять какие либо бизнес требования. Если эти требования специфичны для Вашей форме, добавьте параметр на входе.
Далеко не все. Нам нужен полноценный датасорс, у которого перекрыты нужные нам методы.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Используйте одну форму и семейство классов для управления ею, посмотрите, как работают формы шапок журналов, посмотрите, как работает форма итогов по закупкам в 2009-й (там датасорс в дизайне формы - по таблице Common).
Спасибо, ваши ответы пока самые вменяемые здесь!
За это сообщение автора поблагодарили: blokva (-2).
Старый 27.12.2011, 09:58   #17  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от alexkrut Посмотреть сообщение
Далеко не все. Нам нужен полноценный датасорс, у которого перекрыты нужные нам методы.
Я имел ввиду все методы работающие с данными. Методы отвечающие за работу DataSource на форме (active(), reread(), refresh() и т.д. и т.п.) понятное дело перекрываются только у DataSource на форме.

Цитата:
Про задачу.

На работе автоматизируем один из отделов предприятия. Отдел занимается документами. Документы эти на 70-80 процентов похожи. Формы уже есть. Создавались в AOT. В формах соответственно 70-80 процентов повторяющегося кода. Если кто-то вдруг не понимает зачем нужно избавляться от повторения кода - книжка по рефакторингу вам в помощь.
Думаю для примера можно посмотреть как реализованы формы и их отображение у складских журналов (InventJournalTable): перенос, проводка, прибыль\убыток. Там тоже формы по каждому типу журнала на 70-80% одинаковы, но есть нюансы, которые разруливаются через семейство классов JournalFormTable (а точнее его наследник InventJournalFormTable) - это шапка журнала, и семейство классов JournalFormTrans (а точнее его наследник InventJournalFormTrans, у него тоже есть наследники, но думаю разберетесь) - это строки журналов.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: alexkrut (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как в наследуемом классе кл. RunBase перехватывать модиф. полей м.Prompt() alef_nor DAX: Программирование 2 11.05.2006 15:07
Различные типы связей (LinkType) для FormDataSource Maxim Gorbunov DAX: База знаний и проекты 1 16.05.2004 13:20
Гибрид FormTableControl и FormDataSource Андре DAX: Программирование 27 01.10.2003 09:58
Исполнение методов класса на стороне сервера (AOS)? SnowMan DAX: Программирование 11 28.08.2003 16:15
Собственный SQL запрос в FormDataSource Alexey DAX: База знаний и проекты 0 20.12.2001 00:35

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

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

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