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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.03.2011, 12:57   #1  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
? Определение родительского источника из класса, вызванного из дочерней формы
Возник вопрос, который я, как не программист, решить не могу (подсказать, в какую сторону копать, надо ):
1. Есть форма с родительской таблицей (например, SalesTable);
2. Есть связанная таблица (например, SalesTableLink - 1:n) и форма для ее отображения;
3. На дочерней форме есть пункт меню, который вызывает определенный класс.

Вопрос: как определить идентификатор записи родительской таблицы, из которой была открыта дочерняя форма, в этом классе, если в связанной таблице еще не созданы записи (т.е. набор записей пустой)?
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 31.03.2011, 13:04   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
в args.record() дочерней формы должен быть курсор родительской таблицы. Создайте на форме метод, возвращающий это значение и дергайте его из класса.
Как из класса получить ссылку на вызвавшую его форму знаете?

Последний раз редактировалось S.Kuskov; 31.03.2011 в 13:07.
Старый 31.03.2011, 13:09   #3  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
1. В классе из args получить formRun дочерней формы.
2. Взять его DS.
3. Посмотреть DynaLink.
Старый 31.03.2011, 16:55   #4  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
в args.record() дочерней формы должен быть курсор родительской таблицы. Создайте на форме метод, возвращающий это значение и дергайте его из класса.
В args.record() курсор дочерней формы (причем пустой), т.е. той формы, откуда вызван класс. Меня же интересует доступ к родительской записи.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 31.03.2011, 16:57   #5  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
1. В классе из args получить formRun дочерней формы.
В args нет formRun.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 31.03.2011, 17:09   #6  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,506 / 428 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
А зачем вы вызываете обработку по дочерней форме, если она не заполнена?
Если имеется в виду создание записей в ней, то надо на родительской форме запускаться. Если нет (планируются манипуляции только с DS родителя) - тем более надо это делать там.

Как вариант - посмотрите форму строк журналов инвентаризации. Там есть пункт "Создать", который делает примерно то, что вам нужно.
По крайней мере, там создаются строки с кодом журнала, который есть только в заголовке
__________________
С уважением,
Вячеслав

Последний раз редактировалось pitersky; 31.03.2011 в 17:44.
Старый 31.03.2011, 17:38   #7  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от pitersky Посмотреть сообщение
А зачем вы вызываете обработку по дочерней форме, если она не заполнена?
Если имеется в виду создание записей в ней, то надо на родительской форме запускаться. Если нет (планируются манипуляции только с DS родителя) - тем более надо это делать там.

Как вариант - посмотрите форму строк журналов инвентаризации. Там есть пункт "Создать", который делает примерно то, что вам нужно.
Сейчас пороюсь. Причина следующая: из формы необходимо выводить в Excel в различных форматах (иерархия классов) данные. Часть данных берется из родительской таблицы, часть из дочерней (если дочерняя пустая - выводим пустографку). Но отсутсвие данных в дочерней таблице не должно сказываться на выводе данных из родительской.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 31.03.2011, 17:43   #8  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,506 / 428 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Хм... или я чего-то не понял, или у вас, условно говоря, должны печататься строки журнала из строк журнала с атрибутами заголовка журнала. Честное слово, такую печать я бы вешал именно на заголовок.
__________________
С уважением,
Вячеслав
Старый 31.03.2011, 18:59   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,435 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от KiselevSA Посмотреть сообщение
В args.record() курсор дочерней формы (причем пустой), т.е. той формы, откуда вызван класс. Меня же интересует доступ к родительской записи.
Читайте внимательнее. Я писал про args формы, а не args класса. Т.е. дочерняя форма вызывается с аргументом содержащим ссылку на нужную вам таблицу.

Цитата:
Сообщение от KiselevSA Посмотреть сообщение
В args нет formRun.
В args eсть ссылка на вызывающий объект - args.caller(). В вашем случае в качестве вызывающего объекта выступает FormRun.

Последний раз редактировалось S.Kuskov; 31.03.2011 в 19:02.
Старый 31.03.2011, 19:50   #10  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Всё правильно, я также делаю - обычно для классов типа "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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1238 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от KiselevSA Посмотреть сообщение
Возник вопрос, который я, как не программист, решить не могу (подсказать, в какую сторону копать, надо ):
1. Есть форма с родительской таблицей (например, SalesTable);
2. Есть связанная таблица (например, SalesTableLink - 1:n) и форма для ее отображения;
3. На дочерней форме есть пункт меню, который вызывает определенный класс.

Вопрос: как определить идентификатор записи родительской таблицы, из которой была открыта дочерняя форма, в этом классе, если в связанной таблице еще не созданы записи (т.е. набор записей пустой)?
Если форма и класс вызывались через MenuItems, то всё очень просто:
X++:
static void main(Args _args)
{
    FormRun     parentFormRun;
    Common      parentRecord;
    ;

    parentFormRun   = _args.caller();

    parentRecord    = parentFormRun.args().record();

    info(int2str(parentRecord.RecId));
}
Это метод main класса, где вы хотите получить начальный курсор

Последний раз редактировалось DSPIC; 31.03.2011 в 20:58.
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 01.04.2011, 13:43   #12  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Спасибо всем. Посмотрели, как реализован соответствующий метод в складских журналах, и такую же "обертку" добавили в свой класс.
Поучилоь следующее:

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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1238 (44) ++++++++
Регистрация: 11.04.2008
Что за извращение!
Зачем такие сложности... В журнали там может и оправдано, а тут-то что дает в итоге эта куча строк кода, в которой минут 5 разобираться нужно?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление DS формы из дочерней формы breakpoint DAX: Программирование 3 24.12.2008 15:54
Открытие формы из класса Акавешка DAX: Программирование 2 11.01.2007 13:39
Изменение свойства Table источника данных формы vasiliy DAX: Программирование 6 26.04.2005 12:16
обращение к методам датасоурса формы из класса simply DAX: Программирование 5 03.06.2004 12:02
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.