目录
- ABAP接口部分-C#调用RFC
- 创建表结构
- 创建RFC函数
- 创建C#项目
- 引用SAP .Net Connector包
- 绘制窗口的控件
- 最终布局
- 代码
- 项目配置
- 报错
- SAP.Middleware.Connector.RfcDestinationManager报错
- SAP.Middleware.Connector.RfcLoginexception报错
- SAP.Middleware.Connector.RfcInvalidStateException报错
- 运行结果
- 总结
ABAP接口部分-C#调用RFC
创建表结构
1、 创建要返回的表结构;
事务代码:SE11
输入数据类型的名称,点击“创建”:
选择“结构”单选框,点击确定:
输入结构描述,自定义的组件名称,参考的组件类型,点击保存并激活:
创建RFC函数
事务代码:SE37
输入函数的名称,点击“创建”按钮:
输入函数组名称,如果没有,需要先创建,一个函数组允许有多个不同的函数:
选择远程,点击“立即开始”:
填写输入参数和关联类型,RFC函数要勾选“值传递”:
输入返回表的名称并参照我们之前创建的表结构名称:
输入语句,点击保存并激活:
创建C#项目
首先,需要下载Visual Studio 2019,安装C#相关模块。
之后,开始创建新项目:
1)选择“Windows窗体应用”(.net Framework),点击下一步:
填写项目名称,选择存储的位置,选择框架.NET的版本,点击“创建”按钮进行创建:
引用SAP .Net Connector包
下载安装SAP .NET CONNECTOR
步骤一:安装SAP .Net Connector
• 访问SAP服务市场网站(https://support.sap.com)下载并安装SAP .Net Connector,这是使用C#调用RFC的必要前提;
• 安装完成后,在Visual Studio的C#程序中,单击“引用”右键,选择“管理NuGet包”,搜索“sapnco”,并确认安装该包,并附加到项目中。
登录账号:qq邮箱,密码:a_…
安装目录:
D:\Software\SAP\SAP_DotNetConnector3_Net48_x64
从网上下载下来的文件:
现在使用的是:
在“引用”上右击,“添加项目引用”:
效果如下:
还有一种方法,可以试试
右击,选择"管理NuGet程序包"
输入sapno:
App.config
创建App.config文件
创建winform项目之后会自动生成App.config文件,如果默认没有,可以在项目上右键–新建项–应用程序配置文件,命名为App.config。
代码:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="SAP.Middleware.Connector">
<sectionGroup name="ClientSettings">
<section name="DestinationConfiguration" type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/>
</sectionGroup>
</sectionGroup>
</configSections>
<SAP.Middleware.Connector>
<ClientSettings>
<DestinationConfiguration>
<destinations>
<add NAME="S4H" USER="KN089" PASSWD="Hs87654321" CLIENT="400" SYSNR="04" ASHOST="116.6.45.30" LANG="ZH" GROUP="PUBLIC" MAX_POOL_SIZE="10" IDLE_TIMEOUT="600"/>
</destinations>
</DestinationConfiguration>
</ClientSettings>
</SAP.Middleware.Connector>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
引用SAP中间件:
获取登录信息,并注册客户端:
绘制窗口的控件
添加按钮,修改按钮的文本:
绘制一个DataGridView:
最终布局
代码
Form.cs代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SAP.Middleware.Connector;
namespace WindowsFormsApp1_RFC
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private RfcDestination _rfcDestination = null;
public DataTable dtr = new DataTable();
public void RegisterDestination() //注册客户端
{
try
{
if (_rfcDestination == null)
{
_rfcDestination = RfcDestinationManager.GetDestination("S4H");
//这里报错了
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
//在事件或者方法中调用
this.RegisterDestination();
this.InvokeRFCFunctionGetCompanyID(textBox1.Text);
}
public string InvokeRFCFunctionGetCompanyID(string IN_CARRID)
{
//this.dataGridView1.DataSource ="*;
dtr.Clear();
dtr.Columns.Clear();
IRfcFunction function = null;
string str = string.Empty;
try
{
RfcRepository SapRfcRepository = _rfcDestination.Repository;
function = SapRfcRepository.CreateFunction("Z_TEST_CSHAP_GET_SFLTGHT"); //调用服务器函数Z_TEST_CSHAP_GET_SFLTGHT
function.SetValue("IN_CARRID", IN_CARRID); //传入
//function.SetValue("IN_AGE2", Inige2); //传入参数
function.SetParameterActive(0, true);
function.Invoke(_rfcDestination); //执行服务器调用的函数
IRfcTable myrfcTable = function.GetTable("OUT_SFLIGHT"); //rfc server function 返回值table结构名称
int liElement = 0;
for (liElement = 0; liElement <= myrfcTable.ElementCount - 1; liElement++)
{
RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
dtr.Columns.Add(metadata.Name);//循环创建列
}
foreach (IRfcStructure dr in myrfcTable)
{
DataRow row = dtr.NewRow();//创建新行
for (liElement = 0; liElement <= myrfcTable.ElementCount - 1; liElement++)
{
RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
row[metadata.Name] = dr.GetString(metadata.Name).Trim();
}
dtr.Rows.Add(row);
}
this.dataGridView1.DataSource = dtr;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return str;
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
}
项目配置
报错
SAP.Middleware.Connector.RfcDestinationManager报错
解决:检查sapnco的版本,注意sapnco的版本和.NET框架的版本是否匹配,一开始我使用的是vs2022,版本太新,是.NET6的,现在使用vs2019,并且使用.NET4.8的版本,sapnco的版本是3.0,这样是可以的。
System.BadImageFormatException报错
一开始是:
试试改一下这个:
改完之后ok了。
SAP.Middleware.Connector.RfcLoginexception报错
解决:将app.config中的域名改成ip地址:
找到IP地址,我用的是域名
IP地址:116.6.45.30
SAP.Middleware.Connector.RfcInvalidStateException报错
函数模块不存在:
解决:登录SAP系统,查看是否是激活的状态,并且检查函数名称!!!
后面发现是一个字母写错了。
发现这个是未激活的状态,先激活一下:
注意函数名称!!!!
运行结果
解决完错误之后,点击执行,测试结果如下:
总结
- 注意sapnco与 .net版本的匹配
- 注意项目的设置,比如首选“Any cpu”或者“x64”
- 注意App.config的内容
- 注意函数名称,不要写错