结构、表 声明
DATA: gt_ztco0056 TYPE TABLE OF ztco0056,
gs_last56 TYPE ztco0056.
DATA: gt_luxlog TYPE TABLE OF ztfi0072luxlog,
gs_luxlog LIKE LINE OF gt_luxlog.
DATA ct_zsfi0072a TYPE TABLE OF zsfi0072a.
FIELD-SYMBOLS <fs_zsfi0072a> LIKE LINE OF ct_zsfi0072a.
结构声明:继承
TYPES: BEGIN OF ty_report.
INCLUDE STRUCTURE zsfi0072c.
TYPES:
sel TYPE c, "选择字段
END OF ty_report.
DATA : gt_report TYPE TABLE OF ty_report.
结构声明:SAP_TypeDATA
VBA定义函数SAP_TypeDATA
参数TypeName是声明的自定义名称
Function SAP_TypeDATA(Optional TypeName As String = "Data") As String
Application.Volatile
Dim arr2()
ReDim arr2(6)
arr2(0) = "TYPES: BEGIN OF ty_" & TypeName & ","
arr2(1) = "END OF ty_" & TypeName & "."
arr2(2) = ""
arr2(3) = "DATA: gt_" & TypeName & " TYPE TABLE OF ty_" & TypeName & ","
arr2(4) = "gs_" & TypeName & " TYPE ty_" & TypeName & ","
arr2(5) = "lt_" & TypeName & " TYPE TABLE OF ty_" & TypeName & ","
arr2(6) = "wa_" & TypeName & " TYPE ty_" & TypeName & "."
SAP_TypeDATA = Join(arr2, Chr(10))
End Function
返回结果是ABAP代码
"TYPES: BEGIN OF ty_Data,
END OF ty_Data.
DATA: gt_Data TYPE TABLE OF ty_Data,
gs_Data TYPE ty_Data,
lt_Data TYPE TABLE OF ty_Data,
wa_Data TYPE ty_Data."
结构声明:SAP_TypesBeginOF
VBA定义函数SAP_TypesBeginOF
Function SAP_TypesBeginOF(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '组件类型
s3 = arr1(x, 3) '简短描述
i = Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '组件类型
s3 = arr1(x, 3) '简短描述
i = Len(s2)
arr2(x) = s1 & " TYPE " & s2 & "," & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_TypesBeginOF = Join(arr2, Chr(10))
End Function
输入是RANGE表
字段 | 数据元素 | 简短描述 |
BUKRS | BUKRS | 公司代码 |
ANLN1 | ANLN1 | 主资产号 |
ANLN2 | ANLN2 | 资产子编号 |
ANLKL | ANLKL | 资产类 |
TXK20 | TXT20_ANKT | 资产分类名称 |
返回结果是ABAP代码
"BUKRS TYPE BUKRS, ""公司代码
ANLN1 TYPE ANLN1, ""主资产号
ANLN2 TYPE ANLN2, ""资产子编号
ANLKL TYPE ANLKL, ""资产类
TXK20 TYPE TXT20_ANKT, ""资产分类名称"
结构声明:SAP_TypesBeginOF2
VBA定义函数SAP_TypesBeginOF2
Function SAP_TypesBeginOF2(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), v, arr2(), s1 As String, s2 As String, s3 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
arr2(x) = s2 & " TYPE " & s1 & "-" & s2 & "," & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_TypesBeginOF2 = Join(arr2, Chr(10))
End Function
输入是RANGE表
表名 | 字段 | 简短描述 |
ANLA | BUKRS | 公司代码 |
ANLA | ANLN1 | 主资产号 |
ANLA | ANLN2 | 资产子编号 |
ANLA | ANLKL | 资产类 |
ANKT | TXK20 | 资产分类名称 |
返回结果是ABAP代码
"BUKRS TYPE ANLA-BUKRS, ""公司代码
ANLN1 TYPE ANLA-ANLN1, ""主资产号
ANLN2 TYPE ANLA-ANLN2, ""资产子编号
ANLKL TYPE ANLA-ANLKL, ""资产类
TXK20 TYPE ANKT-TXK20, ""资产分类名称"
结构声明:SAP_TypesBeginOF3
VBA定义函数SAP_TypesBeginOF3
Function SAP_TypesBeginOF3(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String, s4 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '类型
s3 = arr1(x, 3) '长度
If s3 <> "" Then s3 = "(" & s3 & ")"
s4 = arr1(x, 4) '简短描述
i = Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '类型
s3 = arr1(x, 3) '长度
If s3 <> "" Then s3 = "(" & s3 & ")"
s4 = arr1(x, 4) '简短描述
i = Len(s2)
arr2(x) = s1 & s3 & " TYPE " & s2 & "," & Application.Rept(" ", j - i + 10) & """" & s4
Next x
SAP_TypesBeginOF3 = Join(arr2, Chr(10))
End Function
输入是RANGE表
字段 | 数据类型 | 长度 | 简短描述 |
BUKRS | C | 4 | 公司代码 |
ANLN1 | C | 12 | 主资产号 |
ANLN2 | C | 4 | 资产子编号 |
ANLKL | C | 8 | 资产类 |
TXK20 | C | 20 | 资产分类名称 |
返回结果是ABAP代码
"BUKRS(4) TYPE C, ""公司代码
ANLN1(12) TYPE C, ""主资产号
ANLN2(4) TYPE C, ""资产子编号
ANLKL(8) TYPE C, ""资产类
TXK20(20) TYPE C, ""资产分类名称"
SQL取值:SAP_SelectFrom
VBA定义函数SAP_SelectFrom
Function SAP_SelectFrom(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String, s4 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
If x = UBound(arr1) Then
s4 = " "
Else
s4 = ","
End If
arr2(x) = " " & s1 & "~" & s2 & s4 & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_SelectFrom = Join(arr2, Chr(10))
End Function
输入是RANGE表
表名 | 字段 | 简短描述 |
ANLA | BUKRS | 公司代码 |
ANLA | ANLN1 | 主资产号 |
ANLA | ANLN2 | 资产子编号 |
ANLA | ANLKL | 资产类 |
ANKT | TXK20 | 资产分类名称 |
返回结果是ABAP代码
" ANLA~BUKRS, ""公司代码
ANLA~ANLN1, ""主资产号
ANLA~ANLN2, ""资产子编号
ANLA~ANLKL, ""资产类
ANKT~TXK20 ""资产分类名称"
SQL取值:SAP_SelectFrom2
VBA定义函数SAP_SelectFrom2
Function SAP_SelectFrom2(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, k As Integer, arr1(), arr2()
Dim s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String
arr1 = rg.Value
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '声明组件/重命名组件
i = Len(s1) + Len(s2) + Len(s3) + 4
If i > j Then j = i
Next x
k = -1
For x = 1 To UBound(arr1)
If arr1(x, 1) <> "" Then
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '声明组件/重命名组件
s4 = arr1(x, 4) '简短描述
If s2 = s3 Then
s5 = ""
i = Len(s1) + Len(s2)
Else
s5 = " AS " & s3
i = Len(s1) + Len(s2) + Len(s3) + 4
End If
If x = UBound(arr1) Then
s6 = " "
Else
s6 = ","
End If
k = k + 1
ReDim Preserve arr2(k)
arr2(k) = " " & s1 & "~" & s2 & s5 & s6 & Application.Rept(" ", j - i + 10) & """" & s4
End If
Next x
SAP_SelectFrom2 = Join(arr2, Chr(10))
End Function
输入是RANGE表
表名 | 字段 | 重命名字段 | 简短描述 |
ANLA | BUKRS | VKORG | 公司代码/销售组织 |
ANLA | ANLN1 | ANLN1 | 主资产号 |
ANLA | ANLN2 | ANLN2 | 资产子编号 |
ANLA | ANLKL | ANLKL | 资产类 |
ANKT | TXK20 | TXK20 | 资产分类名称 |
返回结果是ABAP代码
" ANLA~BUKRS AS VKORG, ""公司代码/销售组织
ANLA~ANLN1, ""主资产号
ANLA~ANLN2, ""资产子编号
ANLA~ANLKL, ""资产类
ANKT~TXK20 ""资产分类名称"
Oracel SQL传值:SAP_VALUES
VBA定义函数SAP_VALUES
Function SAP_VALUES(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区名
s2 = arr1(x, 2) '字段名
If x = UBound(arr1) Then
s3 = " "
Else
s3 = ","
End If
arr2(x) = " :" & s1 & "-" & s2 & s3
Next x
SAP_VALUES = Join(arr2, Chr(10))
End Function
输入是RANGE表
工作区 | 字段 |
gs_data | BUKRS |
gs_data | ANLN1 |
gs_data | ANLN2 |
gs_data | ANLKL |
gs_data | TXK20 |
返回结果是ABAP代码
" :gs_data-BUKRS,
:gs_data-ANLN1,
:gs_data-ANLN2,
:gs_data-ANLKL,
:gs_data-TXK20 "
这段代码要插入Oracel SQL的LOOP AT循环中,例子如下
LOOP AT pt_zsfi0072a INTO DATA(ls_zsfi0072a).
EXEC SQL .
INSERT INTO ZTFI0072A
( MANDT,ZHTBH,ZHTBB,ZZLLX,ZSXM1 )
VALUES
( :ls_zsfi0072a-MANDT,
:ls_zsfi0072a-ZHTBH,
:ls_zsfi0072a-ZHTBB,
:ls_zsfi0072a-ZZLLX,
:ls_zsfi0072a-ZSXM1
)
ENDEXEC .
ENDLOOP .
赋值:SAP_CONCATENATE
VBA定义函数SAP_CONCATENATE
Function SAP_CONCATENATE(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, k As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String
arr1 = rg.Value
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
i = Len(s1) + Len(s2)
If i > j Then j = i
Next x
k = -1
k = k + 1
ReDim Preserve arr2(k)
arr2(k) = "CONCATENATE"
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
k = k + 1
ReDim Preserve arr2(k)
arr2(k) = " " & s1 & "-" & s2 & Application.Rept(" ", j - i + 10) & """" & s3
Next x
k = k + 1
ReDim Preserve arr2(k)
arr2(k) = "INTO lv_string." 'lv_string是个例子,要自行替换
SAP_CONCATENATE = Join(arr2, Chr(10))
End Function
输入是RANGE表
工作区 | 字段 | 简短描述 |
gs_data | BUKRS | 公司代码 |
gs_data | ANLN1 | 主资产号 |
gs_data | ANLN2 | 资产子编号 |
gs_data | ANLKL | 资产类 |
gs_data | TXK20 | 资产分类名称 |
返回结果是ABAP代码
"CONCATENATE
gs_data-BUKRS ""公司代码
gs_data-ANLN1 ""主资产号
gs_data-ANLN2 ""资产子编号
gs_data-ANLKL ""资产类
gs_data-TXK20 ""资产分类名称
INTO lv_string."
赋值:MOVE-CORRESPONDING
LOOP AT循环里,工作区添加到内表
MOVE-CORRESPONDING ls_anlav TO t_data.
透明表赋值
MOVE-CORRESPONDING it_exp[] TO gt_ztfi0072a[].
赋值:SAP_Move
VBA定义函数:SAP_Move
Function SAP_Move(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String, s4 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
i = Len(s1) + Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
arr2(x) = s1 & "-" & s2 & " = ''." & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_Move = Join(arr2, Chr(10))
End Function
输入是RANGE表
工作区 | 字段 | 简短描述 |
gs_data | BUKRS | 公司代码 |
gs_data | ANLN1 | 主资产号 |
gs_data | ANLN2 | 资产子编号 |
gs_data | ANLKL | 资产类 |
gs_data | TXK20 | 资产分类名称 |
返回结果是ABAP代码
"gs_data-BUKRS = ''. ""公司代码
gs_data-ANLN1 = ''. ""主资产号
gs_data-ANLN2 = ''. ""资产子编号
gs_data-ANLKL = ''. ""资产类
gs_data-TXK20 = ''. ""资产分类名称"
赋值:SAP_Move2
VBA定义函数:SAP_Move2
Function SAP_Move2(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), v, arr2(), s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
s4 = arr1(x, 4) '来源工作区
s5 = arr1(x, 5) '来源工作区的字段
i = Len(s1) + Len(s2) + Len(s4) + Len(s5)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
s4 = arr1(x, 4) '来源工作区
s5 = arr1(x, 5) '来源工作区的字段
If s4 = "" Then
s6 = " '" & s5 & "' "
Else
s6 = s4 & "-" & s5
End If
i = Len(s1) + Len(s2) + Len(s4) + Len(s5)
arr2(x) = " " & s1 & "-" & s2 & " = " & s6 & "." & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_Move2 = Join(arr2, Chr(10))
End Function
输入是RANGE表
工作区 | 字段 | 简短描述 | 来源工作区 | 来源工作区的字段 |
gs_data | BUKRS | 公司代码 | wa_data | BUKRS |
gs_data | ANLN1 | 主资产号 | wa_data | ANLN1 |
gs_data | ANLN2 | 资产子编号 | wa_data | ANLN2 |
gs_data | ANLKL | 资产类 | wa_data | ANLKL |
gs_data | TXK20 | 资产分类名称 | wa_data | TXK20 |
返回结果是ABAP代码
" gs_data-BUKRS = wa_data-BUKRS. ""公司代码
gs_data-ANLN1 = wa_data-ANLN1. ""主资产号
gs_data-ANLN2 = wa_data-ANLN2. ""资产子编号
gs_data-ANLKL = wa_data-ANLKL. ""资产类
gs_data-TXK20 = wa_data-TXK20. ""资产分类名称"
赋值:SAP_Move3
VBA定义函数:SAP_Move3
Function SAP_Move3(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, k As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String, s4 As String
arr1 = rg.Value
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
s4 = arr1(x, 4) '等于 值
i = Len(s1) + Len(s2) + Len(s4)
If i > j Then j = i
Next x
k = -1
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '工作区
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
s4 = arr1(x, 4) '等于 值
i = Len(s1) + Len(s2) + Len(s4)
k = k + 1
ReDim Preserve arr2(k)
arr2(k) = " " & s1 & "-" & s2 & " = '" & s4 & "'." & Application.Rept(" ", j - i + 10) & """" & s3
Next x
SAP_Move3 = Join(arr2, Chr(10))
End Function
输入是RANGE表
工作区 | 字段 | 简短描述 | 值 |
gs_data | BUKRS | 公司代码 | C121 |
gs_data | ANLN1 | 主资产号 | 002606000020 |
gs_data | ANLN2 | 资产子编号 | 0000 |
gs_data | ANLKL | 资产类 | 00002606 |
gs_data | TXK20 | 资产分类名称 |
返回结果是ABAP代码
" gs_data-BUKRS = 'C121'. ""公司代码
gs_data-ANLN1 = '002606000020'. ""主资产号
gs_data-ANLN2 = '0000'. ""资产子编号
gs_data-ANLKL = '00002606'. ""资产类
gs_data-TXK20 = ''. ""资产分类名称"
内表赋值:SAP_gtData
VBA定义函数:SAP_gtData
Function SAP_gtData(rg As Range, Optional gt As String = "gt_data") As String
Dim x As Integer, y As Integer, arr1(), v, arr2(), sr As String, k As Integer
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1) + 2)
k = 1
arr2(k) = gt & " = VALUE #("
For x = 2 To UBound(arr1)
k = k + 1
sr = ""
For y = 1 To UBound(arr1, 2)
sr = sr & " " & arr1(1, y) & " = '" & arr1(x, y) & "' "
Next y
arr2(k) = "(" & sr & ")"
Next x
k = k + 1
arr2(k) = ")."
SAP_gtData = Join(arr2, Chr(10))
End Function
输入是RANGE表
BUKRS | ANLN1 | ANLN2 | ANLKL | TXK20 |
C121 | 002606000020 | 0000 | 00002606 |
返回结果是ABAP代码
"gt_data = VALUE #(
( BUKRS = 'C121' ANLN1 = '002606000020' ANLN2 = '0000' ANLKL = '00002606' TXK20 = '' )
).
"
注意,EXCEL的日期与ABAP不同,要自行转换
而且,如果数据太多的话,函数返回值会错误,可以使用SUB方法
注意下表头行的位置,第一行是中文,第二行是字段,第三行以后是值
Sub SAP_gtData_text()
Dim FirstLine As Integer, InnerTable As String
Dim rg As Range, x As Integer, y As Integer, arr1(), v, arr2(), sr As String, k As Integer
FirstLine = 3
InnerTable = "gt_data"
Set rg = ActiveSheet.Cells(FirstLine, 1)
If rg.Value = "" Then Exit Sub
arr1 = rg.CurrentRegion.Value
ReDim arr2(1 To UBound(arr1) + 2)
Open ActiveWorkbook.Path & "\" & InnerTable & Format(Now(), "YYYYMMDDhhmmss") & ".txt" For Output As #1
Print #1, InnerTable & " = VALUE #("
For x = FirstLine + 1 To UBound(arr1)
sr = ""
For y = 1 To UBound(arr1, 2)
sr = sr & " " & arr1(FirstLine, y) & " = '" & arr1(x, y) & "' "
Next y
Print #1, "(" & sr & ")"
Next x
Print #1, ")."
Close #1
Shell "explorer.exe " & ActiveWorkbook.Path, 1
End Sub
屏幕:SAP_SelectOptions
VBA定义函数:SAP_SelectOptions
Function SAP_SelectOptions(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), arr2(), s1 As String, s2 As String, s3 As String, s4 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
i = Len(s1) + Len(s2)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '来源 透明表
s2 = arr1(x, 2) '组件
s3 = arr1(x, 3) '简短描述
i = Len(s1) + Len(s2)
If x = UBound(arr1) Then
s4 = "."
Else
s4 = ","
End If
arr2(x) = "s_" & s2 & " FOR " & s1 & "-" & s2 & " MODIF ID f1 " & s4 & " """ & s3
Next x
SAP_SelectOptions = Join(arr2, Chr(10))
End Function
输入是RANGE表
表名 | 字段 | 简短描述 |
ANLA | BUKRS | 公司代码 |
ANLA | ANLN1 | 主资产号 |
ANLA | ANLN2 | 资产子编号 |
ANLA | ANLKL | 资产类 |
ANKT | TXK20 | 资产分类名称 |
返回结果是ABAP代码 ,前面要自行加 SELECT-OPTIONS:
"s_BUKRS FOR ANLA-BUKRS MODIF ID f1 , ""公司代码
s_ANLN1 FOR ANLA-ANLN1 MODIF ID f1 , ""主资产号
s_ANLN2 FOR ANLA-ANLN2 MODIF ID f1 , ""资产子编号
s_ANLKL FOR ANLA-ANLKL MODIF ID f1 , ""资产类
s_TXK20 FOR ANKT-TXK20 MODIF ID f1 . ""资产分类名称"
屏幕默认*:SAP_SELECTOPTIONS_INITIAL
VBA定义函数:SAP_SELECTOPTIONS_INITIAL
Function SAP_SELECTOPTIONS_INITIAL(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, arr1(), v, arr2(), s1 As String, s2 As String, s3 As String, k As Integer
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1) * 4)
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '字段
s2 = arr1(x, 2) '简短描述
k = k + 1
arr2(k) = " IF s_" & s1 & " IS INITIAL . """ & s2
k = k + 1
arr2(k) = " s_" & s1 & "(3) = 'ICP'. "
k = k + 1
arr2(k) = " s_" & s1 & "-low = '*' . "
k = k + 1
arr2(k) = " ENDIF."
Next x
SAP_SELECTOPTIONS_INITIAL = Join(arr2, Chr(10))
End Function
输入是RANGE表
字段 | 简短描述 |
BUKRS | 公司代码 |
ANLN1 | 主资产号 |
ANLN2 | 资产子编号 |
ANLKL | 资产类 |
TXK20 | 资产分类名称 |
返回结果是ABAP代码
" IF s_BUKRS IS INITIAL . ""公司代码
s_BUKRS(3) = 'ICP'.
s_BUKRS-low = '*' .
ENDIF.
IF s_ANLN1 IS INITIAL . ""主资产号
s_ANLN1(3) = 'ICP'.
s_ANLN1-low = '*' .
ENDIF.
IF s_ANLN2 IS INITIAL . ""资产子编号
s_ANLN2(3) = 'ICP'.
s_ANLN2-low = '*' .
ENDIF.
IF s_ANLKL IS INITIAL . ""资产类
s_ANLKL(3) = 'ICP'.
s_ANLKL-low = '*' .
ENDIF.
IF s_TXK20 IS INITIAL . ""资产分类名称
s_TXK20(3) = 'ICP'.
s_TXK20-low = '*' .
ENDIF."
二分法取值:SAP_WithKey
VBA定义函数:SAP_WithKey
Function SAP_WithKey(rg As Range) As String
Application.Volatile
Dim x As Integer, i As Integer, j As Integer, k As Integer, arr1(), v, arr2(), s1 As String, s2 As String, s3 As String, s4 As String, s5 As String, s6 As String
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1) + 1)
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '简短描述
s3 = arr1(x, 3) '等于来源
s4 = arr1(x, 4) '等于来源的组件
i = Len(s1) + Len(s3) + Len(s4)
If i > j Then j = i
Next x
For x = 1 To UBound(arr1)
s1 = arr1(x, 1) '组件
s2 = arr1(x, 2) '简短描述
s3 = arr1(x, 3) '等于来源
s4 = arr1(x, 4) '等于来源的组件
i = Len(s1) + Len(s3) + Len(s4)
k = k + 1
arr2(k) = s1 & " = " & s3 & "-" & s4 & Application.Rept(" ", j - i + 10) & """" & s2
Next x
k = k + 1
arr2(k) = "BINARY SEARCH."
SAP_WithKey = Join(arr2, Chr(10))
End Function
输入是RANGE表
字段 | 简短描述 | 来源工作区 | 来源工作区的字段 |
BUKRS | 公司代码 | wa_data | BUKRS |
ANLN1 | 主资产号 | wa_data | ANLN1 |
ANLN2 | 资产子编号 | wa_data | ANLN2 |
ANLKL | 资产类 | wa_data | ANLKL |
TXK20 | 资产分类名称 | wa_data | TXK20 |
返回结果是ABAP代码
前面要自行加:READ TABLE gt_data INTO gs_data WITH KEY
"BUKRS = wa_data-BUKRS ""公司代码
ANLN1 = wa_data-ANLN1 ""主资产号
ANLN2 = wa_data-ANLN2 ""资产子编号
ANLKL = wa_data-ANLKL ""资产类
TXK20 = wa_data-TXK20 ""资产分类名称
BINARY SEARCH."
ALV的fieldcat格式: SAP_fieldcat
VBA定义函数: SAP_fieldcat
'输入两列多行的数据,第一列是文本描述,第二列是t01开始
Function SAP_fieldcat(rg As Range, Optional INSIGN As String = "t") As String
Application.Volatile
Dim x As Integer, i As Integer, arr1(), v, arr2(), s1 As String, s2 As String, s3 As String, k As Integer
arr1 = rg.Value
ReDim arr2(1 To UBound(arr1))
For x = 1 To UBound(arr1)
If arr1(x, 1) <> "" Then
s1 = UCase(arr1(x, 1))
s2 = arr1(x, 2)
If x = UBound(arr1) Then
s3 = "."
Else
s3 = ","
End If
k = k + 1
arr2(k) = " '" & s1 & "' '" & s2 & "'(" & INSIGN & Rept0(x, 2) & ") '' '' '' ''" & s3
End If
Next x
SAP_fieldcat = Join(arr2, Chr(10))
End Function
输入是RANGE表
字段 | 简短描述 |
BUKRS | 公司代码 |
ANLN1 | 主资产号 |
ANLN2 | 资产子编号 |
ANLKL | 资产类 |
TXK20 | 资产分类名称 |
前面要加定义宏才能使用
*----------------------------------------------------------------------*
* 定义宏
*----------------------------------------------------------------------*
DEFINE macro_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = &1. "标题列对应的字段名
ls_fieldcat-coltext = &2. "列标题 列标题,如果字段参考了DDIC,可不设置
ls_fieldcat-fix_column = &3. "固定列 与KEY字段类似,固定列但颜色不变蓝,必须要在左边才起作用(如果设置固定列的左边包含非固定列,则该列不固定)
ls_fieldcat-no_zero = &4. "是否隐藏输出为零的字段 当字段为数值为0时,不显示【如0,0.00,则会显示为空】当字段包含前导0时,隐藏前导0,【如0100,则会显示为100】
"ls_fieldcat-cfieldname = &5. "currency unit field name值为当前输出内表中的货币单位字段的字段名称
"ls_fieldcat-edit = &6. "准备输入 X:可编辑,space:不可编辑 该控制是在整列的级别上,如果想控制仅仅某一行可编辑,则需要通过style来控制
ls_fieldcat-ref_field = &5.
ls_fieldcat-ref_table = &6.
IF ls_fieldcat-outputlen IS INITIAL. "当coltext不存在显示filedtext,如字段没域,只有手工描述的情况
ls_fieldcat-outputlen = 40. "方便条件筛选
ENDIF.
APPEND ls_fieldcat TO lt_fieldcat.
END-OF-DEFINITION.
macro_fieldcat:
返回结果是ABAP代码
一般还要自行在第三列加X,以便键值固定
" 'BUKRS' '公司代码'(t01) '' '' '' '',
'ANLN1' '主资产号'(t02) '' '' '' '',
'ANLN2' '资产子编号 '(t03) '' '' '' '',
'ANLKL' '资产类'(t04) '' '' '' '',
'TXK20' '资产分类名称'(t05) '' '' '' ''."