C#經過RFC調用SAP

using System;
using System.Collections.Generic;
using
SAP.Middleware.Connector;
using System.Data;
using
System.Xml;

namespace RFC
{

///
/// C#與SAP的RFC接口類

///
public class RFCInterface

{
#region
初始化

///
///
初始化SRM-RFC類

///
///
PRD_000爲500系統,PRD_001爲300系統
public
RFCInterface(string
destinationName)

{
DestName
=
destinationName;

//RfcDest =
GetDestination(DestName);


ID = new MyBackendConfig();
//實例化IDestinationConfiguration

}

#endregion

#region
數據定義
private RfcDestination
rfcDest;

protected
RfcDestination RfcDest

{

get

{

if (rfcDest == null && DestName !=
null)

{

this.Connect();

return
rfcDest;

}

else

{

return
rfcDest;

}


}
set {
rfcDest = value; }

}

///
///
DestinationName,用來選擇不一樣的鏈接參數

///
private string
destName;

protected string
DestName

{
get {
return destName;
}
set {
destName = value; }

}


IDestinationConfiguration ID;

#endregion

#region
管理RfcDestination鏈接

///
///
創建RFC鏈接

///
public void
Connect()

{

RfcDestinationManager.RegisterDestinationConfiguration(ID);

RfcDest =
RfcDestinationManager.GetDestination(DestName);

}

///
///
斷開RFC鏈接

///
public void
DisConnect()

{

RfcDestinationManager.UnregisterDestinationConfiguration(ID);

}

#endregion

#region
從SAP讀取數據

///
///
從SAP按Table讀取數據

///
///
函數名稱
///
表格名稱
///
表格列名
///
數據表
public DataTable
ReadTableFromSAP(string functionName, string tableName, List
columnNames)

{

RfcRepository repo =
RfcDest.Repository;

IRfcFunction functionBapi = repo.CreateFunction(functionName);
//調用函數名


functionBapi.Invoke(RfcDest);
//執行函數

IRfcTable table = functionBapi.GetTable(tableName);
//獲取相應的品號內表


DataTable dt = new DataTable();
//新建表格


//增長表的列

foreach (string colName in
columnNames)

{

dt.Columns.Add(colName);
//表格添加一列

}

for
(int i = 0; i < table.RowCount;
i++)

{

table.CurrentIndex = i;
//當前內表的索引行

DataRow dr =
dt.NewRow();

foreach (string colName in
columnNames)

{

dr[colName] = table.GetString(colName);
//給表格賦值

}


dt.Rows.Add(dr);
//填充該表格的值

}


//prd =
null;
repo
=
null;


return dt;

}

///
///
從SAP按Table讀取數據

///
///
函數名稱
///
表格名稱
///
表格列名
///
傳入參數
///
數據表
public DataTable
ReadTableFromSAP(string functionName, string tableName, List columnNames, List
inParams)

{

RfcRepository repo =
RfcDest.Repository;

IRfcFunction functionBapi = repo.CreateFunction(functionName);
//調用函數名


//設置Import的參數

foreach (RFCInParameter inParam in
inParams)

{

functionBapi.SetValue(inParam.ParameterName,
inParam.ParameterValue);

}


functionBapi.Invoke(RfcDest);
//執行函數

IRfcTable table = functionBapi.GetTable(tableName);
//獲取相應的品號內表


DataTable dt = new DataTable();
//新建表格


//增長表的列

foreach (string colName in
columnNames)

{

dt.Columns.Add(colName);
//表格添加一列

}

for
(int i = 0; i < table.RowCount;
i++)

{

table.CurrentIndex = i;
//當前內表的索引行

DataRow dr =
dt.NewRow();

foreach (string colName in
columnNames)

{

dr[colName] = table.GetString(colName);
//給表格賦值

}


dt.Rows.Add(dr);
//填充該表格的值

}


//prd =
null;
repo
=
null;


return dt;

}

#endregion

#region
寫回數據到SAP

///
///
將結果表返回給SAP

///
///
Function名稱
///
返回表名
///
需返回的數據表,表名需和SAP列名相同
///
成功返回True,失敗False
public bool
WriteTableToSAP(string functionName, string tableName, DataTable
dt)

{
if (dt
!= null)

{

//對空的DataTable直接返回真

if (dt.Rows.Count ==
0)

{

return
true;

}

try

{

int intSL = 10000;
//一次同步數量

int intRowNumber =
dt.Rows.Count;

int intCS, intYS, intCount; //循環次數,剩餘數量,
循環時處理數量

intCS = System.Convert.ToInt32(intRowNumber / intSL) +
1;
//分批處理次數

intYS = intRowNumber %
intSL;
//最後執行數量


RfcRepository repo =
rfcDest.Repository;

IRfcFunction funBapi = repo.CreateFunction(functionName);
//調用函數名


IRfcTable tblROF = funBapi.GetTable(tableName);
//獲取相應的表

int k =
0;


for (int j = 0; j < intCS;
j++)

{

intCount = (j == intCS - 1 ? intYS :
intSL);


tblROF.Clear();


for (int i = 0; i < intCount;
i++)

{

tblROF.Insert();

for (int m = 0; m < dt.Columns.Count;
m++)

{

tblROF.CurrentRow.SetValue(dt.Columns[m].ColumnName,
dt.Rows[k][m].ToString());

}


k++;

}


funBapi.SetValue(tableName,
tblROF);


funBapi.Invoke(rfcDest);
//提交

}

//引用回傳結果

//IRfcTable RETURNStructure =
funBapi.GetTable("RETURN");

//顯示調用結果

//MessageBox.Show(RETURNStructure.GetString("MESSAGE").ToString());


// prd =
null;

repo =
null;


return
true;

}

catch

{

return
false;

}

}

else

{

return
false;

}

}

///
///
回寫數據表到SAP

///
///
RFC函數名
///
SAP數據表名
///
回傳數據表
///
SAP表列名,需與回傳表保持一致

///
public bool
WriteTableToSAP(string functionName, string tableName, DataTable dt, List
SAPColumnNames)

{
if
(SAPColumnNames.Count !=
dt.Columns.Count)

{

return
false;

}
else if
(dt !=
null)

{

try

{

int intRowNumber =
dt.Rows.Count;

int intCS, intYS, intCount; //循環次數,剩餘數量,
循環時處理數量

intCS = System.Convert.ToInt32(intRowNumber / 10000) +
1;
//分批處理次數

intYS = intRowNumber %
10000;
//最後執行數量


RfcRepository repo =
rfcDest.Repository;

IRfcFunction funBapi = repo.CreateFunction(functionName);
//調用函數名


IRfcTable tblROF = funBapi.GetTable(tableName);
//獲取相應的表

int k =
0;


for (int j = 0; j < intCS;
j++)

{

intCount = (j == intCS - 1 ? intYS :
10000);


tblROF.Clear();


for (int i = 0; i < intCount;
i++)

{

tblROF.Insert();

for (int m = 0; m < dt.Columns.Count;
m++)

{

tblROF.CurrentRow.SetValue(SAPColumnNames[m],
dt.Rows[k][m].ToString());

}


k++;

}


funBapi.SetValue(tableName,
tblROF);


funBapi.Invoke(rfcDest);
//提交

}

//引用回傳結果

//IRfcTable RETURNStructure =
funBapi.GetTable("RETURN");

//顯示調用結果

//MessageBox.Show(RETURNStructure.GetString("MESSAGE").ToString());


// prd =
null;

repo =
null;


return
true;

}

catch

{

return
false;

}

}

else

{

return
false;

}

}


#endregion
}

#region
RFC傳入參數
///
///
RFC傳入參數
///
public struct
RFCInParameter

{

///
///
參數名稱

///
string
parameterName;

///
///
參數值

///
string
parameterValue;

public string
ParameterName

{
get {
return parameterName;
}
set {
parameterName = value; }

}

public string
ParameterValue

{
get {
return parameterValue;
}
set {
parameterValue = value; }

}
public RFCInParameter(string
paramName, string paramValue)

{

parameterName =
paramName;

parameterValue = paramValue;

}
}

#endregion

#region
Destination參數類
///
///
destination參數類
///
public class
RFCDestinationParameter

{
private string
paramName;
//參數名稱

private string appServerHost;

private string systemNumber;

private string user;
private
string password;
private string
client;
private string
language;
private string
poolsize;
private string
maxpoolsize;
private string
idleTimeout;

public string
ParamName

{
get {
return paramName;
}
set {
paramName = value; }

}
public string
AppServerHost

{
get {
return appServerHost;
}
set {
appServerHost = value; }

}
public string
SystemNumber

{
get {
return systemNumber;
}
set {
systemNumber = value; }

}
public string
User

{
get {
return user;
}
set {
user = value; }

}
public string
Password

{
get {
return password;
}
set {
password = value; }

}
public string
Client

{
get {
return client;
}
set {
client = value; }

}
public string
Language

{
get {
return language;
}
set {
language = value; }

}
public string
Poolsize

{
get {
return poolsize;
}
set {
poolsize = value; }

}
public string
Maxpoolsize

{
get {
return maxpoolsize;
}
set {
maxpoolsize = value; }

}
public string
IdleTimeout

{
get {
return idleTimeout;
}
set {
idleTimeout = value; }

}

public
RFCDestinationParameter()

{

}

public
RFCDestinationParameter(string serverHost, string systemNumber, string user,
string password, string client, string language, string poolsize, string
maxpoolsize, string idleTimeout)

{

AppServerHost =
serverHost;

SystemNumber =
systemNumber;

User =
user;

Password =
password;

Client =
client;

Language =
language;

Poolsize =
poolsize;

Maxpoolsize =
maxpoolsize;

IdleTimeout = idleTimeout;

}
}

#endregion

#region 讀取配置類

///
/// 參數配置類

///
public static class RFCConfig

{
private static string
configFileName = string.Empty;


public static string
ConfigFileName

{
get {
return configFileName;
}
set {
configFileName = value; }

}

#region
讀取XML參數

//讀取RFC配置文件
public static List
ReadRFCConfig()

{
//string
xmlName = System.Environment.CurrentDirectory +
@"\RFCConfig.xml";

if (ConfigFileName ==
string.Empty)

{

ConfigFileName = System.Environment.CurrentDirectory +
@"\RFCConfig.xml";

}
return
ReadRFCConfig(ConfigFileName);

}


///
///
讀取RFC配置文件

///
///
配置文件名稱

///
private static List
ReadRFCConfig(string configName)

{
if
(System.IO.File.Exists(configName))

{

XmlDocument doc = new
XmlDocument();

doc.Load(configName);
//讀取XML文件


List destParams = new
List();


XmlNodeList dests =
doc.SelectNodes("/configuration/SAP.Middleware.Connector/ClientSettings/DestinationConfiguration/destinations/add");

if (dests !=
null)

{

foreach (XmlNode destParam in
dests)

{

//paramNames.Add(destParam.Attributes["name"].Value);

RFCDestinationParameter rfcDestParam = new
RFCDestinationParameter();

rfcDestParam.ParamName =
destParam.Attributes["NAME"].Value;

rfcDestParam.AppServerHost =
destParam.Attributes["ASHOST"].Value;

rfcDestParam.User =
destParam.Attributes["USER"].Value;

rfcDestParam.Password =
destParam.Attributes["PASSWD"].Value;

rfcDestParam.Client =
destParam.Attributes["CLIENT"].Value;

rfcDestParam.Language =
destParam.Attributes["LANG"].Value;

rfcDestParam.SystemNumber =
destParam.Attributes["SYSNR"].Value;

rfcDestParam.Maxpoolsize =
destParam.Attributes["MAX_POOL_SIZE"].Value;

rfcDestParam.Poolsize =
destParam.Attributes["POOL_SIZE"].Value;

rfcDestParam.IdleTimeout =
destParam.Attributes["IDLE_TIMEOUT"].Value;


destParams.Add(rfcDestParam);

}

}


return
destParams;

}

else

{

return
null;

}

}
#endregion

}
#endregion

#region
登陸參數設置類
///
///
登陸參數設置
///
public class
MyBackendConfig : IDestinationConfiguration

{


public
RfcConfigParameters GetParameters(String
destinationName)

{
List
rfcDestParams =
RFCConfig.ReadRFCConfig();


foreach (RFCDestinationParameter destParam in
rfcDestParams)

{

if (destParam.ParamName.Equals(destinationName,
StringComparison.OrdinalIgnoreCase))

{

RfcConfigParameters parms = new
RfcConfigParameters();

parms.Add(RfcConfigParameters.AppServerHost,
destParam.AppServerHost);
//SAP主機IP

parms.Add(RfcConfigParameters.SystemNumber, destParam.SystemNumber);
//SAP實例

parms.Add(RfcConfigParameters.User, destParam.User);
//用戶名

parms.Add(RfcConfigParameters.Password, destParam.Password);
//密碼

parms.Add(RfcConfigParameters.Client, destParam.Client); //
Client

parms.Add(RfcConfigParameters.Language, destParam.Language);
//登錄語言

parms.Add(RfcConfigParameters.PoolSize,
destParam.Poolsize);

parms.Add(RfcConfigParameters.MaxPoolSize,
destParam.Maxpoolsize);

parms.Add(RfcConfigParameters.IdleTimeout,
destParam.IdleTimeout);

return
parms;

}

}


return null;

}
public bool
ChangeEventsSupported()

{
return
false;

}
public event
RfcDestinationManager.ConfigurationChangeHandler
ConfigurationChanged;
}

#endregion
}api

相關文章
相關標籤/搜索