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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.05.2010, 09:58   #1  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
? Открытие формы строк журнала спецификации
Уважаемые участники axforum.info!
Никак не получается программно открыть форму строк журнала спецификации.
Делаю так:
Функция insertInventJour создает журнал и строку в ней и возвращает код журнала:
X++:
//формируем строку inventJournalTable.Description
        descr = strfmt("к заказу %1", SalesTable.SalesId);
        //ищем тип журнала спецификация
        select firstonly inventJournalName where inventJournalName.JournalNameId == 'Спецификация';
        //ищем журнал спецификации к этому заказу
        select firstonly inventJournalTable where (inventJournalTable.JournalNameId == inventJournalName.JournalNameId) && (inventJournalTable.Description == descr);
        //если не нашли, создаем журнал и строку в нем с приходом номенклатуры-спецификации
        if (!inventJournalTable)
        {
            ttsbegin;
            inventJournalTable.initFromInventJournalName(inventJournalName);
            inventJournalTable.Description = descr;
            inventJournalTable.isDocOutput = NoYes::Yes;
            inventJournalTable.Dimension = SalesLine.Dimension;
            inventJournalTable.insert();
            ttscommit;
            select firstonly inventTable where inventTable.ItemId == 'НОМ1';
            ttsbegin;
            inventJournalTrans.initFromInventJournalTable(inventJournalTable);
            inventJournalTrans.initFromInventTable(inventTable);
            inventJournalTrans.TransDate = today();
            inventJournalTrans.Dimension = SalesLine.Dimension;
            inventJournalTrans.insert();
            ttscommit;
        }
        //возвращаем код журнала спецификации
        ret = InventJournalTable.JournalId;
В основном коде:
X++:
inventJournalTableT = InventJournalTable::find(element.insertInventJour());
if(inventJournalTableT)
        {
            select inventJournalTransT where inventJournalTransT.JournalId == inventJournalTableT.JournalId;
            args.record(inventJournalTransT);
            args.parm(inventJournalTableT.JournalId);
            frmInventJournalTrans = new MenuFunction(menuItemDisplayStr(InventJournalTransBOM), menuItemType::Display).create(args);
            frmInventJournalTrans.run();
        }
И получаю ошибку из класса JournalFormTrans о том, что необходим активный буфер.
Она вываливается из метода new
X++:
    if (! formRun.args().caller() || ! formRun.args().dataset())
        throw error(strfmt("@SYS22678",formRun.name()));
Можно ли как-то это обойти?
Версия Аксапты - 4 SP2
Старый 12.05.2010, 10:22   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
получаю ошибку из класса JournalFormTrans о том, что необходим активный буфер.
Она вываливается из метода new
X++:
    if (! formRun.args().caller() || ! formRun.args().dataset())
        throw error(strfmt("@SYS22678",formRun.name()));
Естественно. Вы же не заполнили args().caller().

Как вариант, могу посоветовать в фоне создать форму самих журналов InventJournalTable и передать её в качестве caller в форму строк.
Старый 12.05.2010, 10:28   #3  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Естественно. Вы же не заполнили args().caller().

Как вариант, могу посоветовать в фоне создать форму самих журналов InventJournalTable и передать её в качестве caller в форму строк.
Тоже об этом подумал и дописал в основном коде между select и args
X++:
args.record(inventJournalTableT);
frmInventJournalTable = new MenuFunction(menuItemDisplayStr(InventJournalTableBOM), menuItemType::Display).create(args);
args.caller(frmInventJournalTable);
теперь ловлю runtime-ошибку:
JournalTableData Объект не инициализирован.

Трассировка стека

(C)\Classes\JournalTableData\journalTable
(C)\Classes\InventJournalFormTrans\formInitPost - line 6
(C)\Forms\InventJournalBOM\Methods\init - line 15
(C)\Classes\SysSetupFormRun\init - line 5
(C)\Classes\MenuFunction\create
(C)\Classes\FormButtonControl\Clicked - line 48
Я в замешательстве...
Старый 12.05.2010, 10:37   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Сделайте frmInventJournalTable.init() перед тем как его использовать
Старый 12.05.2010, 10:43   #5  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Сделайте frmInventJournalTable.init() перед тем как его использовать
не помогло
X++:
  : JournalTableData   .

 

(C)\Classes\JournalTableData\journalStatic
(C)\Classes\JournalFormTable\formInitPost - line 8
(C)\Classes\InventJournalFormTable\formInitPost - line 4
(C)\Forms\InventJournalTable\Methods\init - line 27
(C)\Classes\SysSetupFormRun\init - line 5
(C)\Classes\FormButtonControl\Clicked - line 45
Старый 12.05.2010, 10:57   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
не помогло
Не совсем так. Теперь ошибка возникает в init() InventJournalTable
Не хватает ещё вызова datasourceInitPost(). Видимо нужно каким-то более коректным способом проинициализировать форму, так что бы сначала вызвались init'ы источников данных.
Старый 12.05.2010, 11:10   #7  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
X++:
args.record(inventJournalTableT);
args.caller(this);
frmInventJournalTable = new MenuFunction(menuItemDisplayStr(InventJournalTableBOM), menuItemType::Display);
frmInventJournalTable.run(args);
Так пробовали?

Последний раз редактировалось Roman N. Krivov; 12.05.2010 в 11:19.
Старый 12.05.2010, 11:19   #8  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
X++:
args.record(inventJournalTableT);
args.caller(this);
frmInventJournalTable = new MenuFunction(menuItemDisplayStr(InventJournalTableBOM), menuItemType::Display).create(args);
Так пробовали?
А что это дает? Даже если caller указать, объект JournalTableData не инициализированный. Думаю надо в сторону инициализации датасоурсов (как говорит S. Kuskov) копать.
при вызове run все конечно будет инициализировано, но и форма журналов появится, а мне это не нужно.
Можно конечно потом сразу ее закрыть, но мне не нравятся эти мельтешения на экране

Последний раз редактировалось AGRESSOR; 12.05.2010 в 11:25.
Старый 12.05.2010, 11:23   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
Так пробовали?
У меня получилось, если вместо frmInventJournalTable.init() сделать вот так
X++:
    frmInventJournalTable.design().visible(false);
    frmInventJournalTable.run();
    frmInventJournalTable.close();
Возможно не очень красиво, но зато работает
За это сообщение автора поблагодарили: AGRESSOR (1).
Старый 12.05.2010, 11:37   #10  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
У меня получилось, если вместо frmInventJournalTable.init() сделать вот так
X++:
    frmInventJournalTable.design().visible(false);
    frmInventJournalTable.run();
    frmInventJournalTable.close();
Возможно не очень красиво, но зато работает
Решение, конечно, что называется "в лоб"
Но вот форма таблицы журналов ведь будет в этом случае тупо жрать ресурсы зря... думаю нужно все таки попытаться открыть форму строк без запуска формы журналов.
Старый 12.05.2010, 12:11   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
Решение, конечно, что называется "в лоб"
Но вот форма таблицы журналов ведь будет в этом случае тупо жрать ресурсы зря... думаю нужно все таки попытаться открыть форму строк без запуска формы журналов.
Для этого нужно классу строк скормить класс журнала без использования формы журнала. Но учтите, чем больше вы будете программировать сейчас, тем больше вам прийдётся программировать при переходе на новые версии.

Расскажите что вы делаете и зачем вам строки журнала в отдельном окне?
Старый 12.05.2010, 13:25   #12  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Для этого нужно классу строк скормить класс журнала без использования формы журнала. Но учтите, чем больше вы будете программировать сейчас, тем больше вам прийдётся программировать при переходе на новые версии.

Расскажите что вы делаете и зачем вам строки журнала в отдельном окне?
Спасибо. Делаю в рамках автомаркировки строки заказа на продажу и журнала спецификации. Все отлично, по кнопке на форме заказов на продажу, журнал создается, маркируется со строкой заказа, после нужно открыть форму строк, чтоб пользователь смог забить туда спецификацию
Старый 12.05.2010, 15:56   #13  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
Спасибо. Делаю в рамках автомаркировки строки заказа на продажу и журнала спецификации. Все отлично, по кнопке на форме заказов на продажу, журнал создается, маркируется со строкой заказа, после нужно открыть форму строк, чтоб пользователь смог забить туда спецификацию
Весьма, как бы это так сказать... оригинальная архитектура.

Может лучше воспользоваться типичными "паттернами" стандартного функционала?
На форме заказов по кнопке, расположенной в группе "Функции", открывается диалог, где пользователь вводит начальные данные (выбирает спецификацию и т.п.). В диалоге присутствует две кнопулины: "ОК" и "Отмена". Если пользователь передумал - нажал отмену, дилог закрылся, ничего не произошло. Если нажал "ОК", то в одной транзакции на основе данных из диалога создался складской журнал.
На той же форме заказов по кнопке, расположенной в группе "Запросы", можно открыть форму складского журнала и посмотреть спецификацию.
__________________
Dynamics AX Experience

Последний раз редактировалось CDR; 12.05.2010 в 15:58.
Старый 12.05.2010, 17:00   #14  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от CDR Посмотреть сообщение
Весьма, как бы это так сказать... оригинальная архитектура.
Давайте не будем сейчас разводить дискуссию на тему нужно ли это. Можете найти мой топик в ветке про функционал. Прочитаете и все поймете. Вкратце: "Решили, что так нужно"
К тому же я ведь спрашиваю КАК можно это сделать, а не НУЖНО ли это делать.
Если даже моя разработка и не пригодится, то, в любом случае, это опыт... мало ли что бывает, не так ли?
Старый 13.05.2010, 09:22   #15  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
К тому же я ведь спрашиваю КАК можно это сделать, а не НУЖНО ли это делать.
Если даже моя разработка и не пригодится, то, в любом случае, это опыт... мало ли что бывает, не так ли?
Я вроде и писал о том, как это принято делать в системе, а не нужно ли это делать. Жаль, что вы меня не поняли.
__________________
Dynamics AX Experience
Старый 13.05.2010, 10:17   #16  
AGRESSOR is offline
AGRESSOR
Сам.AX
Аватар для AGRESSOR
Самостоятельные клиенты AX
 
28 / 12 (1) ++
Регистрация: 26.04.2010
Адрес: Тюмень
Цитата:
Сообщение от CDR Посмотреть сообщение
Жаль, что вы меня не поняли.
Думаю, что я Вас понял
Предположим через "Функции", я введу нужную номенклатуру.
Только вот как я, не выходя из формы заказы на продажу, могу создать журнал спецификации, открыть в нем строки, и примаркировать этот журнал к созданной строке заказа...
Может я конечно чего-то не понимаю...
Предложение щелкнуть в области переходов по нужному пункту не принимается, нужно именно с формы заказов на продажу
Старый 13.05.2010, 11:18   #17  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Цитата:
Сообщение от AGRESSOR Посмотреть сообщение
Думаю, что я Вас понял
Предположим через "Функции", я введу нужную номенклатуру.
Только вот как я, не выходя из формы заказы на продажу, могу создать журнал спецификации, открыть в нем строки, и примаркировать этот журнал к созданной строке заказа...
Может я конечно чего-то не понимаю...
Предложение щелкнуть в области переходов по нужному пункту не принимается, нужно именно с формы заказов на продажу
Исторически так сложилось, что всякого рода обработка данных пишется в отдельных классах, а не в методах формы. В методах формы, как правило, пишется код для управления отображением формы. Соответственно для отображения диалога, создания журнала и маркировки строк пишется отдельный класс (обычно наследник RunBase). Этот класс вызывается из меню "Функции" с помощью MenuItem. В класс передается строка заказа через args. Часть параметров вводит пользователь в диалоге, часть параметров можно вынести в параметры.
По нажатию "ОК" в диалоге класс в рамках одной транзакции формирует заголовок журнала, создает его строки (если нужно, выполняет разноску журнала) и выполняет маркировку складских проводок. Если происходит ошибка, транзакция полностью откатывается, а пользователь получает сообщение об ошибке. При этом в системе не остается никакого мусора в виде полусозданных журналов.
Для просмотра созданного журнала в "Запросах" создается кнопка для отображения созданного журнала спецификаций, нужно только предусмотреть связь строк заказа и журналов. Таким образом, для текущей строки заказа в любой момент можно открыть и посмотреть журнал.
__________________
Dynamics AX Experience
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Amand: Видео: Спецификации (BOM) в Microsoft Dynamics AX 4.0 Часть 1-2 Настройка - Типы строк спецификаций. Blog bot DAX Blogs 0 24.01.2010 19:05
Очень маленькая высота строк в таблице формы (1-2 мм) Gustav DAX: Программирование 11 17.06.2006 11:57
Программное открытие формы строк журнала переноса ViV DAX: Программирование 13 09.11.2005 13:16
3.0, Модуль: ОС, операция: Разноска строк журнала ОС (с предварит просм проводок) MagisterLudi DAX: Функционал 2 07.10.2003 18:55
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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