智遥工作流软件中自带有一个连接SAP RFC的类,调用起来非常方便,以下是源代码:
注:.Net 要连接SAP,需要网上下载一个 NCO3.0
然后引用命名空间 using SAP.Middleware.Connector;
public class SapRFCHelper
{
///
/// 获取登录SAP参数
///
///
public RfcConfigParameters GetRfcLoginParameters(string conn)
{
//1.获取连接参数
Z_SAP sap = new Z_SAP();
sap.GetModel(conn);
RfcConfigParameters parameters = new RfcConfigParameters();
parameters[RfcConfigParameters.Name] = sap.sap_system;
parameters[RfcConfigParameters.User] = sap.sap_user;
parameters[RfcConfigParameters.Password] = sap.sap_psd;
parameters[RfcConfigParameters.Client] = sap.sap_client;
parameters[RfcConfigParameters.Language] = sap.sap_language;
parameters[RfcConfigParameters.AppServerHost] = sap.sap_server;
parameters[RfcConfigParameters.SystemNumber] = sap.sap_systemnumber;
parameters[RfcConfigParameters.IdleTimeout] = "6000";
return parameters;
}
///
/// 调用RFC,返回一个表;注:RFC必须返回一个内表,无论是否有数据,否则出问题
///
///
需要传入的字符串参数 例:{"P1|value1","P2|value2"}
///
调用的Rfc名称
///
Rfc执行后返回的内表名称
///
public DataTable GetSapData(string conn,string[] param, string RfcName, string IT_tableName)
{
//1.登录SAP
RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
RfcDestination rd = RfcDestinationManager.GetDestination(parameters);
RfcRepository repo = rd.Repository;
IRfcFunction f = repo.CreateFunction(RfcName); //调用函数名
foreach (string value in param)
{
string[] keyvalue = value.Split('|');
f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
}
f.Invoke(rd); //执行函数
IRfcTable itb = f.GetTable(IT_tableName); //获取执行RFC后返回的内表
DataTable dt = new DataTable();
//建立表结构
for (int col = 0; col < itb.ElementCount; col++)
{
RfcElementMetadata rfcCol = itb.GetElementMetadata(col);
string columnName = rfcCol.Name;
dt.Columns.Add(columnName);
}
for (int rx = 0; rx < itb.RowCount; rx++)
{
object[] dr = new object[itb.ElementCount];
for (int cx = 0; cx < dt.Columns.Count; cx++)
{
dr[cx] = itb[rx][dt.Columns[cx].ColumnName].GetValue();
}
dt.Rows.Add(dr);
}
return dt;
}
///
/// 直接调用RFC,不返回任何东西
///
///
需要传入的字符串参数 例:{"P1|value1","P2|value2"}
///
Rfc名称
public void ExecuteRFC(string conn,string[] param, string RfcName)
{
//1.登录SAP
RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
RfcDestination rd = RfcDestinationManager.GetDestination(parameters);
RfcRepository repo = rd.Repository;
IRfcFunction f = repo.CreateFunction(RfcName); //调用函数名
foreach (string value in param)
{
string[] keyvalue = value.Split('|');
f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
}
f.Invoke(rd); //执行函数
}
///
/// 直接调用RFC,返回字符串
///
///
///
///
RFC中返回的参数名称,没有就""
public string GetSAPString(string conn,string[] param, string RfcName, string OutName)
{
//1.登录SAP
RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
RfcDestination rd = RfcDestinationManager.GetDestination(parameters);
RfcRepository repo = rd.Repository;
IRfcFunction f = repo.CreateFunction(RfcName); //调用函数名
foreach (string value in param)
{
string[] keyvalue = value.Split('|');
f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
}
f.Invoke(rd); //执行函数
return f.GetString("").ToString(); //获取执行RFC后返回的内表
}
///
/// 执行RFC,返回一个内表
///
///
///
///
///
///
public IRfcTable GetSAPRfcTable(string conn, string[] param, string RfcName, string IT_tableName)
{
//1.登录SAP
RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
RfcDestination rd = RfcDestinationManager.GetDestination(parameters);
RfcRepository repo = rd.Repository;
IRfcFunction f = repo.CreateFunction(RfcName); //调用函数名
foreach (string value in param)
{
string[] keyvalue = value.Split('|');
f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
}
f.Invoke(rd); //执行函数
IRfcTable itb = f.GetTable(IT_tableName); //获取执行RFC后返回的内表
return itb;
}
///
/// 将内表转换成DataTable
///
///
内表名称
///
返回一个DataTable
public DataTable ConvertToTable(IRfcTable rfcTable)
{
DataTable dt = new DataTable();
//建立表结构
for (int col = 0; col < rfcTable.ElementCount; col++)
{
RfcElementMetadata rfcCol = rfcTable.GetElementMetadata(col);
string columnName = rfcCol.Name;
dt.Columns.Add(columnName);
}
for (int rx = 0; rx < rfcTable.RowCount; rx++)
{
object[] dr = new object[rfcTable.ElementCount];
for (int cx = 0; cx < dt.Columns.Count; cx++)
{
dr[cx] = rfcTable[rx][dt.Columns[cx].ColumnName].GetValue();
}
dt.Rows.Add(dr);
}
return dt;
}
}