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.
Теги
постинг, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Принцип использования дат 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, время: 03:04.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.