设为首页 收藏本站
查看: 1219|回复: 0

[经验分享] SAP connector3.0相关的东西

[复制链接]
发表于 2015-9-18 09:22:02 | 显示全部楼层 |阅读模式
  SAP connector3.0支持的VS版本和使用前必须安装的东西:
  完全兼容VS2005、VS2008、VS2010以及.NET2.0、3.0、3.5、4.0还有分32位和64位的两大版本。由于它所需要的两个文件sapnco.dll和sapnco_utils.dll这两个文件是通过VC++2005编译的,所以在目标电脑里必须要安装这个运行库方可正常运行(系统若有自带则可不用再安装),运行库大小2.6M,安装不到一分钟。
  何谓RFC:

  何谓RFC,就是一个Function,可以被非SAP系统调用,比如VB,C#,Java等。如果我们在RFC中INCLUDE了相关的业务逻辑,那么我们就可以完全操控SAP中的业务数据了。就像在TTE里,有一只程序,前端是在OA开发,设计了相关的客户提领库存,然后还要到SAP系统中去执行程序扣减相应的库存,这样是挺费劲的,如果能够在OA中放一个按钮,点击这个按钮就自动执行了这个程序,方便省事。而这一切,可以利用C#调用RFC来实现。
  要实现整个过程,则必须要现在SAP中建立好相应的RFC函数,然后用VS建立好相应的程序,写代码调用就可以了。两者关联就是使用NCO3.0这个东西了。
  我们假定要实现这样的一个功能:

  • 运行在SAP系统外的一个程序窗体,上面有一个下拉框和文本框
  • 程序运行之后自动载入SAP中某个Client的物料号至该下拉框
  • 用户点击了这个下拉框,则旁边的文本框就现实该品号的物料的名称

  1.在SAP端创建RFC函数

  • 登陆SAP
  • 运行SE37:
DSC0000.png


  • 创建函数组
DSC0001.png DSC0002.png
  


  • 点击保存;之后回到SE37,输入我们要调用的RFC函数名,比如:ZRFC_GetClient 然后点击新建(右一按钮):

  2.在VS端调用SAP创建的RFC函数

  • 首先需要引用两个NCO3.0的DLL:sapnco.dll 和sapnco_utils.dll
  • 然后在程序代码页面引用: using SAP.Middleware.Connector;
  • 定义一个设置SAP connect 连接串的类
  public class SAPConn : IDestinationConfiguration
    {
        #region IDestinationConfiguration Members
  public RfcConfigParameters GetParameters(String sapConnStr)
        {
            //String destinationName
  /*
  <connectionStrings>
   <!--<add name="SapConnectionString" connectionString="CLIENT=800 USER=Y_RFC_CON_01 PASSWD=Aa123456. ASHOST=10.138.250.237 SYSNR=0"/>-->
   <add name="SapConnectionString" connectionString="Client=280;UserName=Y_RFC_CON_01;Password=Aa123456.;AppServerHost=10.138.250.142;Language=EN;SystemNumber=00"/>
</connectionStrings>

  */
            //ConfigurationManager.ConnectionStrings[destinationName].ConnectionString.ToString()
            if (!object.Equals(sapConnStr, null))
            {
                //retrieve parameters in connection string
                string[] paramsstr = sapConnStr.Split(';');
               
                RfcConfigParameters parms = new RfcConfigParameters();
                parms.Add(RfcConfigParameters.Name, "SapConnectionString");
                foreach (string str in paramsstr)
                {
                    string[] strpar = str.Split('=');
  switch (strpar[0])
                    {
                        case "AppServerHost": parms.Add(RfcConfigParameters.AppServerHost, strpar[1]); break;
                        case "Client": parms.Add(RfcConfigParameters.Client, strpar[1]); break;
                        case "SystemNumber": parms.Add(RfcConfigParameters.SystemNumber, strpar[1]); break;
                        case "Language": parms.Add(RfcConfigParameters.Language, strpar[1]); break;
                        case "UserName": parms.Add(RfcConfigParameters.User, strpar[1]); break;
                        case "Password": parms.Add(RfcConfigParameters.Password, strpar[1]); break;
                    }
                }
  return parms;
            }
            else return null;
        }
  public bool ChangeEventsSupported() { return false; }
        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
  #endregion
    }


  • /获取SAP 连接信息
    destination1 = RfcDestinationManager.GetDestination(new SAPConn().GetParameters(SapConnectionString));
    RfcRepository repo = destination1.Repository;
  • //声明调用的RFC 方法
    rfcFunc = repo.CreateFunction("RFC_READ_TABLE");
  • //RFC 输入参数
      companyBapi.Invoke(prd); //执行函数
      IRfcTable table = companyBapi.GetTable("IT_MARA"); //获取相应的品号内表
  • //得到输出信息
  string MAKTX = companyBapi.GetValue("MAKTX").ToString(); //获取品名

  • 对异常的处理
      public void nco(RfcDestination prd)
      {
      string type = string.Empty;
      RfcRepository repo = prd.Repository;
      IRfcFunction companyBapi = repo.CreateFunction("ZRFC_MARA_INFO"); //指定RFC名称
      try
      {
      companyBapi.SetValue("NUM1", textBox1.Text.Trim()); //输入参数复制
      companyBapi.SetValue("NUM2", textBox2.Text.Trim()); //输入参数复制
      companyBapi.Invoke(prd); //开始调用执行
      textBox3.Text = companyBapi.GetValue("NUM3").ToString(); //获取返回结果
      }
      catch (RfcAbapException ex) //此Exception专门用于获取用户自定义的异常信息!!!!
      {
      // companyBapi.Metadata.GetAbapException(ex.Key).Documentation 获取对应的异常的说明文字
      MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
      catch (RfcTypeConversionException ex) //此Exception专门用于获取变量类型转换的异常!!!!
      {
      MessageBox.Show("您输入的不是数值", "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
      }
      catch (RfcAbapRuntimeException ex) //此Exception专门用于获取RFC执行过程中的运行时异常!!!!
      {  
      MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
      }
      catch (RfcBaseException ex) //此Exception是总Exception类,可以获取所有的异常,如果有多个Catch,则不可以放第一位!!!!
      {
      MessageBox.Show("其他所有错误", "SAP RFC返回信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
      }
      prd = null;
      repo = null;   }
  3.既然BAPI是一些特殊的RFC,封装了业务逻辑,使得将业务都变成一个一个对象,使用者只需要传入传出参数就可以了。
  4.sapnco.dll在ASP.NET中载入失败的解决方法


  • 当所有一切代码准备就绪之后,如果是ASP.NET那就是要发布网站到服务器了。如果服务器上的系统是WIN2003,那很不幸,系统会提示这样的&#8220;红脸&#8221;过来:
    DSC0003.jpg
      意思是说sapnco_utils.dll和sapnco.dll这两个文件不能载入。
      Could not load file or assembly "sapnco_utils,Version=3.0.0.42,...  
      网上查找了方法也不尽然,各说纷纭。但是在WIN2008下的IIS7跟WinXP下的IIS5.1都可以完全正常,但是这个WIN2003就不行。
      后来在对这两个DLL进行分析的时候发现它们是用VC++2005开发的,想到WIN2003系统可能没有必要的运行库。于是在工作站测试的时候安装了VC++2005 32bit版,然后刷新一切就正常了!
      解决方法:安装相应vc++2005运行库即可!(实践证明:VC++2008不行!)   如果还不行,需要将这个连个DLL放到GAC里面去

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-115199-1-1.html 上篇帖子: sap中Excel的模版上传和下载 下篇帖子: sap Program DEMO 介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表