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

时间:2021-10-29 04:59:11

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

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

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

 //程序代码页面引用:
using SAP.Middleware.Connector; //代码如下:
namespace SAP_RFC { public partial class Form1 : Form { string MATNR = string.Empty; public Form1() { InitializeComponent(); } public void nco() { IDestinationConfiguration ID = new MyBackendConfig(); RfcDestinationManager.RegisterDestinationConfiguration(ID); RfcDestination prd = RfcDestinationManager.GetDestination("PRD_000"); RfcDestinationManager.UnregisterDestinationConfiguration(ID); nco(prd); } public void nco(RfcDestination prd) { RfcRepository repo = prd.Repository; IRfcFunction companyBapi = repo.CreateFunction("ZRFC_MARA_INFO"); //调用函数名 companyBapi.SetValue("MATNR", MATNR); //设置Import的参数 companyBapi.Invoke(prd); //执行函数 IRfcTable table = companyBapi.GetTable("IT_MARA"); //获取相应的品号内表 string MAKTX = companyBapi.GetValue("MAKTX").ToString(); //获取品名 DataTable dt = new DataTable(); //新建表格 dt.Columns.Add("品号"); //表格添加一列 for (int i = ; i < table.RowCount; i++) { table.CurrentIndex = i; //当前内表的索引行 DataRow dr = dt.NewRow(); dr[] = table.GetString("MATNR"); //获取表格的某行某列的值 dt.Rows.Add(dr); //填充该表格的值 } if (MATNR == "") { for (int i = ; i < dt.Rows.Count; i++) { this.comboBox1.Items.Add(dt.Rows[i][].ToString()); //填充下拉框 } } this.label1.Text = MAKTX; //显示品名 prd = null; repo = null; } //登陆SAP前的准备工作 public class MyBackendConfig : IDestinationConfiguration { public RfcConfigParameters GetParameters(String destinationName) { if ("PRD_000".Equals(destinationName)) { RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.AppServerHost, "192.168.1.3"); //SAP主机IP parms.Add(RfcConfigParameters.SystemNumber, ""); //SAP实例 parms.Add(RfcConfigParameters.User, "MENGXIN"); //用户名 parms.Add(RfcConfigParameters.Password, ""); //密码 parms.Add(RfcConfigParameters.Client, ""); // Client parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言 parms.Add(RfcConfigParameters.PoolSize, ""); parms.Add(RfcConfigParameters.MaxPoolSize, ""); parms.Add(RfcConfigParameters.IdleTimeout, ""); return parms; } else return null; } public bool ChangeEventsSupported() { return false; } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; } private void Form1_Load(object sender, EventArgs e) { comboBox1.Items.Clear(); nco(); comboBox1.SelectedIndex = ; } //当下拉框索引变化的时候传递品号进去查询出品名出来 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { MATNR = comboBox1.Text.ToString(); nco(); } } }

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

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

SAP中品号信息如下:

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

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

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

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

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

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

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