1, SAP RFC基础知识
RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP系统。这种远程功能调用也可在同一系统内部进行(如本地SAP系统内的远程调用);但通常情况下,调用程序和被调用程序处于不同系统。
2, 实例业务场景
函数目的:OA通过读取采购订单号获取物料号最近5次变价记录,结果如下图
3, 创建RFC
1) 通过TCode:SE37,我们既可以进入RFC的开发初始界面,如下图。
2) 与Report不同的是,新建RFC程序前必须先定义一个FuncitonGroup,一个Group下可包含多个Function,创建Function Group的命令的具体操作路径为:Goto-Function groups-Create group,
3) 单击Creategroup 命令后将弹出Create Function Group对话框,要求输入自定义的Function group 名称及描述
4) 单击保存按钮后系统进入CreateObject Directiory Enter 对话框,该界面中需要输入开发类并选择保存类型,STMP表示保存本地类,也可单击本地对象按钮选择保存在本地
5) 选择本地对象按钮保存Function group,系统返回初始界面。
输入自定义Function名称:Z_RFC_SHIZHANSTUDY,单击Create按钮,SAP将弹出Group设置属性对话框,
6) 输入本例所建Function Group及描述,单击Save按钮保存定义。
到此为止,该Function已被创建成功,系统进入初始界面。可以看到系统自动生成了预代码,但是还不具备任何功能,需要对Function的输入输出参数及数据处理逻辑程序进行设置,
7) Function编辑器共分为7个页面,在Attributes属性设置窗口,设置如下图所示。允许该Function被SAP及非SAP程序调用。
8) Import为数据输入接口,其接口参数可以为单个变量或者为一个结构体。本例为单个变量,
9) Tables可同时作为输入输出接口,其参数可为单个变量或Struct或内表。本例为Struct,如下图。本例创建结构步骤省略
10) 单击Source Code选项卡切换到ABAP代码编辑窗口,接口中所定义的参数都是该Function代码的私有变量,可以在Function中直接引用,由此实现与外部程序数据交换。
在Source code中加入程序代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
DATA: BEGIN OF POITABOCCURS 0, EBELN LIKE EKKO-EBELN, "采购订单号 EBELP LIKE EKPO-EBELP, "采购订单行项目 LIFNR LIKE EKKO-LIFNR, "供应商 EKORG LIKE EKKO-EKORG, "采购组织 WERKS LIKE EKPO-WERKS, "工厂 MATNR LIKE EKPO-MATNR, "物料号 KSCHL LIKE A017-KSCHL, "条件类型 DATAB LIKE A017-DATAB, "有效期从 DATBI LIKE A017-DATBI, "有效期到 KNUMH LIKE A017-KNUMH, "条件记录号(定价记录号) KBETR LIKE KONP-KBETR, KONWA LIKE KONP-KONWA, KPEIN LIKE KONP-KPEIN, KMEIN LIKE KONP-KMEIN, END OF POITAB. DATA: BEGIN OF AITAB OCCURS 0, LIFNR LIKE A017-LIFNR, "供应商 EKORG LIKE A017-EKORG, "采购组织 WERKS LIKE A017-WERKS, "工厂 MATNR LIKE A017-MATNR, "物料号 DATAB LIKE A017-DATAB, "有效期从 DATBI LIKE A017-DATBI, "有效期到 KSCHL LIKE A017-KSCHL, "条件类型 KNUMH LIKE A017-KNUMH, "条件记录号(定价记录号) END OF AITAB. DATA: AITAB_S LIKE STANDARD TABLE OF AITABWITH HEADER LINE. DATA: BEGIN OF ITAB OCCURS 0, EBELN LIKE EKKO-EBELN, "采购订单号 EBELP LIKE EKPO-EBELP, "采购订单行项目 LIFNR LIKE EKKO-LIFNR, "供应商 EKORG LIKE EKKO-EKORG, "采购组织 WERKS LIKE EKPO-WERKS, "工厂 MATNR LIKE EKPO-MATNR, "物料号 END OF ITAB. DATA: BEGIN OF KITAB OCCURS 0, KBETR LIKE KONP-KBETR, KONWA LIKE KONP-KONWA, KPEIN LIKE KONP-KPEIN, KMEIN LIKE KONP-KMEIN, KNUMH LIKE KONP-KNUMH, END OF KITAB. " 搜索出采购订单号,供应商,采购组织,物料号,工厂 SELECT EKKO~EBELN EKKO~LIFNR EKKO~EKORG EKPO~WERKS EKPO~MATNRekpo~ebelp INTO CORRESPONDING FIELDS OF TABLEITAB FROM EKPO JOIN EKKO ON EKKO~EBELN =EKPO~EBELN WHERE EKKO~EBELN = IP_EBELN. "搜索出生效起和终日期,供应商,采购组织,物料号,工厂 IF ITAB[] IS NOT INITIAL. "在Open SQL中使用FOR ALL ENTRIED IN ITAB 前,一定要检查ITAB表是否为空,否则会造成SQL执行效率极低。 SELECT A017~DATBI A017~DATAB A017~KNUMHA017~LIFNR A017~MATNR A017~EKORG A017~WERKS INTO CORRESPONDING FIELDS OF TABLE AITAB FROM A017 FOR ALL ENTRIES IN ITAB WHERE A017~LIFNR = ITAB-LIFNR AND A017~MATNR = ITAB-MATNR ANDA017~EKORG = ITAB-EKORG AND A017~WERKS = ITAB-WERKS. ENDIF. "搜索出价格,单位等 IF AITAB[] IS NOT INITIAL. SELECT KONP~KBETR KONP~KONWA KONP~KPEINKONP~KMEIN KONP~KNUMH KONP~LOEVM_KO INTO CORRESPONDING FIELDS OF TABLE KITAB FROM KONP FOR ALL ENTRIES IN AITAB WHERE KONP~KNUMH = AITAB-KNUMH AND KONP~LOEVM_KO <> 'X'. ENDIF. DATA: COUNT TYPE I. "定义变量COUNT,计数 COUNT = 0. SORT AITAB BY LIFNR EKORG WERKS MATNR DATAB DESCENDING . "对AITAB内表排序--倒序 LOOP AT AITAB. MOVE-CORRESPONDING AITAB TO AITAB_S. "将内表AITAB的值转移给AITAB_S APPEND AITAB_S. AT END OF MATNR." 行组的结尾,如果下一行行组中的任何字段内容不同于上一行,执行语句块中的内容。 CLEAR COUNT. LOOP AT AITAB_S. COUNT = COUNT + 1. IF COUNT <= 5. "计数开始,只列出5次的数据信息 MOVE-CORRESPONDING AITAB_S TO POITAB. READ TABLE ITAB WITH KEY MATNR = AITAB_S-MATNR LIFNR = AITAB_S-LIFNREKORG = AITAB_S-EKORG WERKS = AITAB_S-WERKS. IF SY-SUBRC = 0. MOVE-CORRESPONDING ITAB TO POITAB. ENDIF. READ TABLE KITAB WITH KEY KNUMH = AITAB_S-KNUMH. "通过条件记录号读出价格 IF SY-SUBRC = 0. MOVE-CORRESPONDING KITAB TO POITAB. ENDIF. APPEND POITAB. CLEAR POITAB. ENDIF. ENDLOOP. CLEAR AITAB_S. " 将内表重置为填充前的状态,这意味着该内表将不包含任何行 REFRESH AITAB_S. " 如果内表有表头行,该语句并没有将表头行的内容清空。 ENDAT. ENDLOOP. LOOP AT POITAB. "因为POITAB内表和ZPO_INFO有相同字段,且字段数量不对等,所以用LOOP AT 做整体赋值操作 MOVE-CORRESPONDING POITAB TO ZPO_INFO. APPEND ZPO_INFO. ENDLOOP. |
Function程序编写完成后可直接对其进行测试,保存Function后并激活,激活时要顺带将涉及本Function的所有都选中。
单击编辑界面执行按钮,如图1-11所示。
11) Function的执行及数据查看
可以选择保存按钮将此手工输入保存起来,
单击执行,因为此采购订单有3条信息记录,3条信息记录有过很多次改价。代码中我们只取离现在日期最近的5条,所以结果显示15条数据,结果如下图。
单击结果如下图所示。
以上.
发表评论