2014-11-01 139 views
1

我正在使用SAP .NET Connector 3.0構建RFC客戶端,以便讓用戶以最簡單的方式與SAP通信。
在這裏,我想提供一些簡短的例子,說明阻礙我進一步發展的原因。 目前我的目的是改變現有的銷售訂單。我將使用BAPI_SALESORDER_CHANGE來更改SO頭和項目數據。我有12個項目的銷售訂單(從000010到0000120)。情景B和C不適合我。SAP .NET Connector 3.0:銷售訂單更改

場景A:客戶訂單變化
結果:訂單號更改成功。沒有問題。

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination) 
    { 
     RfcRepository repo = destination.Repository; 
     IRfcFunction salesDoc = repo.CreateFunction("BAPI_SALESORDER_CHANGE"); 
     IRfcFunction salesDocCommit = repo.CreateFunction("BAPI_TRANSACTION_COMMIT"); 
     salesDoc.SetValue("SALESDOCUMENT", "3939393837"); 

     IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN"); 
     salesHeader.SetValue("PURCH_NO_C", "Order_01"); 
     IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX"); 
     salesHeaderINX.SetValue("UPDATEFLAG", "U"); 
     salesHeaderINX.SetValue("PURCH_NO_C", "X"); 

     RfcSessionManager.BeginContext(destination); 
     salesDoc.Invoke(destination); 
     salesDocCommit.Invoke(destination); 
     RfcSessionManager.EndContext(destination); 

     IRfcTable returnTable = salesDoc.GetTable("RETURN"); 

     return ConvertToDataTable(returnTable);   
    } 

方案B:項目目標數量變化
結果:我得到一個消息:銷售訂單已保存。但數量並未改變。這裏有什麼問題?

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination) 
    { 
     //... 
     //Same peace of code as above  
     IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN"); 
     IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX"); 
     salesHeaderINX.SetValue("UPDATEFLAG", "U"); 

     IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN"); 
     salesItems.Append(); 
     salesItems.SetValue("ITM_NUMBER", 000120); 
     salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1")); 
     IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX"); 
     salesItemsINX.Append(); 
     salesItemsINX.SetValue("UPDATEFLAG", "U"); 
     salesItemsINX.SetValue("ITM_NUMBER", 000120); 
     salesItemsINX.SetValue("TARGET_QTY", "X"); 
     //... 
     //Invoke methods  
    } 

方案C:新產品添加
結果:錯誤上salesDoc.Invoke(目標)方法: 「畫面輸出,而不連接到用戶」。

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination) 
    { 
     //... 
     //Same peace of code as above 
     IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN"); 
     IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX"); 
     salesHeaderINX.SetValue("UPDATEFLAG", "U"); 

     IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN"); 
     salesItems.Append(); 
     salesItems.SetValue("ITM_NUMBER", 130); 
     salesItems.SetValue("MATERIAL", "000000000081828282"); 
     salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1")); 
     IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX"); 
     salesItemsINX.Append(); 
     salesItemsINX.SetValue("UPDATEFLAG", "I"); 
     salesItemsINX.SetValue("ITM_NUMBER", 130); 
     salesItemsINX.SetValue("MATERIAL", "X"); 
     salesItemsINX.SetValue("TARGET_QTY", "X"); 
     //... 
     //Invoke methods    
    } 
+0

你的問題到底是什麼?你能給一個簡短的例子嗎? – Carsten 2014-11-01 11:58:14

+0

主要問題是我不能更改項目的數據,也不能將新項目添加到銷售訂單。在場景B中,我試圖改變目標數量,沒有任何錯誤消息,並且'RETRUN'表爲我提供了成功的結果。但實際上qty並沒有改變。在場景C中,我試圖向銷售訂單添加新行,但由於錯誤'屏幕輸出沒有連接到用戶',因此調用方法在此處不起作用。所以,如果有人願意與我分享如何在銷售訂單中更改或添加項目的好工作示例,我將不勝感激。可能有其他的FM我可以用於這個目的? – mbigun 2014-11-01 12:30:30

回答

0

就像在ABAP程序,你需要你的成功調用BAPI_SALESORDER_CHANGE之後調用BAPI_TRANSACTION_COMMIT。否則,您的交易不由SAP承擔。

+0

如果您檢查場景A的代碼,則已完成:'... repo.CreateFunction(「BAPI_TRANSACTION_COMMIT」); ...' – mbigun 2014-11-11 15:23:01