C#调用SAP接口的方法,并返回数据
需要引入以下两个dll来访问SAP
以下是调用SAP的例子:
以下是SAP的工具类:
using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Windows.Forms;
namespace WLCGSystem.Util
{
public class SapCon
{
//登陆SAP前的准备工作
public class MyBackendConfig : IDestinationConfiguration
{
public RfcConfigParameters GetParameters(String sapid)
{
int client = int.Parse(sapid);
if (client >= 300 && client < 700)
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "10.0.0.20"); //SAP主机IP
parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例
parms.Add(RfcConfigParameters.User, "sap*"); //用户名
parms.Add(RfcConfigParameters.Password, "2015zhidu"); //密码
//parms.Add(RfcConfigParameters.User, "itman06"); //用户名
//parms.Add(RfcConfigParameters.Password, "654321"); //密码
parms.Add(RfcConfigParameters.Client, sapid); // Client
parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言
parms.Add(RfcConfigParameters.PoolSize, "5");
parms.Add(RfcConfigParameters.MaxPoolSize, "10");
parms.Add(RfcConfigParameters.IdleTimeout, "60");
return parms;
}
if (client >= 700 && client < 800)
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "10.0.0.20"); //SAP主机IP
parms.Add(RfcConfigParameters.SystemNumber, "01"); //SAP实例
parms.Add(RfcConfigParameters.User, "ITMAN00");
parms.Add(RfcConfigParameters.Password, "2013itbsap");
//parms.Add(RfcConfigParameters.User, "sap*"); //用户名
//parms.Add(RfcConfigParameters.Password, "2015zhidu"); //密码
parms.Add(RfcConfigParameters.Client, sapid); // Client
parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言
parms.Add(RfcConfigParameters.PoolSize, "5");
parms.Add(RfcConfigParameters.MaxPoolSize, "10");
parms.Add(RfcConfigParameters.IdleTimeout, "60");
return parms;
}
if (client == 800)
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "10.0.0.24"); //SAP主机IP
parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例
parms.Add(RfcConfigParameters.User, "sap*"); //用户名
parms.Add(RfcConfigParameters.Password, "2015zhidu"); //密码
//parms.Add(RfcConfigParameters.User, "CWZX00"); //用户名
//parms.Add(RfcConfigParameters.Password, "cwzx00"); //密码
parms.Add(RfcConfigParameters.Client, sapid); // 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;
}
//Dictionary<string, string> RfcParIn是传入RFC的参数名及值
//RfcOutTableFields是RFC传出TABLE的列名数组
//sapid 是800,300,700等
public static DataTable GetDT(string sapid, string rfc, string rfctable, Dictionary<string, string> RfcParIn, string[] RfcOutTableFields)
{
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
DataTable dt = new DataTable();
for (int i = 0; i < RfcOutTableFields.Length; i++)
{
dt.Columns.Add(RfcOutTableFields[i]); //表格添加一列
}
foreach (KeyValuePair<string, string> kvp in RfcParIn)
{
RfcFun.SetValue(kvp.Key, kvp.Value);
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable(rfctable); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt.NewRow();
for (int a = 0; a < RfcOutTableFields.Length; a++)
{
dr[RfcOutTableFields[a]] = table.CurrentRow.GetString(RfcOutTableFields[a]).ToString();
}
dt.Rows.Add(dr);
}
}
prd = null;
repo = null;
return dt;
}
catch (Exception ex)
{
MessageBox.Show("读取SAP数据失败\n" + ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw ex;
}
}
//Dictionary<string, string> RfcParIn是传入RFC的参数名及值
//RfcOutTableFields是RFC传出TABLE的列名数组
//sapid 是800,300,700等
public static DataTable GetDT(string sapid, string rfc, string rfctable, DataTable RfcParIn, string[] RfcOutTableFields)
{
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
DataTable dt = new DataTable();
for (int i = 0; i < RfcOutTableFields.Length; i++)
{
dt.Columns.Add(RfcOutTableFields[i]); //表格添加一列
}
IRfcTable rc = RfcFun.GetTable(RfcParIn.TableName);
foreach (DataRow row in RfcParIn.Rows)
{
rc.Insert();
for (int i = 0; i < RfcParIn.Columns.Count; i++)
{
rc.CurrentRow.SetValue(RfcParIn.Columns[i].ColumnName, row[i].ToString());
}
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable(rfctable); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt.NewRow();
for (int a = 0; a < RfcOutTableFields.Length; a++)
{
dr[RfcOutTableFields[a]] = table.CurrentRow.GetString(RfcOutTableFields[a]).ToString();
}
dt.Rows.Add(dr);
}
}
prd = null;
repo = null;
return dt;
}
catch (Exception ex)
{
MessageBox.Show("读取SAP数据失败\n" + ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw ex;
}
}
public static DataSet GetDS(string sapid, string rfc, List<string> rfcTables, Dictionary<string, string> RfcParIn, List<string[]> RfcOutTableFields)
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
foreach (KeyValuePair<string, string> kvp in RfcParIn)
{
RfcFun.SetValue(kvp.Key, kvp.Value); //设置Import的参数
}
RfcFun.Invoke(prd); //执行函数
DataSet ds = new DataSet();
if (rfcTables.Count == RfcOutTableFields.Count)
{
for (int i = 0; i < rfcTables.Count; i++)
{
ds.Tables.Add(GetDT(RfcFun, rfcTables[i], RfcOutTableFields[i]));
}
}
return ds;
}
public static DataTable GetDT(IRfcFunction RfcFun, string rfctable, string[] RfcOutTableFields)
{
IRfcTable table = RfcFun.GetTable(rfctable); //获取相应的品号内表
DataTable dt = new DataTable();
foreach (string s in RfcOutTableFields)
{
dt.Columns.Add(s, typeof(string));
}
for (int i = 0; i < table.RowCount; i++)
{
DataRow dr = dt.NewRow();
table.CurrentIndex = i;
foreach (string s in RfcOutTableFields)
{
dr[s] = table.CurrentRow.GetString(s).ToString();
}
dt.Rows.Add(dr);
}
return dt;
}
public static IRfcFunction GetRfcFun(string sapid, string rfc, Dictionary<string, string> RfcParIn)
{
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
foreach (KeyValuePair<string, string> kvp in RfcParIn)
{
RfcFun.SetValue(kvp.Key, kvp.Value);
}
RfcFun.Invoke(prd); //执行函数
return RfcFun;
}
catch (Exception ex)
{
MessageBox.Show("读取SAP数据失败", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw ex;
}
}
public static IRfcFunction GetRfcFun(string sapid, string rfc, DataTable RfcParIn)
{
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
IRfcTable rc = RfcFun.GetTable(RfcParIn.TableName);
foreach (DataRow row in RfcParIn.Rows)
{
rc.Insert();
for (int i = 0; i < RfcParIn.Columns.Count; i++)
{
rc.CurrentRow.SetValue(RfcParIn.Columns[i].ColumnName, row[i].ToString());
}
}
RfcFun.Invoke(prd); //执行函数
return RfcFun;
}
catch (Exception ex)
{
MessageBox.Show("读取SAP数据失败", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw ex;
}
}
public static string GetDZNumber(DataTable IM_TAB, DataTable dt2, DataTable dt3, ref DataTable dt4, ref DataTable dt5, Dictionary<string, string> RfcParIn)
{
//DateTime t = BLL.ServerTime.GetServerTime();
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(Util.Configure.sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction("Z_RFC_PP_0000620_02"); //调用函数名
IRfcTable rt = RfcFun.GetTable("T_TIMETICKETS");
foreach (DataRow row in IM_TAB.Rows)
{
rt.Insert();
for (int i = 0; i < IM_TAB.Columns.Count; i++)
{
rt.CurrentRow.SetValue(IM_TAB.Columns[i].ColumnName, row[i].ToString().Trim());
}
}
rt = RfcFun.GetTable("T_GOODSMOVEMENTS");
foreach (DataRow row in dt2.Rows)
{
rt.Insert();
for (int i = 0; i < dt2.Columns.Count; i++)
{
rt.CurrentRow.SetValue(dt2.Columns[i].ColumnName, row[i] == null ? "" : row[i].ToString().Trim());
}
}
rt = RfcFun.GetTable("T_LINK_CONF_GOODSMOV");
foreach (DataRow row in dt3.Rows)
{
rt.Insert();
for (int i = 0; i < dt3.Columns.Count; i++)
{
rt.CurrentRow.SetValue(dt3.Columns[i].ColumnName, row[i] == null ? "" : row[i].ToString().Trim());
}
}
foreach (KeyValuePair<string, string> kvp in RfcParIn)
{
RfcFun.SetValue(kvp.Key, kvp.Value);
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable("T_RETURN_DETAIL"); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt4.NewRow();
for (int a = 0; a < dt4.Columns.Count; a++)
{
dr[dt4.Columns[a].ColumnName] = table.CurrentRow.GetString(dt4.Columns[a].ColumnName).ToString();
}
dt4.Rows.Add(dr);
}
}
table = RfcFun.GetTable("T_COGI"); //获取相应的品号内表
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt5.NewRow();
for (int a = 0; a < dt5.Columns.Count; a++)
{
dr[dt5.Columns[a].ColumnName] = table.CurrentRow.GetString(dt5.Columns[a].ColumnName).ToString();
}
dt5.Rows.Add(dr);
}
}
prd = null;
repo = null;
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
public static string GetDZNumber(DataTable IM_TAB, DataTable dt2, DataTable dt3,ref DataTable dt4,ref DataTable dt5)
{
//DateTime t = BLL.ServerTime.GetServerTime();
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(Util.Configure.sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction("Z_RFC_PP_0000620_02"); //调用函数名
IRfcTable rt = RfcFun.GetTable("T_TIMETICKETS");
foreach (DataRow row in IM_TAB.Rows)
{
rt.Insert();
for (int i = 0; i < IM_TAB.Columns.Count; i++)
{
rt.CurrentRow.SetValue(IM_TAB.Columns[i].ColumnName, row[i].ToString());
}
}
rt = RfcFun.GetTable("T_GOODSMOVEMENTS");
foreach (DataRow row in dt2.Rows)
{
rt.Insert();
for (int i = 0; i < dt2.Columns.Count; i++)
{
rt.CurrentRow.SetValue(dt2.Columns[i].ColumnName, row[i] == null ? "" : row[i].ToString());
}
}
rt = RfcFun.GetTable("T_LINK_CONF_GOODSMOV");
foreach (DataRow row in dt3.Rows)
{
rt.Insert();
for (int i = 0; i < dt3.Columns.Count; i++)
{
rt.CurrentRow.SetValue(dt3.Columns[i].ColumnName, row[i] == null ? "" : row[i].ToString());
}
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable("T_RETURN_DETAIL"); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt4.NewRow();
for (int a = 0; a < dt4.Columns.Count; a++)
{
dr[dt4.Columns[a].ColumnName] = table.CurrentRow.GetString(dt4.Columns[a].ColumnName).ToString();
}
dt4.Rows.Add(dr);
}
}
table = RfcFun.GetTable("T_COGI"); //获取相应的品号内表
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt5.NewRow();
for (int a = 0; a < dt5.Columns.Count; a++)
{
dr[dt5.Columns[a].ColumnName] = table.CurrentRow.GetString(dt5.Columns[a].ColumnName).ToString();
}
dt5.Rows.Add(dr);
}
}
prd = null;
repo = null;
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
public static string GetDZNumber(DataTable IM_TAB, ref DataTable dt1, Dictionary<string, string> RfcParIn)
{
//DateTime t = BLL.ServerTime.GetServerTime();
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(Util.Configure.sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction("Z_RFC_PP_0000620_05"); //调用函数名
IRfcTable rt = RfcFun.GetTable("IM_ITAB");
foreach (DataRow row in IM_TAB.Rows)
{
rt.Insert();
for (int i = 0; i < IM_TAB.Columns.Count; i++)
{
rt.CurrentRow.SetValue(IM_TAB.Columns[i].ColumnName, row[i].ToString());
}
}
foreach (KeyValuePair<string, string> kvp in RfcParIn)
{
RfcFun.SetValue(kvp.Key, kvp.Value);
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable("RETURN"); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt1.NewRow();
for (int a = 0; a < dt1.Columns.Count; a++)
{
dr[dt1.Columns[a].ColumnName] = table.CurrentRow.GetString(dt1.Columns[a].ColumnName).ToString();
}
dt1.Rows.Add(dr);
}
}
prd = null;
repo = null;
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
public static string GetDZNumber(DataTable IM_TAB,ref DataTable dt1)
{
//DateTime t = BLL.ServerTime.GetServerTime();
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(Util.Configure.sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction("Z_RFC_PP_0000620_05"); //调用函数名
IRfcTable rt = RfcFun.GetTable("IM_ITAB");
foreach (DataRow row in IM_TAB.Rows)
{
rt.Insert();
for (int i = 0; i < IM_TAB.Columns.Count; i++)
{
rt.CurrentRow.SetValue(IM_TAB.Columns[i].ColumnName, row[i].ToString().Trim());
}
}
RfcFun.Invoke(prd); //执行函数
IRfcTable table = RfcFun.GetTable("RETURN"); //获取相应的品号内表
DataRow dr;
if (table.RowCount > 0)
{
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
dr = dt1.NewRow();
for (int a = 0; a < dt1.Columns.Count; a++)
{
dr[dt1.Columns[a].ColumnName] = table.CurrentRow.GetString(dt1.Columns[a].ColumnName).ToString();
}
dt1.Rows.Add(dr);
}
}
prd = null;
repo = null;
return "";
}
catch (Exception ex)
{
return ex.Message;
}
}
public static void GetDS(string sapid, string rfc, DataSet dsIN, ref DataSet dsOut)
{
try
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination(sapid);
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
RfcRepository repo = prd.Repository;
IRfcFunction RfcFun = repo.CreateFunction(rfc); //调用函数名
foreach (DataTable dt in dsIN.Tables)
{
IRfcTable rc = RfcFun.GetTable(dt.TableName);
foreach (DataRow row in dt.Rows)
{
rc.Insert();
foreach (DataColumn col in dt.Columns)
{
rc.CurrentRow.SetValue(col.ColumnName, row[col].ToString());
}
}
}
RfcFun.Invoke(prd); //执行函数
foreach (DataTable dt in dsOut.Tables)
{
IRfcTable rc = RfcFun.GetTable(dt.TableName);
for (int i = 0; i < rc.RowCount; i++)
{
DataRow dr = dt.NewRow();
rc.CurrentIndex = i;
foreach (DataColumn col in dt.Columns)
{
dr[col.ColumnName] = rc.CurrentRow.GetString(col.ColumnName).ToString();
}
dt.Rows.Add(dr);
}
}
}
catch (Exception ex)
{
MessageBox.Show("读取SAP数据失败", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw ex;
}
}
}
}
post SAP-Garson
原文链接:https://blog.csdn.net/tangliuqing/article/details/105612640文章来自于网络,如果侵犯了您的权益,请联系站长删除!