ABAP 递归用法

2020-11-27 15:49:00 浏览数 (1)

做个ABAP的递归用法

欢迎加群:455101474 讨论SAP相关问题

代码语言:javascript复制
TABLES: makt.

CONSTANTS: maxlevels TYPE i VALUE 10.

TYPES: BEGIN OF ty_usage,
          parent  TYPE  makt-matnr,
          child   TYPE  makt-matnr,
          usage   TYPE  mseg-menge,
       END OF ty_usage.

DATA: wa_usage  TYPE ty_usage,
      it_usage  TYPE STANDARD TABLE OF ty_usage.    " USAGE data

TYPES: BEGIN OF ty_stack,
          level   TYPE  h_level,
          matnr   TYPE  makt-matnr,
          menge   TYPE  mseg-menge,
       END OF ty_stack.

DATA: istackpos TYPE i,
      wa_stack  TYPE ty_stack,
      it_stack  TYPE STANDARD TABLE OF ty_stack.   "BOM Stack

TYPES: BEGIN OF ty_reqd,
          matnr   TYPE  makt-matnr,
          menge   TYPE  mseg-menge,
       END OF ty_reqd.

DATA: wa_reqd   TYPE ty_reqd,
      it_reqd   TYPE STANDARD TABLE OF ty_reqd.    "NET Requirement of 
RAW Material

PARAMETERS: p_build TYPE makt-matnr,    "Target   to Build
            p_menge TYPE mseg-menge.    "Quantity to Build

INITIALIZATION.
  PERFORM f_usage_data.


START-OF-SELECTION.

  istackpos = 0.

  MOVE istackpos  TO wa_stack-level.
  MOVE p_build    TO wa_stack-matnr.
  MOVE p_menge    TO wa_stack-menge.
  APPEND wa_stack TO it_stack.                              " 1st PUSH

  PERFORM f_explode USING p_build.

  SORT it_reqd BY matnr.

  PERFORM zjnc_dump_list USING 'IT_REQD' 'WA_REQD' 'Net RAW 
Requirement'.

*&--------------------------------------------------------------------*
*&      Form  f_Explode
*&--------------------------------------------------------------------*
FORM f_explode USING p_pmatnr.
  DATA: icount   TYPE i,
        totalreq TYPE mseg-menge.

  istackpos = istackpos   1.                          " PUSH

  IF istackpos GE maxlevels.
    PERFORM f_dumpstack.    " terminate
    LEAVE PROGRAM.
  ENDIF.

  icount = 0.

  LOOP AT it_usage INTO wa_usage WHERE parent = p_pmatnr.
    icount = icount   1.

    MOVE istackpos      TO wa_stack-level.
    MOVE wa_usage-child TO wa_stack-matnr.
    MOVE wa_usage-usage TO wa_stack-menge.
    APPEND wa_stack     TO it_stack.                  " PUSH

    PERFORM f_explode USING wa_usage-child.

  ENDLOOP.

  IF icount = 0.                                  " then LEAF
    totalreq = '1.0'.
    LOOP AT it_stack INTO wa_stack.
      totalreq = totalreq * wa_stack-menge.
    ENDLOOP.

    MOVE p_pmatnr   TO wa_reqd-matnr.
    MOVE totalreq   TO wa_reqd-menge.
    COLLECT wa_reqd INTO it_reqd.

  ENDIF.

  DELETE it_stack INDEX istackpos.                      " POP

  istackpos = istackpos - 1.                            " POP

ENDFORM.                    "f_Explode

*&--------------------------------------------------------------------*
*&      Form  f_dumpstack
*&--------------------------------------------------------------------*
FORM f_dumpstack.

  PERFORM zjnc_dump_list USING 'IT_STACK' 'WA_STACK' 'LOOP in BOM 
STACK'.

ENDFORM.                    "f_dumpstack

*&--------------------------------------------------------------------*
*&      Form  f_usage_data for Hungry Bengali ABAPer in Kolkata
*&--------------------------------------------------------------------*
FORM f_usage_data.
  MOVE 'FISHCURRY'   TO wa_usage-parent.
  MOVE 'SPICES'      TO wa_usage-child.
  MOVE 10            TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

  MOVE 'FISHCURRY'   TO wa_usage-parent.
  MOVE 'MIRCHI'      TO wa_usage-child.
  MOVE 5             TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

  MOVE 'FISHCURRY'   TO wa_usage-parent.
  MOVE 'ALOO'        TO wa_usage-child.
  MOVE 8             TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

  MOVE 'SPICES'      TO wa_usage-parent.
  MOVE 'MIRCHI'      TO wa_usage-child.
  MOVE 2             TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

  MOVE 'SPICES'      TO wa_usage-parent.
  MOVE 'JEERA'       TO wa_usage-child.
  MOVE 3             TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

  MOVE 'SPICES'      TO wa_usage-parent.
  MOVE 'HALUD'       TO wa_usage-child.
  MOVE 7             TO wa_usage-usage.
  APPEND wa_usage TO it_usage.

ENDFORM.                    "f_usage_data

0 人点赞