K2 BPM项目 基于COM组件调用SAP RFC 问题

问题前景:

  环境:Win 2008 R2 64bit

  最近项目中有支流程需求中需要在会计入账环节回写SAP的会计凭证。

  SAP组给我们提供.NET基于COM组件调用SAP RFC的函数及参数,花费大量时间查阅资料终于知道怎么调用该函数:

SAPHelper.cs


 

private string CompanyCode { get; set; }
private string ProofDate { get; set; }
private string PostDate { get; set; }
private string OutSub { get; set; }
private string InSub { get; set; }
private string Amount { get; set; }
private string Currency { get; set; }
private string Text { get; set; }
private string UserAccount { get; set; }
private bool Flag { get; set; }
public bool MoneyTransfer(string CompanyCode, string ProofDate, string PostDate, string OutSub, string InSub, string Amount, string Currency, string Text, string UserAccount)
{
this.CompanyCode = CompanyCode;
this.ProofDate = ProofDate;
this.PostDate = PostDate;
this.OutSub = OutSub;
this.InSub = InSub;
this.Amount = Amount;
this.Currency = Currency;
this.Text = Text;
this.UserAccount = UserAccount;
Thread s = new Thread(new ThreadStart(Transfer));
s.SetApartmentState(System.Threading.ApartmentState.STA);//Set the run mode 'STA'
s.Start();//Start the thread
s.Join(); //Wait until thread run OK.
return Flag;
}
/// <summary>
/// 公司内部调拨凭证生成接口
/// </summary>
/// <param name="I_BUKRS">公司代码</param>
/// <param name="I_BLDAT">凭证日期</param>
/// <param name="I_BUDAT">过账日期</param>
/// <param name="I_OSAKNR">转出科目</param>
/// <param name="I_ISAKNR">转入科目</param>
/// <param name="I_WRBTR">金额</param>
/// <param name="I_WAERS">货币</param>
/// <param name="I_SGTXT">项目文本</param>
/// <param name="I_USERNAME">操作用户</param>
private void Transfer()
{
Connection conn = GetConnection();
try
{
//登陆
if (conn.Logon(null, true))
{
SAPFunctionsClass functions = new SAPFunctionsClass();
functions.Connection = conn;
//传入Function Name
Function fucntion = (Function)functions.Add("ZFI_FM005");
#region 传入值参数
Parameter pCompanyCode = (Parameter)fucntion.get_Exports("I_BUKRS");
pCompanyCode.Value = CompanyCode;
Parameter pProofDate = (Parameter)fucntion.get_Exports("I_BLDAT");
pProofDate.Value = ProofDate;
Parameter pPostDate = (Parameter)fucntion.get_Exports("I_BUDAT");
pPostDate.Value = PostDate;
Parameter pOutSub = (Parameter)fucntion.get_Exports("I_OSAKNR");
pOutSub.Value = OutSub;
Parameter pInSub = (Parameter)fucntion.get_Exports("I_ISAKNR");
pInSub.Value = InSub;
Parameter pAmount = (Parameter)fucntion.get_Exports("I_WRBTR");
pAmount.Value = Amount;
Parameter pCurrency = (Parameter)fucntion.get_Exports("I_WAERS");
pCurrency.Value = Currency;
Parameter pText = (Parameter)fucntion.get_Exports("I_SGTXT");
pText.Value = Text;
Parameter pUserAccount = (Parameter)fucntion.get_Exports("I_USERNAME");
pUserAccount.Value = UserAccount;
#endregion
//传出参数
Parameter OutPut = (Parameter)fucntion.get_Imports("I_RETURN");
//调用函数
if (fucntion.Call())
{
#region
string s = OutPut.Value.ToString();
//to do
if (s.Contains("错误"))
{
this.Flag = false;
}
else
{
this.Flag = true;
}
#endregion
}
}
//退出登陆
conn.Logoff();
}
catch (COMException ex)
{
conn.Logoff();
Flag= false;
}
}
private Connection GetConnection()
{
SAPLogonControlClass connctl = new SAPLogonControlClass();
connctl.Client = ConfigurationManager.AppSettings["SAPClient"];
connctl.Language = "ZH";
connctl.ApplicationServer = ConfigurationManager.AppSettings["ApplicationServer"];
connctl.SystemNumber = 00;
connctl.User = ConfigurationManager.AppSettings["SAPUser"];
connctl.Password = ConfigurationManager.AppSettings["SAPPassword"];
return (Connection)connctl.NewConnection();
}

调用:


SAPService service = new SAPService();
this.ContinueProcessFlag = service.MoneyTransfer(txtPayCompanySAPCode.Text.Trim(), txtTransferDate.Text.Trim(), txtTransferDate.Text.Trim(), txtPaySAPAccountCode.Text, txtInComeSAPAccountCode.Text, txtPayAmountLow.Text, "CNY", txtTransferReason.Text, WebContext.Current.CurrentEmployee.UserAccount);

编译完后调试,OK。

本地调试OK。

然而发布到IIS上后问题出现了:

发布后调用调试IIS(怎么调试略),发现在if (conn.Logon(null, true))停留,无法登录。

经过研究与查阅大量资料后,基本确定问题是在与IIS在调用组件的权限问题上。根据http://wenku.it168.com/d_001035865.shtml 配置DCOM权限将“启动与激活”和“访问权限”改为自定义并加上EveryOne权限,将标识改为“交互式用户”,IIS应用程序池使用的是隶属于管理员组的域帐号,托管管道模式使用的是集成模式:

然而问题依旧,尝试过将应用程序池域帐号,IUSR组,IIS_WPG组加到“访问权限”和“启动和激活权限”,未果。

期待各位大虾门指点思路。

 
 
分类: ASP.NET
标签: ASP.NETSAPBPMK2

K2 BPM项目 基于COM组件调用SAP RFC 问题的更多相关文章

  1. C# 使用 SAP NCO3.0 调用SAP RFC函数接口

    最近使用C#调用SAP RFC函数,SAP提供了NCO3.0组件. 下载组件安装,之后引用“sapnco.dll”和“sapnco_utils.dll”两个文件. 在程序中 using SAP.Mid ...

  2. .net 调用SAP RFC函数获取数据的两种方式

    方式1:使用客户端自带的组件 安装客户端以后,添加引用:SAPFunctionsOCX(.net 的Com列表里一般找不到,需要引用DLL[一般位于以下路径:Program Files\SAP\Fro ...

  3. 最新.net和Java调用SAP RFC中间件下载

    还记得2012年初我发布的全网络第一个关于.net 连接SAP RFC的NCO3原创博文,用的就是SAP出的最新的.Net Connector 3.0的版本,在那个时候都是普遍用其他蹩脚的方式或Web ...

  4. java 调用SAP RFC函数错误信息

    RFC接口调用SAP如果有异常会通过com.sap.mw.jco.JCO$Exception: 抛出异常 在开发中遇到的异常有如下 用户名密码可能是错误或者用户无权限,确认用户,必要时联系SAP负责人 ...

  5. .net 调用SAP RFC的几种方法

    转自:http://www.cherpservice.com/pub/newsdetail.asp?Newsid=3613 第一种方式采用SAP.net Connector: 最新版本是3.,不开源, ...

  6. 验证外部系统是否成功调用SAP RFC的方法有几种?

  7. K2 BPM介绍(2)

    K2 BPM介绍(2) 上一篇已经讲了一些K2 BPM基本特性,本遍讲K2 BPM大概的组件以及组件关系. K2 BPM组件 K2 BPM分别由以下组件构成: K2产品已经发展很多年,所以它有很多版本 ...

  8. K2 BPM + SAP,实现全方面管理企业

    K2作为专业的BPM.工作流管理平台供应商,面向庞大的SAP用户群体,除了提供产品化的SAP集成工具「K2 connect」产品之外,更拥有一套得到众多客户验证的集成解决方案. 此方案可供SAP用户或 ...

  9. 基于Jetpack组件构建的开源项目-WanLearning

    「WanLearning App」基于 Material Design 风格构建的 玩 Android 客户端,主要是为了适应Kotlin语言开发流程. 主要特点 基于Google官方宣贯的MVVM模 ...

随机推荐

  1. 【百度地图API】多家地图API内存消耗对比测验(带源码)

    原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...

  2. Android 记录的(MediaRecorder)而播放(MediaPlayer)

    经MediaRecorder和MediaPlayer实现声音记录和回放,代码比较简单,直接附着到代码. xml文档面对只有四个button不贴. UI watermark/2/text/aHR0cDo ...

  3. socket在windows下和linux下的区别

    原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h    错误处理:errno.h 2 ...

  4. Asp.Net MVC4 + Oracle + EasyUI + Bootstrap

    Asp.Net MVC4 + Oracle + EasyUI + Bootstrap --操作数据和验证 本文链接:http://www.cnblogs.com/likeli/p/4234238.ht ...

  5. selenium之多线程启动grid分布式测试框架封装(一)

    一.设计思路 在国内市场上,IE内核的浏览器占据了绝大部分的市场份额,那么此次框架封装将进行IE系列的浏览器进行多线程并发执行分布式测试的封装. 运行时主进程与多线程关系如下:

  6. 本学习笔记TCP/IP传输协议

    一个.通过网络发送数据,大致能够分为面向有连接与面向无连接两种类型: 1.面向无连接型包含以太网. IP.UDP等协议. 2. 面向有连接 型包含ATM.帧中继.TCP等 协议. 通过一张图了解一下: ...

  7. SQL Server 性能调优 之运行计划(Execution Plan)调优

    运行计划中的三种 Join 策略 SQL Server 存在三种 Join 策略:Hash Join,Merge Join,Nested Loop Join. Hash Join:用来处理没有排过序/ ...

  8. js实现文字横向滚动

    页面布局      <div id="scroll_div" class="fl">         <div id="scroll ...

  9. 笔试 - 高德软件有限公司python问题 和 答案

    高德软件有限公司python问题 和 答案 本文地址: http://blog.csdn.net/caroline_wendy/article/details/25230835 by Spike 20 ...

  10. Cygwin 是一个用于 Windows 的类 UNIX shell 环境

    cygwin的安装使用   Cygwin 是一个用于 Windows 的类 UNIX shell 环境. 它由两个组件组成:一个 UNIX API 库,它模拟 UNIX 操作系统提供的许多特性:以及 ...