前言

该公司很快就接到了一个项目,SAP有接口。让我们做老大SAP。首先SAP联系。但发展从来没有打过。本周集中在这一个研究.

各种碰壁,SAP该系统让我怎么说? 算了。说多了都是泪,以下附上本周学习成果。大家一起探讨一下。ABAP 还得多学学.

Package (tcode:se80)

输入须要创建的 Package ,例:ZTP (之前用T打头測试。貌似不行,大家能够试试)

点  Yes 创建.

输入创建Package的信息.

Table (tcode:se11)

点击Create.

点击保存,弹出选择Package界面

保存就可以.

切换到 Fields 选项卡:

一个字段可相应一个数据元素,一个数据元素可相应多个字段.

如上图: ZAGE 数据元素不存在,双击可进入:

提示不存在,则创建.

输入数据类型,长度:

保存。都会提示选择Package,后面就不说了.

激活该数据元素.

回到创建表界面,就可以发现数据类型和长度都已显示.

点击 技术设置.

保存就可以.

点击 索引.

点击创建索引.

输入索引名字.

选择字段等

保存,激活索引,激活表.

上面忘记设置 Key,选一个字段设置Key就可以.

Function Group (tcode:se37)

输入创建Function Group的信息.点击保存后弹出选择 Package 的界面:

选择刚刚创建的 Package :

保存就可以.

Function Module (tcode:se37)

Z_TEST_1

点击创建 , 选择函数组.

创建后 , 在Attributes选项卡 选择 Remote 远程调用函数.

这里简单说一下 Import,Export,Tables 三个选项卡

Import 就是须要导入的字段,在SAP的測试执行的时候能够输入该值进行測试,外部程序调用时传值进入,能够理解 Java方法參数.

Export 就是导出字段,程序运行完毕后返回字段,能够理解 Java方法返回值,只是能够返回多个.

Tables 能够作为导入、导出, 他的字段为数据结果。事实上就是一个复杂參数,比方说外围程序调用要传入一批数据。就能够使用他了,导出一样,能够返回一批数据.

这里我们就使用Table做一个批量上传数据的一个功能,点击 Tables选项卡,定义字段

Parameter Name,參数名,自定义

Type spec,參数类型 。普通值使用Type就可以。只是在Tables这里一般定义复杂类型。使用Like模拟一个结构对象

Associated Type,使用Like 时输入我们的參考对象,能够是表、视图、元素等.

然后回车就可以,第一次回车好像报红,再回车一次就能够了,不知道其他大神有没有遇到过.

点击 Source code 选项卡,进入编码.

小白也不知道复杂的编码,所以仅仅能简单写一下了.

我们的目标是将传入的数据插入到SAP的内表中,编码例如以下

INSERT ZTAB01 FROM TABLEIMPT.

以上代码就能够啦,将传入的 IMPT 导入到内表中.

先保存,点击Check。无错误激活就可以.

然后点击激活.

左下角会提示激活.

然后我们能够測试一下程序是否成功.

进入到输入參数界面,就可以看到我们定义的Tables字段.

点击进入编辑数据.

完毕编辑后,返回.

点击运行就可以.

此为运行结果.

通过 tcode:se11 进入到数据库表查看数据

数据已插入到SAP内表.

Z_TEST_2

数据上传已经完毕。这个时候我们做一个数据查询的Function.

相同我们选择 远程调用函数

这个时候我们加一个 Import參数,有选择性的依据条件来查询.

在Tables參数我们加一个返回參数.

设置好后,进入编码 source code.

*推断传入參数是否为空
IF DZNAME = '' .
*为空查询全部数据
SELECT * INTOTABLE OUTT FROM ZTAB01.
ELSE.
SELECT * INTOTABLE OUTT FROM ZTAB01 WHERE ZNAME = DZNAME.
ENDIF.

点击 Check,无问题后。激活測试.

測试时,输入參数显示出来了.

运行后。上图已出结果。点击进入查看明细.

不输入条件时查询.

到此RFC我们就已经创建好了.

Java

准备工具

Eclipse

SapJco.jar

librfc32.dll

sapjcorfc.dll

(以上两个动态连接须要载入,最简单的办法就是放在和Java运行程序放在一起,事实上就是JDK环境 bin 文件夹下)

环境

Window 环境

JDK 1.6 32位

首先准备了一个工具类。连接SAP.

import com.sap.mw.jco.IFunctionTemplate;
import com.sap.mw.jco.JCO;
import com.sap.mw.jco.JCO.Client; /**
* SAP 连接工具类
* @author berr
* 2014.11.7
*/
public class SapConn { private JCO.Client client; //客户端连接对象
private JCO.Function function; //RFC Function 对象
String host,clientId,userName, password,lang, sysnr; //地址,客户端。username。密码,语言。系统标识 public SapConn(){ } /**
* 创建连接对象
*/
public void connect(){
client = JCO.createClient(clientId, userName,password,lang,host,sysnr);
client.connect();
} /**
* 断开连接
*/
public void disconnect(){
client.disconnect();
} public Client getClient() {
return client;
} public void setClient(Client client) {
this.client = client;
} /**
* 注冊并获取一个RFC函数
* @param reName 注冊名称。随意
* @param ftName RFC 名称
*/
public void regFunction(String reName,String ftName){
JCO.Repository mRepository = new JCO.Repository(reName,this.client);
IFunctionTemplate ft = mRepository.getFunctionTemplate(ftName.toUpperCase());
this.function = ft.getFunction();
} /**
* 设置输入參数
* @param parameter 參数名
* @param value 值
*/
public void setImport(String parameter,String value){
JCO.ParameterList im = this.function.getImportParameterList();
im.setValue(value,parameter);
} /**
* 获取Tables结构对象
* @param tableName 參数名称
* @return
*/
public JCO.Table getTable(String tableName){
return this.function.getTableParameterList().getTable(tableName);
} /**
* 运行当前注冊的函数
*/
public void execute(){
this.client.execute(this.function);
} public JCO.Function getFunction() {
return function;
} public void setFunction(JCO.Function function) {
this.function = function;
} }

这里我们開始准备測试类

測试插入RFC函数。代码例如以下

import com.sap.mw.jco.JCO;

public class CallInsert {

	public static void main(String[] args) {

		SapConn sc = new SapConn();
sc.host="192.168.0.140";
sc.clientId = "001";
sc.userName = "dev";
sc.password = "d123456";
sc.lang = "zh";
sc.sysnr="000";
/*以上都是连接SAP须要的信息,登录SAP GUI也须要这些,就不多解释了*/ sc.connect();//创建连接 String function1 = "Z_TEST_1";
sc.regFunction(function1,function1); //注冊并获取一个Function JCO.Table imt = sc.getTable("IMPT"); //获取Function 中设置的Tables參数 for (int i = 0; i < 10; i++) {
imt.appendRow(); //添加一行
imt.setValue(i, "ZAGE"); // 设置 ZAGE 值,必须为大写
imt.setValue("C" + i, "ZNAME");// 设置 ZNAME 值,必须为大写
} sc.execute(); sc.disconnect(); }
}

运行成功后,返回SAP查看结果.

測试查询RFC函数,代码例如以下

import com.sap.mw.jco.JCO;

public class CallQuery {

	public static void main(String[] args) {

		SapConn sc = new SapConn();
sc.host="192.168.0.140";
sc.clientId = "001";
sc.userName = "dev";
sc.password = "d123456";
sc.lang = "zh";
sc.sysnr="000";
/*以上都是连接SAP须要的信息,登录SAP GUI也须要这些。就不多解释了*/ String tpl = "name:%s,age:%s"; sc.connect();//创建连接 String function1 = "Z_TEST_1";
sc.regFunction(function1,function1); //注冊并获取一个Function String zname = "C1";
sc.setImport("DZNAME",zname); //设置输入參数 sc.execute(); JCO.Table imt = sc.getTable("OUTT"); //获取Function Tables中的数据 System.out.println("-------依据条件"+zname+"查询-----------");
do{
Object name = imt.getValue("ZNAME");
Object age = imt.getValue("ZAGE");
System.out.println(String.format(tpl, name,age)); }while(imt.nextRow()); System.out.println("-------不依据条件查询-----------"); sc.regFunction(function1,function1); //注冊并获取一个Function
sc.execute(); imt = sc.getTable("OUTT"); //获取Function Tables中的数据 do{
Object name = imt.getValue("ZNAME");
Object age = imt.getValue("ZAGE");
System.out.println(String.format(tpl, name,age)); }while(imt.nextRow()); sc.disconnect(); }
}

运行结果例如以下:

以上,简单的RFC程序开发与外部程序调用就完毕了,欢迎大家一起交流.

以下再总结一些外部程序调用的异常情况.

动态链接库未载入

Exceptionin thread "main" java.lang.ExceptionInInitializerError:JCO.classInitialize(): Could not load middleware layer'com.sap.mw.jco.rfc.MiddlewareRFC'
JCO.nativeInit():Could not initialize dynamic link library sapjcorfc [no sapjcorfc injava.library.path]. java.library.path[D:\work\wms\jdk1.6.0_26\jre\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;E:/jdk15/BIN/../jre/bin/client;E:/jdk15/BIN/../jre/bin;E:/jdk15/BIN/../jre/lib/i386;d:\app\berr\product\11.2.0\client_1\bin;E:\jdk15\BIN;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\eclipse-jee-indigo-SR2-win32\eclipse;;.]
atcom.sap.mw.jco.JCO.<clinit>(JCO.java:776)
at SapConn.connect(SapConn.java:26)
at CallInsert.main(CallInsert.java:18)

解决方式:将sapjcorfc.dll,librfc32.dll 载入到JDK动态链接库中。最简单的办法及拷贝到JAVA_HOME/bin文件夹下.

RFC 未开启远程调用

Exceptionin thread "main" com.sap.mw.jco.JCO$Exception: (104)RFC_ERROR_SYSTEM_FAILURE: The function module "Z_TEST_2" cannot beused for 'remote' calls.
atcom.sap.mw.jco.rfc.MiddlewareRFC$Client.nativeExecute(NativeMethod)
at com.sap.mw.jco.rfc.MiddlewareRFC$Client.execute(MiddlewareRFC.java:1242)
atcom.sap.mw.jco.JCO$Client.execute(JCO.java:3816)
atcom.sap.mw.jco.JCO$Client.execute(JCO.java:3261)
at SapConn.execute(SapConn.java:82)
at CallQuery.main(CallQuery.java:30)

解决方式:开启远程调用就可以.

以上。希望大家交流交流! 本人邮箱:berr@live.cn  ,博客不能上传附件,须要Java源代码的能够Email我。

Java 源代码已上传 http://download.csdn.net/detail/iberr/8133125.

版权声明:本文博主原创文章,博客,未经同意不得转载。

SAP RFC 函数来创建 Java呼叫 学习总结 一步一步的插图的更多相关文章

  1. C# 使用 SAP NCO3.0 调用SAP RFC函数接口

    最近使用C#调用SAP RFC函数,SAP提供了NCO3.0组件. 下载组件安装,之后引用“sapnco.dll”和“sapnco_utils.dll”两个文件. 在程序中 using SAP.Mid ...

  2. .net 调用SAP RFC函数获取数据的两种方式

    方式1:使用客户端自带的组件 安装客户端以后,添加引用:SAPFunctionsOCX(.net 的Com列表里一般找不到,需要引用DLL[一般位于以下路径:Program Files\SAP\Fro ...

  3. SAP RFC函数

    RFC 接口 RFC是对一个函数模块的调用,但是调用者的系统与被调函数所在的系统是不一样的. RFC也可以在系统内被调用,但是通常调用和被调用是在不同的系统中的. 在sap系统中,远程调用的能力是有R ...

  4. SAP RFC函数远程调试跟踪管理软件

    最近在搞OA系统与sap的接口开发,接口太多老是和.net的开发人员打嘴仗,为了避免不必要的纠结,自己做了一个rfc的调试工具,有些问题调试起来也比较容易了.程序是delphi开发的,为了保证程序可以 ...

  5. java 调用SAP RFC函数错误信息

    RFC接口调用SAP如果有异常会通过com.sap.mw.jco.JCO$Exception: 抛出异常 在开发中遇到的异常有如下 用户名密码可能是错误或者用户无权限,确认用户,必要时联系SAP负责人 ...

  6. Java连接Sap系统调并调用RFC函数

    参考博客:https://blog.csdn.net/qq_36026747/article/details/81287462                   https://www.cnblog ...

  7. 介绍SAP预留函数创建搜索帮助

    紧接上一节介绍的SAP预定义的出口函数F4IF_SHLP_EXIT_EXAMPLE创建搜索帮助, 该函数主要有两个部分: Changing接口的参数属性如下: SHLP:搜索帮助的基础描述,包括搜索帮 ...

  8. [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 最新.net和Java调用SAP RFC中间件下载

    还记得2012年初我发布的全网络第一个关于.net 连接SAP RFC的NCO3原创博文,用的就是SAP出的最新的.Net Connector 3.0的版本,在那个时候都是普遍用其他蹩脚的方式或Web ...

随机推荐

  1. FusionCharts简单教程---建立第一个FusionCharts图形

    由于项目需求需要做一个报表,选择FusionCharts作为工具使用.由于以前没有接触过报表,网上也没有比较详细的fusionCharts教程,所以决定好好研究FusionCharts,同时做一个比较 ...

  2. Oracle 阅读器-刚看完表空间回复的详细解释

    (一) 当使用一个控制文件的备份恢复,例如下面的附图.使用备份控制文件恢复位置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVtb25zb24=/fo ...

  3. uip UDPclient模式通信移植,p本地ort可以是无规

    现在移植UDPclient模式,使用广播地址检测. //udp_client.c /********************************************************** ...

  4. C++ Primer 学习笔记_40_STL实践与分析(14)--概要、先来看看算法【上】

    STL实践与分析 --概述.初窥算法[上]     标准库容器定义的操作很少.并没有给容器加入大量的功能函数.而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是"泛型"的. ...

  5. C#实现远程机器管理

    原文:C#实现远程机器管理 目前处于待离职状态,原先所有的工作都在进行交接,过程当中不乏有很多先前整理的和动手尝试实现的功能:我的主页中已经列出来一部分内容,有兴趣的可以前往看一看. 接下来的内容主要 ...

  6. go语言实现遍历目录,及查找特定的文件类型

    // filelist.go package main import ( //"flag" "fmt" "os" "path/fi ...

  7. org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/jiaoshi/daochuEx

    org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/jiaoshi/daochuEx ...

  8. iOS开展-clang: error: unknown argument: &#39;-websockets&#39;解决方案

    问题: 昨天莫名其妙Xcode自己主动升级,那么今天之前执行project什么时候,不知怎的,他们都获得了. 错误内容: clang: error: unknown argument: '-webso ...

  9. poj 3074 Sudoku(Dancing Links)

    Sudoku Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8152   Accepted: 2862 Descriptio ...

  10. Android - 用Fragments实现动态UI - 创建灵活的UI

    当设计程序来支持各种不一样的屏幕尺寸时,可以在不同的布局中重用fragment来根据可用的屏幕大小来优化用户体验. 例如,在手机上可能使用一个fragment来使用单窗口用户体验比较合适.但是,你可能 ...