C#调用SAP函数,传入参数为表
//using SAP.Middleware.Connector;
//private RfcConfigParameters _params = new RfcConfigParameters();
//private RfcDestination _rfcDest;
//RfcConfigParameters parms = new RfcConfigParameters();
// parms.Add(RfcConfigParameters.Name, "xxx");
// parms.Add(RfcConfigParameters.AppServerHost, "xxx");
// parms.Add(RfcConfigParameters.SystemNumber, "00");
// parms.Add(RfcConfigParameters.Client, "900");
// parms.Add(RfcConfigParameters.User, "xxx");
// parms.Add(RfcConfigParameters.Password, "xxxxx");
// parms.Add(RfcConfigParameters.Language, "EN");
// parms.Add(RfcConfigParameters.PoolSize, "5");
// parms.Add(RfcConfigParameters.MaxPoolSize, "10");
// parms.Add(RfcConfigParameters.IdleTimeout, "600");
// return parms;
//_rfcDest = RfcDestinationManager.GetDestination(_params);
public DataTable GetSAPData(DataTable dt)
{
DataTable dtSAPData = new DataTable();
try
{
dtSAPData.Columns.Add("DATA1", typeof(string));
dtSAPData.Columns.Add("DATA2", typeof(string));
dtSAPData.Columns.Add("DATA3", typeof(string));
string strOrder = null;
RfcRepository rfcRep = _rfcDest.Repository;
IRfcFunction func = rfcRep.CreateFunction("Z_RFC_XXXX");
IRfcTable tSAP = func.GetTable("INPUT_TABLE");
for (int i = 0; i < dt.Rows.Count; i++)
{
str1 = dt.Rows[i][0].ToString();
str2 = dt.Rows[i][1].ToString();
str3 = dt.Rows[i][2].ToString();
IRfcStructure struSAP = tSAP.Metadata.LineType.CreateStructure();
struSAP.SetValue("str1", str1);
struSAP.SetValue("str2", str2);
struSAP.SetValue("str3", str3);
tSAP.Append(struSAP);
}
func.SetValue("INPUT_TABLE", tSAP); //table 参数
func.SetValue("WERKS", "A"); //单个参数
func.SetValue("STATUS", "B"); //单个参数
func.Invoke(_rfcDest);
IRfcTable SAPDataTable = func.GetTable("RETURN_TABLE");
for (int i = 0; i < SAPDataTable.RowCount; i++)
{
IRfcStructure stru = SAPDataTable[i];
DataRow dr = dtSAPData.NewRow();
dr["DATA1"] = stru.GetValue("X").ToString();
dr["DATA2"] = stru.GetValue("Y").ToString();
dr["DATA3"] = stru.GetValue("Z").ToString();
dtSAPData.Rows.Add(dr);
}
}
catch(Exception ex)
{
string strcatch = ex.Message;
}
return dtSAPData;
}
以上是传入传出都为table的情况。
还有一种直接传入一条数据的情况,当然,SAP函数里面的接收参数还是table
代码如下:
var rfcDestination = SAPUtility.GetDestination(SapDestionation.PRD_800, SapUsers.PRD_IT06);
BAPI_USER_GETLIST
RfcRepository rfcrep = rfcDestination.Repository;
IRfcFunction myfun = rfcrep.CreateFunction("Z_MISGETTEXT");//调用的SAP函数
var table = myfun.GetTable("ZOBJTEXT");//SAP函数的table
//设置传入参数
table.Insert();
table.CurrentIndex = 0;
var currentRow = table.CurrentRow;
currentRow.SetValue("TDOBJECT", "测试OBJ");
currentRow.SetValue("TDNAME", "测试NAME");
currentRow.SetValue("TDID", "测试ID");
currentRow.SetValue("LANGUAGE", "测试语言");
myfun.Invoke(rfcDestination); //提交调用BAPI
//取得返回值,这里的TEXT项目也是SAP函数table【ZOBJTEXT】中的字段
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i;
var currentRow2 = table.CurrentRow;
Console.WriteLine(currentRow2.GetString("TEXT"));
}
Console.Read();