为什么.net调用SAP的BAPI接口需要调用BAPI_TRANSACTION_COMMIT呢?首先得明白BAPI_TRANSACTION_COMMIT这个BAPI的作用。它功劳很大,在SAP里面很多的BAPI直接调用是不会有结果的,因为需要COMMIT一下才能生效,比如生成资产编号的BAPI:BAPI_FIXEDASSET_CREATE1,如果对他直接在SE37中调用运行或者使用SE38调用它,虽然可以得到一个资产编号,但是在AS03里面查询,系统会很白痴得提示你:该资产编号不存在于XX公司。更搞的是当你在AS01中新建资产编号时,新建的资产编号会跳过之前用BAPI生成“失败”的号码。

那么,这就需要COMMIT一下,在调用这个BAPI之后再紧接调用BAPI_TRANSACTION_COMMIT这个。但是,在SE38中是可以这样做,而在.net中就没那么简单了,直接在调用完BAPI_FIXEDASSET_CREATE1之后再紧接调用BAPI_TRANSACTION_COMMIT是不可以的,虽然还是生成了资产编号,但仍旧是个废号。跟在SE37中调用无异。

怎么在.net中解决这个问题呢,这就需要用到RfcSessionManager.BeginContext和RfcSessionManager.EndContext这两个方法了。只有在这两个方法之间调用BAPI才能方保万无一失!

代码如下:

1、首先引用:using SAP.Middleware.Connector;

2、调用代码:

public void nco(DataSet ds) { IDestinationConfiguration ID = new RfcConfig(); RfcDestinationManager.RegisterDestinationConfiguration(ID); RfcDestination prd = RfcDestinationManager.GetDestination(”PRD_000″); RfcDestinationManager.UnregisterDestinationConfiguration(ID); nco(prd, ds); } public void nco(RfcDestination prd, DataSet ds) { bool asset = false; //选择要调用的BAPI的名称 RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD = prd.Repository.GetFunctionMetadata(”BAPI_REQUISITION_CREATE”); //新建调用该BAPI的一个“实例” IRfcFunction function = null; function = BAPI_COMPANYCODE_GETDETAIL_MD.CreateFunction(); IRfcTable ITEMS = function.GetTable(”REQUISITION_ITEMS”); IRfcTable ACCOUNT = function.GetTable(”REQUISITION_ACCOUNT_ASSIGNMENT”); IRfcTable RETURN = function.GetTable(”RETURN”); int j = 0; RfcSessionManager.BeginContext(prd);  //因期间需要同一个时间调用BAPI,而且各个BAPI之间有顺序关联,所以最好用这个包围起来 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { ITEMS.Insert(); j = j + 1; j = j * 10; ITEMS.CurrentRow.SetValue(”PREQ_ITEM”, j.ToString()); ITEMS.CurrentRow.SetValue(”PREQ_NAME”, ds.Tables[0].Rows[i]["QGA27"].ToString()); ITEMS.CurrentRow.SetValue(”CREATED_BY”, ds.Tables[0].Rows[i]["QGA27"].ToString()); ITEMS.CurrentRow.SetValue(”PREQ_DATE”, Convert.ToDateTime(ds.Tables[0].Rows[i]["QGA15"].ToString()).Date); ITEMS.CurrentRow.SetValue(”MATERIAL”, ds.Tables[0].Rows[i]["QGA04"].ToString()); ITEMS.CurrentRow.SetValue(”SHORT_TEXT”, ds.Tables[0].Rows[i]["QGA05"].ToString()); ITEMS.CurrentRow.SetValue(”PLANT”, “1201″); ITEMS.CurrentRow.SetValue(”QUANTITY”, Convert.ToDecimal(ds.Tables[0].Rows[i]["QGA07"].ToString())); ITEMS.CurrentRow.SetValue(”DELIV_DATE”, Convert.ToDateTime(ds.Tables[0].Rows[i]["QGA09"].ToString()).Date); ITEMS.CurrentRow.SetValue(”C_AMT_BAPI”, Convert.ToDecimal(ds.Tables[0].Rows[i]["QGA14"].ToString())); ITEMS.CurrentRow.SetValue(”ACCTASSCAT”, ds.Tables[0].Rows[i]["QGA12"].ToString()); ITEMS.CurrentRow.SetValue(”DOC_TYPE”, ds.Tables[0].Rows[i]["QGA28"].ToString()); ITEMS.CurrentRow.SetValue(”UNIT”, ds.Tables[0].Rows[i]["QGA06"].ToString());

ACCOUNT.Insert(); ACCOUNT.CurrentRow.SetValue(”PREQ_ITEM”, j.ToString()); ACCOUNT.CurrentRow.SetValue(”COST_CTR”, ds.Tables[0].Rows[i]["QGA31"].ToString()); ACCOUNT.CurrentRow.SetValue(”ORDER_NO”, ds.Tables[0].Rows[i]["QGA10"].ToString());

if (ds.Tables[0].Rows[i]["QGA12"].ToString().Trim() == “A”)  //如果类别是A,即资产,则需要资产编号 { ACCOUNT.CurrentRow.SetValue(”ASSET_NO”, GetASSET(prd, i, ds));  //设置新建的资产编号 ACCOUNT.CurrentRow.SetValue(”CO_AREA”, “1000″); ACCOUNT.CurrentRow.SetValue(”SUB_NUMBER”, “0000″); } } function.SetValue(”REQUISITION_ITEMS”, ITEMS); function.SetValue(”REQUISITION_ACCOUNT_ASSIGNMENT”, ACCOUNT); function.Invoke(prd);//提交调用BAPI RfcSessionManager.EndContext(prd); if (RETURN.GetString(”TYPE”).ToString().Trim() == “I”) { Suess.Text = RETURN.GetString(”MESSAGE”).ToString(); BANFN.Text = “返回的请购单号:” + function.GetString(”NUMBER”).Trim(); } else if (RETURN.GetString(”TYPE”).ToString().Trim() == “E”) { Error.Text = RETURN.GetString(”MESSAGE”).ToString(); } prd = null; } /// <summary> /// 取得资产编号 /// </summary> /// <param name=”prd”></param> /// <returns></returns> public string GetASSET(RfcDestination prd, int i, DataSet ds) { RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD = prd.Repository.GetFunctionMetadata(”BAPI_FIXEDASSET_CREATE1″); IRfcFunction function = null; function = BAPI_COMPANYCODE_GETDETAIL_MD.CreateFunction(); IRfcStructure KEY = function.GetStructure(”KEY”); KEY.SetValue(”COMPANYCODE”, “2012″); IRfcStructure GENERALDATA = function.GetStructure(”GENERALDATA”); GENERALDATA.SetValue(”ASSETCLASS”, “00005990″); GENERALDATA.SetValue(”DESCRIPT”, ds.Tables[0].Rows[i]["QGA05"].ToString()); IRfcStructure GENERALDATAX = function.GetStructure(”GENERALDATAX”); GENERALDATAX.SetValue(”ASSETCLASS”, “X”); GENERALDATAX.SetValue(”DESCRIPT”, “X”); function.SetValue(”KEY”, KEY); function.SetValue(”GENERALDATA”, GENERALDATA); function.SetValue(”GENERALDATAX”, GENERALDATAX);

prd.Repository.ClearFunctionMetadata();  //貌似这句可以省略… RfcFunctionMetadata BAPI_COMPANYCODE_GETDETAIL_MD1 = prd.Repository.GetFunctionMetadata(”BAPI_TRANSACTION_COMMIT”); IRfcFunction function1 = null; function1 = BAPI_COMPANYCODE_GETDETAIL_MD1.CreateFunction(); function1.SetValue(”WAIT”, “X”); RfcSessionManager.BeginContext(prd); function.Invoke(prd);     //提交调用BAPI_FIXEDASSET_CREATE1  生成资产编号 function1.Invoke(prd);   //提交调用BAPI_TRANSACTION_COMMIT 进行COMMIT一下 RfcSessionManager.EndContext(prd); twMsgbox.AjaxAlert(function.GetValue(”ASSET”).ToString().Trim()); return function.GetValue(”ASSET”).ToString().Trim(); }

新建立之后的请购单一切OK,同时,建立的资产编号在AS03已经可以认出来了

BAPI 调用相当于BAPI_TRANSACTION_COMMIT 的方法的更多相关文章

  1. [SAP ABAP开发技术总结]BAPI调用

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. Spring.net 间接调用被AOP拦截的方法失效(无法进入aop的拦截方法)

    .下面的tx要定义 <objects xmlns="http://www.springframework.net" xmlns:db="http://www.spr ...

  3. js调用父窗口中的方法

    window.open调用父窗口中的方法 回调函数: function fun9(ex){ alert(ex); } 调用语句: window.open("RoomSelecter.htm? ...

  4. JQuery直接调用asp.net后台WebMethod方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.[WebMethod]   命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的 ...

  5. android 中activity调用本地service中的方法。

    1.自定义一个接口,暴露服务中的方法 public interface IService {    /**服务中对外暴露的方法 */    void methodInService();} 2.自定一 ...

  6. asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

    通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...

  7. .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox

    一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...

  8. 利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先来个简单的实例热热身吧. 1.无参数的方法调用 asp.net code: view plaincopy to clip ...

  9. 在C#中我们能调用一个类的私有方法吗

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

随机推荐

  1. ASP.NET CheckBoxList Operations with jQuery

    本文描述了如何通过jQuery来对ASP.NET CheckBoxList控件进行一些基本操作,如通过value/text/index check/uncheck CheckBoxList,最小/最大 ...

  2. Marbles启动信息

    body-parser deprecated undefined extended: provide extended option app.js:40:20 -------------------- ...

  3. Java程序员的日常—— Properties文件的读写

    在日常的Java程序开发中,Properties文件的读写是很常用的.经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整. 那么本片就来简单的介绍下,如何使用Prop ...

  4. paip.java OutOfMemoryError 解决方法o33

    paip.java OutOfMemoryError 解决方法o33 java.lang.OutOfMemoryError: Requested # java.lang.OutOfMemoryErro ...

  5. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

  6. asp.net对cookie的操作

    创建cookie: HttpCookie cookie = new HttpCookie("CurrentUser"); //创建一个名称为CurrentUser 的cookie对 ...

  7. 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  8. C#窗体全屏功能

    最近有朋友让我给他弄个应用程序全屏的功能,例如银行的取号程序界面.所以我从网上查询了一些实现的方法. C#应用程序中如何实现全屏幕显示功能? 效果就像windows自带的屏幕保护程序和众多的游戏那样, ...

  9. C#:注册机的实现【提供源代码下载】

    代码下载 C#软件注册机 软件运行结果 参考文章 http://www.cnblogs.com/hanzhaoxin/archive/2013/01/04/2844191.html

  10. Postman测试Web API

    如何查看查询字符串? →输入包含查询字符串的URL,比如:http://localhost:54176/api/ProductCategories?name=darren&age=25→点击P ...