SAP接口编程-RFC系列15 : 调用自定义FM
来源:互联网 发布:手机无损音乐软件 编辑:程序博客网 时间:2024/04/30 14:08
从外部环境调用自定义FM和调用SAP预置的函数并没有不同,需要注意的是在SAP系统自定义FM的要点:
1)FM必须是Remote-enabled Module(属性(attribute)中设置)
2)参数必须是pass by value,不允许pass by reference
下面是具体的例子,当然不会采用加减乘除四则运算这样无聊的例子。我们自定义一个函数,根据透明表的表名获取所有字段,信息比RFC_READ_TABLE要多,后面综合实例还会就这个函数实现C#的应用场景。
首先在SAP中使用SE11创建一个结构,作为函数输出的table参数。
然后使用SE37创建函数:Z_FM_TABLE_FIELDS
FUNCTION z_fm_table_fields.*"----------------------------------------------------------------------*"*"Local Interface:*" IMPORTING*" VALUE(TAB_NAME) TYPE TABNAME*" TABLES*" TAB_FIELDS STRUCTURE ZTABFIELDS*"---------------------------------------------------------------------- DATA: BEGIN OF gt_tabflds OCCURS 0 , tabname LIKE dd03l-tabname, fieldname LIKE dd03l-fieldname, keyflag LIKE dd03l-keyflag, position LIKE dd03l-position, rollname LIKE dd03l-rollname, datatype LIKE dd03l-datatype, leng LIKE dd03l-leng, ddtext LIKE dd04t-ddtext, scrtext_s LIKE dd04t-scrtext_s, scrtext_m LIKE dd04t-scrtext_m, scrtext_l LIKE dd04t-scrtext_l, END OF gt_tabflds. SELECT tabname fieldname keyflag position rollname datatype leng INTO CORRESPONDING FIELDS OF TABLE gt_tabflds FROM dd03l WHERE tabname = tab_name. SORT gt_tabflds BY position. DELETE gt_tabflds WHERE fieldname+0(1) = '.'. LOOP AT gt_tabflds. SELECT SINGLE ddtext scrtext_s scrtext_m scrtext_l INTO CORRESPONDING FIELDS OF gt_tabflds FROM dd04t WHERE rollname = gt_tabflds-rollname AND ddlanguage = sy-langu. MODIFY gt_tabflds. ENDLOOP. LOOP AT gt_tabflds. CLEAR tab_fields. MOVE-CORRESPONDING gt_tabflds TO tab_fields. APPEND tab_fields. ENDLOOP.ENDFUNCTION.
C#通过RFC调用
1)定义TableFields (TableFields.cs)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace SAPZFunction{ public class TableFields { public string TabName { get; set; } // table name public string FieldName { get; set; } // field name public string KeyFlag { get; set; } // flag to indicate whether the field is primary key public string Positiion { get; set; } // position public string RollName { get; set; } // data element name public string DataType { get; set; } // data type public int Leng { get; set; } // length public string DDText { get; set; } // explaintory short text public string ScrText_S { get; set; } // short field label public string ScrText_M { get; set; } // medium field label public string ScrText_L { get; set; } // long field label }}
2) 调用RFC (ZFunction.cs)
using System;using System.Collections.Generic;using SAPLogonCtrl;using SAPFunctionsOCX;using SAPTableFactoryCtrl;using ConnectionProvider;namespace SAPZFunction{ public class ZFunction { private Connection conn; // sap connection // demo how to use GetFields public List<TableFields> GetTableFieldsDemo() { var fields = new List<TableFields>(); bool isSuccessful = SAPConnection.SilentLogon( "192.168.65.100", "D01", 00, "001", "STONE", "PWD", "ZH"); if (isSuccessful) { conn = SAPConnection.Connection; fields = this.GetFields("SKB1"); SAPConnection.Logoff(); } return fields; } // get fields from SAP table public List<TableFields> GetFields(String tableName) { var fieldsList = new List<TableFields>(); if (conn == null || conn.IsConnected != CRfcConnectionStatus.tloRfcConnected) { return null; } SAPFunctions functions = new SAPFunctions(); functions.Connection = conn; Function fm = functions.Add("Z_FM_TABLE_FIELDS"); fm.get_Exports("TAB_NAME").Value = tableName; fm.Call(); Table fields = fm.Tables["TAB_FIELDS"]; fieldsList = this.Convert(fields); // convert table to List<TableFields> return fieldsList; } private List<TableFields> Convert(Table itab) { var fields = new List<TableFields>(); if (itab.RowCount == 0) return null; for (int row = 1; row <= itab.RowCount; row++) { var entity = new TableFields(); entity.TabName = itab.get_Cell(row, 1); // first column entity.FieldName = itab.get_Cell(row, 2); entity.KeyFlag = itab.get_Cell(row, 3); entity.Positiion = itab.get_Cell(row, 4); entity.RollName = itab.get_Cell(row, 5); entity.DataType = itab.get_Cell(row, 6); entity.Leng = itab.get_Cell(row, 7); entity.DDText = itab.get_Cell(row, 8); entity.ScrText_S = itab.get_Cell(row, 9); entity.ScrText_M = itab.get_Cell(row, 10); entity.ScrText_L = itab.get_Cell(row, 11); fields.Add(entity); } return fields; } }}
3)单元测试 (TestZFM.cs)
using System;using Microsoft.VisualStudio.TestTools.UnitTesting;using SAPZFunction;using System.Collections.Generic;namespace UnitTestProject{ [TestClass] public class TestZFM { [TestMethod] public void Test_ZFunction() { ZFunction zfm = new ZFunction(); // Customized fm in SAP List<TableFields> fields = zfm.GetTableFieldsDemo(); foreach (TableFields item in fields) { Console.WriteLine(item.TabName); Console.WriteLine(item.FieldName); Console.WriteLine(item.Positiion); Console.WriteLine(item.KeyFlag); Console.WriteLine(item.RollName); Console.WriteLine(item.DataType); Console.WriteLine(item.Leng); Console.WriteLine(item.DDText); Console.WriteLine(item.ScrText_S); Console.WriteLine(item.ScrText_M); Console.WriteLine(item.ScrText_L); Console.WriteLine("---------------------------"); } } }}
0 0
- SAP接口编程-RFC系列15 : 调用自定义FM
- SAP接口编程-RFC系列03 : RFC调用SAP函数
- SAP接口编程-RFC系列11:C#语言调用RFC
- SAP接口编程-RFC系列04 : 动态调用SAP函数
- SAP接口编程-RFC系列01 : RFC Hello World
- RFC调用sap接口
- C#调用sap rfc 接口
- sap的rfc接口调用
- SAP接口编程-RFC系列02 : Connection对象
- SAP接口编程-RFC系列05 : Table作为输出参数
- SAP接口编程-RFC系列06 : Table作为输入参数
- SAP接口编程-RFC系列09 : 使用BAPI
- MULE 连接sap rfc接口开发二:调用rfc接口
- SAP接口编程-RFC系列08 : 获取SAP DDIC的数据字段
- SAP接口编程-RFC系列14 : 获取SAP DDIC的数据字段
- PB调用SAP的RFC函数接口
- JAVA调用SAP端RFC接口
- java调用sap的RFC接口
- android学习笔记——Service服务初探
- git命令总结2
- 这里记载所有的工具
- 关于/dev/null及用途
- 软件测试的自我修养之测试用例设计
- SAP接口编程-RFC系列15 : 调用自定义FM
- STM32:STM32学习记录2:跑马灯及仿真
- React.js-02-遍历数据
- 6-1、Spark RDD
- android学习笔记——HttpURLConnection简单应用以及讲解
- HDU 1728 逃离迷宫(广度搜索)
- 解决g++报错Floating point exception: 8
- LeetCode 53 Maximum Subarray
- Nim程序:使用默认浏览器打开一个网址