由于前段时间给XX集团改个项目,当中,要调用SAP接口,也网上找了些资料,慢慢地去试,问别人,爱理不理的,弄了的时间有点长,结果自己摸索出来了,在这边主要把功能解释下,并贴出代码,供需要的同行们参考。
一、封装SAP调用接口
1.添加引用SAP.Connector.dll,SAP.Connector.Rfc.dll
2.配置App.config
<appSettings>
<add key="Name" value=""/>
<add key="AppServerHost" value="地址"/>
<add key="SystemNumber" value="00"/>
<add key="User" value="用户名"/>
<add key="Password" value="密码"/>
<add key="Client" value="510"/>
<add key="Language" value="ZH"/>
</appSettings>
这样做,比较方便用户修改,也可做成可配置的
2.新建一个类"MyBackendConfig" ,并继承IDestinationConfiguration
public class MyBackendConfig : IDestinationConfiguration
{
#region IDestinationConfiguration 成员
public bool ChangeEventsSupported()
{
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
public RfcConfigParameters GetParameters(string destinationName)
{
string sName = ConfigurationManager.AppSettings["Name"].ToString();
string sAppServerHost = ConfigurationManager.AppSettings["AppServerHost"].ToString();
string sSystemNumber = ConfigurationManager.AppSettings["SystemNumber"].ToString();
string sUser = ConfigurationManager.AppSettings["User"].ToString();
string sPassword = ConfigurationManager.AppSettings["Password"].ToString();
string sClient = ConfigurationManager.AppSettings["Client"].ToString();
string sLanguage = ConfigurationManager.AppSettings["Language"].ToString();
if (sName.Equals(destinationName))
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.Name, sName);
parms.Add(RfcConfigParameters.AppServerHost, sAppServerHost);
parms.Add(RfcConfigParameters.SystemNumber, sSystemNumber);
parms.Add(RfcConfigParameters.User, sUser);
parms.Add(RfcConfigParameters.Password, sPassword);
parms.Add(RfcConfigParameters.Client, sClient);
parms.Add(RfcConfigParameters.Language, sLanguage);
return parms;
}
else return null;
}
#endregion
}
二、调用SAP接口
/// <summary>
/// SAP接口调用
/// </summary>
public class SAPService
{
public static string nco(string sPZV, string sPSN)
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination("");
RfcDestinationManager.UnregisterDestinationConfiguration(ID);
return nco(prd, sPZV, sPSN);
}
static string sMATNR = string.Empty;
///查询返回的值
public static string nco(RfcDestination prd, string sPZV, string sPSN)
{
try
{
RfcRepository repo = prd.Repository;
IRfcFunction companyBapi = repo.CreateFunction("ZPP_SERNR_GENERANT"); //ZPP_SERNR_GENERANT 整车车号
companyBapi.SetValue("L_TEXT", sPZV);//设置导出参数
companyBapi.SetValue("H_TEXT", sPSN);
companyBapi.SetValue("NUMB", "");
companyBapi.SetValue("TIME", "1");
try
{
companyBapi.Invoke(prd);
}
catch (Exception ex)
{
}
IRfcTable table = companyBapi.GetTable("ZSERNR6"); //获取相应的品号内表
DataTable dt = new DataTable(); //新建表格
dt.Columns.Add("SERNR"); //表格添加一列
for (int i = 0; i < table.RowCount; i++)
{
table.CurrentIndex = i; //当前内表的索引行
DataRow dr = dt.NewRow();
sMATNR = table.GetString("SERNR").ToString(); //获取表格的某行某列的值
}
prd = null;
repo = null;
}
catch (Exception)
{
initSys.TS_MessageBox("网络故障!");
}
return sMATNR;
}
///新增,通 SAP接口上传数据到服务器中
public static string nco2(RfcDestination prd, string sPDM, string sPZV, string sFac, string sSN, string sStartTime, string sEndTime, string userid)
{
string a = string.Empty;
string b = string.Empty;
string c = string.Empty;
string d = string.Empty;
try
{
RfcRepository repo = prd.Repository;
IRfcFunction companyBapi = repo.CreateFunction("ZDMS_CONFIG_UPDAT");//ZDMS_CONFIG_UPDAT整车档案装配
IRfcTable table = companyBapi.GetTable("GT_INPUT"); //获取相应的品号内表
DataSet ds = initSys.ws.GetAssembly_tree_define(sPDM, sPZV, sFac, sSN, sStartTime, sEndTime);
if (ds.Tables[0].Rows.Count > 0)
{
// int iCount = ds.Tables[0].Rows.Count;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
//iNum++;
count = 1;
sPDM = ds.Tables[0].Rows[i]["PPDM"].ToString().Trim();
sPZV = ds.Tables[0].Rows[i]["PPZV"].ToString().Trim();
sFac = ds.Tables[0].Rows[i]["PFac"].ToString().Trim();
sSN = ds.Tables[0].Rows[i]["PSN"].ToString().Trim();
sTo = ds.Tables[0].Rows[i]["PPDM"].ToString().Trim();
string sTest = nco(sPZV.Split('*')[0].ToString(), sSN);//整车车号
a = ds.Tables[0].Rows[i]["CPDM"].ToString().Trim();
b = ds.Tables[0].Rows[i]["CPZV"].ToString().Trim();
DataTable dt = initSys.ws.GetNewOldBarCode(ds.Tables[0].Rows[i]["CFac"].ToString()).Tables[0];
if (dt.Rows.Count > 0)
{
c = dt.Rows[0][0].ToString().Trim();
}
else
{
c = ds.Tables[0].Rows[i]["CFac"].ToString().Trim();
}
d = ds.Tables[0].Rows[i]["CSN"].ToString().Trim();
s1 = a;
s2 = d;
//下面这一段是递归读取本地数据,并通过 SAP接口上传
NewMethod(sTest, sTo, sPDM, sPZV, sFac, sSN, sStartTime, sEndTime, a, b, ds.Tables[0].Rows[i]["CFac"].ToString(), d, table, userid);
}
companyBapi.SetValue("GT_INPUT", table);
try
{
companyBapi.Invoke(prd);
}
catch (Exception)
{
}
sMATNR = table.GetString("UPD_FLAG").ToString() + "|" + iNum.ToString();
prd = null;
repo = null;
iNum = 0;
}
return sMATNR;
}
catch (Exception)
{
iNum = 0;
return "网络故障!";
}
}
}
主要是贴出代码,有些时候,会做了,就会知道,是什么问题,仅供参考,如有问题,可咨询
请问上面的两个两个SAP.Connector.dll,SAP.Connector.Rfc.dll那里找的,当初对接的时候SAP运营商会提供吗?