客户端开始
private void button1_Click(object sender, EventArgs e) { Execute(); } public void Execute() { IDestinationConfiguration ID = new MyBackendConfig(); RfcDestinationManager.RegisterDestinationConfiguration(ID); //登录 RfcDestination prd = RfcDestinationManager.GetDestination("PA0_000"); Execute(prd); //退出登录 RfcDestinationManager.UnregisterDestinationConfiguration(ID); } //登陆SAP前的准备工作 public class MyBackendConfig : IDestinationConfiguration { public RfcConfigParameters GetParameters(String destinationName) { if ("PA0_000".Equals(destinationName)) { RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.AppServerHost, "192.168.2.165"); //SAP主机IP parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例 parms.Add(RfcConfigParameters.User, "SAP*"); //用户名 parms.Add(RfcConfigParameters.Password, "123"); //密码 parms.Add(RfcConfigParameters.Client, "000"); // Client parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言 parms.Add(RfcConfigParameters.PoolSize, "5"); parms.Add(RfcConfigParameters.MaxPoolSize, "10"); parms.Add(RfcConfigParameters.IdleTimeout, "60"); return parms; } else return null; } public bool ChangeEventsSupported() { return false; } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; }
分析:IDestinationConfiguration 字面意 我的指定设置 ,实例的一个类MyBackendConfig ,该类继承IDestinationConfiguration,说明该类用来配置或重写标准配置。
RfcDestinationManager.RegisterDestinationConfiguration(ID);保存配置。
//登录
RfcDestination prd = RfcDestinationManager.GetDestination("PA0_000");
走的是RfcDestinationManager里的方法,并传递参数PA0_000,跟踪代码得知执行的是 public RfcConfigParameters GetParameters(String destinationName)方法,及自定义配置的方法。
其中:RfcConfigParameters.SystemNumber对应的是SAP中系统编号,在登录窗口点击属性
RfcConfigParameters.Client为集团编号
用户名密码一定要大写。
剩下的就不用管了。连不上的话会有各种提示的。
核心方法读取录入数据
public void Execute(RfcDestination prd) { RfcRepository SapRfcRepository = prd.Repository; IRfcFunction myfun = SapRfcRepository.CreateFunction("ZORDER_RFC"); IRfcStructure import = null; IRfcTable table = myfun.GetTable("IN_ORDER"); for (int i = 0; i < 3; i++) { import = SapRfcRepository.GetStructureMetadata("ZORDERTEST").CreateStructure(); import.SetValue("ORDERID", i); import.SetValue("ORDERCODE", DateTime.Now.ToString("yyyyMMdd")); import.SetValue("ORDERTIME", DateTime.Now); import.SetValue("ORDERUSER", "小李"+i); table.Insert(import); } myfun.Invoke(prd); string RETURNStr = myfun.GetString("R_SUBRC"); MessageBox.Show(RETURNStr); string[] columns = new string[]{ "ORDERID", "ORDERCODE", "ORDERTIME", "ORDERUSER" }; DataTable dt = new DataTable(); foreach (string clmn in columns) { dt.Columns.Add(clmn); } table = myfun.GetTable("IN_ORDER"); for (int i = 0; i < table.RowCount; i++) { DataRow dr = dt.NewRow(); foreach (string clmn in columns) { dr[clmn] = table[i].GetString(clmn); } dt.Rows.Add(dr); } this.dataGridView1.DataSource = dt; }
分析SapRfcRepository.CreateFunction("ZORDER_RFC");
传入函数名称。
myfun.GetTable("IN_ORDER");,是gettable,传的是参数名。
SapRfcRepository.GetStructureMetadata("ZORDERTEST").CreateStructure();这传的是表名,
myfun.GetString("R_SUBRC");接收返回的参数,应该是‘OK’,同样是参数名
dr[clmn] = table[i].GetString(clmn);table是接口自定义的类型,跟踪看下结构,像个json。
到星期一接口调通,还得学习SAP做单,表情如下