如何在转化退出时下载数据



我尝试将内部表下载到我的 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",特别是关于转换退出ALPHAISOLACUNIT的字段(

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

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

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

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

相关内容

  • 没有找到相关文章