Abap 在循环另一个itab期间修改一个itab

Abap 在循环另一个itab期间修改一个itab,abap,internal-tables,Abap,Internal Tables,我想做以下几件事 Loop at itab into wa_itab. wa_itab2-field1 = wa_itab-field1. wa_itab2-field2 = wa_itab-field2. wa_itab2-field3 = wa_itab-field3. wa_itab2-field4 = wa_itab-field4. *how to insert in itab2 if fields 1,2 & 3 do not exist or upda

我想做以下几件事

Loop at itab into wa_itab.
   wa_itab2-field1 = wa_itab-field1.
   wa_itab2-field2 = wa_itab-field2.
   wa_itab2-field3 = wa_itab-field3.
   wa_itab2-field4 = wa_itab-field4.
*how to insert in itab2 if fields 1,2 & 3 do not exist or update itab2 if fields 1,2 & 3 exist?
EndLoop.
让我再解释一下。 我有itab,包含bukrs、KUNR、日期、行动等字段。 itab2包含以下字段:bukrs、kunnr、name1(来自kna1)、date01(一月)、action01、date02(二月)、action02。。。日期12(12月),行动12。 在itab循环期间,我希望如果itab2有一个带有bukrs和KUNR的记录,那么它将根据itab日期的月份更新日期和操作,如果它不存在(bukrs,KUNR),那么将一个记录插入itab2

我希望这能解释我想要什么

提前谢谢 埃利亚斯

附:这是节目单

*&---------------------------------------------------------------------*
*& Report  Z_COLLECTORS_ACTIONS
*&
*&---------------------------------------------------------------------*
*& Description
*&
*&---------------------------------------------------------------------*
*& Change log:
*& Date          Author        Action
*&
*&---------------------------------------------------------------------*

REPORT  z_collectors_actions.

TABLES: zcollectoraction, kna1, t001.

TYPE-POOLS : slis.

TYPES: BEGIN OF ty_totalcollectoractions,
         bukrs  TYPE zcollectoraction-bukrs,
         kunnr  TYPE zcollectoraction-kunnr,
         name1  TYPE kna1-name1,
         date01 TYPE zcollectoraction-dat,
         date02 TYPE zcollectoraction-dat,
         date03 TYPE zcollectoraction-dat,
         date04 TYPE zcollectoraction-dat,
         date05 TYPE zcollectoraction-dat,
         date06 TYPE zcollectoraction-dat,
         date07 TYPE zcollectoraction-dat,
         date08 TYPE zcollectoraction-dat,
         date09 TYPE zcollectoraction-dat,
         date10 TYPE zcollectoraction-dat,
         date11 TYPE zcollectoraction-dat,
         date12 TYPE zcollectoraction-dat,
         action01 TYPE zcollectoraction-action,
         action02 TYPE zcollectoraction-action,
         action03 TYPE zcollectoraction-action,
         action04 TYPE zcollectoraction-action,
         action05 TYPE zcollectoraction-action,
         action06 TYPE zcollectoraction-action,
         action07 TYPE zcollectoraction-action,
         action08 TYPE zcollectoraction-action,
         action09 TYPE zcollectoraction-action,
         action10 TYPE zcollectoraction-action,
         action11 TYPE zcollectoraction-action,
         action12 TYPE zcollectoraction-action,
       END OF ty_totalcollectoractions.

DATA: wa_collectoraction LIKE zcollectoraction,
      it_collectoraction LIKE TABLE OF zcollectoraction,
      wa_totalcollectoractions TYPE ty_totalcollectoractions,
      it_totalcollectoractions TYPE TABLE OF ty_totalcollectoractions WITH KEY kunnr.

DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      field_catalog TYPE lvc_t_fcat,
      gd_layout    TYPE slis_layout_alv,
      gd_repid     LIKE sy-repid,
      g_save TYPE c VALUE 'X',
      g_variant TYPE disvariant,
      gx_variant TYPE disvariant,
      g_exit TYPE c.

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
PARAMETERS: variant LIKE disvariant-variant.
PARAMETERS p_bukrs TYPE bukrs OBLIGATORY.
SELECT-OPTIONS: so_kunnr FOR kna1-kunnr OBLIGATORY,
                so_date  FOR sy-datum OBLIGATORY.
SELECTION-SCREEN END OF BLOCK bl1.

INITIALIZATION.
  gx_variant-report = sy-repid.
  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      i_save     = g_save
    CHANGING
      cs_variant = gx_variant
    EXCEPTIONS
      not_found  = 2.
  IF sy-subrc = 0.
    variant = gx_variant-variant.
  ENDIF.

START-OF-SELECTION.

  SELECT bukrs kunnr dat MAX( time ) AS time
    FROM zcollectoraction INTO CORRESPONDING FIELDS OF TABLE it_collectoraction
    WHERE bukrs = p_bukrs AND
          kunnr IN so_kunnr AND
          dat   IN so_date
    GROUP BY bukrs kunnr dat.

  LOOP AT it_collectoraction INTO wa_collectoraction.
    SELECT SINGLE * FROM zcollectoraction INTO CORRESPONDING FIELDS OF wa_collectoraction
      WHERE bukrs = wa_collectoraction-bukrs AND
            kunnr = wa_collectoraction-kunnr AND
            dat   = wa_collectoraction-dat   AND
            time  = wa_collectoraction-time.

    MODIFY it_collectoraction FROM wa_collectoraction.

    wa_totalcollectoractions-bukrs = wa_collectoraction-bukrs.
    wa_totalcollectoractions-kunnr = wa_collectoraction-kunnr.

    SELECT SINGLE name1 FROM kna1 INTO wa_totalcollectoractions-name1
      WHERE kunnr = wa_collectoraction-kunnr.

    DATA lv_month TYPE n LENGTH 2.

    lv_month = wa_collectoraction-dat+4(2).

    CASE lv_month.
      WHEN '01'.
        wa_totalcollectoractions-date01 = wa_collectoraction-dat.
        wa_totalcollectoractions-action01 = wa_collectoraction-action.
      WHEN '02'.
        wa_totalcollectoractions-date02 = wa_collectoraction-dat.
        wa_totalcollectoractions-action02 = wa_collectoraction-action.
      WHEN '03'.
        wa_totalcollectoractions-date03 = wa_collectoraction-dat.
        wa_totalcollectoractions-action03 = wa_collectoraction-action.
      WHEN '04'.
        wa_totalcollectoractions-date04 = wa_collectoraction-dat.
        wa_totalcollectoractions-action04 = wa_collectoraction-action.
      WHEN '05'.
        wa_totalcollectoractions-date05 = wa_collectoraction-dat.
        wa_totalcollectoractions-action05 = wa_collectoraction-action.
      WHEN '06'.
        wa_totalcollectoractions-date06 = wa_collectoraction-dat.
        wa_totalcollectoractions-action06 = wa_collectoraction-action.
      WHEN '07'.
        wa_totalcollectoractions-date07 = wa_collectoraction-dat.
        wa_totalcollectoractions-action07 = wa_collectoraction-action.
      WHEN '08'.
        wa_totalcollectoractions-date08 = wa_collectoraction-dat.
        wa_totalcollectoractions-action08 = wa_collectoraction-action.
      WHEN '09'.
        wa_totalcollectoractions-date09 = wa_collectoraction-dat.
        wa_totalcollectoractions-action09 = wa_collectoraction-action.
      WHEN '10'.
        wa_totalcollectoractions-date10 = wa_collectoraction-dat.
        wa_totalcollectoractions-action10 = wa_collectoraction-action.
      WHEN '11'.
        wa_totalcollectoractions-date11 = wa_collectoraction-dat.
        wa_totalcollectoractions-action11 = wa_collectoraction-action.
      WHEN '12'.
        wa_totalcollectoractions-date12 = wa_collectoraction-dat.
        wa_totalcollectoractions-action12 = wa_collectoraction-action.
      WHEN OTHERS.
    ENDCASE.

    READ TABLE it_totalcollectoractions INTO wa_totalcollectoractions
                        WITH TABLE KEY kunnr = wa_collectoraction-kunnr.
    IF sy-subrc = 0.
      MODIFY it_totalcollectoractions INDEX sy-tabix FROM wa_totalcollectoractions.
    ELSE.
      INSERT wa_totalcollectoractions INTO TABLE it_totalcollectoractions.
    ENDIF.

  ENDLOOP.

  PERFORM build_fieldcatalog_agreggate.
  PERFORM display_alv_report.


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_alv_report .
  gd_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = gd_repid
      i_callback_top_of_page  = 'TOP-OF-PAGE'  "see FORM
      i_callback_user_command = 'USER_COMMAND'
      it_fieldcat             = fieldcatalog[]
      i_save                  = 'X'
      is_variant              = g_variant
    TABLES
      t_outtab                = it_totalcollectoractions
    EXCEPTIONS
      program_error           = 1
      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.

ENDFORM.                    " DISPLAY_ALV_REPORT

*-------------------------------------------------------------------*
* Form  TOP-OF-PAGE                                                 *
*-------------------------------------------------------------------*
* ALV Report Header                                                 *
*-------------------------------------------------------------------*
FORM top-of-page.
*ALV Header declarations
  DATA: t_header TYPE slis_t_listheader,
        wa_header TYPE slis_listheader,
        t_line LIKE wa_header-info,
        ld_lines TYPE i,
        ld_linesc(10) TYPE c,
        lv_butxt TYPE butxt.

  SELECT SINGLE butxt INTO lv_butxt FROM t001
    WHERE bukrs = p_bukrs.
* Title
  wa_header-typ  = 'H'.
  wa_header-info = 'Collectors'' Action Report'.
  APPEND wa_header TO t_header.
  CLEAR wa_header.
* Date
  wa_header-typ  = 'S'.
  wa_header-key = 'Date: '.
  CONCATENATE  sy-datum+6(2) '.'
               sy-datum+4(2) '.'
               sy-datum(4) INTO wa_header-info.   "todays date
  APPEND wa_header TO t_header.
  CLEAR: wa_header.
* Bukrs
  wa_header-typ  = 'S'.
  wa_header-key = 'Company: '.
  CONCATENATE p_bukrs lv_butxt INTO wa_header-info SEPARATED BY space.
  APPEND wa_header TO t_header.
  CLEAR wa_header.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = t_header.
ENDFORM.                    "top-of-page



*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG_AGREGGATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog_agreggate .

  fieldcatalog-fieldname   = 'KUNNR'.
  fieldcatalog-seltext_m   = 'Customer ID'.
  fieldcatalog-col_pos     = 0.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'NAME1'.
  fieldcatalog-seltext_m   = 'Customer Name'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION01'.
  fieldcatalog-seltext_m   = 'January'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION02'.
  fieldcatalog-seltext_m   = 'February'.
  fieldcatalog-col_pos     = 3.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION03'.
  fieldcatalog-seltext_m   = 'March'.
  fieldcatalog-col_pos     = 4.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION04'.
  fieldcatalog-seltext_m   = 'April'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION05'.
  fieldcatalog-seltext_m   = 'May'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION06'.
  fieldcatalog-seltext_m   = 'June'.
  fieldcatalog-col_pos     = 7.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION07'.
  fieldcatalog-seltext_m   = 'July'.
  fieldcatalog-col_pos     = 8.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION08'.
  fieldcatalog-seltext_m   = 'August'.
  fieldcatalog-col_pos     = 9.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION09'.
  fieldcatalog-seltext_m   = 'September'.
  fieldcatalog-col_pos     = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION10'.
  fieldcatalog-seltext_m   = 'Octomber'.
  fieldcatalog-col_pos     = 11.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION11'.
  fieldcatalog-seltext_m   = 'Noveber'.
  fieldcatalog-col_pos     = 10.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'ACTION12'.
  fieldcatalog-seltext_m   = 'December'.
  fieldcatalog-col_pos     = 11.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.


ENDFORM.                    " BUILD_FIELDCATALOG_AGREGGATE
*&---------------------------------------------------------------------*
*&报告Z_收集器\u操作
*&
*&---------------------------------------------------------------------*
*&描述
*&
*&---------------------------------------------------------------------*
*&更改日志:
*&日期作者行动
*&
*&---------------------------------------------------------------------*
报告z_收集器的操作。
表:zcollectoraction,kna1,t001。
类型池:SLI。
类型:从ty_totalcollectoractions开始,
bukrs类型zcollectoraction bukrs,
KUNR类型zcollectoraction KUNR,
名称1类型kna1-name1,
date01类型zcollectoraction dat,
date02类型zcollectoraction dat,
date03类型zcollectoraction dat,
date04类型zcollectoraction dat,
date05类型zcollectoraction dat,
date06类型zcollectoraction dat,
date07类型zcollectoraction dat,
date08类型zcollectoraction dat,
date09类型zcollectoraction dat,
date10类型zcollectoraction dat,
date11类型zcollectoraction dat,
date12类型zcollectoraction dat,
action01类型zcollectoraction操作,
action02类型zcollectoraction操作,
action03类型zcollectoraction操作,
action04类型zcollectoraction操作,
action05类型zcollectoraction动作,
action06类型zcollectoraction动作,
action07类型zcollectoraction动作,
action08类型zcollectoraction动作,
action09类型zcollectoraction操作,
action10类型zcollectoraction操作,
action11类型zcollectoraction操作,
action12类型zcollectoraction动作,
ty_totalcollectoractions结束。
数据:与zcollectoraction类似的wa_collectoraction,
它是一个类似于zcollectoraction表的collectoraction,
wa_totalcollectoractions类型ty_totalcollectoractions,
它是具有键KUNR的ty_totalcollectoractions类型表。
数据:带有标题行的fieldcatalog类型slis\u t\u fieldcat\u alv,
字段目录类型lvc\U t\U fcat,
gd\U布局类型slis\U布局\U alv,
gd_repid像sy repid一样,
g_保存类型c值“X”,
g_变体类型disvariant,
gx_变体类型disvariant,
g_出口类型c。
块bl1的选择屏幕开始,框架标题文本为-001。
参数:类似disvariant的变量。
参数p_bukrs类型bukrs必须。
选择选项:对于kna1 KUNR,必须选择so_KUNR,
所以sy数据的日期是强制性的。
选择块bl1的屏幕末端。
初始化。
gx_variant-report=sy repid。
调用函数“重用\u ALV\u变量\u默认值\u GET”
出口
i_save=g_save
改变
cs_变量=gx_变量
例外情况
未找到=2。
如果sy subrc=0。
变量=gx_变量-变量。
恩迪夫。
开始选择。
选择bukrs kunnr dat MAX(时间)作为时间
从zcollectoraction到表it\U collectoraction的相应字段
其中bukrs=p_bukrs和
苏苏昆纳的昆纳和
苏苏日期
由bukrs kunnr dat进行分组。
将it_collectoraction循环到wa_collectoraction。
从zcollectoraction中选择SINGLE*进入wa_collectoraction的相应字段
其中bukrs=wa_collectoraction-bukrs和
kunnr=wa_collectoraction-kunnr和
dat=wa_collectoraction-dat和
时间=wa_collectoraction-time。
从wa_collectoraction修改它_collectoraction。
wa_totalcollectoractions-bukrs=wa_collectoraction-bukrs。
wa_totalcollectoractions-kunnr=wa_collectoraction-kunnr。
从kna1中选择单个名称1到wa_totalcollectoractions-name1
其中kunnr=wa_collectoraction-kunnr。
数据LVU月类型n长度2。
lv_月=wa_collectoraction-dat+4(2)。
一个月一次。
当'01'时。
wa_totalcollectoractions-date01=wa_collectoraction-dat。
wa_totalcollectoractions-action 01=wa_collectoraction-action。
当'02'时。
wa_totalcollectoractions-date02=wa_collectoraction-dat。
wa_totalcollectoractions-action02=wa_collectoraction-action。
当'03'时。
wa_totalcollectoractions-date03=wa_collectoraction-dat。
wa_totalcollectoractions-03=wa_collectoraction-action。
当'04'时。
wa_totalcollectoractions-date04=wa_collectoraction-dat。
wa_totalcollectoractions-action04=wa_collectoraction-action。
05年的时候。
wa_totalcollectoractions-date05=wa_collectoraction-dat。
wa_totalcollectoractions-action 05=wa_collectoraction-action。
06年的时候。
wa_totalcollectoractions-date06=wa_collectoraction-dat。
wa_totalcollectoractions-action06=wa_collectoraction-action。
当‘07’的时候。
wa_totalcollectoractions-date07=wa_collectoraction-dat。
wa_totalcollectoractions-action 07=wa_collectoraction-action。
08年的时候。
wa_totalcollectoractions-date08=wa_collectoraction-dat。
wa_totalcollectoractions-08=wa_collectoraction-action。
当'09'时。
wa_totalcollectoractions-date09=wa_collectoraction-dat。
wa_totalcollectoractions-action09=wa_collectoraction-action。
当‘10’的时候。
wa_totalcollectoractions-date10=wa_collectoraction-dat。
wa_totalcollectoract
    clear: itab2[].
    Loop at itab into wa_itab.
      wa_itab2-field1 = wa_itab-field1.
      wa_itab2-field2 = wa_itab-field2.
      wa_itab2-field3 = wa_itab-field3.
      wa_itab2-field4 = wa_itab-field4.
      ...
      read table itab2 into data(ls_itab2) with key field1 = wa_itab2-field1
                                                    field2 = wa_itab2-field2
                                                    field3 = wa_itab2-field3
                                                    ... 
                                                    binary search.
      if sy-subrc = 0 .
        " modify the line
         modify itab2 from wa_itab2 index sy-tabix.
      else.
        " append the line 
         append wa_itab2 to itab2.
         sort itab2 ascending by field1 field2 field3 ... . "the key fields.
      endif. 
    EndLoop.
FIELD-SYMBOLS: <fs_itab2> TYPE wa_itab2.
SORT itab2 BY bukrs kunnr.
LOOP AT itab INTO wa_itab.
***CHECK IF DATES EXIST***
READ TABLE itab2 ASSIGNING <fs_itab2> WITH KEY bukrs = wa_itab-bukrs
                                               kunnr = wa_itab-kunnr
                                               BINARY SEARCH.
 if sy-subrc = 0 . "if the record are founded
    <fs_itab2>-field1 = wa_itab-field1.
    <fs_itab2>-field2 = wa_itab-field2.
    <fs_itab2>-field3 = wa_itab-field3.
    ...
 else.  
  APPEND INITIAL LINE TO itab2 ASSIGNING <fs_itab2>.
  IF <fs_itab2> IS ASSIGNED.
    <fs_itab2>-field1 = wa_itab-field1.
    <fs_itab2>-field2 = wa_itab-field2.
    <fs_itab2>-field3 = wa_itab-field3.
    ...
  ENDIF.
ENDLOOP.
MOVE-CORRESPONDING src_tab TO target.
SELECT * FROM konh INTO TABLE @DATA(lt_konh) WHERE kschl = 'MWST'.
DATA(lt_upd_konh) = lt_konh.

LOOP AT lt_konh ASSIGNING FIELD-SYMBOL(<fs_konh>) WHERE datbi > sy-datum.
 <fs_konh>-datbi = sy-datum - 1.
ENDLOOP.

<fs_konh>-knumh = 1000.
APPEND <fs_konh> TO lt_konh.
<fs_konh>-knumh = 1001.
APPEND <fs_konh> TO lt_konh.
<fs_konh>-knumh = 1002.
APPEND <fs_konh> TO lt_konh.

MOVE-CORRESPONDING lt_konh TO lt_upd_konh.