利用 Sapnco 在.net/c# 中跨系统调用 SAP RFC 功能,执行SAP中的函数

利用Sapnco 在.net/c# 中跨系统调用 SAP RFC 功能,执行SAP中的函数

Sapnco  -C#中使用的核心组件,sap官网有下,本文使用的版本在 framework  平台使用,

sap 官网地址,但是下载要权限,全名称为: 

SAP Connector for Microsoft .NET ,链接:https://support.sap.com/en/product/connectors/msnet.html?anchorId=section_512604546

 

核心功能其实就是用到两个dll:

sapnco.dll

sapnco_utils.dll

没有的可以到这个网盘下载  网盘地址

提取码: vhjz  

本文是在 .net 4.8 上测试使用

实现效果如下,输入料号,点button1, 即可通过该winform,远程调用sap函数,然后返回 料号的 描述到 winform 画面上

步骤如下:

1. SAP中se37建立一个函数:ZKAVEN_F001 ,注意勾上启用远程模式。

该函数作用就是输入一个料号,查询出该料号的描述,和得到一个类似mara 表的关于物料代码信息的内表 

输入参数:

输出参数:

 输出表:

 代码:很简单,就是获取一个料号描述给到上面的输出参数,给一个内表到上面的参数表

 先sap自行测试下:

 

可以得到一个描述 和一个内表, 共两个输出

 以上是SAP 中函数建立过程,没啥问题,sap自行测试已通过。

2.打开visual studio 2022, 创建一个.NET Framework 项目

 本文用的 .net 4.8

右击项目,添加引用,引用下载的 两个dll

程序中先 using SAP.Middleware.Connector; 

winform 添加3个组件 textbox label button

完成代码如下:

复制代码
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 WindowsFormSAP_RFC1
{
    public partial class Form1 : Form
    {
     
        public Form1()
        {
            InitializeComponent();
        }

        public void nco()
        {
            RfcDestination prd = RfcDestinationManager.GetDestination("PRD_000");
            // RfcDestinationManager.UnregisterDestinationConfiguration(ID);  //返注册
            nco(prd);
        }
        public void nco(RfcDestination prd)
        {
            RfcRepository repo =  prd.Repository;
            IRfcFunction companyBapi = repo.CreateFunction("ZKAVEN_F001");   //调用函数名
            companyBapi.SetValue("L_MATNR", this.textBox1.Text.ToString());   //设置Import的参数
            companyBapi.Invoke(prd);   //执行函数
            IRfcTable table = companyBapi.GetTable("IT_MARA");  //获取相应的品号内表
            string MAKTX = companyBapi.GetValue("L_MAKTX").ToString();  //获取品名

            this.label1.Text = MAKTX;   //显示品名
            prd = null;
            repo = null;
        }
        //登陆SAP前的准备工作
        public class MyBackendConfig : IDestinationConfiguration
        {
            public RfcConfigParameters GetParameters(String destinationName)
            {
                if ("PRD_000".Equals(destinationName))
                {
                    RfcConfigParameters parms = new RfcConfigParameters();
                    parms.Add(RfcConfigParameters.Name, "PRD_000");
                    parms.Add(RfcConfigParameters.AppServerHost, "10.100.112.11");   //SAP主机IP
                    parms.Add(RfcConfigParameters.SystemNumber, "10");  //SAP实例


                    parms.Add(RfcConfigParameters.User, "xxx");  //用户名
                    parms.Add(RfcConfigParameters.Password, "xxxxx");  //密码
                    parms.Add(RfcConfigParameters.Client, "710");  // Client
                    parms.Add(RfcConfigParameters.Language, "ZH");  //登陆语言
                    parms.Add(RfcConfigParameters.PoolSize, "5");

                    return parms;
                }
                else return null;
            }
            public bool ChangeEventsSupported()
            {
                return false;
            }
            public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IDestinationConfiguration ID = new MyBackendConfig();  //连接池
            RfcDestinationManager.RegisterDestinationConfiguration(ID);
            nco();
        }
    }
}
复制代码

 

 另一边利用 SapNwRfc 实现同样功能,可参考 链接:https://www.cnblogs.com/cnishop/p/18729102

posted @   轻烟随风  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示