0

嗨 ABAP 用户我想问一下我可以通过什么过程来收集同一字段上的数据?我想做的就是总结或收集 dmbtr 中属于同一日期的数据,(日期字段 monat)(工厂代码)

it_zfi_vbrp_bseg_1-num3 = it_zfi_vbrp_bseg_1-werks.

it_zfi_vbrp_bseg_1-num2 = it_zfi_vbrp_bseg_1-dmbtr.

COLLECT it_zfi_vbrp_bseg_1.

DELETE ADJACENT DUPLICATES FROM it_zfi_vbrp_bseg_1 COMPARING ALL FIELDS.

Sort it_zfi_vbrp_bseg_1 by werks.

LOOP AT it_zfi_vbrp_bseg_1 into wa_zfi_vbrp_bseg_1 WHERE monat = '01'.

    IF wa_zfi_vbrp_bseg_1-werks EQ '4030'.

        WRITE:/, AT pos wa_zfi_vbrp_bseg_1-dmbtr. 
             
    ENDIF.
    
ENDLOOP.

我的代码中有任何配置吗?

4

2 回答 2

2

假设你已经用字段扩展了标准bsegmonat,那么你应该这样做:

TYPES: BEGIN OF ty_zfi_vbrp_bseg_1,
        werks TYPE bseg-werks,
        monat TYPE monat,
        dmbtr TYPE bseg-dmbtr,
       END OF ty_zfi_vbrp_bseg_1.

DATA: it_zfi_vbrp_bseg_1 TYPE TABLE OF ty_zfi_vbrp_bseg_1,
      is_zfi_vbrp_bseg_1 TYPE ty_zfi_vbrp_bseg_1.

SELECT werks, monat, dmbtr
INTO TABLE @DATA(lt_bseg)
FROM bseg
WHERE werks = '4030'.

* summation of months
LOOP AT lt_bseg ASSIGNING FIELD-SYMBOL(<fs_line>).
  CLEAR: is_zfi_vbrp_bseg_1.
  MOVE-CORRESPONDING <fs_line> TO is_zfi_vbrp_bseg_1.
  COLLECT is_zfi_vbrp_bseg_1 INTO it_zfi_vbrp_bseg_1.
ENDLOOP.

* output the results
LOOP AT it_zfi_vbrp_bseg_1 ASSIGNING FIELD-SYMBOL(<zfi_line>).
    IF <zfi_line>-werks EQ '4030'.
        WRITE: / <zfi_line>-werks, <zfi_line>-monat, <zfi_line>-dmbtr.
    ENDIF.
ENDLOOP.

对您的错误代码的几点说明:

  1. COLLECT不像单个语句那样工作,应该循环执行。
  2. 总而言之,COLLECT您应该声明工作区,以便所有非关键字段都是数字。与 Ray 所说的相反,键字段(即使它是隐式键)可以是任何类型。N类型还可以。
  3. DELETE ADJACENT DUPLICATES在这里是多余的,因为之后COLLECT(通过主键求和)你不会有任何重复。
于 2017-07-08T17:04:12.447 回答
-1

这一切都取决于您如何定义内部表 it_zfi_vbrp_bseg_1

为了使 COLLECT 工作,您需要使用字符类型键和打包字段类型来定义它:

数据:it_zfi_vbrp_bseg_1 开始出现 0,werks 类型 werks,month(2) 类型 c,dmbtr 类型 dmbtr,it_zfi_vbrp_bseg_1 结束。

那可行。

这不会:

数据:it_zfi_vbrp_bseg_1 的开头出现 0。包括结构 vbrp。数据:monat 类型 monat,dmbtr 类型 dmbtr,it_zfi_vbrp_bseg 结束。

阅读 COLLECT 的帮助并相应地定义您的汇总表。

于 2017-06-26T15:03:56.480 回答