以下 总结了三种情况下的以装箱单过发票
1.简单的对某个销售订单开票
public static str60 shipSalesOrder(str salesId)
{
SalesFormLetter clsSalesFormLetter;
SalesTable salesTable;
str ret='';
System.Exception err;
;
try
{
//Get SalesTable
tSalesTable = SalesTable::find(salesId);
//Packing Slip update
clsSalesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);
clsSalesFormLetter.update(salesTable,systemDateGet(),SalesUpdate::All,AccountOrder::None,NoYes::No,NoYes::No);
clsSalesFormLetter.checkCloseDialog(clsSalesFormLetter);
//Invoice update
clsSalesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);
clsSalesFormLetter.update(salesTable,systemDateGet(),SalesUpdate::PackingSlip,AccountOrder::None,NoYes::No,NoYes::No);
clsSalesFormLetter= null;
ret = 'OK';
return ret;
}
catch (Exception::CLRError)
{
err = CLRInterop::getLastException();
ret = err.ToString();
return ret;
}
}
2.合并装箱单批量开票(系统原有功能),可以根据某些条件筛选对装箱单开票
static void RB_PostSalesInvoice(Args _args)
{
SalesTable salesTable;
SalesFormLetter salesFormLetter;
Query query;
QueryRun queryRun;
QueryBuildDataSource qbds;
salesTable = SalesTable::find('CNMF_00001');
query = new Query(QueryStr(SalesUpdatePackingSlip));
qbds = query.dataSourceTable(tableNum(SalesLine));
// Build query range to find those lines which needs to be posted.
qbds.addRange(fieldNum(SalesLine, SalesId)).value('CNMF_00001');
qbds.addRange(fieldNum(SalesLine, SalesStatus)).value(queryValue(SalesStatus::Backorder));
qbds.addRange(fieldNum(SalesLine, itemId)).value('D0001');
queryRun = new queryRun(query);
salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);
salesFormLetter.chooseLinesQuery(queryRun);
salesFormLetter.update(salesTable);
}
3. 多选装箱单以当前交货量的方法批量开票
class PostInvoiceBySettle
{
public static void main(Args _args)
{
Test_SalesParmLine salesParmLine, salesParmLineUpdate, salesParmLineTmp;
Test_SalesSettleTable salesSettleTable;
FormDataSource formDataSource;
SalesLine salesline, saleslineUpdate,salesLineTmp;
SettlePostInvoiceTmp settlePostInvoiceTmp;
PostInvoiceBySettle postInvoiceBySettle = new PostInvoiceBySettle();
SalesFormLetter salesFormLetter;
SalesTable salesTable;
SalesParmLine parmLine;
Qty deliveryQty, settleQty,salesPrice, salesLineAmount;
Query query;
SysQueryRun queryRun;
QueryBuildDataSource qbds;
container con, conParmLine;
CustInvoiceJour custInvoiceJour;
SalesParmUpdate salesParmUpdate;
int i, conLenth;
SalesId salesId;
InventTransId inventTransId;
;
if(!_args)
{
throw Error("@SYS22539");
}
if(_args.dataset() == tableNum(Test_SalesSettleTable))
{
salesSettleTable = _args.record();
if(salesSettleTable)
{
ttsbegin;
while select sum(SettleQty), sum(SettleAmount) from salesParmLineTmp
group by salesParmLineTmp.InventTransId
where salesParmLineTmp.SalesSettlementId == salesSettleTable.SalesSettlementId
&& salesParmLineTmp.SettledQty != salesParmLineTmp.DeliverNow
{
salesline = SalesLine::findInventTransId(salesParmLineTmp.InventTransId, true);
if(salesline)
{
salesline.SalesDeliverNow = salesParmLineTmp.SettleQty;
salesline.modifiedField(fieldNum(SalesLine, SalesDeliverNow));
salesline.update();
}
if(!salesId || salesId != salesParmLine.OrigSalesId)
{
con += salesParmLine.OrigSalesId;
}
salesId = salesParmLine.OrigSalesId;
}
query = new Query(queryStr(SalesUpdate));
qbds = query.dataSourceTable(tableNum(SalesTable));
qbds.addRange(fieldNum(SalesTable, SalesId)).value(con2Str(con));
queryRun = new SysQueryRun(query);
salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);
salesFormLetter.chooseLinesQuery(queryRun);
salesFormLetter.transDate (systemDateGet());
salesFormLetter.specQty (SalesUpdate::DeliverNow);
salesFormLetter.printFormLetter(false);
salesFormLetter.chooseLines(false, true);
salesFormLetter.reArrangeNow(true);
salesFormLetter.sumBy(AccountOrder::Account);
salesParmUpdate = salesFormLetter.salesParmUpdate();
salesFormLetter.run();
ttscommit;
select firstonly custInvoiceJour
where custInvoiceJour.ParmId == salesParmUpdate.ParmId;
if(custInvoiceJour)
{
ttsbegin;
salesSettleTable.selectForUpdate(true);
salesSettleTable.InvoiceId = salesSettleTable.InvoiceId ? (salesSettleTable.InvoiceId + ',' + custInvoiceJour.InvoiceId) : custInvoiceJour.InvoiceId;
salesSettleTable.doUpdate();
while select settlePostInvoiceTmp
where settlePostInvoiceTmp.InventTransId
{
saleslineUpdate = SalesLine::findInventTransId(settlePostInvoiceTmp.InventTransId, true);
if(saleslineUpdate)
{
saleslineUpdate.SalesDeliverNow = settlePostInvoiceTmp.DeliveryQty;
salesline.modifiedField(fieldNum(SalesLine, SalesDeliverNow));
saleslineUpdate.update();
}
}
ttscommit;
}
}
}
}
}