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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.06.2015, 09:10   #1  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
887 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Что только мОлодежь не придумает, лишь не работать

Задача какова - единым инструментом в любой форме рулить доступностью редактирования определенных полей определенной таблицы на основании определенных правил. Руление это необходимо в двух случаях - при переходе на новую запись и при редактировании текущей.

Есть какой-нибудь общий системный класс, позволяющий глобально из одного места добраться до источников данных любой формы ? Есть, SysSetupFormRun, упомянутый S.Kuskov. Позволяет этот класс отслеживать смену позиции в источнике данных управляемой формы и идентифицировать сам источник, в котором произошли изменения? Нет, он больше для элементов управления, контролов то бишь, заточен. Более подходящим бы класс FormDataSource, но он системный и скрытый, в его active() не залезешь. Это первая птичка обломинго ...

Есть какой нибудь класс, общий для всех таблиц, позволяющий отслеживать изменения полей в табличной переменной ? Есть, xRecord - но он системный и скрытый. Влезть в его modifiedField() не выйдет. Это птичка обломинго номер два...

Глобально эту задачу доступными средствами не решить - просто смиритесь с этим и делайте как все, класс-обработчик доступа в каждую форму.

P.S. Можно, конечно, проявить профессиональную Йаркость™, хакнув приложение,сняв атрибут скрытости с FormDataSource и xRecord.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 09.06.2015, 10:23   #2  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Есть какой-нибудь общий системный класс, позволяющий глобально из одного места добраться до источников данных любой формы ? Есть, SysSetupFormRun, упомянутый S.Kuskov. Позволяет этот класс отслеживать смену позиции в источнике данных управляемой формы и идентифицировать сам источник, в котором произошли изменения? Нет, он больше для элементов управления, контролов то бишь, заточен. Более подходящим бы класс FormDataSource, но он системный и скрытый, в его active() не залезешь. Это первая птичка обломинго ...
Ну не такая уже и прям обломинго. Сходу могу назвать целых два способа руления событием active на любой форме:
1. info.formNotify и, например, основанный на нем в 2009 FormRunListener_RU
2. Рисование наследника FormObjectSetNotify и использование addNotifyHandler на датасорсе. Позволяет отслеживать несколько событий датасорса, в т.ч. и active. Правда у меня в итоге не прижился, ибо при его использовании если на форме в гриде потащить за скроллбар мышью, то при отпускании мыши клиент заворачивал ласты. Что-то в ядре там перемудрили. Это на 2009, в 2012 может поправили.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Есть какой нибудь класс, общий для всех таблиц, позволяющий отслеживать изменения полей в табличной переменной ? Есть, xRecord - но он системный и скрытый. Влезть в его modifiedField() не выйдет. Это птичка обломинго номер два...

Глобально эту задачу доступными средствами не решить - просто смиритесь с этим и делайте как все, класс-обработчик доступа в каждую форму.
Ну, в 2009 наверное да, но в 2012 - почему бы и нет?
X++:
fds.object(fieldnum(...)).registerOverrideMethod(...)
И - вперед
PS: сам тоже не пробовал, но ведь уже есть куда копать...
За это сообщение автора поблагодарили: АртемМелихов (1).
Старый 09.06.2015, 11:20   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
887 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от makbeth Посмотреть сообщение
1. info.formNotify и, например, основанный на нем в 2009 FormRunListener_RU
2. Рисование наследника FormObjectSetNotify и использование addNotifyHandler на датасорсе.
...
X++:
fds.object(fieldnum(...)).registerOverrideMethod(...)
Максим, а вообще без допрограммирования на форме/датасорсе всяких регистраторов извещений ?
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Последний раз редактировалось TasmanianDevil; 09.06.2015 в 11:23.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 09.06.2015, 11:40   #4  
axm2013
Гость
 
n/a
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
...
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
Чуть ранее
Цитата:
Сообщение от TasmanianDevil
Есть, SysSetupFormRun,
Старый 09.06.2015, 11:56   #5  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Максим, а вообще без допрограммирования на форме/датасорсе всяких регистраторов извещений ?
"А вообще без программирования" нам кушать станет не на что

А так - все верно. Определенные изменения в SysSetupFormRun придется сделать.
Хотя мне больше нравится подход, когда определенный движок уже реализован в сторонке, но чтобы добавить поддержку это движка на форму, стоит внести изменения только в эту форму (например, написав что-то типа myMegaEngine.activateFor(element) в init), а не проверять нужна ли поддержка для каждой формы при ее открытии. Тем более для чего может пригодится такая вот необходимость влезать в каждую форму я даже не представляю.
Старый 09.06.2015, 12:52   #6  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
887 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от makbeth Посмотреть сообщение
"А вообще без программирования" нам кушать станет не на что
Фундаментальный продукт. позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.

Цитата:
Сообщение от makbeth Посмотреть сообщение
А так - все верно. Определенные изменения в SysSetupFormRun придется сделать.
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи ? Спозиционировались, механизм отработал, начинаем редактировать и по результату редактирования доступ должен измениться. Чегой-то мне кажется, что без доступа к xRecord.modifiedField() вряд ли получится
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 09.06.2015, 13:37   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Фундаментальный продукт, позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.
К счастью, нету таких - и не надо Потому что все эти "фундаментальные продукты" не всякий консультант нормально использовать может, а клиент не понимает, зачем ему ради "одного-единственного поля" пытаются продать дорогущий "комбайн" + кучу часов консалтинга для его настройки.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи?
Узко мыслите Кроме виндового клиента у Аксапты еще есть веб-клиент Корпоративного портала, есть всякие там интеграции, в т.ч. через Excel какой-нить, и там эти "фундаментальные продукты", висящие гроздью на SysSetupFormRun, просто идут лесом. А всё потому, что идет попытка смешать бизнес-логику с презентационной. Подсвечивание поля как доступного/недоступного для редактирования на форме, - это сугубо презентационная логика, которую при желании можно и обойти. Если же требуется реализовать запрет на изменение поля в рамках бизнес-логики, то это нужно делать явно не на xRecord.modifiedField() и прочих FormDataSource.active()
Старый 09.06.2015, 17:20   #8  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Кстати, не так уж много таблиц в системе, задействованных в большом количестве форм. Чтобы примерно оценить, стоит ли игра свеч, можно воспользоваться таким джобом (как пользоваться - см. комментарии):
X++:
static void ShowMostUsedTables(Args _args)
{
////////////////////////////////////////////////////////////////
// С заданными ниже параметрами Job работает около 5-7 секунд, меняйте с осторожностью:)

    #define.DSCountCriteria     (10)        // критерий попадания в "ТОП" (минимальное количество ссылающихся DS)
    #define.TableFilter         ("*")       // доп. фильтр, например: "Invent*", "Ledger*", "Vend*"
////////////////////////////////////////////////////////////////
    xRefReferences      xref;
    xRefPaths           forms, tables;

    RecordSortedList    sortedList = new RecordSortedList(tablenum(xRefPaths));

    ;
    sortedList.sortOrder(fieldnum(xRefPaths, ApplObjectPathRecId), fieldnum(xRefPaths, RecId));
    
    // перебрать таблицы
    while select Path, RecId from tables
        group by tables.Path, RecId
        where     tables.Path like "\\\\Data Dictionary\\\\Tables\\\\" + #TableFilter   
            &&  !(tables.Path like "*\\\\Tables\\\\?*\\\\*")                            // исключить все подузлы
    // подсчитать ссылки "Чем используется"
    join    count (RecId) from xref                                                     
        where   xref.referencePathRecId     == tables.RecId
            &&  xref.line                   == 0                                        // исключить ссылки из X++ кода
    // наложить фильтр на ссылки
    exists join forms                                                                   
        where   forms.RecId     == xref.xRefPathRecId
            &&    forms.Path    like "\\\\Forms\\\\?*\\\\Data Sources\\\\*"             // интересуют DS форм
            &&  !(forms.Path    like "*\\\\Fields\\\\*")                                // не интересуют поля и прочее
            &&  !(forms.Path    like "*\\\\Ranges\\\\*")
            &&  !(forms.Path    like "*\\\\Sorting\\\\*")                    
    {
        if (xref.RecId >= #DSCountCriteria)
        {
            tables.ApplObjectPathRecId = -xref.RecId;  // минус - для убывающей сортировки
            sortedList.ins(tables);
        }
    }
    setprefix(strfmt("Найдено %1 таблиц (по фильтру %2) с количеством ссылающихся FormDS >= %3", sortedList.len(), #TableFilter, #DSCountCriteria));
    info("Сount of FormDS; TableName");

    sortedList.first(tables);
    do{
        info(strfmt("%1; %2", -tables.ApplObjectPathRecId, tables.pathName()));
    } 
    while (sortedList.next(tables));
}
На кастомизированной DAX2009 "Топ" выглядит примерно так (см. вложение):
Изображения
 
__________________
Старый 10.06.2015, 15:10   #9  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
887 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от gl00mie Посмотреть сообщение
К счастью, нету таких - и не надо
Вот за все и за всех говорить - точно не надо.
По крайней мере одна фундаментальная доработка в виде расширения RLS по доступности редактирования/удаления видимых записей (записей целиком, а не отдельных полей, как у топикстартера) является востребованной и не раз запрашивалась здесь на форуме.

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

Цитата:
Сообщение от gl00mie Посмотреть сообщение
а клиент не понимает, зачем ему ради "одного-единственного поля" пытаются продать дорогущий "комбайн" + кучу часов консалтинга для его настройки.
Понятия не имею о чем Вы говорите. Видимо потому, что подавляющее большинство времени работаю на клиенте и делаю доработки по его осознанным и выстраданным потребностям.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Узко мыслите
Дык чего ждать от низкорожденного IT-чандалы, не понимающего местами необъятного широкомыслия разработческих брахманов из MBS, воплотивших в системе божественную безупречность и логичность
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: slava (1).
Теги
field, код, свойства

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kashperuk Ivan: Tutorial: AX 2012 - Invalid field access or Accessing unretrieved fields Blog bot DAX Blogs 0 29.10.2011 05:18
DynamicsAxSCM: The InventTrans table. Explore various field usages. Blog bot DAX Blogs 0 09.11.2010 19:10
Как можно управлять элементом Grid из кода? vitk DAX: Программирование 4 26.08.2004 16:02
DS по временной таблице странно обновлляется ArturK DAX: Программирование 2 29.07.2004 19:27
Что и как можно резать? George Nordic DAX: Администрирование 1 11.05.2004 18:44

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

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

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