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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.07.2011, 16:03   #1  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Особенности использования PurchFormLetter
Собственно, прошу поделиться опытом. На форуме уже обсуждались нюансы работы с PurchFormLetter, к примеру:
X++:
PurchTable      purchTable      = PurchTable::find("кодЗакупки");
PurchFormLetter purchFormLetter = PurchFormLetter::construct(DocumentStatus::Invoice);
;

purchFormLetter.update(purchTable,
                       "Номер накладной",
                       systemDateGet(),
                       PurchUpdate::All,
                       AccountOrder::None,
                       NoYes::No,
                       NoYes::No);
Однако это простейший сценарий. А что, если необходимо запостить PackingSlip для произвольных записей из PurchTable или PurchLine?

Нашел в закромах следующий код:
X++:
protected void postVendPackingSkip(VendAccount _vendAccount)
{
    SysQueryRun             chooseLinesQuery;
    QueryBuildDataSource    qbds;
    PurchFormLetter         purchFormLetterPS;
    container               purchIds;
    Num                     parmId;
    int                     i;
    ;

    purchIds = this.initOrders(_vendAccount);

    if (purchIds)
    {
        chooseLinesQuery = new SysQueryRun(querystr(PurchUpdate));
        chooseLinesQuery.query().interactive(false);
        chooseLinesQuery.saveUserSetup(false);

        qbds = chooseLinesQuery.query().dataSourceTable(tablenum(PurchTable));

        for (i = 1; i <= conlen(purchIds); i++)
            qbds.addRange(fieldnum(PurchTable, PurchId)).value(queryValue(conpeek(purchIds, i)));

        purchFormLetterPS = PurchFormLetter::construct(DocumentStatus::PackingSlip, true);
        purchFormLetterPS.chooseLinesQuery  (chooseLinesQuery);
        parmId = purchFormLetterPS.parmId();    // Unique id
        purchFormLetterPS.parmParmTableNum  (parmId);
        purchFormLetterPS.transDate         (systemDateGet());
        purchFormLetterPS.proforma          (false);
        purchFormLetterPS.printFormLetter   (false);
        purchFormLetterPS.createParmUpdate  (false);
        purchFormLetterPS.specQty           (PurchUpdate::ReceiveNow);
        purchFormLetterPS.sumBy             (AccountOrder::Account);
        purchFormLetterPS.chooseLines       (false);
        purchFormLetterPS.reArrangeNow      (true);
        purchFormLetterPS.progressHide();
        purchFormLetterPS.run();
    }
}
Работать-то он работает, но насколько он красив, логичен и корректен - другой вопрос.

Скажем, видно, что SpecQty здесь устанавливается в ReceiveNow. Если же мы захотим использовать подобный кусок кода для постинга инвойса со SpecQty = PackingSlip, проблем не избежать. Можно разбираться, делать метод PurchFormLetter_Invoice.initQueryBuild public, использовать что-то вроде:
X++:
protected void postVendInvoice(VendAccount _vendAccount)
{
    SysQueryRun             chooseLinesQuery;
    QueryBuildDataSource    qbds;
    PurchFormLetter_Invoice purchFormLetterInv;
    container               purchIds;
    Num                     parmId;
    str                     rangeStr;
    int                     i;
    ;

    purchIds = this.initOrders(_vendAccount);

    if (purchIds)
    {
        purchFormLetterInv = PurchFormLetter::construct(DocumentStatus::Invoice, true);
        purchFormLetterInv.reSelect(PurchUpdate::PackingSlip, NoYes::Yes);
        purchFormLetterInv.initQueryBuild();

        qbds = purchFormLetterInv.chooseLinesQuery().query().dataSourceTable(tablenum(PurchTable));
        for (i = 1; i <= conlen(purchIds); i++)
            qbds.addRange(fieldnum(PurchTable, PurchId)).value(queryValue(conpeek(purchIds, i)));

        qbds = purchFormLetterInv.chooseLinesQuery().query().dataSourceTable(tablenum(InventTrans));
        if (qbds)
        {
            rangeStr = strfmt('(((%1.%2 == %4) && (%1.%3 == %5)) || ((%1.%2 == %6) && (%1.%3 == %7)))',
                               qbds.name(),
                               fieldstr(InventTrans,StatusReceipt),
                               fieldstr(InventTrans,StatusIssue),
                               queryValue(enum2int(StatusReceipt::Received)),
                               queryValue(enum2int(StatusIssue::None)),
                               queryValue(enum2int(StatusReceipt::None)),
                               queryValue(enum2int(StatusIssue::Deducted)));

            SysQuery::findOrCreateRange(qbds, fieldnum(InventTrans, StatusReceipt)).value(rangeStr);
        }

        parmId = purchFormLetterInv.parmId();   // Unique id
        purchFormLetterInv.parmParmTableNum (parmId);
        purchFormLetterInv.transDate        (systemDateGet());
        purchFormLetterInv.proforma         (false);
        purchFormLetterInv.printFormLetter  (false);
        purchFormLetterInv.createParmUpdate (false);
        purchFormLetterInv.sumBy            (AccountOrder::Account);
        purchFormLetterInv.chooseLines      (false);
        purchFormLetterInv.reArrangeNow     (true);
        purchFormLetterInv.progressHide();
        purchFormLetterInv.run();
    }
}
И задумываться о том, что все это еще менее красиво, логично и корректно.

Интересно, как подобные задачи решают люди, которые собаку съели с классами PurchFormLetter и SalesFormLetter на закуску. Есть ли у кого информация о наличии удобных способов постинга произвольно выбранных записей с помощью этих классов?

Последний раз редактировалось Hyper; 08.07.2011 в 16:13.
Старый 11.07.2011, 11:58   #2  
Мартынов Дмитрий is offline
Мартынов Дмитрий
Участник
 
236 / 66 (3) ++++
Регистрация: 02.02.2004
Адрес: г. Москва
Надо конечно смотреть что там внутри update()
Насколько я помню список обрабатываемых строк находится в таблице PurchParmLine. Если эту таблицу заполнить нужными строками а ненужные удалить, то получим требуемую обработку.
Старый 11.07.2011, 13:35   #3  
Maximin is offline
Maximin
NavAx
NavAx Club
 
412 / 346 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Подскажу еще:
Есть такой метод: interCompanyInitQueryBuild. И не надо мучать класс.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
Старый 11.07.2011, 14:03   #4  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Maximin Посмотреть сообщение
Есть такой метод: interCompanyInitQueryBuild. И не надо мучать класс.
Точно, метод PurchFormLetter_Invoice.initQueryBuild делать public вовсе не нужно, спасибо за замечание.
Старый 11.07.2011, 14:09   #5  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от Мартынов Дмитрий Посмотреть сообщение
Насколько я помню список обрабатываемых строк находится в таблице PurchParmLine. Если эту таблицу заполнить нужными строками а ненужные удалить, то получим требуемую обработку.
Если кто-то успешно применяет такой подход и желает поделиться опытом, я думаю, многим будет интересно посмотреть на пример кода.
Старый 12.07.2011, 03:52   #6  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Поищите по фразе "программная разноска" или "создание накладной из кода" - есть варианты и с ручным созданием PurchParmLine, вот, например, тема - Создание CustInvoiceJour, CustInvoiceSalesLink, CustInvoiceTrans from X++

Сам пишу примерно такой код (разноска отборочной - выбор нужных строк заказа по фильтру и задание для каждой требуемого кол-ва):
X++:
        purchParmTable.clear();

        purchFormLetter = new PurchFormLetter_PackingSlip_public(true);
        purchFormLetter.parmId();
        purchFormLetter.initParmPurchTable(purchTable);
        purchFormLetter.specQty(PurchUpdate::PackingSlip);
        purchFormLetter.transDate(systemdateget());
        purchFormLetter.createParmTable(purchParmTable, purchTable);

        purchParmTable.Num = packingSlip.PackingSlipId;
        purchParmTable.Transdate = packingSlip.DeliveryDate;
        purchParmTable.insert();
        purchFormLetter.parmPurchParmTable(purchParmTable);

        while purchLine //все необходимые фильтры
        {
            purchParmLine.clear();
            purchParmLine.initFromParmTable(purchParmTable);
            purchParmLine.initFromPurchLine(purchLine);

            purchQuantity = PurchQuantity::construct(DocumentStatus::PackingSlip);
            [purchParmLine.ReceiveNow, purchParmLine.RemainBefore, purchParmLine.RemainAfter] =
                purchQuantity.qtyPurch(purchLine, purchUpdate::PackingSlip, < ->, false, purchParmTable.PackingSlipIdForUpdate_W);
            [purchParmLine.InventNow , purchParmLine.RemainBeforeInvent, purchParmLine.RemainAfterInvent] =
                purchQuantity.qtyInvent(purchLine, purchUpdate::PackingSlip, < ->, false, purchParmTable.PackingSlipIdForUpdate_W);

            purchLine.PurchReceivedNow = purchParmLine.ReceiveNow;
            purchLine.setInventReceivedNow();

            purchParmLine.setQty(purchParmTable.ordering, false);
            purchParmLine.setInventReceiveNow();
            purchParmLine.setLineAmount();
            purchParmLine.insert();
        }

        purchFormLetter.multiForm(true);
        purchFormLetter.allowCreateParmTable(true);
        purchFormLetter.progressInit("Создание отборочной", 1, '');
        purchFormLetter.createParmUpdate();
        purchFormLetter.setJournalList();
        purchFormLetter.createJournal();

Последний раз редактировалось vanokh; 12.07.2011 в 04:27.
Старый 15.07.2011, 21:51   #7  
Hyper is offline
Hyper
Участник
Соотечественники
 
163 / 29 (1) +++
Регистрация: 09.10.2003
Цитата:
Сообщение от vanokh Посмотреть сообщение
есть варианты и с ручным созданием PurchParmLine, вот, например, тема - Создание CustInvoiceJour, CustInvoiceSalesLink, CustInvoiceTrans from X++
Или я чего-то не вижу, или там нет ни слова о PurchParmLine и ровно два упоминания вскользь SalesParmLine:
Цитата:
DmitrySincerity: После создания Sales Line не создается SalesParmLine - это так, для заметки
Sada: После создания Sales Line не должен создаваться SalesParmLine
Цитата:
Сообщение от vanokh Посмотреть сообщение
Сам пишу примерно такой код
Код больше вызывает вопросов, чем объясняет
Что за класс PurchFormLetter_PackingSlip_public; возвращаясь к первоначальной теме, если необходимо выбрать несколько записей PurchTable, что делать с единственным вызовом purchFormLetter.initParmPurchTable(purchTable) и purchFormLetter.createParmTable(purchParmTable, purchTable); ну и еще всякого по мелочи.
Увы, кусок кода больше запутывает, чем помогает.
Старый 18.07.2011, 05:33   #8  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от Hyper Посмотреть сообщение
Или я чего-то не вижу, или там нет ни слова о PurchParmLine и ровно два упоминания вскользь SalesParmLine:
Логика-то почти та же самая Вдумчивое использование поиска помогает)

Цитата:
Сообщение от Hyper Посмотреть сообщение
Код больше вызывает вопросов, чем объясняет
Что за класс PurchFormLetter_PackingSlip_public; возвращаясь к первоначальной теме, если необходимо выбрать несколько записей PurchTable, что делать с единственным вызовом purchFormLetter.initParmPurchTable(purchTable) и purchFormLetter.createParmTable(purchParmTable, purchTable); ну и еще всякого по мелочи.
Увы, кусок кода больше запутывает, чем помогает.
Я всего лишь пример привел, а не решение Мне нужно было выбрать определенные PurchLine из одного PurchTable.

Класс _public открывает некоторые методы PurchFormLetter_PackingSlip, которые нельзя вызвать извне - это забыл сказать. Попробуйте проделать то же самое с PurchFormLetter_PackingSlip и сразу будет видно, чего не хватает.

В вашем случае я так понимаю надо на каждый PurchTable создать свой purchParmTable, объединяя общим ParmId. Насчет единственного вызова purchFormLetter.initParmPurchTable(purchTable) - если будет несколько purchParmTable c разными PurchId, то PurchTable будет определяться из очередного по мере перебора в цикле (PurchFormLetter.run:72).
Теги
постинг, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Принцип использования дат LEO DAX: Функционал 4 25.06.2010 16:11
Примеры использования AIF Lazy_Tiger DAX: База знаний и проекты 14 16.01.2008 13:24
COM+ механизмы использования cutter DAX: Программирование 2 01.11.2007 00:32
Номер накладной поставщика в purchFormLetter.update SNG DAX: Программирование 8 24.03.2004 10:03
Пример использования RunBuf Mechanizm DAX: Программирование 11 02.03.2004 13:25

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

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

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