调用SAP系统的功能,需要使用SAP提供的RFC接口,而C#语言则可以通过SAP .Net Connector来实现RFC调用操作。
以下是调用SAP RFC的详细攻略:
步骤一:安装SAP .Net Connector
- 访问SAP服务市场网站(https://support.sap.com)下载并安装SAP .Net Connector,这是使用C#调用RFC的必要前提;
- 安装完成后,在Visual Studio的C#程序中,单击“引用”右键,选择“管理NuGet包”,搜索“sapnco”,并确认安装该包,并附加到项目中。
步骤二:编写C#程序连接SAP系统
- 在C#程序中添加如下一段代码连接SAP系统:
using SAP.Middleware.Connector;
public class MySAP {
private RfcDestination destination;
public MySAP() {
// 初始化连接SAP系统的配置
RfcDestinationManager.RegisterDestinationConfiguration(new SAPConfig());
// 创建一个新的RFC连接
destination = RfcDestinationManager.GetDestination("MY_SAP_SYSTEM");
}
}
- 添加SAP系统的链接配置信息,需要创建一个类SAPConfig,继承IDestinationConfiguration接口,添加方法实现:
class SAPConfig : IDestinationConfiguration {
public RfcConfigParameters GetParameters(string dest) {
RfcConfigParameters configParams = new RfcConfigParameters();
// SAP系统的相关配置信息
configParams.Add(RfcConfigParameters.AppServerHost, "SAPSYSTEM.HOST");
configParams.Add(RfcConfigParameters.SystemNumber, "00");
configParams.Add(RfcConfigParameters.User, "SAP_USER");
configParams.Add(RfcConfigParameters.Password, "SAP_PASSWORD");
configParams.Add(RfcConfigParameters.Client, "001");
configParams.Add(RfcConfigParameters.Language, "EN");
return configParams;
}
public bool ChangeEventsSupported() {
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
}
- 创建一个C#函数,用于执行SAP RFC调用:
public RfcTable MyFunction() {
RfcTable result = null;
try {
// 获取RFC函数
RfcFunction rfcFunction = destination.Repository.CreateFunction("BAPI_COMPANYCODE_GETLIST");
// 执行RFC函数
rfcFunction.Invoke(destination);
result = rfcFunction.GetTable("COMPANYCODE_LIST");
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
return result;
}
上述代码中,BAPI_COMPANYCODE_GETLIST是一个SAP函数模块名称,调用该函数,使用RFC返回公司代码清单(COMPANYCODE_LIST)。
示例一:查询公司代码列表
public class MySAP {
// ...
public DataTable GetCompanyList() {
RfcTable resultTable = MyFunction();
DataTable dataTable = new DataTable();
// 将RFC表格转换为数据表格
foreach (IRfcStructure row in resultTable) {
if (dataTable.Columns.Count == 0) {
// 添加列名
foreach (var cell in row){
dataTable.Columns.Add(cell.Metadata.Name);
}
}
// 添加行
DataRow newRow = dataTable.NewRow();
for (int i = 0; i < row.ElementCount; i++) {
newRow[i] = row.GetValue(i);
}
dataTable.Rows.Add(newRow);
}
return dataTable;
}
}
该示例中,MySAP类新增GetCompanyList函数,用于查询SAP系统中所有的公司代码,该函数执行SAP函数模块BAPI_COMPANYCODE_GETLIST后,将SAP返回的RFC表格转换为C#的数据表格(DataTable)格式,返回该数据表格。
示例二:查询指定物料号的库存量
public class MySAP {
// ...
public string GetMaterialStock(string materialNo) {
RfcTable resultTable = GetMaterialStockBatch(materialNo);
string stockQuantity = "";
foreach (IRfcStructure row in resultTable) {
string batchNumber = row.GetString("CHARG");
stockQuantity = row.GetString("LABST");
Console.WriteLine(batchNumber + " : " + stockQuantity);
}
return stockQuantity;
}
private RfcTable GetMaterialStockBatch(string materialNo) {
RfcTable result = null;
try {
// 获取RFC函数
RfcFunction rfcFunction = destination.Repository.CreateFunction("BAPI_MATERIAL_STOCK_REQ");
rfcFunction.SetValue("MATERIAL", materialNo);
rfcFunction.SetValue("PLANT", "1000");
rfcFunction.Invoke(destination);
result = rfcFunction.GetTable("MATERIAL_STOCK_OVERVIEW");
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
}
return result;
}
}
该示例中的MySAP类新增GetMaterialStock和GetMaterialStockBatch函数,用于查询SAP系统中指定物料号的库存量,该过程通过调用SAP系统的SAP函数模块BAPI_MATERIAL_STOCK_REQ来实现,该函数使用RfcFunction.SetValue方法设置函数输入参数后,通过执行RF函数Invoke方法实现。获取SAP返回的RFC表格,经过遍历后返回部分物料库存信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 如何调用SAP RFC - Python技术站