SAP:如何使用转换退出下载数据?

时间:2012-05-10 15:47:57

标签: download sap abap

我尝试将内部表格下载到我的电脑上,下载应使用转换出口。

一个例子: 表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),但我发现从未进行转换。

说明:

  • 我使用SAP Release 7.01,支持包SAPKB70107。这是一个unicode系统。
  • 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.

这将是一个可能的解决方案,但在这种情况下,我将更容易调整导出文件的使用者。

3 个答案:

答案 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”)的字段最常见的情况,尤其是涉及转换出口ALPHAISOLACUNIT

    (您可以在功能组Put_Char_LineBuffer的子例程SFES中,更具体地在子例程ConvertAsc中的数据类型上验证这些规则)

请注意,gui_download的方法cl_gui_frontend_services中嵌入的文档说:

DAT模式:不再受支持。请改用ASC。

因此,您不能依赖该方法完成的转​​换。