您的位置:首页 > 其它

ABAP 递归用法

2017-01-10 17:04 218 查看
做个ABAP的递归用法

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  递归