我尝试将内部表格下载到我的电脑上,下载应使用转换出口。
一个例子:
表T002
包含一个带有一个字符的语言键(T0002-SPRAS)。
当我WRITE T0002-SPRAS.
使用转换例程ISOLA
时,我会得到一个双字符语言键( E 变为 EN ...)
这个转换例程应该用于我的导出。
我的测试报告:
REPORT Y_MY_DOWNLOAD_TEST.
CONSTANTS: c_filename type string VALUE 'C:\temp\test.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 documentation提及参数dat_mode
:
如果设置了此标志,则不执行转换退出。
我没有设置标志,所以我希望转换完成。
我尝试了不同的组合(dat_mode
开/关,filetype
ASC和DAT),但我发现从未进行转换。
说明:
我正在寻找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.
这将是一个可能的解决方案,但在这种情况下,我将更容易调整导出文件的使用者。
答案 0 :(得分:1)
我不认为这是可能的。但是,您可以在查询中加入LAISO
值(SPRAS
输出转换函数返回的值),其中包含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:\temp\test.txt'
filetype = 'DAT'
changing
data_tab = ta_t003p ).
答案 1 :(得分:0)
好,
这里,使用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.
写这个很有趣..
答案 2 :(得分:0)
从ABAP 7.52开始,我已验证仅在以下情况下执行转换退出:
参数为filetype = 'DAT'
或filetype = 'ASC' and dat_mode = 'X'
(实际上不是文档所说的内容)
并且仅适用于数据类型为'N','D','F'(值0除外)或'T'(但不包括“ C”)的字段最常见的情况,尤其是涉及转换出口ALPHA
,ISOLA
和CUNIT
)
(您可以在功能组Put_Char_LineBuffer
的子例程SFES
中,更具体地在子例程ConvertAsc
中的数据类型上验证这些规则)
请注意,gui_download
的方法cl_gui_frontend_services
中嵌入的文档说:
DAT模式:不再受支持。请改用ASC。
因此,您不能依赖该方法完成的转换。