1

我尝试将内部表下载到我的 PC,下载应该使用转换出口。

示例:表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 文档提到了参数dat_mode

如果设置了此标志,则 .... 不执行转换出口。

我没有设置标志,所以我希望转换完成。我尝试了不同的组合(dat_mode开/关、filetypeASC 和 DAT),但我从未发现任何转换。

评论:

  • 我使用 SAP 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.

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

4

3 回答 3

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 ).
于 2012-05-12T10:43:06.730 回答
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.

写起来很有趣。。

于 2012-05-10T19:23:47.497 回答
0

从 ABAP 7.52 开始,我已验证转换出口仅在以下情况下执行:

  • 参数是filetype = 'DAT'

    • 或者filetype = 'ASC' and dat_mode = 'X'

      (实际上并不是文档所说的)

  • 并且仅适用于数据类型为“N”、“D”、“F”(值 0 除外)或“T”的字段(但不是最常见的“C”,尤其是关于转换出口ALPHA和)ISOLACUNIT

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

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

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

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

于 2020-04-08T12:26:12.823 回答