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

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



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#代码很简单,我就不多做详细说明了。结果如下:


.NET连接SAP系统专题:C#调用RFC代码(三)_i++

SAP中品号信息如下:

.NET连接SAP系统专题:C#调用RFC代码(三)_ide_02

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

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

.NET连接SAP系统专题:C#调用RFC代码(三)_javascript_03

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

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