.NET用NCO连接SAP 从RFC查询数据 代码配置连接SAP的信息

关键词:在代码中设置SAP连接信息,从RFC查询数据解析成DataTable

1.环境:

a. win7+64位操作系统    b. VS2012

c. nco3.0,是SAP针对.Net开发的专用组件(64bit 下载网址:http://www.dllbang.com/dll/sapnco_dll )

d. (可能用到)Microsoft Visual C++ 2005 Service Pack 1,用于运nco3.0的dll文件

下载网址:http://www.microsoft.com/en-us/download/details.aspx?id=14431

e. 安装NCO3.0后在C:\Program Files\SAP\SAP_DotNetConnector3_x86目录下面会有sapnco_utils.dll sapnco.dll rscp4n.dll libicudecnumber.dll四个DLL文件,在项目里面添加引用前两个 DLL文件即可(可在项目中建立一个文件夹,放置这两个dll,再引用文件夹里的这两个dll),还要将项目的.NET目标平台改为4.0。

2.目的:连接SAP的一个查询数据的RFC,调用并解析返回数据成DataTable

3.RFC结构:ZCP3_MMIF002ZBZZ125 的结构:

1)输入参数 Import : INPUT,如下图:

INPUT的具体结构如下图:

2)输入/输出参数 Tables:有很多,下面每一行都是一个(后面代码中以 JHNUM和JHTYP为例),如下图:

其中 JHNUM的结构如下图:

其中 JHTYP的结构和上面JHNUM的结构一样。

3)输出参数-查询结果,是 输入/输出参数Tables中的 HEADER,如下图:

HEADER的结构如下:(后面C#代码中就查询HEADER中的这些字段)

4.测试用查询条件:

INPUT里的BUKRS:K999

INPUT里的WERKS:X666

Tables里的JHNUM:  SIGN:I      OPTION:EQ      LOW:00000001      HIGH: (空字符串"")

Tables里的JHTYP:     SIGN:I      OPTION :BT     LOW:1                    HIGH:2

5.代码

<span style="font-family:Microsoft YaHei;font-size:14px;">
//C#代码创建Sap连接对象的类SapConnection
public class SapConnection : IDestinationConfiguration
    {
        public RfcConfigParameters GetParameters(string destinationName)
        {
            RfcConfigParameters conf = new RfcConfigParameters();
            if (destinationName == "NSP")//给连接SAP的对象命个名
            {
                conf.Add(RfcConfigParameters.AppServerHost, "sap服务器IP地址");
                conf.Add(RfcConfigParameters.SystemNumber, "sap实例号 如00");
                conf.Add(RfcConfigParameters.SystemID, "");
                conf.Add(RfcConfigParameters.User, "登录sap账号");
                conf.Add(RfcConfigParameters.Password, "密码");
                conf.Add(RfcConfigParameters.Client, "sap的Client号");
                conf.Add(RfcConfigParameters.Language, "ZH或者EN");
            }
            return conf;
        }
        public bool ChangeEventsSupported()
        {
            return true;
        }
        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
    }

//自定义的调用RFC的类
public class NcoQueryRFC
    {
        //创建Sap连接对象的类SapConnection的实例global_dest,单例模式
        private static RfcDestination global_dest;
        public static RfcDestination SapConnInfo()
        {
            if (global_dest == null)
            {
                SapConnection con = new SapConnection();//SapConnection类定义见代码末
                RfcDestinationManager.RegisterDestinationConfiguration(con);
            }
            global_dest = RfcDestinationManager.GetDestination("NSP");
            return global_dest;
        }

       //查询RFC的方法
        public static string GetHeadersFromSap()
        {

            RfcDestination dest = NcoQueryRFC.SapConnInfo();
            RfcRepository rfcrep = dest.Repository;
            IRfcFunction myfun = rfcrep.CreateFunction("ZCP3_MMIF002ZBZZ125"); //RFC的名称

            //传入结构INPUT
            IRfcStructure input = myfun.GetStructure("INPUT");
            input.SetValue("BUKRS", "K999");
            input.SetValue("WERKS", "X666");
            myfun.SetValue("INPUT", input);

            //传入Tables表中的 JHNUM
            IRfcTable table = myfun.GetTable("JHNUM");//RFC中要传入的JHNUM的表
            IRfcStructure import = null;
            var structMeta = rfcrep.GetStructureMetadata("ZCP3MMIF002ZBZZ125_S05");//是SAP里JHNUM这个表参考的结构
            import = structMeta.CreateStructure();
            import.SetValue("SIGN", "I");
            import.SetValue("OPTION", "EQ");
            import.SetValue("LOW", "00000001");
            import.SetValue("HIGH", "");
            table.Insert(import);

            //传入Tables表中的 JHTYP
            IRfcTable table2 = myfun.GetTable("JHTYP");
            IRfcStructure import2 = null;
            var structMeta = rfcrep.GetStructureMetadata("ZCP3MMIF002ZBZZ125_S05");
            import2 = structMeta.CreateStructure();
            import2.SetValue("SIGN", "I");
            import2.SetValue("OPTION", "BT");
            import2.SetValue("LOW", "1");
            import2.SetValue("HIGH", "2");
            table2.Insert(import2);

            myfun.Invoke(dest);//调用

            IRfcTable headTable = myfun.GetTable("HEADER");//RFC返回的HEADER结构集合

            DataTable dt2 = new DataTable();
            string[] rfcHeaderKeys = { "JHNUM", "BUKRS","BUTXT", "WERKS", "NAME1","JHTYP"};//要返回的DataTable里的列名
            foreach (string key in rfcHeaderKeys)
            {
                dt2.Columns.Add(key);
            }
            //循环把IRfcTable里面的数据放入Table里面
            for (int i = 0; i < (headTable.Count); i++)
            {
                headTable.CurrentIndex = i;

                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    DataRow dr = dt2.NewRow();
                    foreach (string key in rfcHeaderKeys)
                    {
                       dr[key] = headTable.GetString(key);
                    }
                    dt2.Rows.Add(dr);
                }
            }

            return dt2;
        }
}<span style="white-space: normal;">
</span></span>
时间: 2024-08-29 16:40:23

.NET用NCO连接SAP 从RFC查询数据 代码配置连接SAP的信息的相关文章

Jmeter数据库正常连接,可以正常查询数据,但是当条件为汉字是查询条件无效返回数据为空;

Jmeter数据库正常连接,可以正常查询数据,但是当条件为汉字是查询条件无效: 需要在连接配置的Database URL中添加&characterEncoding=utf-8即可: 原文地址:https://www.cnblogs.com/cjy-blog/p/10213621.html

JSP连接SQL数据库并且查询数据

具体代码如下: <!--导入包--> <%@ page language="java" import="java.util.*" %> <%@page import="java.sql.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE HTM

java实现连接mysql数据库单元测试查询数据项目分享

1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test;具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且添加对应的测试数据; (这里我使用的是绿色版的数据库,具体的下载地址:http://pan.baidu.com/s/1mg88YAc) 具体的建立数据库操作详见下图: 3.编写包中的各种类代码,具体参考代码如下: UserInfo.java /** * FileName: UserInfo.java

IntelliJ IDEA2017 java连接mysql数据库并查询数据

最近自己开始重新学习java基础了,做java开发不可避免要处理数据库,由于好久不写java了,对idea也有点陌生了.所以这里写篇用jdbc来连接mysql的文章 至于mysql怎么装,请自行百度 不多说先看代码 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

webconfig连接串的使用与用代码写连接串的使用

原文发布时间为:2008-07-25 -- 来源于本人的百度文章 [由搬家工具导入] 1、使用web.config中设置连接串 在web.config中<configuration>.......</configuration>之间加:(当然Connect Timeout=30可写可不写) <appSettings>     <add key="MyConn" value="Server=.\SQLEXPRESS;Database=M

oracle 查询数据变慢 ;重新收集信息;

oracle11g查看自动收集统计信息是否开启select client_name,status from dba_autotask_client; ----------------------------------------------------------------------------------------------------------- SYSDBA登录exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');exec db

第六章 查询数据

基本查询语句 select的基本语法: select 属性列表 from 表名和视图列表 [where 条件表达式1] [group by 属性名1 [having 条件表达式2]] [order by 属性2 [asc|desc]] 单表查询 如下表: 查询所有字段 mysql> select * from employee; 查询指定字段 select name,sex,homeaddr from employee; 查询指定记录 where 条件表达式 select * from empl

sql查询未走索引问题分析之查询数据量过大

前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉及对象的对象数据量,段大小,行数量,where条件列,是否存在索引,列的选择读情况如何 4.总结,优化整改 1.找到sql_text,sql_id 094cmrxrahdy2 SELECT 8~10个列名称(由于设计用户信息,因此部分信息不再详细说明) FROM Prescription WHERE

010.简单查询、分组统计查询、多表连接查询(sql实例)

-------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SELECT UNION --SELECT 'HAHA',1,32--UNION ALL --全部显示/显示重复数据 即使集合相同--UNION---------将查询的两个结果集合并.结构必须一致 -->常见面试题 --SELECT 'HEHE',2,33------将查询结果添加到列表中(子查询)IN