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

 
 
Thread Tools Search this Thread Display Modes
Old 09.06.2015, 07:42   #1  
АртемМелихов is offline
АртемМелихов
Участник
АртемМелихов's Avatar
 
120 / 10 (1) +
Join Date: 18.12.2013
Location: Samara
Можно ли из кода изменить свойства Field в таблице, не в DS?
Можно ли из кода изменить свойства Field в таблице, не в DS? Например, изменить возможность редактирования. Спасибо!
Old 09.06.2015, 07:55   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Я правильно вас понял. Вы хотите программно изменить приложение? Тогда вам нужны методы для работы с AOT.

Но вы точно этого хотите? Зачем? Это что-то разовое, связанное с обновлением системы?
Old 09.06.2015, 08:02   #3  
АртемМелихов is offline
АртемМелихов
Участник
АртемМелихов's Avatar
 
120 / 10 (1) +
Join Date: 18.12.2013
Location: Samara
Quote:
Originally Posted by S.Kuskov View Post
Я правильно вас понял. Вы хотите программно изменить приложение? Тогда вам нужны методы для работы с AOT.

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

На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение.
Old 09.06.2015, 08:35   #5  
lvan is offline
lvan
Участник
lvan's Avatar
Лучший по профессии 2014
 
858 / 82 (4) ++++
Join Date: 15.04.2011
Blog Entries: 1
Quote:
Originally Posted by АртемМелихов View Post
при наличие
:facepalm:
This post has been rated by: DSPIC (0).
Old 09.06.2015, 08:36   #6  
АртемМелихов is offline
АртемМелихов
Участник
АртемМелихов's Avatar
 
120 / 10 (1) +
Join Date: 18.12.2013
Location: Samara
Quote:
Originally Posted by S.Kuskov View Post
Логику определения доступности поля можете реализовать в методе таблицы, но применять свойство доступности поля придётся на каждой форме. Либо заморачиваться и внедрять свой код в базовые классы работающие с формами, типа SysSetupFormRun, но имхо это того не стоит.

На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение.
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Old 09.06.2015, 08:38   #7  
lvan is offline
lvan
Участник
lvan's Avatar
Лучший по профессии 2014
 
858 / 82 (4) ++++
Join Date: 15.04.2011
Blog Entries: 1
нельзя сделать то, что вы хотите.
да и не должны вы этого хотеть
опять смахивает на сагу о X, Y и Z
This post has been rated by: gl00mie (0).
Old 09.06.2015, 08:46   #8  
axm2013
Гость
 
n/a
Quote:
Originally Posted by АртемМелихов View Post
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Если к примеру вам хочется ограничить доступность, то проще указанное сделать на fds.
Если хотите при этом общий метод на табличке то получится нечто типа

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

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

Last edited by axm2013; 09.06.2015 at 08:49.
Old 09.06.2015, 08:59   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Quote:
Originally Posted by АртемМелихов View Post
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Основная проблема здесь не как добраться до свойств датасорса в табличном методе (про это уже правильно всё подсказали), а как в таблице поймать событие при котором следует менять эти самые свойства. Нужные события они все на уровне датасорса а не на уровне таблиц (.

Last edited by S.Kuskov; 09.06.2015 at 09:02.
Old 09.06.2015, 09:08   #10  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Join Date: 15.06.2004
Location: москва
если есть сложная логика, лучше сделать Edit метод и вывести его на формы, а редактирование исходного поля запретить
Old 09.06.2015, 09:10   #11  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
TasmanianDevil's Avatar
Злыдни
 
887 / 389 (14) ++++++
Join Date: 24.01.2005
Location: Томск
Что только мОлодежь не придумает, лишь не работать

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

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

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

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

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

Глобально эту задачу доступными средствами не решить - просто смиритесь с этим и делайте как все, класс-обработчик доступа в каждую форму.
Ну, в 2009 наверное да, но в 2012 - почему бы и нет?
X++:
fds.object(fieldnum(...)).registerOverrideMethod(...)
И - вперед
PS: сам тоже не пробовал, но ведь уже есть куда копать...
This post has been rated by: АртемМелихов (1).
Old 09.06.2015, 11:20   #13  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
TasmanianDevil's Avatar
Злыдни
 
887 / 389 (14) ++++++
Join Date: 24.01.2005
Location: Томск
Quote:
Originally Posted by makbeth View Post
1. info.formNotify и, например, основанный на нем в 2009 FormRunListener_RU
2. Рисование наследника FormObjectSetNotify и использование addNotifyHandler на датасорсе.
...
X++:
fds.object(fieldnum(...)).registerOverrideMethod(...)
Максим, а вообще без допрограммирования на форме/датасорсе всяких регистраторов извещений ?
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
__________________
Мы летаем, кружимся, нагоняем ужасы ...

Last edited by TasmanianDevil; 09.06.2015 at 11:23.
This post has been rated by: S.Kuskov (1).
Old 09.06.2015, 11:40   #14  
axm2013
Гость
 
n/a
Quote:
Originally Posted by TasmanianDevil View Post
...
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
Чуть ранее
Quote:
Originally Posted by TasmanianDevil
Есть, SysSetupFormRun,
Old 09.06.2015, 11:56   #15  
makbeth is offline
makbeth
Участник
makbeth's Avatar
КОРУС Консалтинг
 
43 / 52 (2) ++++
Join Date: 15.05.2007
Location: Санкт-Петербург
Quote:
Originally Posted by TasmanianDevil View Post
Максим, а вообще без допрограммирования на форме/датасорсе всяких регистраторов извещений ?
"А вообще без программирования" нам кушать станет не на что

А так - все верно. Определенные изменения в SysSetupFormRun придется сделать.
Хотя мне больше нравится подход, когда определенный движок уже реализован в сторонке, но чтобы добавить поддержку это движка на форму, стоит внести изменения только в эту форму (например, написав что-то типа myMegaEngine.activateFor(element) в init), а не проверять нужна ли поддержка для каждой формы при ее открытии. Тем более для чего может пригодится такая вот необходимость влезать в каждую форму я даже не представляю.
Old 09.06.2015, 12:52   #16  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
TasmanianDevil's Avatar
Злыдни
 
887 / 389 (14) ++++++
Join Date: 24.01.2005
Location: Томск
Quote:
Originally Posted by makbeth View Post
"А вообще без программирования" нам кушать станет не на что
Фундаментальный продукт. позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.

Quote:
Originally Posted by makbeth View Post
А так - все верно. Определенные изменения в SysSetupFormRun придется сделать.
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи ? Спозиционировались, механизм отработал, начинаем редактировать и по результату редактирования доступ должен измениться. Чегой-то мне кажется, что без доступа к xRecord.modifiedField() вряд ли получится
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Old 09.06.2015, 12:53   #17  
pitersky is offline
pitersky
северный Будда
pitersky's Avatar
Ex AND Project
Соотечественники
 
1,517 / 435 (18) +++++++
Join Date: 26.09.2007
Location: Солнечная система
Quote:
Originally Posted by АртемМелихов View Post
Это я понимаю. Я не понимаю как добраться из кода в свойства field? this.field1.ичтодальше?
Вы бы всё-таки чуть поподробнее про саму задачу рассказали. Я вот за 10 лет работы с аксаптой ни разу не сталкивался с необходимостью такого хардкода.
__________________
С уважением,
Вячеслав
Old 09.06.2015, 13:37   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Join Date: 28.11.2005
Location: Москва
Blog Entries: 3
Quote:
Originally Posted by TasmanianDevil View Post
Фундаментальный продукт, позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.
К счастью, нету таких - и не надо Потому что все эти "фундаментальные продукты" не всякий консультант нормально использовать может, а клиент не понимает, зачем ему ради "одного-единственного поля" пытаются продать дорогущий "комбайн" + кучу часов консалтинга для его настройки.
Quote:
Originally Posted by TasmanianDevil View Post
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи?
Узко мыслите Кроме виндового клиента у Аксапты еще есть веб-клиент Корпоративного портала, есть всякие там интеграции, в т.ч. через Excel какой-нить, и там эти "фундаментальные продукты", висящие гроздью на SysSetupFormRun, просто идут лесом. А всё потому, что идет попытка смешать бизнес-логику с презентационной. Подсвечивание поля как доступного/недоступного для редактирования на форме, - это сугубо презентационная логика, которую при желании можно и обойти. Если же требуется реализовать запрет на изменение поля в рамках бизнес-логики, то это нужно делать явно не на xRecord.modifiedField() и прочих FormDataSource.active()
Old 09.06.2015, 17:20   #19  
Ruff is offline
Ruff
Дмитрий Ерин
Ruff's Avatar
1C
 
475 / 396 (14) ++++++
Join Date: 18.09.2003
Location: Тула
Кстати, не так уж много таблиц в системе, задействованных в большом количестве форм. Чтобы примерно оценить, стоит ли игра свеч, можно воспользоваться таким джобом (как пользоваться - см. комментарии):
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 "Топ" выглядит примерно так (см. вложение):
Attached Images
 
__________________
Old 10.06.2015, 09:00   #20  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Join Date: 28.12.2001
Location: Москва
Quote:
Originally Posted by Ruff View Post
Чтобы примерно оценить, стоит ли игра свеч,
Сюда вряд ли попадут автоматически присоединяемые datasource Dir* и т.п...
__________________
С уважением, Вячеслав.
Tags
field, код, свойства

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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

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 17:30.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.