|
|
#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. |
|
|
|
|
#2 |
|
Участник
|
Надо конечно смотреть что там внутри update()
Насколько я помню список обрабатываемых строк находится в таблице PurchParmLine. Если эту таблицу заполнить нужными строками а ненужные удалить, то получим требуемую обработку. |
|
|
|
|
#3 |
|
NavAx
|
Подскажу еще:
Есть такой метод: interCompanyInitQueryBuild. И не надо мучать класс.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты...
|
|
|
|
|
#4 |
|
Участник
|
|
|
|
|
|
#5 |
|
Участник
|
Если кто-то успешно применяет такой подход и желает поделиться опытом, я думаю, многим будет интересно посмотреть на пример кода.
|
|
|
|
|
#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. |
|
|
|
|
#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); ну и еще всякого по мелочи. Увы, кусок кода больше запутывает, чем помогает. |
|
|
|
|
#8 |
|
Участник
|
Цитата:
Вдумчивое использование поиска помогает)Цитата:
Сообщение от 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). |
|
|
| Теги |
| постинг, программно |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Принцип использования дат | 4 | |||
| Примеры использования AIF | 14 | |||
| COM+ механизмы использования | 2 | |||
| Номер накладной поставщика в purchFormLetter.update | 8 | |||
| Пример использования RunBuf | 11 | |||
|