您好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.
我的代码中的任何配置?
答案 0 :(得分:2)
假设您已经使用bseg
字段扩展了标准monat
表,那么您应该这样做:
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.
对错误代码的一些注释:
COLLECT
不像单个语句那样工作,应该循环执行。COLLECT
语句求和,您应声明工作区域,以便所有非关键字段都是数字。关键字段(即使它是隐式键)可以是任何类型,与Ray所说的相反。 N
类型也可以。DELETE ADJACENT DUPLICATES
在这里是多余的,因为在COLLECT
之后(通过主键进行求和),您将不会有任何重复。答案 1 :(得分:-1)
这一切都取决于你如何定义内部表格it_zfi_vbrp_bseg_1
要使COLLECT起作用,您需要使用字符类型键定义它,然后使用压缩字段类型:
数据:it_zfi_vbrp_bseg_1的开头0, werks type werks, 月(2)c型, dmbtr型dmbtr, it_zfi_vbrp_bseg_1。
这将有效。
这不会:
数据:it_zfi_vbrp_bseg_1的开头出现0。 包括结构vbrp。 数据:monat type monat, dmbtr型dmbtr, 结束了it_zfi_vbrp_bseg。
阅读有关COLLECT的帮助并相应地定义汇总表。