我尝试将内部表下载到我的 PC,下载应使用转换出口。
举个例子:表 T002
包含一个字符的语言键 (T0002-SPRAS(。
当我WRITE T0002-SPRAS.
转换例程时,使用了ISOLA
,我得到了一个两个字符的语言键(E 变为 EN...此转换例程应用于我的导出。
我的测试报告:
REPORT Y_MY_DOWNLOAD_TEST.
CONSTANTS: c_filename type string VALUE 'C:temptest.txt'.
data: it_table type table of t002.
start-of-selection.
SELECT * from t002 into table it_table.
* Start file download
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = c_filename
filetype = 'ASC' "or DAT
WRITE_FIELD_SEPARATOR = 'X'
WRITE_LF = 'X'
* DAT_MODE = SPACE
codepage = '4110' "UNICODE
SHOW_TRANSFER_STATUS = 'X'
WRITE_LF_AFTER_LAST_LINE = 'X'
CHANGING
data_tab = it_table
EXCEPTIONS
OTHERS = 99.
write: 'end'.
结果是一个没有使用转换出口的文件(英语保留 E(。
SAP 文档提到了参数dat_mode
:
如果设置了此标志,....不会执行转换退出。
我没有设置标志,所以我希望转换完成。我尝试了不同的组合(dat_mode
开/关,filetype
ASC和DAT(,但我从未发现转换。
言论:
- 我使用 SAP 版本 7.01,支持包SAPKB70107。它是一个统一码系统。
- T002只是一个例子,我的真实数据是其他数据,包含语言键。
我正在寻找带有gui_download
(或其他标准方法/功能模块(的解决方案。
我不想像这样构建自己的导出文件:
data:
tmp type string,
targetline type string,
targettable type table of string.
loop at it_table into sourceline.
"This could be done dynamic with field symbols and ASSIGN COMPONENT
write sourceline-field1 to tmp.
CONCATENATE targetline ';' tmp into targetline.
"...
APPEND targetline to targettable.
endloop.
这将是一个可能的解决方案,但在这种情况下,我更容易适应导出文件的使用者。
我认为这是不可能的。但是,您可以在包含SPRAS
类型字段的查询中联接LAISO
值(即SPRAS
输出转换函数返回的值(,并为查询使用自定义类型,其中将SPRAS
类型字段替换为LAISO
类型。
下面是使用 T003P
表的示例:
types: begin of ty_t003p,
client type mandt,
spras type laiso,
auart type aufart,
txt type auarttext,
end of ty_t003p.
data ta_t003p type standard table of ty_t003p.
select t003p~client t002~laiso t003p~auart t003p~txt into table ta_t003p from t003p inner join t002 on t002~spras = t003p~spras.
cl_gui_frontend_services=>gui_download(
exporting
filename = 'C:temptest.txt'
filetype = 'DAT'
changing
data_tab = ta_t003p ).
好的,
在这里,使用 SE11,转到表,双击带有转换例程的数据元素以显示数据元素。然后双击域以显示域,然后双击对话。例程名称。(在这种情况下是ISOLA(由于您想要输出值(输入值在 db 中(,因此您希望对每个表条目的 spras 字段执行CONVERSION_EXIT_ISOLA_INPUT。
类似的东西
data: wa_table type t002.
loop at it_table into wa_table.
CALL FUNCTION 'CONVERSION_EXIT_ISOLA_OUTPUT'
EXPORTING
input = wa_table-spras
IMPORTING
OUTPUT = wa_table-spras.
modify it_table from wa_table index sy-tabix.
endloop.
此时,您可以继续在it_table上使用 cl_gui_frontend_services=>gui_download。
我意识到这接近于使用您的 WRITE 语句,除了 WRITE 语句会给您带来麻烦。
我们在工作中所做的是编写一个程序,该程序使用数据字典生成上传下载程序。
表DD04L 包含每个表字段的转换出口,然后我们做这样的事情:
CONCATENATE 'wa_db-' wa_field-fieldname INTO g_string.
SELECT SINGLE * FROM dd03l INTO wa_dd03l WHERE tabname EQ p_tab AND fieldname EQ wa_field-fieldname.
SELECT SINGLE * FROM dd04l INTO wa_dd04l WHERE rollname EQ wa_dd03l-rollname.
IF wa_dd04l-lowercase IS INITIAL.
_repl 'translate wa_field to upper case.' g_string.
ENDIF.
_add 'if g_oops is initial.'.
IF wa_dd04l-convexit IS NOT INITIAL.
_add 'try.'.
_repl 'move wa_field to &.' g_string.
_add 'CATCH CX_DYNAMIC_CHECK into gcl_dynamic_check.'.
_add 'l_error = gcl_dynamic_check->get_text( ).'.
_add 'l_long_error = gcl_dynamic_check->GET_LONGTEXT( ).'.
_repl 'concatenate ''Conversion error'' wa_field ''into & ->'' l_error into l_error separated by space.' g_string.
_add 'condense l_error.' .
_add 'write l_error. new-line.' .
_add 'write l_long_error. new-line.' .
_add 'ENDTRY.'.
CONCATENATE 'CONVERSION_EXIT_' wa_dd04l-convexit '_INPUT' INTO g_fm.
_repl ' CALL FUNCTION ''&''' g_fm.
_add ' EXPORTING'.
_repl ' input = &' g_string.
_add ' IMPORTING'.
_repl ' output = &' g_string.
_add ' EXCEPTIONS'.
_add ' length_error = 1'.
_add ' OTHERS = 2.'.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
使用一些定义将代码添加到生成的 ABAP
DEFINE _repl.
wa_prog = &1.
replace all occurrences of '&' in wa_prog with &2.
append wa_prog to it_prog.
END-OF-DEFINITION.
DEFINE _add.
append &1 to it_prog.
END-OF-DEFINITION.
写起来很有趣。
从 ABAP 7.52 开始,我已经验证了转换退出仅在以下情况下执行:
-
参数要么
filetype = 'DAT'
-
或
filetype = 'ASC' and dat_mode = 'X'
(不是文档所说的(
-
-
并且仅适用于数据类型为"N"、"D"、"F"(值 0 除外(或"T"(但不是最常见的情况"C",特别是关于转换退出
ALPHA
、ISOLA
和CUNIT
的字段((您可以在函数组
SFES
的子例程Put_Char_LineBuffer
中验证这些数据类型的规则,更具体地说是在子例程ConvertAsc
中验证这些规则(
请注意,嵌入在方法 gui_download
中的文档 cl_gui_frontend_services
说:
DAT 模式:不再支持。请改用 ASC
。
因此,您不能依赖该方法完成的转换。