09.06.2015, 07:42 | #1 |
Участник
|
Можно ли из кода изменить свойства Field в таблице, не в DS?
Можно ли из кода изменить свойства Field в таблице, не в DS? Например, изменить возможность редактирования. Спасибо!
|
|
09.06.2015, 07:55 | #2 |
Участник
|
Я правильно вас понял. Вы хотите программно изменить приложение? Тогда вам нужны методы для работы с AOT.
Но вы точно этого хотите? Зачем? Это что-то разовое, связанное с обновлением системы? |
|
09.06.2015, 08:02 | #3 |
Участник
|
Нет, речь идет о возможности редактирования определенного поля, при наличие определенных условий. И правило должно работать не на одной форме а всегда. Поэтому и задумался о реализации правила не в DataSource
|
|
09.06.2015, 08:13 | #4 |
Участник
|
Логику определения доступности поля можете реализовать в методе таблицы, но применять свойство доступности поля придётся на каждой форме. Либо заморачиваться и внедрять свой код в базовые классы работающие с формами, типа SysSetupFormRun, но имхо это того не стоит.
На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение. |
|
09.06.2015, 08:35 | #5 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: DSPIC (0). |
09.06.2015, 08:36 | #6 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Логику определения доступности поля можете реализовать в методе таблицы, но применять свойство доступности поля придётся на каждой форме. Либо заморачиваться и внедрять свой код в базовые классы работающие с формами, типа SysSetupFormRun, но имхо это того не стоит.
На уровне таблицы можно использовать методы ValidateField или ValidateWrite, чтобы запретить редактирование, В этом случае пользователь увидит сообщение об ошибке при попытке сохранить значение. |
|
09.06.2015, 08:38 | #7 |
Участник
|
нельзя сделать то, что вы хотите.
да и не должны вы этого хотеть опять смахивает на сагу о X, Y и Z |
|
|
За это сообщение автора поблагодарили: gl00mie (0). |
09.06.2015, 08:46 | #8 |
Гость
|
Цитата:
Если хотите при этом общий метод на табличке то получится нечто типа метод таблички 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; 09.06.2015 в 09:02. |
|
09.06.2015, 09:08 | #10 |
Участник
|
если есть сложная логика, лучше сделать Edit метод и вывести его на формы, а редактирование исходного поля запретить
|
|
09.06.2015, 09:10 | #11 |
Мрачный тип
|
Что только мОлодежь не придумает, лишь не работать
Задача какова - единым инструментом в любой форме рулить доступностью редактирования определенных полей определенной таблицы на основании определенных правил. Руление это необходимо в двух случаях - при переходе на новую запись и при редактировании текущей. Есть какой-нибудь общий системный класс, позволяющий глобально из одного места добраться до источников данных любой формы ? Есть, SysSetupFormRun, упомянутый S.Kuskov. Позволяет этот класс отслеживать смену позиции в источнике данных управляемой формы и идентифицировать сам источник, в котором произошли изменения? Нет, он больше для элементов управления, контролов то бишь, заточен. Более подходящим бы класс FormDataSource, но он системный и скрытый, в его active() не залезешь. Это первая птичка обломинго ... Есть какой нибудь класс, общий для всех таблиц, позволяющий отслеживать изменения полей в табличной переменной ? Есть, xRecord - но он системный и скрытый. Влезть в его modifiedField() не выйдет. Это птичка обломинго номер два... Глобально эту задачу доступными средствами не решить - просто смиритесь с этим и делайте как все, класс-обработчик доступа в каждую форму. P.S. Можно, конечно, проявить профессиональную Йаркость™, хакнув приложение,сняв атрибут скрытости с FormDataSource и xRecord.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
09.06.2015, 10:23 | #12 |
Участник
|
Цитата:
Сообщение от TasmanianDevil
Есть какой-нибудь общий системный класс, позволяющий глобально из одного места добраться до источников данных любой формы ? Есть, SysSetupFormRun, упомянутый S.Kuskov. Позволяет этот класс отслеживать смену позиции в источнике данных управляемой формы и идентифицировать сам источник, в котором произошли изменения? Нет, он больше для элементов управления, контролов то бишь, заточен. Более подходящим бы класс FormDataSource, но он системный и скрытый, в его active() не залезешь. Это первая птичка обломинго ...
1. info.formNotify и, например, основанный на нем в 2009 FormRunListener_RU 2. Рисование наследника FormObjectSetNotify и использование addNotifyHandler на датасорсе. Позволяет отслеживать несколько событий датасорса, в т.ч. и active. Правда у меня в итоге не прижился, ибо при его использовании если на форме в гриде потащить за скроллбар мышью, то при отпускании мыши клиент заворачивал ласты. Что-то в ядре там перемудрили. Это на 2009, в 2012 может поправили. Цитата:
Сообщение от TasmanianDevil
Есть какой нибудь класс, общий для всех таблиц, позволяющий отслеживать изменения полей в табличной переменной ? Есть, xRecord - но он системный и скрытый. Влезть в его modifiedField() не выйдет. Это птичка обломинго номер два...
Глобально эту задачу доступными средствами не решить - просто смиритесь с этим и делайте как все, класс-обработчик доступа в каждую форму. X++: fds.object(fieldnum(...)).registerOverrideMethod(...) PS: сам тоже не пробовал, но ведь уже есть куда копать... |
|
|
За это сообщение автора поблагодарили: АртемМелихов (1). |
09.06.2015, 11:20 | #13 |
Мрачный тип
|
Цитата:
Чтоб создать форму в АОТ с нуля, кинуть ей датасорс, грид, в грид поля, открыть форму и наслаждаться изменениями доступности полей при навигации и редактировании по предопределенным где-то правилам...
__________________
Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 09.06.2015 в 11:23. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
09.06.2015, 11:40 | #14 |
Гость
|
Цитата:
Цитата:
Сообщение от TasmanianDevil
Есть, SysSetupFormRun,
|
|
09.06.2015, 11:56 | #15 |
Участник
|
Цитата:
А так - все верно. Определенные изменения в SysSetupFormRun придется сделать. Хотя мне больше нравится подход, когда определенный движок уже реализован в сторонке, но чтобы добавить поддержку это движка на форму, стоит внести изменения только в эту форму (например, написав что-то типа myMegaEngine.activateFor(element) в init), а не проверять нужна ли поддержка для каждой формы при ее открытии. Тем более для чего может пригодится такая вот необходимость влезать в каждую форму я даже не представляю. |
|
09.06.2015, 12:52 | #16 |
Мрачный тип
|
Фундаментальный продукт. позволяющий избавиться от мелкого программерства стоит дороже и правильное его позиционирование не даст умереть с голоду.
Хорошо, по навигации все отловится через SysSetupFormRun - а при редактированиии записи ? Спозиционировались, механизм отработал, начинаем редактировать и по результату редактирования доступ должен измениться. Чегой-то мне кажется, что без доступа к xRecord.modifiedField() вряд ли получится
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
09.06.2015, 12:53 | #17 |
северный Будда
|
Вы бы всё-таки чуть поподробнее про саму задачу рассказали. Я вот за 10 лет работы с аксаптой ни разу не сталкивался с необходимостью такого хардкода.
__________________
С уважением, Вячеслав |
|
09.06.2015, 13:37 | #18 |
Участник
|
Цитата:
|
|
09.06.2015, 17:20 | #19 |
Дмитрий Ерин
|
Кстати, не так уж много таблиц в системе, задействованных в большом количестве форм. Чтобы примерно оценить, стоит ли игра свеч, можно воспользоваться таким джобом (как пользоваться - см. комментарии):
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)); }
__________________
|
|
10.06.2015, 09:00 | #20 |
сибиряк
|
Сюда вряд ли попадут автоматически присоединяемые datasource Dir* и т.п...
__________________
С уважением, Вячеслав. |
|
Теги |
field, код, свойства |
|
|