zoukankan      html  css  js  c++  java
  • .NET连接SAP系统专题:C#调用RFC代码(三)

    本文就说明在C#中如何编写代码来调用SAP中的RFC函数获取数据。

    首先需要引用两个NCO3.0的DLL

    DLL下载地址:http://files.cnblogs.com/mengxin523/SAP_DotNetConnector3.zip

     

      1 //程序代码页面引用:
      2 using SAP.Middleware.Connector;
      3 
      4 //代码如下:
      5 namespace SAP_RFC
      6 
      7 {
      8 
      9     public partial class Form1 : Form
     10 
     11     {
     12 
     13         string MATNR = string.Empty;
     14 
     15         public Form1()
     16 
     17         {
     18 
     19             InitializeComponent();
     20 
     21         }
     22 
     23         public void nco()
     24 
     25         {
     26 
     27             IDestinationConfiguration ID = new MyBackendConfig();
     28 
     29             RfcDestinationManager.RegisterDestinationConfiguration(ID);
     30 
     31             RfcDestination prd = RfcDestinationManager.GetDestination("PRD_000");
     32 
     33             RfcDestinationManager.UnregisterDestinationConfiguration(ID);
     34 
     35             nco(prd);
     36 
     37         }
     38 
     39         public void nco(RfcDestination prd)
     40 
     41         {            
     42 
     43             RfcRepository repo = prd.Repository;
     44 
     45             IRfcFunction companyBapi = repo.CreateFunction("ZRFC_MARA_INFO");   //调用函数名
     46 
     47             companyBapi.SetValue("MATNR", MATNR);   //设置Import的参数
     48 
     49             companyBapi.Invoke(prd);   //执行函数
     50 
     51             IRfcTable table = companyBapi.GetTable("IT_MARA");  //获取相应的品号内表
     52 
     53             string MAKTX = companyBapi.GetValue("MAKTX").ToString();  //获取品名
     54 
     55             DataTable dt = new DataTable();  //新建表格
     56 
     57             dt.Columns.Add("品号");  //表格添加一列
     58 
     59             for (int i = 0; i < table.RowCount; i++)
     60 
     61             {
     62 
     63                 table.CurrentIndex = i;  //当前内表的索引行
     64 
     65                 DataRow dr = dt.NewRow();
     66 
     67                 dr[0] = table.GetString("MATNR");  //获取表格的某行某列的值
     68 
     69                 dt.Rows.Add(dr);  //填充该表格的值
     70 
     71             }
     72 
     73             if (MATNR == "")
     74 
     75             {
     76 
     77                 for (int i = 0; i < dt.Rows.Count; i++)
     78 
     79                 {
     80 
     81                     this.comboBox1.Items.Add(dt.Rows[i][0].ToString());   //填充下拉框
     82 
     83                 }
     84 
     85             }
     86 
     87             this.label1.Text = MAKTX;   //显示品名
     88 
     89             prd = null;
     90 
     91             repo = null;
     92 
     93         }
     94 
     95  
     96 
     97         //登陆SAP前的准备工作
     98 
     99         public class MyBackendConfig : IDestinationConfiguration
    100 
    101         {
    102 
    103             public RfcConfigParameters GetParameters(String destinationName)
    104 
    105             {
    106 
    107                 if ("PRD_000".Equals(destinationName))
    108 
    109                 {
    110 
    111                     RfcConfigParameters parms = new RfcConfigParameters();
    112 
    113                     parms.Add(RfcConfigParameters.AppServerHost, "192.168.1.3");   //SAP主机IP
    114 
    115                     parms.Add(RfcConfigParameters.SystemNumber, "00");  //SAP实例
    116 
    117                     parms.Add(RfcConfigParameters.User, "MENGXIN");  //用户名
    118 
    119                     parms.Add(RfcConfigParameters.Password, "5239898");  //密码
    120 
    121                     parms.Add(RfcConfigParameters.Client, "888");  // Client
    122 
    123                     parms.Add(RfcConfigParameters.Language, "ZH");  //登陆语言
    124 
    125                     parms.Add(RfcConfigParameters.PoolSize, "5");
    126 
    127                     parms.Add(RfcConfigParameters.MaxPoolSize, "10");
    128 
    129                     parms.Add(RfcConfigParameters.IdleTimeout, "60");
    130 
    131                     return parms;
    132 
    133                 }
    134 
    135                 else return null;
    136 
    137             }
    138 
    139             public bool ChangeEventsSupported()
    140 
    141             {
    142 
    143                 return false;
    144 
    145             }
    146 
    147             public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
    148 
    149         }
    150 
    151  
    152 
    153         private void Form1_Load(object sender, EventArgs e)
    154 
    155         {
    156 
    157             comboBox1.Items.Clear();
    158 
    159             nco();
    160 
    161             comboBox1.SelectedIndex = 1;
    162 
    163         }
    164 
    165         //当下拉框索引变化的时候传递品号进去查询出品名出来
    166 
    167         private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    168 
    169         {
    170 
    171             MATNR = comboBox1.Text.ToString();
    172 
    173             nco();
    174 
    175         }
    176 
    177     }
    178 
    179 }

    我想这个C#代码很简单,我就不多做详细说明了。结果如下:

    SAP中品号信息如下:

    由此可见数据完全OK,调用成功。

    程序在第一次载入的时候有点慢,在链接SAP和登陆。后续在下拉框变化的时候就立马显示出品名出来了,丝毫没有任何停顿。第二次链接SAP的时候大概是不必在登陆了,SAP系统中已有登陆信息,运行T-CODE:SM04

    红色框中这两个即是我们的RFC调用所留下的登录会话。一旦我们的C#程序退出之后,这两个RFC也就退出了。

    如果我们的C#程序是ASP.NET的话,页面关闭之后这个RFC登录信息都还在的。除非IIS关闭,否则只有等到SAP系统超时退出这两个登陆会话了。

    原文:http://blog.csdn.net/mengxin523/article/details/6710091

  • 相关阅读:
    npm tip: go to the package's home page
    centos7在Evolution中配置163邮箱,被阻止收件解决方法
    emacs-显示行号以及跳转到指定行
    2020年学习目标之一——emacs
    学习前端的时候,突然想起了Sharepoint母版页里的占位符,算知识的融会不?
    问题记录--jekyll serve 启动的时候如何指定80端口
    为什么总是无法访问VMware内的web服务?
    python开发目录合并小工具 PathMerge
    python计算文件的md5值
    python+selenium 简单尝试
  • 原文地址:https://www.cnblogs.com/dekevin/p/3253649.html
Copyright © 2011-2022 走看看