2015-02-07 133 views
0

從我的WCF服務中,我需要在SAP創建的採購訂單中創建採購訂單。但是當我嘗試提交事務時,它不會影響SAP系統。SAP BAPI交易未從WCF提交

這裏是我的代碼

NFCLMasters.ZMASTERDATA zmobj = new NFCLMasters.ZMASTERDATA(); 
      NFCLMasters.ZMASTERDATAResponse zmresponse = new NFCLMasters.ZMASTERDATAResponse(); 
      NFCLMasters.ZSM_WH_MST[] zmwarehousemaster = new NFCLMasters.ZSM_WH_MST[10]; 
      NFCLMasters.zws_mst mst = new NFCLMasters.zws_mst(); 
      zmobj.IWHMST = "X"; 
      zmobj.WHMST_LINES = zmwarehousemaster; 
      zmresponse = mst.ZMASTERDATA(zmobj); 

      NFCLTransactions.BAPI_PO_CREATE1 Zpo = new NFCLTransactions.BAPI_PO_CREATE1(); 
      NFCLTransactions.BAPI_PO_CREATE1Response Zporesponse = new NFCLTransactions.BAPI_PO_CREATE1Response(); 
      NFCLTransactions.zws_lo SapTrasactions = new NFCLTransactions.zws_lo(); 
      // Data objects 
      NFCLTransactions.BAPIMEPOHEADER poheader = new NFCLTransactions.BAPIMEPOHEADER(); 
      NFCLTransactions.BAPIMEPOHEADERX poheaderx = new NFCLTransactions.BAPIMEPOHEADERX(); 
      NFCLTransactions.BAPIMEPOITEM[] poitem = new NFCLTransactions.BAPIMEPOITEM[1]; 
      NFCLTransactions.BAPIMEPOITEMX[] poitemx = new NFCLTransactions.BAPIMEPOITEMX[1]; 
      NFCLTransactions.BAPIMEPOSCHEDULE[] poschedule = new NFCLTransactions.BAPIMEPOSCHEDULE[1]; 
      NFCLTransactions.BAPIMEPOSCHEDULX[] poschedulex = new NFCLTransactions.BAPIMEPOSCHEDULX[1]; 
      NFCLTransactions.BAPIITEMSHIP[] poitemship = new NFCLTransactions.BAPIITEMSHIP[1]; 
      NFCLTransactions.BAPIITEMSHIPX[] poitemshipx = new NFCLTransactions.BAPIITEMSHIPX[1]; 
      NFCLTransactions.BAPIRET2[] Bapireturn = new NFCLTransactions.BAPIRET2[100];     

      // ASSIGNING VALUES TO EACH OBJECT AND ADDING MAIN BAPI 
      poheader.COMP_CODE = "NFCL"; poheader.DOC_TYPE = "ZPPS"; poheader.PURCH_ORG = "MKTG"; poheader.PUR_GROUP = "M13"; poheader.DOC_DATE = "2015-02-06"; 
      poheader.SUPPL_PLNT = "1311"; poheader.OUR_REF = "R006"; 
      Zpo.POHEADER = poheader; 

      poheaderx.COMP_CODE = "X"; poheaderx.DOC_TYPE = "X"; poheaderx.PMNTTRMS = "X"; poheaderx.PURCH_ORG = "X"; poheaderx.PUR_GROUP = "X"; 
      poheaderx.SUPPL_PLNT = "X"; poheaderx.OUR_REF = "X"; 
      Zpo.POHEADERX = poheaderx; 

      poitem[0] = new NFCLTransactions.BAPIMEPOITEM(); 
      poitem[0].PO_ITEM = "00001"; poitem[0].MATERIAL = "U01016501F"; poitem[0].PLANT = "1311"; poitem[0].STGE_LOC = "K038"; poitem[0].QUANTITY = 10; 
      poitem[0].PERIOD_IND_EXPIRATION_DATE = "D"; 
      Zpo.POITEM = poitem; 

      poitemx[0] = new NFCLTransactions.BAPIMEPOITEMX(); 
      poitemx[0].PO_ITEM = "00001"; poitemx[0].MATERIAL = "X"; poitemx[0].PLANT = "X"; poitemx[0].STGE_LOC = "X"; poitemx[0].QUANTITY = "X"; 
      poitemx[0].VAL_TYPE = "X"; poitemx[0].BATCH = "X"; 
      Zpo.POITEMX = poitemx;   

      poschedule[0] = new NFCLTransactions.BAPIMEPOSCHEDULE(); 
      poschedule[0].PO_ITEM = "00001"; poschedule[0].DELIVERY_DATE = "06.02.2015"; poschedule[0].QUANTITY = 10; 
      //poschedule[0].DELIV_TIME = 'X'; 
      // poschedule[0].GR_END_TIME 
      Zpo.POSCHEDULE = poschedule; 

      poschedulex[0] = new NFCLTransactions.BAPIMEPOSCHEDULX(); 
      poschedulex[0].PO_ITEM = "00001"; poschedulex[0].PO_ITEMX = "X"; poschedulex[0].DELIVERY_DATE = "X"; poschedulex[0].QUANTITY = "X";     
      Zpo.POSCHEDULEX = poschedulex;      

      poitemship[0] = new NFCLTransactions.BAPIITEMSHIP(); 
      poitemship[0].PO_ITEM = "00001"; poitemship[0].SHIP_POINT = "R006"; 
      Zpo.POSHIPPING = poitemship; 

      poitemshipx[0] = new NFCLTransactions.BAPIITEMSHIPX(); 
      poitemshipx[0].PO_ITEM = "00001"; poitemshipx[0].SHIP_POINT = "X"; 
      Zpo.POSHIPPINGX = poitemshipx; 
      Zpo.RETURN = Bapireturn; 

      NFCLTransactions.BAPI_TRANSACTION_COMMIT transcommit = new NFCLTransactions.BAPI_TRANSACTION_COMMIT(); 
      transcommit.WAIT = "X"; 
      Zporesponse = SapTrasactions.BAPI_PO_CREATE1(Zpo); 
      response = Zporesponse.EXPPURCHASEORDER; 
      NFCLTransactions.BAPI_TRANSACTION_COMMITResponse resp = SapTrasactions.BAPI_TRANSACTION_COMMIT(transcommit); 

所以,我從SAP獲得採購單號碼,它不是承諾。

任何人都可以幫助我解決這個問題。

回答

2

您的兩個BAPI調用當前正在各個上下文中執行。因此,第二次調用BAPI_TRANSACTION_COMMIT將不起作用,因爲第二個調用上下文不知道第一個調用的結果。您需要在相同的上下文中執行這兩個調用。我不知道如何使用舊的,不推薦使用的SAP .Net連接器,但是使用當前的SAP Nco 3,您可以使用方法RfcSessionManager.BeginContext()RfcSessionManager.EndContext()來實現。

如果BAPI僅作爲Web服務公開,則提交可能不會成功,因爲所有對這些Web服務的調用都是在它們自己的上下文中執行的,因此您再次遇到同樣的問題。使用Web服務和BAPI_TRANSACTION_COMMIT的解決方法是在SAP系統中創建一個首先調用BAPI的自定義功能模塊,如果該調用成功,則調用BAPI_TRANSACTION_COMMIT。該功能模塊必須具備RFC功能,並且可以作爲Web服務公開給您。該自定義功能模塊的參數(至少)與您需要的BAPI相同,也許是一個額外的「COMMIT」參數,允許您在不提交任何內容的情況下調用它。創建這樣的功能模塊相對容易,對熟悉SAP ERP的公司來說不應該是個問題。

+0

謝謝Dirik,現在明白了這個問題。但是如果我們使用SAP.Net連接器,那麼我們需要直接連接到SAP系統。但客戶只給我WSDL。所以我只是將服務參考添加到我的項目中。我可以獲取數據並將數據推送到SAP,但唯一的問題是使用BAPI事務。我是WCF新手。你可以給我一個示例代碼來提交BAPI事務。你的建議會在這種情況下幫助我。謝謝。 – user2039072 2015-02-09 07:21:14

+0

我不認爲這會按照你的希望工作。 Web服務調用可能總是在它們自己的上下文中執行。您工作的公司必須爲您提供一個定製的RFC功能模塊,該模塊可在一個會話中調用兩個BAPI。該功能模塊可以作爲Web服務公開給您。關於SAP論壇上相同主題的主題:http://scn.sap.com/message/6324213#6324213 – 2015-02-09 08:00:42