31.03.2011, 12:57 | #1 |
Злыдни
|
Определение родительского источника из класса, вызванного из дочерней формы
Возник вопрос, который я, как не программист, решить не могу (подсказать, в какую сторону копать, надо ):
1. Есть форма с родительской таблицей (например, SalesTable); 2. Есть связанная таблица (например, SalesTableLink - 1:n) и форма для ее отображения; 3. На дочерней форме есть пункт меню, который вызывает определенный класс. Вопрос: как определить идентификатор записи родительской таблицы, из которой была открыта дочерняя форма, в этом классе, если в связанной таблице еще не созданы записи (т.е. набор записей пустой)?
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
31.03.2011, 13:04 | #2 |
Участник
|
в args.record() дочерней формы должен быть курсор родительской таблицы. Создайте на форме метод, возвращающий это значение и дергайте его из класса.
Как из класса получить ссылку на вызвавшую его форму знаете? Последний раз редактировалось S.Kuskov; 31.03.2011 в 13:07. |
|
31.03.2011, 13:09 | #3 |
Участник
|
1. В классе из args получить formRun дочерней формы.
2. Взять его DS. 3. Посмотреть DynaLink. |
|
31.03.2011, 16:55 | #4 |
Злыдни
|
В args.record() курсор дочерней формы (причем пустой), т.е. той формы, откуда вызван класс. Меня же интересует доступ к родительской записи.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
31.03.2011, 16:57 | #5 |
Злыдни
|
В args нет formRun.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
31.03.2011, 17:09 | #6 |
северный Будда
|
А зачем вы вызываете обработку по дочерней форме, если она не заполнена?
Если имеется в виду создание записей в ней, то надо на родительской форме запускаться. Если нет (планируются манипуляции только с DS родителя) - тем более надо это делать там. Как вариант - посмотрите форму строк журналов инвентаризации. Там есть пункт "Создать", который делает примерно то, что вам нужно. По крайней мере, там создаются строки с кодом журнала, который есть только в заголовке
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 31.03.2011 в 17:44. |
|
31.03.2011, 17:38 | #7 |
Злыдни
|
Цитата:
Сообщение от pitersky
А зачем вы вызываете обработку по дочерней форме, если она не заполнена?
Если имеется в виду создание записей в ней, то надо на родительской форме запускаться. Если нет (планируются манипуляции только с DS родителя) - тем более надо это делать там. Как вариант - посмотрите форму строк журналов инвентаризации. Там есть пункт "Создать", который делает примерно то, что вам нужно.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
31.03.2011, 17:43 | #8 |
северный Будда
|
Хм... или я чего-то не понял, или у вас, условно говоря, должны печататься строки журнала из строк журнала с атрибутами заголовка журнала. Честное слово, такую печать я бы вешал именно на заголовок.
__________________
С уважением, Вячеслав |
|
31.03.2011, 18:59 | #9 |
Участник
|
Цитата:
В args eсть ссылка на вызывающий объект - args.caller(). В вашем случае в качестве вызывающего объекта выступает FormRun. Последний раз редактировалось S.Kuskov; 31.03.2011 в 19:02. |
|
31.03.2011, 19:50 | #10 |
Участник
|
Всё правильно, я также делаю - обычно для классов типа "Proposal", у которого задача заполнить таблицу дочерними запясими.
Давно уже писал, вроде работает. Сделано так, потому что форма может быть открыта из разных форм, и допустим, если надо знать какой нибудь "параметр", то можно сделать поиск по возможным вариантам. Например, "Invoice" может фильтроваться и от "Дебитора/Кредитора", и также от самой "заготовки" (Sales/PurchTable). X++: /* Finds specific cursor on DS dynalinks */ public static Common findDynalinkTable(tableId _tableId, Common _common) { FormDatasource ds = _common.dataSource(); QueryBuildDatasource qbds; QueryBuildDynalink qbd; Common ret; int i; ; if (ds) { qbds = ds.query().dataSourceTable(_common.tableId); if (qbds) { if (qbds.dynalinkCount()) { for (i=1; i <= qbds.dynalinkCount(); i++) { qbd = qbds.dynalink(i); if (qbd && qbd.cursor().TableId == _tableId) { ret = qbd.cursor(); break; } } } } } return ret; } Последний раз редактировалось Delfins; 31.03.2011 в 19:55. |
|
31.03.2011, 20:19 | #11 |
Боец
|
Цитата:
Сообщение от KiselevSA
Возник вопрос, который я, как не программист, решить не могу (подсказать, в какую сторону копать, надо ):
1. Есть форма с родительской таблицей (например, SalesTable); 2. Есть связанная таблица (например, SalesTableLink - 1:n) и форма для ее отображения; 3. На дочерней форме есть пункт меню, который вызывает определенный класс. Вопрос: как определить идентификатор записи родительской таблицы, из которой была открыта дочерняя форма, в этом классе, если в связанной таблице еще не созданы записи (т.е. набор записей пустой)? X++: static void main(Args _args) { FormRun parentFormRun; Common parentRecord; ; parentFormRun = _args.caller(); parentRecord = parentFormRun.args().record(); info(int2str(parentRecord.RecId)); } Последний раз редактировалось DSPIC; 31.03.2011 в 20:58. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
01.04.2011, 13:43 | #12 |
Злыдни
|
Спасибо всем. Посмотрели, как реализован соответствующий метод в складских журналах, и такую же "обертку" добавили в свой класс.
Поучилоь следующее: X++: if (_args && _args.caller() && _args.dataset() ) { id = fieldname2id(_args.dataset(),fieldstr(SalesTable,SalesId)); if (id) salesId = _args.record().(id); callerForm = _args.caller(); if (!salesId) { if (callerForm && callerForm.args() && callerForm.args().record() && callerForm.args().record().TableId) { id = fieldname2id(callerForm.args().record().TableId,fieldstr(SalesTable,SalesId)); if (id) salesId = callerForm.args().record().(id); } } } return salesId; }
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
01.04.2011, 18:18 | #13 |
Боец
|
Что за извращение!
Зачем такие сложности... В журнали там может и оправдано, а тут-то что дает в итоге эта куча строк кода, в которой минут 5 разобираться нужно? |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|