首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAP BAPI事务未从WCF提交

SAP BAPI事务未从WCF提交
EN

Stack Overflow用户
提问于 2015-02-07 20:43:24
回答 1查看 1.5K关注 0票数 0

从我的WCF服务,我需要在SAP系统中创建一个采购订单,它正在创建。但是当我尝试提交事务时,它在SAP系统中不起作用。

我正在从SAP获取PONumber,但它没有提交。

在这个问题上,有人能帮我吗?

下面是我的代码:

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2015-02-09 01:03:41

您的两个BAPI调用当前在单独的上下文中执行。因此,对BAPI_TRANSACTION_COMMIT的第二个调用将无法工作,因为第二个调用上下文不知道第一个调用的任何结果。您需要在同一上下文中执行这两个调用。我不知道如何使用旧的、不推荐使用的SAPNCO3连接器,但是使用当前的SAPNCO3,您可以使用RfcSessionManager.BeginContext()RfcSessionManager.EndContext()方法来实现它。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28382256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档