SAP接口编程-RFC系列07 : 通用的数据库表读取
2016-01-06 14:25
639 查看
实现通用的数据库表读取功能
上一篇讲的是调用RFC_READ_TABLE查看SAP table的数据。为了方便查看数据,我们可以写一个通用的表查看程序。使用起来比SAP SE11或SE16N方便点。本篇没有关于RFC调用新的知识点。主要说明函数调用后,VBA如何处理这些数据并在Excel中显示。不熟悉VBA的读者可以参考。由于VBA本身数据结构的限制,处理过程还是蛮啰嗦的。后续用C#调用的代码会方便很多。
不多说,上代码:
Option Explicit Public Sub test() Call Logon Call ReadTable("T030", Sheet1) Call Logoff End Sub '''''''''''''''''''''''''''''''''''''''''''''' '读取tableName的数据,写入inSheet这个工作表 '''''''''''''''''''''''''''''''''''''''''''''' Private Sub ReadTable(tableName As String, inSheet As Worksheet) Dim functions As SAPFunctions Set functions = New SAPFunctions Dim fm As SAPFunctionsOCX.Function ' RFC_READ_TABLE的三个table型参数 Dim optionsTable As SAPTableFactoryCtrl.Table Dim dataTable As SAPTableFactoryCtrl.Table Dim fieldsTable As SAPTableFactoryCtrl.Table Dim delimeter As String delimeter = "~" '长度只能为1 If sapConnection Is Nothing Then Exit Sub Set functions.Connection = sapConnection If sapConnection.IsConnected = tloRfcConnected Then 'FM加到functions collection Set fm = functions.Add("RFC_READ_TABLE") '------------------------ '填充Import parameters '------------------------ 'QUERY_TABLE是要查找的表名 fm.Exports("QUERY_TABLE").Value = tableName 'Table name 'DELIMITER是输出时字段的分割符 fm.Exports("DELIMITER").Value = delimeter Set optionsTable = fm.Tables("OPTIONS") 'OPTIONS是筛选条件 Set fieldsTable = fm.Tables("FIELDS") 'FIELDS表示要输出的列 Set dataTable = fm.Tables("DATA") 'DATA为输出的数据 fm.Call '如果有Exception,说明有错误产生 If fm.Exception <> "" Then Debug.Print fm.Exception Exit Sub End If ' 存储fields信息的数组 Dim fields() As Variant fields = ItabToArray(fieldsTable) ' 存储data信息的数组 Dim data() As Variant data = ItabToArray(dataTable) ' 将data分割 Dim splittedData() As Variant splittedData = splitData(data, delimeter) ' 为了Excel显示需要,将数据加上"'", Excel显示为字符型 Dim r As Long Dim c As Long For r = 1 To UBound(splittedData, 1) For c = 1 To UBound(splittedData, 2) splittedData(r, c) = "'" + splittedData(r, c) Next Next ' 将field name, field text和data整合到一个工作表显示 Call WriteData(fields, splittedData, Sheet1) End If End Sub ' 将itab转换成数组 Private Function ItabToArray(itab As SAPTableFactoryCtrl.Table) As Variant Dim arr() As Variant arr = itab.data ItabToArray = arr End Function Private Function splitData(data() As Variant, delimeter As String) As Variant Dim dataSplitted() As Variant '返回值 Dim rowcount As Long rowcount = UBound(data, 1) ' 列数需要计算 Dim testcol As Variant testcol = Split(data(1, 1), delimeter) '根据第一个数据来确定列数 Dim colcount As Long colcount = UBound(testcol) + 1 ReDim dataSplitted(1 To rowcount, 1 To colcount) Dim line As Variant Dim r As Long Dim c As Long For r = 1 To rowcount line = Split(data(r, 1), delimeter) ' line 从0开始 For c = 1 To colcount dataSplitted(r, c) = line(c - 1) Next Next splitData = dataSplitted End Function Private Sub WriteData(fields() As Variant, data() As Variant, inSheet As Worksheet) ' Clear first inSheet.Cells.ClearContents Dim fieldname() As Variant Dim fieldtext() As Variant Dim rowcount As Integer rowcount = UBound(fields, 1) ReDim fieldname(1 To rowcount) ReDim fieldtext(1 To rowcount) Dim r As Integer For r = 1 To UBound(fields, 1) fieldname(r) = fields(r, 1) ' 第一列为fieldname fieldtext(r) = fields(r, 5) ' 第五列为fieldtext Next ' fieldname和fieldtext写入工作表 ' 第一行fieldname Dim fieldNameRange As Range Set fieldNameRange = inSheet.Range("A1") fieldNameRange.Resize(1, UBound(fieldname)).Value = fieldname ' 第二行fieldtext Dim fieldTextRange As Range Set fieldTextRange = inSheet.Range("A2") fieldTextRange.Resize(1, UBound(fieldname)).Value = fieldtext ' 从第三行开始,将splitted data写入工作表 Dim dataRange As Range Set dataRange = inSheet.Range("A3") dataRange.Resize(UBound(data, 1), UBound(data, 2)).Value = data End Sub
相关文章推荐
- mysql数据库优化小结
- SQL Server时间粒度系列----第1节时间粒度概述
- 计算数据库中各个表的数据量和每行记录所占用空间
- 2.mysql 将查询出来的表设置别名用法
- Oracle建表命令
- mysql索引总结----mysql 索引类型以及创建
- 理解MySQL——索引与优化
- ORACLE linux 下 sqlplus命令
- Oracle默认账户
- redis 可视化管理工具
- redis服务器及采集端设置
- mysql服务器安装后,navcat远程连接
- mysql的用户管理和权限管理(访问控制)
- redis中save和bgsave区别
- redis持久化
- 一条sql解决.一张表的数据复制到另外一张表
- Redis: 改变HomeBrew安装的数据库文件目录
- MySQL学习笔记——获取MySQL命令的帮助信息
- MySQL: 改变Homebrew安装MySQL/MariaDB的数据库文件目录
- Oracle正则表达式函数