开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2013.04.12
智遥工作流软件中自带有一个连接SAP RFC的类,调用起来非常方便,以下是源代码:
注:.Net 要连接SAP,需要网上下载一个 NCO3.0
然后引用命名空间 using SAP.Middleware.Connector;
public class SapRFCHelper
{ /// <summary> /// 获取登录SAP参数 /// </summary> /// <returns></returns> 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; } /// <summary> /// 调用RFC,返回一个表;注:RFC必须返回一个内表,无论是否有数据,否则出问题 /// </summary> /// <param name="param">需要传入的字符串参数 例:{"P1|value1","P2|value2"}</param> /// <param name="RfcName">调用的Rfc名称</param> /// <param name="IT_tableName">Rfc执行后返回的内表名称</param> /// <returns></returns> 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; } /// <summary> /// 直接调用RFC,不返回任何东西 /// </summary> /// <param name="param">需要传入的字符串参数 例:{"P1|value1","P2|value2"}</param> /// <param name="RfcName">Rfc名称</param> 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); //执行函数 } /// <summary> /// 直接调用RFC,返回字符串 /// </summary> /// <param name="param"></param> /// <param name="RfcName"></param> /// <param name="OutName">RFC中返回的参数名称,没有就""</param> 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后返回的内表 } /// <summary> /// 执行RFC,返回一个内表 /// </summary> /// <param name="conn"></param> /// <param name="param"></param> /// <param name="RfcName"></param> /// <param name="IT_tableName"></param> /// <returns></returns> 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; } /// <summary> /// 将内表转换成DataTable /// </summary> /// <param name="rfcTable">内表名称</param> /// <returns>返回一个DataTable</returns> 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;
}
微信登录中...请勿关闭此页面