|
08.07.2011, 16:03 | #1 |
Участник
|
Особенности использования 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); Нашел в закромах следующий код: 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 |
Участник
|
Надо конечно смотреть что там внутри update()
Насколько я помню список обрабатываемых строк находится в таблице PurchParmLine. Если эту таблицу заполнить нужными строками а ненужные удалить, то получим требуемую обработку. |
|
11.07.2011, 14:09 | #3 |
Участник
|
Если кто-то успешно применяет такой подход и желает поделиться опытом, я думаю, многим будет интересно посмотреть на пример кода.
|
|
11.07.2011, 13:35 | #4 |
NavAx
|
Подскажу еще:
Есть такой метод: interCompanyInitQueryBuild. И не надо мучать класс.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
11.07.2011, 14:03 | #5 |
Участник
|
|
|
12.07.2011, 03:52 | #6 |
Участник
|
Поищите по фразе "программная разноска" или "создание накладной из кода" - есть варианты и с ручным созданием 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 |
Участник
|
Цитата:
Сообщение от vanokh
есть варианты и с ручным созданием PurchParmLine, вот, например, тема - Создание CustInvoiceJour, CustInvoiceSalesLink, CustInvoiceTrans from X++
Цитата:
DmitrySincerity: После создания Sales Line не создается SalesParmLine - это так, для заметки
Sada: После создания Sales Line не должен создаваться SalesParmLine Что за класс PurchFormLetter_PackingSlip_public; возвращаясь к первоначальной теме, если необходимо выбрать несколько записей PurchTable, что делать с единственным вызовом purchFormLetter.initParmPurchTable(purchTable) и purchFormLetter.createParmTable(purchParmTable, purchTable); ну и еще всякого по мелочи. Увы, кусок кода больше запутывает, чем помогает. |
|
18.07.2011, 05:33 | #8 |
Участник
|
Цитата:
Цитата:
Сообщение от Hyper
Код больше вызывает вопросов, чем объясняет
Что за класс PurchFormLetter_PackingSlip_public; возвращаясь к первоначальной теме, если необходимо выбрать несколько записей PurchTable, что делать с единственным вызовом purchFormLetter.initParmPurchTable(purchTable) и purchFormLetter.createParmTable(purchParmTable, purchTable); ну и еще всякого по мелочи. Увы, кусок кода больше запутывает, чем помогает. Класс _public открывает некоторые методы PurchFormLetter_PackingSlip, которые нельзя вызвать извне - это забыл сказать. Попробуйте проделать то же самое с PurchFormLetter_PackingSlip и сразу будет видно, чего не хватает. В вашем случае я так понимаю надо на каждый PurchTable создать свой purchParmTable, объединяя общим ParmId. Насчет единственного вызова purchFormLetter.initParmPurchTable(purchTable) - если будет несколько purchParmTable c разными PurchId, то PurchTable будет определяться из очередного по мере перебора в цикле (PurchFormLetter.run:72). |
|
Теги |
постинг, программно |
|
Похожие темы | ||||
Тема | Ответов | |||
Принцип использования дат | 4 | |||
Примеры использования AIF | 14 | |||
COM+ механизмы использования | 2 | |||
Номер накладной поставщика в purchFormLetter.update | 8 | |||
Пример использования RunBuf | 11 |
|