BAPI 调用相当于BAPI_TRANSACTION_COMMIT 的方法
为什么.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 的方法的更多相关文章
- [SAP ABAP开发技术总结]BAPI调用
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Spring.net 间接调用被AOP拦截的方法失效(无法进入aop的拦截方法)
.下面的tx要定义 <objects xmlns="http://www.springframework.net" xmlns:db="http://www.spr ...
- js调用父窗口中的方法
window.open调用父窗口中的方法 回调函数: function fun9(ex){ alert(ex); } 调用语句: window.open("RoomSelecter.htm? ...
- JQuery直接调用asp.net后台WebMethod方法
利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法.[WebMethod] 命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod]的 ...
- android 中activity调用本地service中的方法。
1.自定义一个接口,暴露服务中的方法 public interface IService { /**服务中对外暴露的方法 */ void methodInService();} 2.自定一 ...
- asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...
- .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox
一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...
- 利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法
利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先来个简单的实例热热身吧. 1.无参数的方法调用 asp.net code: view plaincopy to clip ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
随机推荐
- mysql where执行顺序
where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个. 在用MySQL查询数据库的时候,连接了很多个过滤条件 ...
- Atitit.计算机图形图像图片处理原理与概论attilax总结
Atitit.计算机图形图像图片处理原理与概论attilax总结 计算机图形1 图像处理.分析与机器视觉(第3版)1 数字图像处理(第六版)2 图像处理基础(第2版)2 发展沿革 1963年,伊凡·苏 ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- Abstract Server模式,Adapter模式和Bridge模式
简易的台灯 Abstract Server模式 谁拥有接口. 接口属于它的客户,而不是它的派生类. 接口和客户之间的逻辑关系,强于接口和其派生类的逻辑关系. 逻辑关系和实体关系的强度是不一致的.在实体 ...
- SAP Business One SAP B1功能概述
SAP Business One SAP B1功能概述 SAP B One配有易于使用的软件界面,是一款全面的,多功能的业务管理解决方案,贵企业可以将其用作主要的企业资源(ERP)应用程序. 该解决方 ...
- discuz x3在DIY模块中调用伪静态不成功,显示动态链接的解决办法
discuz x3在DIY模块中调用伪静态不成功,显示动态链接,然而其他的链接正常显示伪静态. 后台启用伪静态后,发现论坛版块.帖子点击链接,伪静态正常显示,然后在门户首页DIY显示的帖子,点进去后发 ...
- 【由VerySky原创】CX51、CX52 ——数据表
今天通过DEBUG CX52 得出所保存的数据表是ECMCA:
- 如何将 DVD 转成 ISO
Windows 电脑 + 光驱(Mac 下没找到类似 UltraISO 这么好用的软件,知道的朋友推荐一下哈) 安装 UltraISO 软件(试用版即可),http://baoku.360.cn/so ...
- GBK、UTF8、UNICODE编码转换
string GBKToUTF8(const std::string& strGBK) { , strGBK.c_str(), -, NULL, ); WCHAR * wszUTF8 = ne ...
- 扩展ViewFlow避免和ViewPager滑动冲突,同时支持无限循环,并完美和CircleFlowIndicator结合
首先,为了避免滑动冲突,我们要继承ViewFlow,重写onInterceptTouchEvent public class MyViewFlow extends ViewFlow { private ...