.NET连接SAP系统专题:C#调用RFC代码(三)
本文就说明在C#中如何编写代码来调用SAP中的RFC函数获取数据。
首先需要引用两个NCO3.0的DLL
DLL下载地址:https://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系统超时退出这两个登陆会话了。