![]() |
#1 |
Участник
|
Связь полей.
Добрый день.
Есть форма, в ней есть данные из таблицы А и таблицы Б. В init методе таблицы А при изменении поля ==> изменяется поле в форме, которое из таблицы Б. Как сделать, чтобы при изменении поля в таблице Б, оно менялось и в таблице В, которая не связана с данными таблицами и формой? Может и слишком простой вопрос, но я пока что новичок. Сильно не критикуйте ![]() |
|
![]() |
#2 |
Участник
|
например есть закупка. При изменении рег. номера изменяется профиль учета. В строках он тоже меняется. А при переходе к основной форме партии товара, профиль учета не меняется. Нужно, чтобы он менялся тоже.
|
|
![]() |
#3 |
Участник
|
Попробуйте из подчиненной формы выудить источник данных вызывающей формы и обновить его:
примерно такой код можно было бы вставить в метод modified на поле источника данных или же в метод write источника данных, где меняется рег номер -> профиль учета X++: FormDataSource callerDataSource;
if (element.args().record() && element.args().record().isFormDataSource())
{
callerDataSource = element.args().record().dataSource();
callerDataSource.reread();
callerDataSource.refresh();
}
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
![]() |
#4 |
Участник
|
Просто в методе init Таблицы А меняется рег. номер и профиль учета.
Хотелось бы в том же init методе таблицы А прописать условие. |
|
![]() |
#5 |
Участник
|
Абстрактно: вам нужно разобраться с двумя моментами
- как программно (например из тестового Job) выполнить изменения нужных вам данных - в какое место (в какое событие) вставить ваш код, для того чтобы изменения произошли в нужный вам момент и на нужные вам значения Т.е. куда вставить код и какой код вставить. Пока по описанию задачи не понятно даже не только что, но и куда ![]() Цитата:
И ещё. Понятно что пользователь меняет данные в таблицах, работая на форме. При этом вызываюся некоторые методы-события формы , которые в свою очередь вызывают методы таблицы. Так вот. Методы формы обычно приходится менять для того чтобы изменить пользовательский интерфейс. Если изменять нужно данные, то в этом случае лучше программировать на уровне методов таблиц, а не форм. |
|
![]() |
#6 |
Участник
|
Покажите, пожалуйста, код метода init(), чтобы можно было представить всю картину.
Непонятно, почему вы для изменения данных используете именно этот метод. Если вы хотите, чтобы что-либо менялось при смене записей в главной таблице (читаем: источнике данных) на форме, используйте метод active(). Если вы хотите обновлять другие данные при внесении изменений, используйте методы update(), modified()/modifiedField() или на худой конец textChange().
__________________
// no comments |
|
![]() |
#7 |
Участник
|
S.Kuskov, да, нужно изменять данные, вот я и хочу на уровне метода таблицы это сделать.
Просто не совсем понимаю как написать условие выхода на другую таблицу. Dech, X++: if (rContractTable.InventProfileType || rContractTable.InventProfileId)
{
this.InventProfileType_RU = rContractTable.InventProfileType;
this.InventProfileId_RU = rContractTable.InventProfileId;
} |
|
![]() |
#8 |
Участник
|
Не очень понятно что должно происходить. Например, как будет обрабатываться рассогласования данных в случае несохранения данных в одной из форм?
|
|
![]() |
#9 |
Участник
|
|
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
Участник
|
Цитата:
X++: InventBatch.OwnershipAccId = InventDim.InventProfileId_RU Последний раз редактировалось Stingich; 25.04.2013 в 11:51. |
|
![]() |
#12 |
Участник
|
Смотрите. Этот метод на самом деле не меняет значение поля в БД. Он присваивает значение полю табличного курсора. Сохранение сделанных изменений в БД будет происходить в методе update() таблицы. Если, скажем, после того как отработает метод initContractAccount и до того как выполнится метод update(), произойдёт непредвиденная ошибка (выключится свет), то данные в БД не изменятся. Поэтому изменять значения в третьей таблице в этом методе не стоит.
Цитата:
Найти откуда вызывается метод можно экспериментальным путём. Поставьте точку останова в этот метод. Когда точка останова сработает, в отладчике проанализируйте стек вызовов. |
|
|
За это сообщение автора поблагодарили: Stingich (1). |
![]() |
#13 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Смотрите. Этот метод на самом деле не меняет значение поля в БД. Он присваивает значение полю табличного курсора. Сохранение сделанных изменений в БД будет происходить в методе update() таблицы. Если, скажем, после того как отработает метод initContractAccount и до того как выполнится метод update(), произойдёт непредвиденная ошибка (выключится свет), то данные в БД не изменятся. Поэтому изменять значения в третьей таблице в этом методе не стоит.
Код который вы привели не отвечает за изменение в таблице строк. Он обновляет значение только в курсоре верхней таблицы. Ищите то место откуда происходит вызов метода update() таблицы строк. Найти откуда вызывается метод можно экспериментальным путём. Поставьте точку останова в этот метод. Когда точка останова сработает, в отладчике проанализируйте стек вызовов. |
|
![]() |
#14 |
Участник
|
Цитата:
- Из названия и местоположения метода initContractAccount на таблице PurchTable следует, что он предназанчен для инициализации полей ContractAccount таблицы PurchTable. Вставлять в него код для изменения пусть таких же полей но другой таблицы - не логично. - Добавлять код, меняющий данные в БД, в метод, который предназначен для изменения значений лишь в курсоре - не логично. |
|
![]() |
#15 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() На всякий случай ещё раз. Две причины, по которым не стоит этого делать - это название метода: initContractAccount и его местоположение: таблица PurchTable.
- Из названия и местоположения метода initContractAccount на таблице PurchTable следует, что он предназанчен для инициализации полей ContractAccount таблицы PurchTable. Вставлять в него код для изменения пусть таких же полей но другой таблицы - не логично. - Добавлять код, меняющий данные в БД, в метод, который предназначен для изменения значений лишь в курсоре - не логично. |
|
![]() |
#16 |
Участник
|
Цитата:
Вы должны сами найти запись в inventBatch которую хотите изменить; выбрать её для обновления; задать новое значение поля; и наконец вызвать метод update() таблицы inventBatch для сохранения изменений в БД. |
|
![]() |
#17 |
Участник
|
Спасибо за ответы, буду копать.
|
|