0

从我的 WCF 服务中,我需要在 SAP 系统中创建一个采购订单并且它正在创建。但是当我尝试提交事务时,它在 SAP 系统中没有影响。

我从 SAP 获得 PONumber 并且它没有提交。

任何人都可以在这个问题上帮助我。

这是我的代码:

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);
4

1 回答 1

6

您的两个 BAPI 调用当前在单独的上下文中执行。因此,对 BAPI_TRANSACTION_COMMIT 的第二次调用将不起作用,因为第二次调用上下文对第一次调用的结果一无所知。您需要在同一上下文中执行这两个调用。我不知道如何使用旧的、已弃用的 SAP .Net 连接器来做到这一点,但使用当前的 SAP Nco 3,您可以通过使用方法RfcSessionManager.BeginContext()和.Net 连接器来实​​现它RfcSessionManager.EndContext()

如果 BAPI 仅作为 Web 服务公开,则提交可能不会成功,因为对这些 Web 服务的所有调用都是在它们自己的上下文中执行的,所以您又遇到了同样的问题。使用 Web 服务的一种解决方法BAPI_TRANSACTION_COMMIT是在 SAP 系统中创建一个自定义功能模块,该模块首先调用您的 BAPI,如果该调用成功,则调用BAPI_TRANSACTION_COMMIT. 该功能模块必须具有 RFC 能力,并且可以作为 Web 服务公开给您。该自定义功能模块的参数将(至少)与您需要的 BAPI 相同,也许是一个额外的“COMMIT”参数,允许您在不提交任何内容的情况下调用它。创建这样一个功能模块相对容易,对于熟悉 SAP ERP 的公司来说应该不成问题。

于 2015-02-08T17:03:40.680 回答