using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ability.MIS.Utils
{
public static class SAPUtility
{
private static RfcConfigParameters GetConfigParams(SapDestionation sapDestionation, SapUser sapUser)
{
RfcConfigParameters configParams = new RfcConfigParameters();
switch (sapDestionation)
{
default:
case SapDestionation.DEV_100:
configParams.Add(RfcConfigParameters.Name, "DEV_100");
configParams.Add(RfcConfigParameters.AppServerHost, "182.1.1.1");
configParams.Add(RfcConfigParameters.Client, "100");
break;
case SapDestionation.DEV_200:
configParams.Add(RfcConfigParameters.Name, "DEV_200");
configParams.Add(RfcConfigParameters.AppServerHost, "182.1.1.2");
configParams.Add(RfcConfigParameters.Client, "200");
break;
case SapDestionation.QAS_800:
configParams.Add(RfcConfigParameters.Name, "QAS_800");
configParams.Add(RfcConfigParameters.AppServerHost, "182.1.1.116");
configParams.Add(RfcConfigParameters.Client, "800");
break;
case SapDestionation.PRD_800:
configParams.Add(RfcConfigParameters.Name, "PRD_800");
configParams.Add(RfcConfigParameters.AppServerHost, "182.1.1.16");
configParams.Add(RfcConfigParameters.Client, "800");
break;
}
configParams.Add(RfcConfigParameters.SystemNumber, "00");
configParams.Add(RfcConfigParameters.User, sapUser.UserName);
configParams.Add(RfcConfigParameters.Password, sapUser.PassWord);
configParams.Add(RfcConfigParameters.Language, "ZH");
configParams.Add(RfcConfigParameters.PoolSize, "5");
configParams.Add(RfcConfigParameters.PeakConnectionsLimit, "15");
configParams.Add(RfcConfigParameters.IdleTimeout, "120");
return configParams;
}
public static RfcDestination GetDestination(SapDestionation sapDestionation, SapUser sapUser)
{
RfcConfigParameters configParams = GetConfigParams(sapDestionation, sapUser);
RfcDestination dest = RfcDestinationManager.GetDestination(configParams);
return dest;
}
public static void PingDestination(SapDestionation sapDestionation, SapUser sapUser)
{
RfcDestination destination = GetDestination(sapDestionation, sapUser);
destination.Ping();
}
}
}
c#存放SAP用户名和密码类:
using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ability.MIS.Utils
{
public enum SapDestionation
{
Default = 0,
DEV_100 = 1,
DEV_200 = 2,
QAS_800 = 3,
PRD_800 = 4
}
public class SapUsers
{
public static SapUser DEV_IT06 = new SapUser("us01","000000");
public static SapUser QAS_IT06 = new SapUser("us01", "123456");
public static SapUser PRD_IT06 = new SapUser("us01", "000000");
public static SapUser PRD_CK03 = new SapUser("us01", "1235401");
public static SapUser QAS_CK03 = new SapUser("us01", "524121");
public static SapUser CustomUser(string userName, string passWord)
{
return new SapUser(userName,passWord);
}
}
public class SapUser
{
public String UserName;
public String PassWord;
public SapUser(string userName, string passWord)
{
UserName = userName;
PassWord = passWord;
}
}
}
调用如下:
/// <summary>
/// 采购申请批量转采购订单
/// </summary>
/// <param name="dtSource">传入的采购申请相关信息表</param>
/// <returns name="dtOut">传出的信息表,包含生成的采购订单号和提示信息</returns>
public DataTable createPO(DataTable dtSource)
{
var rfcDestination = SAPUtility.GetDestination(SapDestionation.DEV_200, SapUsers.DEV_IT06);
//BAPI_USER_GETLIST
RfcRepository rfcrep = rfcDestination.Repository;
IRfcFunction myfun = rfcrep.CreateFunction("Z_MISCREATEPO");//Z_MISCREATEPO 为SAP函数名
DataTable dtOut = new DataTable();
//采购申请号
dtOut.Columns.Add("BANFN", typeof(string));
//采购申请行号
dtOut.Columns.Add("BNFPO", typeof(string));
//计划行
dtOut.Columns.Add("J_3AEBSP", typeof(string));
//网格值
dtOut.Columns.Add("J_3ASIZE", typeof(string));
//物料组
dtOut.Columns.Add("MATKL", typeof(string));
//实际采购数量
dtOut.Columns.Add("MENGE", typeof(string));
//单位
dtOut.Columns.Add("MEINS", typeof(string));
//供应商编码
dtOut.Columns.Add("VENDOR", typeof(string));
//需求跟踪号
dtOut.Columns.Add("BEDNR", typeof(string));
//净价格
dtOut.Columns.Add("COND_VALUE", typeof(string));
//价格单位
dtOut.Columns.Add("COND_P_UNT", typeof(string));
//税码
dtOut.Columns.Add("SHUIM", typeof(string));
//货币
dtOut.Columns.Add("WAERS", typeof(string));
//交货日期
dtOut.Columns.Add("JHDAT", typeof(string));
//成功标志(返回值,不需要传入)
dtOut.Columns.Add("SUFLG", typeof(string));
//信息(返回值,不需要传入)
dtOut.Columns.Add("ERMSG", typeof(string));
//采购订单号(返回值,不需要传入)
dtOut.Columns.Add("EBELN", typeof(string));
DataTable dtIn = new DataTable();
dtIn.Columns.Add("BANFN", typeof(string));
dtIn.Columns.Add("BNFPO", typeof(string));
dtIn.Columns.Add("J_3AEBSP", typeof(string));
dtIn.Columns.Add("J_3ASIZE", typeof(string));
dtIn.Columns.Add("MATKL", typeof(string));
dtIn.Columns.Add("MENGE", typeof(string));
dtIn.Columns.Add("MEINS", typeof(string));
dtIn.Columns.Add("VENDOR", typeof(string));
dtIn.Columns.Add("BEDNR", typeof(string));
dtIn.Columns.Add("COND_VALUE", typeof(string));
dtIn.Columns.Add("COND_P_UNT", typeof(string));
dtIn.Columns.Add("SHUIM", typeof(string));
dtIn.Columns.Add("WAERS", typeof(string));
dtIn.Columns.Add("JHDAT", typeof(string));
dtIn.Columns.Add("SUFLG", typeof(string));
dtIn.Columns.Add("ERMSG", typeof(string));
dtIn.Columns.Add("EBELN", typeof(string));
var table = myfun.GetTable("ZMISCRPO");//ZMISCRPO 为SAP函数的Tables里的表名,这个表既作为传入参数也作为传出参数
for (int i = 0; i < dtSource.Rows.Count; i++)
{
//传入对应数据
IRfcStructure currentRow = table.Metadata.LineType.CreateStructure();
currentRow.SetValue("BANFN", dtSource.Rows[i]["BANFN"]);
currentRow.SetValue("BNFPO", dtSource.Rows[i]["BNFPO"]);
currentRow.SetValue("J_3AEBSP", dtSource.Rows[i]["J_3AEBSP"]);
currentRow.SetValue("J_3ASIZE", dtSource.Rows[i]["J_3ASIZE"]);
currentRow.SetValue("MATKL", dtSource.Rows[i]["MATKL"]);
currentRow.SetValue("MENGE", dtSource.Rows[i]["MENGE"]);
currentRow.SetValue("MEINS", dtSource.Rows[i]["MEINS"]);
currentRow.SetValue("VENDOR", dtSource.Rows[i]["VENDOR"]);
currentRow.SetValue("BEDNR", dtSource.Rows[i]["BEDNR"]);
currentRow.SetValue("COND_VALUE", dtSource.Rows[i]["COND_VALUE"]);
currentRow.SetValue("COND_P_UNT", dtSource.Rows[i]["COND_P_UNT"]);
currentRow.SetValue("SHUIM", dtSource.Rows[i]["SHUIM"]);
currentRow.SetValue("WAERS", dtSource.Rows[i]["WAERS"]);
currentRow.SetValue("JHDAT", dtSource.Rows[i]["JHDAT"]);
table.Append(currentRow);
}
myfun.SetValue("ZMISCRPO", table);//设置传入表的值
myfun.Invoke(rfcDestination); //提交调用函数
for (int i = 0; i < table.RowCount; i++)
{
//获取传出的数据
table.CurrentIndex = i;
var currentRowOut = table.CurrentRow;
DataRow drOut = dtOut.NewRow();
drOut["BANFN"] = currentRowOut.GetString("BANFN");
drOut["BNFPO"] = currentRowOut.GetString("BNFPO");
drOut["J_3AEBSP"] = currentRowOut.GetString("J_3AEBSP");
drOut["J_3ASIZE"] = currentRowOut.GetString("J_3ASIZE");
drOut["MATKL"] = currentRowOut.GetString("MATKL");
drOut["MENGE"] = currentRowOut.GetString("MENGE");
drOut["MEINS"] = currentRowOut.GetString("MEINS");
drOut["VENDOR"] = currentRowOut.GetString("VENDOR");
drOut["BEDNR"] = currentRowOut.GetString("BEDNR");
drOut["COND_VALUE"] = currentRowOut.GetString("COND_VALUE");
drOut["COND_P_UNT"] = currentRowOut.GetString("COND_P_UNT");
drOut["SHUIM"] = currentRowOut.GetString("SHUIM");
drOut["WAERS"] = currentRowOut.GetString("WAERS");
drOut["JHDAT"] = currentRowOut.GetString("JHDAT");
drOut["SUFLG"] = currentRowOut.GetString("SUFLG");
drOut["ERMSG"] = currentRowOut.GetString("ERMSG");
drOut["EBELN"] = currentRowOut.GetString("EBELN");
dtOut.Rows.Add(drOut);
}
//返回传出表
return dtOut;
}