客户端开始
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做单,表情如下