2017-01-16 50 views
0

我们正在尝试创建链接到采购订单文档的采购订单收货凭证。以下是代码,但在提交PO行的选择后,web服务不返回任何结果。稍后它会给执行超时异常。通过网络服务从采购订单创建采购收货

 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服务未返回任何结果。任何人都可以提供帮助吗?

变种receiptLines = context.PO302000Submit(文档);

+0

我只想指出,在创建Document命令数组时,您的第三个和第七个命令都是VendorRef字段的设置值。同样的事情发生在你的第四和第五个命令中,这两个命令都为Date字段设置了一个值。 – samol518

+0

是的,谢谢指出。 – Hybridzz

回答

0

@ samol518的样品帮助我解决。我张贴的全部代码,如果有人以后需要它

下面的代码会从PO,变化量增加线路和保存PO收据。

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

该解决方案是使用Acumatica版本6.00.1596测试。

我发现返回的采购订单行的值,你不需要做一个foreach。

设置汇总值并删除这里的deuplicate后是我用它来找回POLines。

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(文档); 正在返回一些关于可用行的信息。

+0

您的部分代码有助于解决问题。我将发布完整的工作代码。 – Hybridzz