02.03.2011, 08:47 | #1 |
Участник
|
Отображение таблицы в новой форме форме
Доброго времени суток.
Так как я новичек (изучаю программирование в аксапте примерно 3-4 дня), возник вопрос. Есть задание: Цитата:
Необходимо создать две формы: «Журнал» и «Строки журнала».
В форме «Журнал» должны присутствовать следующие поля: • «Разнесено» (тип «Да/Нет») • «Номер журнала» (создать тип «TestJournalId», данное значение должно быть уникально и генерироваться при создании автоматически) • «Количество строк» (тип Int, необходимо выводить количество строк данного журнала) • «Дата создания» (тип «Дата» генерируется при создании) • «Время создания» (тип «Время» генерируется при создании) • «Дата разноски» (тип «Дата» заполняется по нажатию кнопки «Разнести») • «Время разноски» (тип «Время» заполняется по нажатию кнопки «Разнести») На форму «Журнал» должны быть добавлены следующие кнопки: • «Строки» (переход на форму «Строки Журнала») • «Разнести» (разносит журнал, т.е. проставляет признак «Разнесено» и заполняет дату и время разноски) • «Отменить разноску» (отменяет разноску, т.е. отменяет признак «Разнесено» и очищает дату и время разноски) • «Печать» (распечатывает строки текущего журнала упорядоченные по полю «Сумма» в порядке возрастания) По нажатию кнопки «Строки» должна открываться форма «Строки журнала». В форме «Строки журнала» должны присутствовать следующие поля: • «Номер журнала» (тип «TestJournalId») • «Номер строки журнала» (тип Int) • «Сумма» (тип Real) После разноски журнала любые изменения в строках этого журнала запрещены. Суть вопроса вот в чем: при нажатии на кнопку "Строки" открывается новая форма (это я сделал благодаря посику по форуму). нужно чтобы на второй форме отображалась вторая таблица "Строки журнала". Никак не могу понять как передать параметры грида на новую форму... Или как это делается? Вот код нажатия на кнопку "Строки" Нужно передать параметры здесь? Или нужно форму настроить до этого? PHP код:
Заранее прошу прощения если тема лишняя, и мои объяснения невнятные (сам не могу понять толком). Версия: Axapta 3.0 Build #1951.7609/514-12 SP1 Последний раз редактировалось DAsm; 02.03.2011 в 08:49. |
|
02.03.2011, 08:58 | #2 |
Участник
|
В системе есть множество тестовых примеров - объекты начинающиеся на tutorial*.
Для решения вашей задачи посмотрите как реализованы формы tutorial_JournalName tutorial_JournalTable tutorial_JournalTransMovement P.S.: Немного офтопика по поводу самой задачи. Конечно понятно что она тестовая, но всё-таки кнопка «Отменить разноску» вызывает большие вопросы. Дело в том что в аксапте под "разноской" подразумевается создание строк в отдельной таблице проводок, а не просто проставление даты в строках журнала. И понятия отмены разноски не существует. Для омены разнесённой операции делают ещё одну - обратную, котрая компенсирует первую. Последний раз редактировалось S.Kuskov; 02.03.2011 в 09:13. |
|
02.03.2011, 09:37 | #3 |
Участник
|
S.Kuskov, Благодарю за ответ. Буду разбираться. Создалось впечатление что я вооще не правильно реализовывал.
|
|
02.03.2011, 10:16 | #4 |
Модератор
|
Форма... А сами таблицы? А механизмы разноски? Они могут быть довольно сложными...
С Уважением, Георгий |
|
02.03.2011, 11:37 | #5 |
Участник
|
В Аксапте очень много стандартных примеров. Попросите постановщика задачи показать вам стандартный аналог - а дальше изучайте код, делайте по аналогии.
Когда набьете руку и изучите стандартные подходы к решению задач, сможете самостоятельно вести новые разработки намного эффективнее, чем если бы с нуля начинали программировать что-то свое.
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: DAsm (1). |
02.03.2011, 14:43 | #6 |
Участник
|
Ivanhoe, я бы рад сделать аналог, вот только это 2 тестовое задание на работу. Я студент заканчивающий. Кинул резюме на разработчика. А фирма оказывается работает с аксаптой. Это для меня ново и даже стандартные примеры с меткой tutorial для меня сложны.
В любом случае благодарен всем за советы, но задача остается все же непосильной для меня на данный момент. Возможно у меня не хватает знаний в ООП. Рассматривая примеры не могу понять как программировались кнопки , чтобы рассмотреть механизм работы. так как на он клик там нет кода. Либо тут другие методы программирования о которых я и не знаю. А есть ли наглядные примеры с описанием для совсем уж чайников как я, чтобы наконец вывести эту таблицу во второй форме? Либо ткните уж носом что изучать, чтобы разобраться с этими туториалами. Прошу извинить за оффтоп, и за трату вашего драгоценного времени. UPD: С Отображением формы и грида решил вопрос. Теперь нужно как-то передать айдишник с первой формы во вторую. Подскажете? |
|
02.03.2011, 15:01 | #7 |
Молодой, подающий надежды
|
Если учитесь в Ax 2009, то обратите внимание на книгу из этого топика
Dianne Siebold: New on the Bookshelf: AX 2009 Development Cookbook В ней рассмотрено множество типовых задач с примерами реализации и объяснением, как оно работает. |
|
02.03.2011, 15:09 | #8 |
Участник
|
DAsm, вы читали книгу morphx.pdf? если нет, то очень советую, многие вопросы сразу отпадут.
Цитата:
Ничего передавать не надо. Если всё сделать правильно, связь между таблицами установится самостоятельно. Это стандартное поведение для аксапты основывается на механизме DynaLink. Данный механизм также будет обновлять связь, если вы не закрывая вторую форму перейдёте на другой журнал в первой форме Последний раз редактировалось S.Kuskov; 02.03.2011 в 15:13. |
|
|
За это сообщение автора поблагодарили: DAsm (1). |
02.03.2011, 23:44 | #9 |
Участник
|
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 |
Участник
|
Цитата:
Будем считать, что с вопросом "в какой момент менять доступность?" мы разобралсь, теперь вернёмся к вопросу о том "как находясь на второй форме получить значение признака разноски с активной строки первой формы?". Вообще есть несколько способов передачи данных между объектами (формами/отчётами/диалогами) и все они основаны на струтуре Args. Cамый универсальный способ - это во втором объекте получить ссылку на первый и вызвать заранее написаный метод который бы возвращал нужные нам данные. Делается это так: X++: Object caller; // используем абстрактный тип Object для того чтобы уйти от раннего связывания ; caller = args().caller(); // получаем ссылку на вызвавший объект prm = caller.<>(); // имя метода не проверяется на этапе компиляции. Используется позднее связывание Применительно к вашей задаче стоит отметить, что в системе разработан большой набор стандартных классов, реализующих стандартное поведение. Поведение типовое и понятное всем пользователем, независимо от того в каком из модулей системы они работают. Если вы смотрели формы tutorial_JournalTable и tutorial_JournalTransMovement, то вы наверное уже обратили внимание на классы JournalFormTable и JournalFormTrans. Правльно будет ипользовать их в своих разработках. В этом случае вам не придется заново программировать вещи, общие для всех типовых форм. Не совсем понял, что именно у вас пока не получается. Последний раз редактировалось S.Kuskov; 03.03.2011 в 09:57. |
|
04.03.2011, 09:24 | #11 |
Участник
|
Спасибо за исчерпывающие ответы. Буду разбираться понемногу.
Цитата:
Не совсем понял, что именно у вас пока не получается.
|
|
04.03.2011, 11:24 | #12 |
Участник
|
Цитата:
Суть стандартного подхода в том чтобы количество строк не рассчитывать каждый раз, а хранить в таблице журналов. Ну и соответственно обновлять его каждый раз при вставке и удалении строк. Ещё раз повтрю, что данный механизм уже реализован в стандарных классах JournalFormTable и JournalFormTrans, и что бы им воспользоваться просто нужно внедрить их в свою форму, так как это показано на примере тестовых форм tutorial_JournalTable и tutorial_JournalTransMovement. |
|
04.03.2011, 11:51 | #13 |
Участник
|
Цитата:
Суть стандартного подхода в том чтобы количество строк не рассчитывать каждый раз, а хранить в таблице журналов.
И к сожалению я не могу понять логику туториалов вообще. Похоже я в программировании не так силен как предполагал. И не открываются кстати формы туториалов по журналам требуя какой-то активный буфер или выдавая ошибки... |
|
04.03.2011, 12:09 | #14 |
Участник
|
Читайте книги, без базовых знаний вам никакие советы и туториалы не помогут.
И такая наводка - в формах, как правило, отображаются данные из таблиц БД. Для получения данных из таблиц не нужно что-то передавать между формами - работайте с таблицами.
__________________
Ivanhoe as is.. |
|
04.03.2011, 12:20 | #15 |
Участник
|
Знаний по программированию достаточно. Ни с БД ни с кодингом проблем нет. Проблема понятия самой аксапты. На других языках я за 30 минут нормально все напишу.
А работая с таблицами предполагается кодинг или что-то другое? или изменения методов таблицы? А книг по аксапте не видел нормальных, лишь разъяснения синтаксиса свойств. Примеров бы с комментариями... |
|
04.03.2011, 12:25 | #16 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
А форма tutorial_JournalTable тоже не открывается? |
|
04.03.2011, 12:39 | #17 |
Участник
|
Цитата:
Прислушайтесь к совету Ivanhoe: Цитата:
Сообщение от Ivanhoe
В Аксапте очень много стандартных примеров. Попросите постановщика задачи показать вам стандартный аналог - а дальше изучайте код, делайте по аналогии.
Когда набьете руку и изучите стандартные подходы к решению задач, сможете самостоятельно вести новые разработки намного эффективнее, чем если бы с нуля начинали программировать что-то свое. |
|
04.03.2011, 14:04 | #18 |
Участник
|
Цитата:
А форма tutorial_JournalTable тоже не открывается?
Ясно... Значит другие классы нужно прикручивать к своему проекту... Разобраться нужно... А где мне найти OnInsertRecord? Извините если совсем уж туповат |
|
04.03.2011, 14:12 | #19 |
Участник
|
Какой текст ошибки?
Событие вставки записи можно поймать в двух местах. На форме в методе write() источника данных (узел DataSource) и на таблице в методе insert(). В тестовом примере это делается черех метод на форме \Forms\tutorial_JournalTransMovement\Data Sources\TutorialJournalTrans\Methods\write |
|
04.03.2011, 14:22 | #20 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Событие вставки записи можно поймать в двух местах. На форме в методе write() источника данных (узел DataSource) и на таблице в методе insert(). В тестовом примере это делается черех метод на форме \Forms\tutorial_JournalTransMovement\Data Sources\TutorialJournalTrans\Methods\write
Последний раз редактировалось DAsm; 04.03.2011 в 14:59. |
|
Теги |
axapta |
|
|