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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.06.2015, 07:42   #1  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Можно ли из кода изменить свойства Field в таблице, не в DS?
Можно ли из кода изменить свойства Field в таблице, не в DS? Например, изменить возможность редактирования. Спасибо!
Старый 09.06.2015, 07:55   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я правильно вас понял. Вы хотите программно изменить приложение? Тогда вам нужны методы для работы с AOT.

Но вы точно этого хотите? Зачем? Это что-то разовое, связанное с обновлением системы?
Старый 09.06.2015, 08:02   #3  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Я правильно вас понял. Вы хотите программно изменить приложение? Тогда вам нужны методы для работы с AOT.

Но вы точно этого хотите? Зачем? Это что-то разовое, связанное с обновлением системы?
Нет, речь идет о возможности редактирования определенного поля, при наличие определенных условий. И правило должно работать не на одной форме а всегда. Поэтому и задумался о реализации правила не в DataSource
Старый 09.06.2015, 08:13   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Логику определения доступности поля можете реализовать в методе таблицы, но применять свойство доступности поля придётся на каждой форме. Либо заморачиваться и внедрять свой код в базовые классы работающие с формами, типа SysSetupFormRun, но имхо это того не стоит.

На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение.
Старый 09.06.2015, 08:35   #5  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
при наличие
:facepalm:
За это сообщение автора поблагодарили: DSPIC (0).
Старый 09.06.2015, 08:36   #6  
АртемМелихов is offline
АртемМелихов
Участник
Аватар для АртемМелихов
 
120 / 10 (1) +
Регистрация: 18.12.2013
Адрес: Samara
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Логику определения доступности поля можете реализовать в методе таблицы, но применять свойство доступности поля придётся на каждой форме. Либо заморачиваться и внедрять свой код в базовые классы работающие с формами, типа SysSetupFormRun, но имхо это того не стоит.

На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение.
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Старый 09.06.2015, 08:38   #7  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
нельзя сделать то, что вы хотите.
да и не должны вы этого хотеть
опять смахивает на сагу о X, Y и Z
За это сообщение автора поблагодарили: gl00mie (0).
Старый 09.06.2015, 08:46   #8  
axm2013
Гость
 
n/a
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Если к примеру вам хочется ограничить доступность, то проще указанное сделать на fds.
Если хотите при этом общий метод на табличке то получится нечто типа

метод таблички

FormDataSource fds;
...
if (this.datasource())
{
fds = this.datasource();
fds.object(fieldId).allowEdit(...)
}

Последний раз редактировалось axm2013; 09.06.2015 в 08:49.
Старый 09.06.2015, 08:59   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Основная проблема здесь не как добраться до свойств датасорса в табличном методе (про это уже правильно всё подсказали), а как в таблице поймать событие при котором следует менять эти самые свойства. Нужные события они все на уровне датасорса а не на уровне таблиц (.

Последний раз редактировалось S.Kuskov; 09.06.2015 в 09:02.
Старый 09.06.2015, 09:08   #10  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
если есть сложная логика, лучше сделать Edit метод и вывести его на формы, а редактирование исходного поля запретить
Старый 09.06.2015, 09:10   #11  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Что только мОлодежь не придумает, лишь не работать

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

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

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

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

P.S. Можно, конечно, проявить профессиональную Йаркость™, хакнув приложение,сняв атрибут скрытости с FormDataSource и xRecord.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 09.06.2015, 10:23   #12  
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   #13  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 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   #14  
axm2013
Гость
 
n/a
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
...
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
Чуть ранее
Цитата:
Сообщение от TasmanianDevil
Есть, SysSetupFormRun,
Старый 09.06.2015, 11:56   #15  
makbeth is offline
makbeth
Участник
Аватар для makbeth
КОРУС Консалтинг
 
43 / 52 (2) ++++
Регистрация: 15.05.2007
Адрес: Санкт-Петербург
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Максим, а вообще без допрограммирования на форме/датасорсе всяких регистраторов извещений ?
"А вообще без программирования" нам кушать станет не на что

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

Цитата:
Сообщение от makbeth Посмотреть сообщение
А так - все верно. Определенные изменения в SysSetupFormRun придется сделать.
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи ? Спозиционировались, механизм отработал, начинаем редактировать и по результату редактирования доступ должен измениться. Чегой-то мне кажется, что без доступа к xRecord.modifiedField() вряд ли получится
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 09.06.2015, 12:53   #17  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от АртемМелихов Посмотреть сообщение
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Вы бы всё-таки чуть поподробнее про саму задачу рассказали. Я вот за 10 лет работы с аксаптой ни разу не сталкивался с необходимостью такого хардкода.
__________________
С уважением,
Вячеслав
Старый 09.06.2015, 13:37   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Фундаментальный продукт, позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.
К счастью, нету таких - и не надо Потому что все эти "фундаментальные продукты" не всякий консультант нормально использовать может, а клиент не понимает, зачем ему ради "одного-единственного поля" пытаются продать дорогущий "комбайн" + кучу часов консалтинга для его настройки.
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи?
Узко мыслите Кроме виндового клиента у Аксапты еще есть веб-клиент Корпоративного портала, есть всякие там интеграции, в т.ч. через Excel какой-нить, и там эти "фундаментальные продукты", висящие гроздью на SysSetupFormRun, просто идут лесом. А всё потому, что идет попытка смешать бизнес-логику с презентационной. Подсвечивание поля как доступного/недоступного для редактирования на форме, - это сугубо презентационная логика, которую при желании можно и обойти. Если же требуется реализовать запрет на изменение поля в рамках бизнес-логики, то это нужно делать явно не на xRecord.modifiedField() и прочих FormDataSource.active()
Старый 09.06.2015, 17:20   #19  
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, 09:00   #20  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Сообщение от Ruff Посмотреть сообщение
Чтобы примерно оценить, стоит ли игра свеч,
Сюда вряд ли попадут автоматически присоединяемые datasource Dir* и т.п...
__________________
С уважением, Вячеслав.
Теги
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, время: 13:29.