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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.03.2011, 08:47   #1  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Отображение таблицы в новой форме форме
Доброго времени суток.
Так как я новичек (изучаю программирование в аксапте примерно 3-4 дня), возник вопрос. Есть задание:
Цитата:
Необходимо создать две формы: «Журнал» и «Строки журнала».
В форме «Журнал» должны присутствовать следующие поля:
• «Разнесено» (тип «Да/Нет»)
• «Номер журнала» (создать тип «TestJournalId», данное значение должно быть уникально и генерироваться при создании автоматически)
• «Количество строк» (тип Int, необходимо выводить количество строк данного журнала)
• «Дата создания» (тип «Дата» генерируется при создании)
• «Время создания» (тип «Время» генерируется при создании)
• «Дата разноски» (тип «Дата» заполняется по нажатию кнопки «Разнести»)
• «Время разноски» (тип «Время» заполняется по нажатию кнопки «Разнести»)
На форму «Журнал» должны быть добавлены следующие кнопки:
• «Строки» (переход на форму «Строки Журнала»)
• «Разнести» (разносит журнал, т.е. проставляет признак «Разнесено» и заполняет дату и время разноски)
• «Отменить разноску» (отменяет разноску, т.е. отменяет признак «Разнесено» и очищает дату и время разноски)
• «Печать» (распечатывает строки текущего журнала упорядоченные по полю «Сумма» в порядке возрастания)
По нажатию кнопки «Строки» должна открываться форма «Строки журнала».
В форме «Строки журнала» должны присутствовать следующие поля:
• «Номер журнала» (тип «TestJournalId»)
• «Номер строки журнала» (тип Int)
• «Сумма» (тип Real)
После разноски журнала любые изменения в строках этого журнала запрещены.
Худо бедно справился с задачей первой формы.
Суть вопроса вот в чем: при нажатии на кнопку "Строки" открывается новая форма (это я сделал благодаря посику по форуму). нужно чтобы на второй форме отображалась вторая таблица "Строки журнала". Никак не могу понять как передать параметры грида на новую форму... Или как это делается?
Вот код нажатия на кнопку "Строки" Нужно передать параметры здесь? Или нужно форму настроить до этого?
PHP код:
void clicked()
{
    
FormRun form1;
    
super();
    
form1=ClassFactory.formRunClass(new Args(formstr("Form2")));
    
form1.init();
    
form1.run();
    
form1.wait();

Искал по форуму, не нашел. Будьте добры помогите новичку.
Заранее прошу прощения если тема лишняя, и мои объяснения невнятные (сам не могу понять толком).
Версия: Axapta 3.0 Build #1951.7609/514-12 SP1

Последний раз редактировалось DAsm; 02.03.2011 в 08:49.
Старый 02.03.2011, 08:58   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В системе есть множество тестовых примеров - объекты начинающиеся на tutorial*.
Для решения вашей задачи посмотрите как реализованы формы
tutorial_JournalName
tutorial_JournalTable
tutorial_JournalTransMovement

P.S.: Немного офтопика по поводу самой задачи. Конечно понятно что она тестовая, но всё-таки кнопка «Отменить разноску» вызывает большие вопросы. Дело в том что в аксапте под "разноской" подразумевается создание строк в отдельной таблице проводок, а не просто проставление даты в строках журнала. И понятия отмены разноски не существует. Для омены разнесённой операции делают ещё одну - обратную, котрая компенсирует первую.

Последний раз редактировалось S.Kuskov; 02.03.2011 в 09:13.
Старый 02.03.2011, 09:37   #3  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
S.Kuskov, Благодарю за ответ. Буду разбираться. Создалось впечатление что я вооще не правильно реализовывал.
Старый 02.03.2011, 10:16   #4  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Форма... А сами таблицы? А механизмы разноски? Они могут быть довольно сложными...

С Уважением,
Георгий
Старый 02.03.2011, 11:37   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
В Аксапте очень много стандартных примеров. Попросите постановщика задачи показать вам стандартный аналог - а дальше изучайте код, делайте по аналогии.
Когда набьете руку и изучите стандартные подходы к решению задач, сможете самостоятельно вести новые разработки намного эффективнее, чем если бы с нуля начинали программировать что-то свое.
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: DAsm (1).
Старый 02.03.2011, 14:43   #6  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Ivanhoe, я бы рад сделать аналог, вот только это 2 тестовое задание на работу. Я студент заканчивающий. Кинул резюме на разработчика. А фирма оказывается работает с аксаптой. Это для меня ново и даже стандартные примеры с меткой tutorial для меня сложны.
В любом случае благодарен всем за советы, но задача остается все же непосильной для меня на данный момент. Возможно у меня не хватает знаний в ООП.
Рассматривая примеры не могу понять как программировались кнопки , чтобы рассмотреть механизм работы. так как на он клик там нет кода. Либо тут другие методы программирования о которых я и не знаю.
А есть ли наглядные примеры с описанием для совсем уж чайников как я, чтобы наконец вывести эту таблицу во второй форме? Либо ткните уж носом что изучать, чтобы разобраться с этими туториалами.
Прошу извинить за оффтоп, и за трату вашего драгоценного времени.

UPD: С Отображением формы и грида решил вопрос. Теперь нужно как-то передать айдишник с первой формы во вторую. Подскажете?
Старый 02.03.2011, 15:01   #7  
pedrozzz is offline
pedrozzz
Молодой, подающий надежды
Аватар для pedrozzz
MCBMSS
Лучший по профессии 2015
 
164 / 218 (8) ++++++
Регистрация: 18.02.2010
Адрес: Краснодар
Если учитесь в Ax 2009, то обратите внимание на книгу из этого топика
Dianne Siebold: New on the Bookshelf: AX 2009 Development Cookbook
В ней рассмотрено множество типовых задач с примерами реализации и объяснением, как оно работает.
Старый 02.03.2011, 15:09   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
DAsm, вы читали книгу morphx.pdf? если нет, то очень советую, многие вопросы сразу отпадут.

Цитата:
Сообщение от DAsm Посмотреть сообщение
Рассматривая примеры не могу понять как программировались кнопки , чтобы рассмотреть механизм работы. так как на он клик там нет кода. Либо тут другие методы программирования о которых я и не знаю.
Совершенно точно - другие методы. Там кнопка не простая, а основанная на MenuItem. Это такая ссылка, которую можно нацелить, например, на другую форму.

Цитата:
Сообщение от DAsm Посмотреть сообщение
UPD: С Отображением формы и грида решил вопрос. Теперь нужно как-то передать айдишник с первой формы во вторую. Подскажете?
Ничего передавать не надо. Если всё сделать правильно, связь между таблицами установится самостоятельно. Это стандартное поведение для аксапты основывается на механизме DynaLink. Данный механизм также будет обновлять связь, если вы не закрывая вторую форму перейдёте на другой журнал в первой форме

Последний раз редактировалось S.Kuskov; 02.03.2011 в 15:13.
За это сообщение автора поблагодарили: DAsm (1).
Старый 02.03.2011, 23:44   #9  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
S.Kuskov, Благодарю за ответы. Книгу прочитал и прояснил для себя некоторые аспекты. Поискал и вроде бы понял как работает DynaLink, и Menuitem, весь кусок кода для открытия формы и передачи параметров уложился 5-10 кликов мышью. Теперь возник вопрос по поводу разноски: Как мне передать параметр разноски во вторую форму чтобы уже в зависимости от значения таблицы можно было выставлять свойство allowedit true или false.
Научился передавать параметры в обычной кнопке
Для нажатия
X++:
void clicked()
{
    FormRun form1;
    Jurnal  tabl;
    Args    args = new Args("Form2");
    super();
    args.lookupField(Jurnal.Jurnal_number);
    args.lookupValue(int2str(tabl.Jurnal_number));
    if (Jurnal.Raznos == Raznos::No)
    {
        args.parm("No");
    }
    if (Jurnal.Raznos == Raznos::Yes)
    {
        args.parm("Yes");
    }
    form1 = ClassFactory.formRunClass(args);

    form1.init();
    form1.run();
    form1.wait();
}
Для приема параметра во второй форме
X++:
public void activate(boolean _active)
{
    str _id;
    Stroki tabl;

    super(_active);
    _id = element.args().parm();
    if (_id == "Yes")
    {
        element.control(control::Grid).allowEdit(false);
    }
    else if (_id == "No")
    {
        element.control(control::Grid).allowEdit(true);
    }
    print (_id);

}
Надеюсь не замудренный код.
Так вот проблема, в обычной кнопке все передается на Ура, а вот через MenuItemButton похоже что другая история.
Посоветуете что читать или в какую сторону хоть идти в этом дремучем лесу?

Или можно каким-то образом встроить кусок своего кода, в код выполнения меню итем?

UPD: Только хотел уйти спать, как поиск по форуму дал результаты. В общем эта проблема тоже решена.
нашел ответ тут: Передача параметра в Запрос(Query)

Остается научится выводить отчет и каким-то образом выводить правильное количество строк во второй форме по значениям в первой.

Последний раз редактировалось DAsm; 03.03.2011 в 00:14.
Старый 03.03.2011, 09:41   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DAsm Посмотреть сообщение
Как мне передать параметр разноски во вторую форму чтобы уже в зависимости от значения таблицы можно было выставлять свойство allowedit true или false.
Я уже упоминал, что механизм DynaLink действует не только в момент открытия формы, он продолжает работать до тех пор пока не будет закрыта первая форма! (открыв строки неразнесённого журнала, пользователь может перейти на первой форме на разнесённый и в форме строк отобразаться уже его строки). Это значит, что установить доступность строк журнала один раз при открытии формы не выйдет. Как быть? Доступность строк нужно устанавливать не в событии открытия формы, а в событии смены ведущего источника данных. Для это предназначен метод источника данных DataSource.linkActive(), не спутайте с DataSource.Active(), последний это событие смены активной строки своего датасурса.

Будем считать, что с вопросом "в какой момент менять доступность?" мы разобралсь, теперь вернёмся к вопросу о том "как находясь на второй форме получить значение признака разноски с активной строки первой формы?".
Вообще есть несколько способов передачи данных между объектами (формами/отчётами/диалогами) и все они основаны на струтуре Args. Cамый универсальный способ - это во втором объекте получить ссылку на первый и вызвать заранее написаный метод который бы возвращал нужные нам данные. Делается это так:
X++:
    Object  caller; // используем абстрактный тип Object для того чтобы уйти от раннего связывания
    ;
    caller = args().caller(); // получаем ссылку на вызвавший объект
    prm = caller.<>(); // имя метода не проверяется на этапе компиляции. Используется позднее связывание
Также часто используется метод args().record() для передачи табличных курсоров. Во многих случаях система сама упраляет созданием, наполнением и передачей структуры Args.

Применительно к вашей задаче стоит отметить, что в системе разработан большой набор стандартных классов, реализующих стандартное поведение. Поведение типовое и понятное всем пользователем, независимо от того в каком из модулей системы они работают. Если вы смотрели формы tutorial_JournalTable и tutorial_JournalTransMovement, то вы наверное уже обратили внимание на классы JournalFormTable и JournalFormTrans. Правльно будет ипользовать их в своих разработках. В этом случае вам не придется заново программировать вещи, общие для всех типовых форм.

Цитата:
Сообщение от DAsm Посмотреть сообщение
Остается научится выводить отчет и каким-то образом выводить правильное количество строк во второй форме по значениям в первой.
Не совсем понял, что именно у вас пока не получается.

Последний раз редактировалось S.Kuskov; 03.03.2011 в 09:57.
Старый 04.03.2011, 09:24   #11  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Спасибо за исчерпывающие ответы. Буду разбираться понемногу.
Цитата:
Не совсем понял, что именно у вас пока не получается.
Тут у меня вопрос как сделать так, что бы в первой таблице "Журнал" в колонке "Количество строк" выводилось значения количества строк в этом журнале. Мне нужно при инициализации таблицы "Журнал" считывать количество строк со второй таблицы?
Старый 04.03.2011, 11:24   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DAsm Посмотреть сообщение
Тут у меня вопрос как сделать так, что бы в первой таблице "Журнал" в колонке "Количество строк" выводилось значения количества строк в этом журнале.
Это также типовая задача для форм журналов, следовательно её реализация уже есть в стандартных класах. Например в тестовой форме tutorial_JournalTable количество строк отображается на вкладе "История" в группе "Итоги".
Цитата:
Сообщение от DAsm Посмотреть сообщение
Мне нужно при инициализации таблицы "Журнал" считывать количество строк со второй таблицы?
Суть стандартного подхода в том чтобы количество строк не рассчитывать каждый раз, а хранить в таблице журналов. Ну и соответственно обновлять его каждый раз при вставке и удалении строк. Ещё раз повтрю, что данный механизм уже реализован в стандарных классах JournalFormTable и JournalFormTrans, и что бы им воспользоваться просто нужно внедрить их в свою форму, так как это показано на примере тестовых форм tutorial_JournalTable и tutorial_JournalTransMovement.
Старый 04.03.2011, 11:51   #13  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Цитата:
Суть стандартного подхода в том чтобы количество строк не рассчитывать каждый раз, а хранить в таблице журналов.
Ну а для начала мне нужно обнулить все значения строк? А потом уже при добавлении удалении обновлять данные? А как быть с тем чтобы именно значение "количество строк" в таблице "Журналы" не могли модифицироваться? Как из 1 формы мне получать значения во второй? Или так же с передачей параметров?
И к сожалению я не могу понять логику туториалов вообще. Похоже я в программировании не так силен как предполагал. И не открываются кстати формы туториалов по журналам требуя какой-то активный буфер или выдавая ошибки...
Старый 04.03.2011, 12:09   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Читайте книги, без базовых знаний вам никакие советы и туториалы не помогут.

И такая наводка - в формах, как правило, отображаются данные из таблиц БД. Для получения данных из таблиц не нужно что-то передавать между формами - работайте с таблицами.
__________________
Ivanhoe as is..
Старый 04.03.2011, 12:20   #15  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Знаний по программированию достаточно. Ни с БД ни с кодингом проблем нет. Проблема понятия самой аксапты. На других языках я за 30 минут нормально все напишу.
А работая с таблицами предполагается кодинг или что-то другое? или изменения методов таблицы?
А книг по аксапте не видел нормальных, лишь разъяснения синтаксиса свойств. Примеров бы с комментариями...
Старый 04.03.2011, 12:25   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DAsm Посмотреть сообщение
Ну а для начала мне нужно обнулить все значения строк? А потом уже при добавлении удалении обновлять данные?
Порядок работы пользователя таков, что сначала он создаёт заголовок/шапку журнала, а только потом создаёт его строки. Так? Т.е в начальный момент, когда журнал уже есть, а строк ещё нет, количество строк равно нулю (это значению по умолчанию). Потом при вводе строк можно на форме строк перехватить это событие и обновить значение в таблице журналов. Или я не понял ваш вопрос?

Цитата:
Сообщение от DAsm Посмотреть сообщение
А как быть с тем чтобы именно значение "количество строк" в таблице "Журналы" не могли модифицироваться?
Ну это то как раз совсем просто. Стоит лишь установить свойства AllowEdit и AllowEditOnCreate у нужного поля таблицы в значение false.

Цитата:
Сообщение от DAsm Посмотреть сообщение
Как из 1 формы мне получать значения во второй? Или так же с передачей параметров?
Тут наверное стоит уточнить, что работа с данными может происходит не только на уровне форм, но и на уровне таблиц. Т.е. вам никто не мешает находясь на форме 1 обращаться к данным таблицы 2. Данные, который храняться в БД, в отличии от временных данных кокторые связанны с конкретным объектом, доступны в любом объекте аксапты.

Цитата:
Сообщение от DAsm Посмотреть сообщение
И к сожалению я не могу понять логику туториалов вообще. Похоже я в программировании не так силен как предполагал.
Логика в том, чтобы отделить дизайн (саму форму), от поведения (кода в обработчиках событий). Т.е. на самой форме кода остаётся по минимому, только переадресация управления соответствующим методам класса. Классы собраны в иерархии. В базовых классах реализуются общие ньюнсы поведения в наследниках более спецефические, относящиеся к более конкретной задаче.

Цитата:
Сообщение от DAsm Посмотреть сообщение
И не открываются кстати формы туториалов по журналам требуя какой-то активный буфер или выдавая ошибки...
Форма строк журнала не может быть открыта сама по себе, только в контексте какого-то журнала. Она не предназанчена для отображения всех строк всех журналов сразу, только конкретного. Т.е. открыть её можно только по кнопке "Строки" на форме журналов.
А форма tutorial_JournalTable тоже не открывается?
Старый 04.03.2011, 12:39   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DAsm Посмотреть сообщение
Знаний по программированию достаточно. Ни с БД ни с кодингом проблем нет. Проблема понятия самой аксапты. На других языках я за 30 минут нормально все напишу.
Искуство программирования в аксапте заключается в том чтобы изучить стандартные возможности и создавая минимум нового научиться пользоваться тем что в ней уже есть. То что в других языках пишеться за 30 минут в аксапте как правило можно написать за 5. В первый раз потратить три часа на поиск нужного класса и потом писать за 5 минут. .

Прислушайтесь к совету Ivanhoe:
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
В Аксапте очень много стандартных примеров. Попросите постановщика задачи показать вам стандартный аналог - а дальше изучайте код, делайте по аналогии.
Когда набьете руку и изучите стандартные подходы к решению задач, сможете самостоятельно вести новые разработки намного эффективнее, чем если бы с нуля начинали программировать что-то свое.
Старый 04.03.2011, 14:04   #18  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Цитата:
А форма tutorial_JournalTable тоже не открывается?
она как раз и с ошибкой выходит
Ясно... Значит другие классы нужно прикручивать к своему проекту... Разобраться нужно...
А где мне найти OnInsertRecord? Извините если совсем уж туповат
Старый 04.03.2011, 14:12   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DAsm Посмотреть сообщение
она как раз и с ошибкой выходит
Какой текст ошибки?
Цитата:
Сообщение от DAsm Посмотреть сообщение
А где мне найти OnInsertRecord? Извините если совсем уж туповат
Событие вставки записи можно поймать в двух местах. На форме в методе write() источника данных (узел DataSource) и на таблице в методе insert(). В тестовом примере это делается черех метод на форме \Forms\tutorial_JournalTransMovement\Data Sources\TutorialJournalTrans\Methods\write
Старый 04.03.2011, 14:22   #20  
DAsm is offline
DAsm
Участник
 
11 / 10 (1) +
Регистрация: 02.03.2011
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Событие вставки записи можно поймать в двух местах. На форме в методе write() источника данных (узел DataSource) и на таблице в методе insert(). В тестовом примере это делается черех метод на форме \Forms\tutorial_JournalTransMovement\Data Sources\TutorialJournalTrans\Methods\write
Значит правильно почти сделал.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Какой текст ошибки?
Изображения
 

Последний раз редактировалось DAsm; 04.03.2011 в 14:59.
Теги
axapta

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как правильно связать таблицы в форме? Как показать параметры партии? mazzy DAX: Программирование 10 27.10.2010 15:56
Фильтр строк подчиненной таблицы на форме demon46 DAX: Программирование 4 15.07.2008 15:41
вывод количества записей в таблице на web форме и указание текущей страницы таблицы bambuk1960 DAX: Программирование 1 06.07.2006 13:27
проблема с вызовом новой (добавленной) таблицы alpin DAX: Программирование 4 12.01.2004 14:31
Объединить несколько полей таблицы в одном поле Grid-а на форме? storer DAX: Программирование 2 12.11.2003 14:08

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:45.