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


    问题前景:

      环境:Win 2008 R2 64bit

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

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

    SAPHelper.cs

      1 private string CompanyCode { get; set; }
      2         private string ProofDate { get; set; }
      3         private string PostDate { get; set; }
      4         private string OutSub { get; set; }
      5         private string InSub { get; set; }
      6         private string Amount { get; set; }
      7         private string Currency { get; set; }
      8         private string Text { get; set; }
      9         private string UserAccount { get; set; }
     10         private bool Flag { get; set; }
     11 
     12         public bool MoneyTransfer(string CompanyCode, string ProofDate, string PostDate, string OutSub, string InSub, string Amount, string Currency, string Text, string UserAccount)
     13         {
     14             this.CompanyCode = CompanyCode;
     15             this.ProofDate = ProofDate;
     16             this.PostDate = PostDate;
     17             this.OutSub = OutSub;
     18             this.InSub = InSub;
     19             this.Amount = Amount;
     20             this.Currency = Currency;
     21             this.Text = Text;
     22             this.UserAccount = UserAccount;
     23             Thread s = new Thread(new ThreadStart(Transfer));
     24             s.SetApartmentState(System.Threading.ApartmentState.STA);//Set the run mode 'STA'
     25             s.Start();//Start the thread
     26             s.Join(); //Wait until thread run OK.
     27             return Flag;
     28         }
     29         /// <summary>
     30         /// 公司内部调拨凭证生成接口
     31         /// </summary>
     32         /// <param name="I_BUKRS">公司代码</param>
     33         /// <param name="I_BLDAT">凭证日期</param>
     34         /// <param name="I_BUDAT">过账日期</param>
     35         /// <param name="I_OSAKNR">转出科目</param>
     36         /// <param name="I_ISAKNR">转入科目</param>
     37         /// <param name="I_WRBTR">金额</param>
     38         /// <param name="I_WAERS">货币</param>
     39         /// <param name="I_SGTXT">项目文本</param>
     40         /// <param name="I_USERNAME">操作用户</param>
     41         private void Transfer()
     42         {
     43             Connection conn = GetConnection();
     44             try
     45             {
     46                 //登陆
     47                 if (conn.Logon(null, true))
     48                 {
     49                     SAPFunctionsClass functions = new SAPFunctionsClass();
     50                     functions.Connection = conn;
     51                     //传入Function Name
     52                     Function fucntion = (Function)functions.Add("ZFI_FM005");
     53                     #region 传入值参数
     54                     Parameter pCompanyCode = (Parameter)fucntion.get_Exports("I_BUKRS");
     55                     pCompanyCode.Value = CompanyCode;
     56                     Parameter pProofDate = (Parameter)fucntion.get_Exports("I_BLDAT");
     57                     pProofDate.Value = ProofDate;
     58                     Parameter pPostDate = (Parameter)fucntion.get_Exports("I_BUDAT");
     59                     pPostDate.Value = PostDate;
     60                     Parameter pOutSub = (Parameter)fucntion.get_Exports("I_OSAKNR");
     61                     pOutSub.Value = OutSub;
     62                     Parameter pInSub = (Parameter)fucntion.get_Exports("I_ISAKNR");
     63                     pInSub.Value = InSub;
     64                     Parameter pAmount = (Parameter)fucntion.get_Exports("I_WRBTR");
     65                     pAmount.Value = Amount;
     66                     Parameter pCurrency = (Parameter)fucntion.get_Exports("I_WAERS");
     67                     pCurrency.Value = Currency;
     68                     Parameter pText = (Parameter)fucntion.get_Exports("I_SGTXT");
     69                     pText.Value = Text;
     70                     Parameter pUserAccount = (Parameter)fucntion.get_Exports("I_USERNAME");
     71                     pUserAccount.Value = UserAccount;
     72                     #endregion
     73                     //传出参数
     74                     Parameter OutPut = (Parameter)fucntion.get_Imports("I_RETURN");
     75                     //调用函数
     76                     if (fucntion.Call())
     77                     {
     78                         #region 
     79                         string s = OutPut.Value.ToString();
     80                         //to do 
     81                         if (s.Contains("错误"))
     82                         {
     83                             this.Flag = false;
     84                         }
     85                         else
     86                         {
     87                             this.Flag = true;
     88                         }
     89                         #endregion
     90                     }
     91                 }
     92                 //退出登陆
     93                 conn.Logoff();
     94             }
     95             catch (COMException ex)
     96             {
     97                 conn.Logoff();
     98                 Flag= false;
     99             }
    100         }
    101 
    102         private Connection GetConnection()
    103         {
    104             SAPLogonControlClass connctl = new SAPLogonControlClass();
    105 
    106             connctl.Client = ConfigurationManager.AppSettings["SAPClient"];
    107             connctl.Language = "ZH";
    108             connctl.ApplicationServer = ConfigurationManager.AppSettings["ApplicationServer"];
    109             connctl.SystemNumber = 00;
    110             connctl.User = ConfigurationManager.AppSettings["SAPUser"];
    111             connctl.Password = ConfigurationManager.AppSettings["SAPPassword"];
    112 
    113             return (Connection)connctl.NewConnection();
    114         }
    View Code

    调用:

    1 SAPService service = new SAPService();
    2                 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);
    View Code

    编译完后调试,OK。

    本地调试OK。

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

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

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

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

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

  • 相关阅读:
    [BJWC2011]最小三角形
    用于监视Linux上的内存使用情况的Bash脚本
    使用ps、top、ps_mem命令找出Linux中的最大内存消耗过程
    无法开机 如果您的手机黑屏无法开机,可以按照以下方式操作尝试: 如果是,使用原装充电器或使用弱电流方式充电(例如使用电脑USB接口充电)充电15-30分钟后尝试重新开机;注意:电量过低引起的无法开机,刚插入充电器时可能不亮屏但呼吸灯闪烁状态。
    Centos7 cache/buff过高处理方法
    上,打开SSH服务的配置文件:/etc/ssh/sshd_config 加上如下两行: ClientAliveInterval 120 ClientAliveCountMax 720 第一行,表示每隔120秒向客户端
    inux软件安装管理之——dpkg与apt-*详解
    在虚拟机中安装 Ubuntu
    一看就懂的 安装完ubuntu 18.04后要做的事情和使用教程
    一、apt的简介
  • 原文地址:https://www.cnblogs.com/zhangxiaohui/p/3255249.html
Copyright © 2020-2023  润新知