ABAP接口部分-C#调用RFC

news/2024/7/8 2:31:03

目录

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

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

运行结果

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

总结

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

http://lihuaxi.xjx100.cn/news/2082471.html

相关文章

第十二章执行引擎

第十二章执行引擎 文章目录 第十二章执行引擎0. 前情概述1. 执行引擎的概述1.1 执行引擎的工作过程 2. Java代码编译和执行的过程什么是解释器&#xff1f;什么是JIT编译器&#xff1f;为什么说java是半编译半解释型语言 3. 机器码、指令、汇编语言机器码指令指令集汇编语言高级…

STM32基本定时功能

1、定时器就是计数器。 2、怎么计数&#xff1f; 3、我们需要有一恒定频率的方波信号&#xff0c;再加上一个寄存器。 4、比如每来一个上升沿信号&#xff0c;寄存器值加1&#xff0c;就可以完成计数。 5、假设方波频率是100Hz&#xff0c;也就是1秒100个脉冲。…

基于c语言的大宗商品撮合交易平台的市场价值

大宗商品撮合交易平台的市场价值主要体现在以下几个方面&#xff1a; 提高市场流动性&#xff1a;平台通过自动化撮合和高效的交易处理&#xff0c;降低了交易成本&#xff0c;提高了市场流动性。这使得投资者能够更容易地找到合适的交易对手&#xff0c;促进交易的成交。 促进…

【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言

​​发表时间&#xff1a;2024年2月21日 BSV区块链协会宣布上线JavaScript和TypeScript SDK&#xff08;即“标准开发工具包”&#xff09;。TypeScript SDK旨在为开发者提供新版统一核心代码库&#xff0c;以便利开发者在BSV区块链上开发能够任意扩容的应用程序。新上线的SDK替…

2024年目标检测研究进展

YOLOv9 图片来源网络 YOLO相关的研究&#xff1a;https://blog.csdn.net/yunxinan/article/details/103431338

使用Migration升级数据库

使用Migration升级数据库 package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; impo…

万字完整版【C语言】指针详解~

一、前言 初始指针&#xff08;0&#xff09;&#xff1a;着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针&#xff08;1&#xff09;&#xff1a;讲解指针变量常见的类型&#xff0c;如何去理解这些类型、最后就是如何正确的使用深入指针&#…

Spring Boot单元测试与热部署简析

1 Spring Boot的简介 Spring Boot是一个用于构建独立的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的开发过程&#xff0c;提供了自动配置和默认配置&#xff0c;使得开发者只需专注于业务逻辑的实现&#xff0c;而不用去关注繁琐的配置问题。 Spring …