如何编写结构?

How to WRITE a structure?

我怎样才能做到以下几点:

data: ls_header type BAPIMEPOHEADER.
" fill it
write ls_header.

目前我收到一个错误,因为 write 无法将复杂类型解析为字符串。有没有一种简单的方法可以在 abap 中获取此代码 运行?

我知道两种方式,一种是过程式的,另一种是oop方式。 这是程序方法。

  1. Select 从数据字典 table DD03L 到本地内部 table.
  2. 的结构字段(或您可能需要的任何其他内容)
  3. 循环 table 进入工作区
  4. 检查当前字段是否为平面单一数据类型,如果是,
  5. 将结构 ls_header 的组件工作区字段名称分配给任何字段符号
  6. 写入任意字段符号

你需要密码吗?

您可以使用类似的东西:

DATA: g_struct TYPE bapimepoheader.

DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE g_struct TO FIELD-SYMBOL(<f>).
  IF sy-subrc NE 0.
    EXIT.
  ENDIF.
  WRITE: / <f>.
ENDDO.

您可以将您的结构写入一个字符串,然后输出该字符串。创建了相同的方法 idoc 段。

Class CL_ABAP_CONTAINER_UTILITIES是SAP专门为此引入的

使用FILL_CONTAINER_C方法以WRITE方式输出结构:

DATA: ls_header type BAPIMEPOHEADER.

CALL METHOD CL_ABAP_CONTAINER_UTILITIES=>FILL_CONTAINER_C
 EXPORTING
  IM_VALUE                = ls_header
 IMPORTING
  EX_CONTAINER            = DATA(container)
 EXCEPTIONS
  ILLEGAL_PARAMETER_TYPE = 1
  others                 = 2.

WRITE container.

也许不完全是您期望的答案:如果您列出每个字段。

这可以通过 SE38 中的模式掩码轻松完成:

  1. Select 写模式:
  2. 输入你想要的结构:
  3. Select 字段 用 "Copy"
  4. 确认

确认后得到

WRITE: bapimepoheader-po_number,
       bapimepoheader-comp_code,
       bapimepoheader-doc_type,
       bapimepoheader-delete_ind,
       bapimepoheader-status,
       bapimepoheader-creat_date,
       bapimepoheader-created_by,
       bapimepoheader-item_intvl,
       bapimepoheader-vendor,
       bapimepoheader-langu,
       bapimepoheader-langu_iso,
       bapimepoheader-pmnttrms,
       bapimepoheader-dscnt1_to,
       bapimepoheader-dscnt2_to,
       bapimepoheader-dscnt3_to,
       bapimepoheader-dsct_pct1,
       bapimepoheader-dsct_pct2,
       bapimepoheader-purch_org,
       bapimepoheader-pur_group,
       bapimepoheader-currency,
       bapimepoheader-currency_iso,
       bapimepoheader-exch_rate,
       bapimepoheader-ex_rate_fx,
       bapimepoheader-doc_date,
       bapimepoheader-vper_start,
       bapimepoheader-vper_end,
       bapimepoheader-warranty,
       bapimepoheader-quotation,
       bapimepoheader-quot_date,
       bapimepoheader-ref_1,
       bapimepoheader-sales_pers,
       bapimepoheader-telephone,
       bapimepoheader-suppl_vend,
       bapimepoheader-customer,
       bapimepoheader-agreement,
       bapimepoheader-gr_message,
       bapimepoheader-suppl_plnt,
       bapimepoheader-incoterms1,
       bapimepoheader-incoterms2,
       bapimepoheader-collect_no,
       bapimepoheader-diff_inv,
       bapimepoheader-our_ref,
       bapimepoheader-logsystem,
       bapimepoheader-subitemint,
       bapimepoheader-po_rel_ind,
       bapimepoheader-rel_status,
       bapimepoheader-vat_cntry,
       bapimepoheader-vat_cntry_iso,
       bapimepoheader-reason_cancel,
       bapimepoheader-reason_code,
       bapimepoheader-retention_type,
       bapimepoheader-retention_percentage,
       bapimepoheader-downpay_type,
       bapimepoheader-downpay_amount,
       bapimepoheader-downpay_percent,
       bapimepoheader-downpay_duedate,
       bapimepoheader-memory,
       bapimepoheader-memorytype,
       bapimepoheader-shiptype,
       bapimepoheader-handoverloc,
       bapimepoheader-shipcond,
       bapimepoheader-incotermsv,
       bapimepoheader-incoterms2l,
       bapimepoheader-incoterms3l.

现在您可以用 ls_header 简单地替换 bapimepoheader 并且您有结构所有字段的输出。

也许这并不优雅,如果结构发生变化,您必须调整您的报告。但我喜欢这种方式,因为我通常不需要所有字段,而且我可以 select 以一种简单的方式输入这些字段。