以下 总结了三种情况下的以装箱单过发票

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;
                }
            }           
        }      
    }
}

 

posted on 2019-09-25 16:16  Sunny_Li  阅读(417)  评论(0编辑  收藏  举报