ABAP接口部分-C#调用RFC

目录

  • 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_SFLTGHTfunction.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系统,查看是否是激活的状态,并且检查函数名称!!!
后面发现是一个字母写错了。
发现这个是未激活的状态,先激活一下:
在这里插入图片描述

注意函数名称!!!!
在这里插入图片描述

运行结果

解决完错误之后,点击执行,测试结果如下:
在这里插入图片描述

总结

  1. 注意sapnco与 .net版本的匹配
  2. 注意项目的设置,比如首选“Any cpu”或者“x64”
  3. 注意App.config的内容
  4. 注意函数名称,不要写错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合实现类研究底层(部分):手撕ArrayList底层源码、手撕LinkedList底层源码、手写单向链表和双向链表

day26上 集合框架图 标绿已经学习底层&#xff0c;深入底层主要是研究实现类底层 继承关系图 手撕ArrayList底层源码 ps:研究添加元素的过程 思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程 提升&#xff1a…

BUGKU-WEB ezbypass

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 代码审计题目发现需要构造一个字符串&#xff0c;使得它不包含字母、数字、特殊字符的PHP代码片段&#xff0c;长度小于105&#xff0c;然后传递给$codepost提交参数&#xff0c;eval&#xff08;&…

数仓基础理论(一)

数据仓库概念 数据库 vs 数据仓库 从数据来源进行区分 数据库&#xff1a;企业中基础核心的业务数据 数据仓库&#xff1a;数据库中的数据 从数据存储进行区分 数据库&#xff1a;核心作用就是查找业务数据&#xff0c;基本上行式存储(带有索引)&#xff0c;基本上无法存…

大模型学习笔记六:Semantic Kernel

文章目录 一、Semantic Kernel介绍和发展1&#xff09;SK 的语言开发进展2&#xff09;SK的生态位3&#xff09;SK基础架构 二、环境搭建1&#xff09;初始化2&#xff09;Semantic Functions&#xff08;不用编写代码&#xff0c;用配置实现回调函数&#xff09;3&#xff09;…

js的异常处理

1、throw抛异常 throw抛出异常信息&#xff0c;程序也会终止执行&#xff1b; throw后面跟的是错误提示信息&#xff1b; new Error() 配个throw使用&#xff0c;能设置更详细的错误信息。 function counter(x,y) {if (!x || !y) {throw new Error(参数不能为空)}retu…

Kotlin 数据解析(Gson)

一、添加依赖 build.gradle.kts(:app) // gson数据解析implementation("com.google.code.gson:gson:2.8.6") 对象类&#xff1a; // 对象类 class Account {var uid:String "00001"var userName:String "Freeman"var password:String &quo…

k8s+wordpress+zabbix+elastic+filebeat+kibana服务搭建以及测试

一&#xff0c;环境&#xff1a;docker&#xff0c;k8s&#xff0c;zabbix&#xff0c;以及搭建worpdress&#xff0c;elasticsearch&#xff0c;filebeat&#xff0c;kibana 二&#xff0c;主机分配&#xff1a; 名称host详述个人博客3192.168.142.133 搭配mysql8.0.36的数据…

DVWA靶场-暴力破解

DVWA是一个适合新手锻炼的靶机&#xff0c;是由PHP/MySQL组成的 Web应用程序&#xff0c;帮助大家了解web应用的攻击手段 DVWA大致能分成以下几个模块&#xff0c;包含了OWASP Top 10大主流漏洞环境。 Brute Force——暴力破解 Command Injection——命令注入 CSRF——跨站请…

SublimeText4 安装

Sublime Text 可以编写html&#xff0c;css&#xff0c;js&#xff0c;php等等&#xff0c;是一个轻量、简洁、高效、跨平台的编辑器。 图1&#xff1a;SublimeText官网 Sublime Text具有漂亮的用户界面和强大的功能&#xff0c;例如代码缩略图&#xff0c;Python的插件&#…

Java的编程之旅41——字符流

目录 1.字符流的简介 2.字符的编码与解码 3.字符流读写操作 1.字符流写入 2.字符流复制文件 4.FileWriter&FileReader 5.缓冲区高效读写 6.序列化与反序列化 1.字符流的简介 在Java中&#xff0c;字符流是用于处理字符数据的输入输出流。它是以字符为单位进行处理&a…

读取txt文件并统计每行最长的单词以及长度

读取txt文件并统计每行最长的单词以及长度 题目 在 D:\\documant.txt 文本中,文件中有若干行英文文本,每行英文文本中有若干个单词&#xff0c;每个单词不会跨行出现每行至多包含100个字符,要求编写一个程序,处理文件,分析各行中的单词,找到每行中的最长单词&#xff0c;分别…

群晖docker安装sql server

安装步骤 开启群晖 SSH&#xff0c;通过 SSH 工具连接到群晖&#xff0c;运行下面的命令拉取mssql 2019 镜像 sudo docker pull mcr.microsoft.com/mssql/server:2019-latest然后在 docker 中就可以看到该镜像&#xff1a; 在群晖 docker 共享文件夹中创建 mssql2009 文件夹 …

ABAP - cl_gui_alv_grid cl_salv_table的各种处理

这篇文章主要是记录一下cl_gui_alv_grid 和 cl_salv_table 两种方式的ALV的字段&#xff0c;事件等的处理 举例&#xff0c;下面这个是用一个screen&#xff0c;显示2个ALV&#xff1b;上面这一个是用alv grid的&#xff1b;下面那一个是用salv去实现的 alv grid 主要涉及&am…

神舟通用-神通MPP

1、国产MPP 神通MPP是以多年大型通用数据库领域的研发实力为基础&#xff0c;集深厚的航天信息化建设经验&#xff0c;集成多项先进技术&#xff0c;为满足航天、政府、金融、电信等行业的海量数据分析统计应用需求而打造的分布式数据库软件&#xff0c;具有负载衡、在线扩展、…

基于ssm的志愿者招募系统的设计与实现(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

nginx有几种启动方式

Nginx 通常可以以两种主要的方式启动&#xff1a;作为前台进程运行或作为守护进程&#xff08;后台&#xff09;运行。 前台运行&#xff1a; 当Nginx以前台模式运行时&#xff0c;它会在命令行保持活动状态&#xff0c;所有的日志输出都会直接显示在命令行上。这种模式通常用于…

Redis底层数据结构之List

文章目录 1. Redis 6的list源码分析1. Redis 7的list源码分析 1. Redis 6的list源码分析 首先我们查看一下redis 6关于list的相关配置&#xff1a; config get list*可以看见redis 6的quicklist底层使用的数据结构是ziplist list-compress-depth&#xff1a;表示一个quicklis…

【力扣hot100】刷题笔记Day25

前言 这几天搞工作处理数据真是类似我也&#xff0c;还被老板打电话push压力有点大的&#xff0c;还好搞的差不多了&#xff0c;明天再汇报&#xff0c;赶紧偷闲再刷几道题&#xff08;可恶&#xff0c;被打破连更记录了&#xff09;这几天刷的是动态规划&#xff0c;由于很成…

Node携手MongoDB探险旅行⛏️

Node携手MongoDB探险旅行⛏️ 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 文章简单学习总结&#xff1a;如有错误 大佬 &#x1f449;点. 本篇不适合纯新手&#xff0c;因为本人已经使用很多数据库&#xff0c;很多数据库概念…就不会进行解释&#xff…

presto / trino plugin(自定义UDF函数)开发指南

方案1:自定义udf插件开发 1. Presto插件机制 presto不能像hive那样配置自定义的udf,而是采用插件机制实现。Presto 的插件(Plugin)机制,是 Presto 能够整合多种数据源的核心。通过实现不同的 Plugin,Presto 允许用户在不同类型的数据源之间进行 JOIN 等计算。Presto 内部的…