通过 Web 服务从采购订单创建采购收据

Posted

技术标签:

【中文标题】通过 Web 服务从采购订单创建采购收据【英文标题】:Create Purchase receipt from Purchase order through web service 【发布时间】:2017-05-31 04:56:47 【问题描述】:

我们正在尝试创建链接到 PO 文档的 PO 收据文档。下面是代码,但是在提交订单行的选择后,webservice 没有返回任何结果。后来它给出了一个执行超时异常。

        apitest.Screen context = BuisnessLogicACU.context;
        PO302000Content PORcptSchema;
        try
        
            PORcptSchema = context.PO302000GetSchema();
        
        catch
        
            BuisnessLogicACU.contextLogin();
            PORcptSchema = context.PO302000GetSchema();
        
        PORcptSchema.Actions.AddPOOrderLine2.Commit = true;
       //header            
            AcumaticaInterface.apitest.Command[] Document = new AcumaticaInterface.apitest.Command[]
                                
                PORcptSchema.Actions.Insert,
                 new Value
                
                    Value = BPCode,
                    LinkedCommand = PORcptSchema.DocumentSummary.Vendor,
                    Commit = true
                ,
                 new Value
                
                    Value = BPRefNbr ,
                    LinkedCommand = PORcptSchema.DocumentSummary.VendorRef
                ,
                 new Value
                
                    Value = PostDate.HasValue ? ((DateTime)PostDate.Value).ToLongDateString() : "",
                    LinkedCommand = PORcptSchema.DocumentSummary.Date
                ,                   
                 new Value
                
                    Value = DocDate.HasValue ? ((DateTime)DocDate.Value).ToLongDateString() : "",
                    LinkedCommand = PORcptSchema.DocumentSummary.Date
                ,
                 new Value
                
                    Value = Description,
                    LinkedCommand = PORcptSchema.DocumentSummary.NoteText
                ,
                new Value
                
                    Value = "POS Doc " + DocNum,
                    LinkedCommand = PORcptSchema.DocumentSummary.VendorRef
                ,

            ;



//set the dialog answer
            var dgAnswer = new Command[]
                         new Value 
                            
                                Value = "OK", 
                                LinkedCommand = PORcptSchema.AddPurchaseOrderLine.ServiceCommands.DialogAnswer, 
                                Commit = true 
                            
                        ;
            Document = Document.Concat(dgAnswer).ToArray();


 //select lines
            foreach (POReceiptLine line in POReceiptlines.OrderBy(x => x.LineNum))
            
                AcumaticaInterface.apitest.Command[] Docline = new AcumaticaInterface.apitest.Command[]
                                   
                    new Key
                    
                        ObjectName = PORcptSchema.AddPurchaseOrderLine.OrderNbr.ObjectName,
                        FieldName = PORcptSchema.AddPurchaseOrderLine.OrderNbr.FieldName,
                        Value = "='" + line.BaseDocNum + "'"
                    ,
                    new Key
                    
                        ObjectName = PORcptSchema.AddPurchaseOrderLine.LineNbr.ObjectName,
                        FieldName = PORcptSchema.AddPurchaseOrderLine.LineNbr.FieldName,
                        Value = "='" + line.BaseLineNum + "'"
                    ,              
                    new Value 
                    
                        Value = "True", 
                        LinkedCommand = PORcptSchema.AddPurchaseOrderLine.Selected, 
                        Commit = true 
                      
                ;
                Document = Document.Concat(Docline).ToArray();
            

  //Add PO line. 
            var addPOLine = new Command[]
                         
                            PORcptSchema.Actions.AddPOOrderLine2,

                            ////get back the added lines in the grid
                            PORcptSchema.DocumentDetails.POOrderNbr,
                            PORcptSchema.DocumentDetails.POLineNbr
                        ;
            Document = Document.Concat(addPOLine).ToArray();

            var receiptLines = context.PO302000Submit(Document);
//update quantity..
            //check CreateShipment() in webservice demo
            List<Command> commandList = new List<Command>();
            for (int index = 0; index < receiptLines.Length; index++)
            
                commandList.Add(new Value
                
                    Value = index.ToString(),
                    LinkedCommand = PORcptSchema.DocumentDetails.ServiceCommands.RowNumber
                );

                POReceiptLine line = POReceiptlines.Where(x => x.BaseDocNum == receiptLines[index].DocumentDetails.POOrderNbr.Value && x.BaseLineNum.ToString() == receiptLines[index].DocumentDetails.POLineNbr.Value).FirstOrDefault();
                if (line != null)
                
                    commandList.Add(new Value
                    
                        Value = line.Qty.ToString(),
                        LinkedCommand = PORcptSchema.DocumentDetails.ReceiptQty,
                        Commit = index < receiptLines.Length - 1
                    );
                
                else
                    throw new Exception("Matching POS Rcpt line not found.");
            


            //save
            AcumaticaInterface.apitest.Command[] save = new AcumaticaInterface.apitest.Command[] 
                        PORcptSchema.Actions.Save
                    ;
            Document = Document.Concat(save).ToArray();

            //SAVING And get the document nbr
            AcumaticaInterface.apitest.Command[] Output = new AcumaticaInterface.apitest.Command[]                  
                PORcptSchema.DocumentSummary.Type,
                PORcptSchema.DocumentSummary.ReceiptNbr               
            ;
            Document = Document.Concat(Output).ToArray();

           var POReceipt = context.PO302000Submit(Document)[0];

在此特定行之后,Web 服务未返回任何结果。任何人都可以在这方面提供帮助吗?

var receiptLines = context.PO302000Submit(Document);

【问题讨论】:

我只想指出,在创建文档命令数组时,您的第三个和第七个命令都在为 VendorRef 字段设置值。同样的事情发生在你的第四个和第五个命令上,它们都在为日期字段设置一个值。 是的,感谢您的指出。 【参考方案1】:

此解决方案已使用 Acumatica 版本 6.00.1596 进行了测试。

我发现要返回采购订单行的值,您不需要执行 foreach。

设置摘要的值并在此处删除重复数据后,我使用它来取回 POLine。

var selectPOLine = new Command[]

    new Value
    
        Value = "OK",
        LinkedCommand = PORcptSchema.AddPurchaseOrderLine.ServiceCommands.DialogAnswer,
        Commit = true
    ,
    addPOLineWithCommit,
    new Value
    
        LinkedCommand = PORcptSchema.AddPurchaseOrderLinePOSelection.OrderNbr,
        Value = "PO000451"
    ,
    new Value
    
        Value = "True",
        LinkedCommand = PORcptSchema.AddPurchaseOrderLine.Selected,
    ,
    PORcptSchema.AddPurchaseOrderLine.InventoryID,
    PORcptSchema.AddPurchaseOrderLine.LineDescription,
    PORcptSchema.AddPurchaseOrderLine.LineType,
;

用“addPOLineWithCommit”定义为

var addPOLineWithCommit = PORcptSchema.Actions.AddPOOrderLine;
addPOLineWithCommit.Commit = true;

使用这些行: var receiptLines = context.PO302000Submit(Document); 正在向我返回一些关于可用线路的信息。

【讨论】:

您的部分代码有助于解决问题。我将发布完整的工作代码。【参考方案2】:

@samol518 的样本帮助我解决了问题。我正在发布完整的代码,如果以后有人需要它

下面的代码将从采购订单中添加行,更改数量并保存采购订单收据。

public void createAcuPR()
    

        apitest.Screen context = BuisnessLogicACU.context;
        PO302000Content PORcptSchema;
        try
        
            PORcptSchema = context.PO302000GetSchema();
        
        catch
        
            BuisnessLogicACU.contextLogin();
            PORcptSchema = context.PO302000GetSchema();
        
        var addPOLineWithCommit = PORcptSchema.Actions.AddPOOrderLine;
        addPOLineWithCommit.Commit = true;

        //somehow if there is a second document then it goes to update mode
        context.PO302000Submit(new Command[]  PORcptSchema.Actions.Insert );

        //header            
        AcumaticaInterface.apitest.Command[] Document = new AcumaticaInterface.apitest.Command[]
                        
            PORcptSchema.Actions.Insert,
             new Value
            
                Value = BPCode,
                LinkedCommand = PORcptSchema.DocumentSummary.Vendor,
                Commit = true
            ,
             new Value
            
                Value = BPRefNbr ,
                LinkedCommand = PORcptSchema.DocumentSummary.VendorRef
            ,
             new Value
            
                Value = PostDate.HasValue ? ((DateTime)PostDate.Value).ToLongDateString() : "",
                LinkedCommand = PORcptSchema.DocumentSummary.Date
            ,               
             new Value
            
                Value = "POS Doc " + DocNum + "-" + Description,
                LinkedCommand = PORcptSchema.DocumentSummary.NoteText
                                           
        ;

        //set the dialog answer
        var dgAnswer = new Command[]
                     new Value 
                        
                            Value = "OK", 
                            LinkedCommand = PORcptSchema.AddPurchaseOrderLine.ServiceCommands.DialogAnswer, 
                            Commit = true 
                        
                    ;
        Document = Document.Concat(dgAnswer).ToArray();

        //select lines from smart panel
        foreach (POReceiptLine line in POReceiptlines.OrderBy(x => x.LineNum))
        
            AcumaticaInterface.apitest.Command[] Docline = new AcumaticaInterface.apitest.Command[]
                               
                new Key
                
                    ObjectName = PORcptSchema.AddPurchaseOrderLine.OrderNbr.ObjectName,
                    FieldName = PORcptSchema.AddPurchaseOrderLine.OrderNbr.FieldName,
                    Value = "='" + line.BaseDocNum + "'"
                ,
                new Key
                
                    ObjectName = PORcptSchema.AddPurchaseOrderLine.LineNbr.ObjectName,
                    FieldName = PORcptSchema.AddPurchaseOrderLine.LineNbr.FieldName,
                    Value = "='" + line.BaseLineNum + "'"
                ,              
                new Value 
                
                    Value = "True", 
                    LinkedCommand = PORcptSchema.AddPurchaseOrderLine.Selected, 
                    Commit = true 
                  
            ;
            Document = Document.Concat(Docline).ToArray();
        


        //Add PO line and retrive back the added lines.
        var addPOLine = new Command[]
                                                 
                        addPOLineWithCommit,
                        ////get back the added lines in the grid
                        PORcptSchema.DocumentDetails.POOrderNbr,
                        PORcptSchema.DocumentDetails.POLineNbr
                    ;
        Document = Document.Concat(addPOLine).ToArray();

        var receiptLines = context.PO302000Submit(Document);

        //update quantity..           
        List<Command> commandList = new List<Command>();
        for (int index = 0; index < receiptLines.Length; index++)
        
            commandList.Add(new Value
            
                Value = index.ToString(),
                LinkedCommand = PORcptSchema.DocumentDetails.ServiceCommands.RowNumber
            );

            POReceiptLine line = POReceiptlines.Where(x => x.BaseDocNum == receiptLines[index].DocumentDetails.POOrderNbr.Value && x.BaseLineNum.ToString() == receiptLines[index].DocumentDetails.POLineNbr.Value).FirstOrDefault();
            if (line != null)
            
                commandList.Add(new Value
                
                    Value = line.Qty.ToString(),
                    LinkedCommand = PORcptSchema.DocumentDetails.ReceiptQty,
                    Commit = index < receiptLines.Length - 1
                );
            
            else
                throw new Exception("Matching POS Rcpt line not found.");
        

        //save
        commandList.AddRange(
                    //SAVING And get the document nbr
                   new AcumaticaInterface.apitest.Command[]    
                        PORcptSchema.Actions.Save,
                        PORcptSchema.DocumentSummary.Type,
                        PORcptSchema.DocumentSummary.ReceiptNbr               
        );


        var POReceipt = context.PO302000Submit(commandList.ToArray())[0];           
    

【讨论】:

【参考方案3】:

此代码有效,正在创建收据,但未为新生成的采购订单生成新创建的收据,此收据是为旧的任何 PO 生成的

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于通过 Web 服务从采购订单创建采购收据的主要内容,如果未能解决你的问题,请参考以下文章

sap创建采购订单步骤

SAP中转储单和采购订单的区别是啥?

odoo以编程方式添加采购订单(rfq)

SAP 怎么从采购申请找到采购订单

sap对采购订单无收获可能是啥意思

在SAP中如何创建销售订单