ABAP Bom按层展开的几种实现方法
来源:互联网 发布:usb数据传输线 编辑:程序博客网 时间:2024/05/16 02:50
*递归的方式实现FUNCTION zbomexplode.*"--------------------------------------------------------- *"*"Local Interface:*"IMPORTING*"REFERENCE(MATNR) TYPE MATNR*"REFERENCE(WERKS) TYPE WERKS_D*"TABLES*"PARENT STRUCTURE SBOM*"CHILDREN STRUCTURE SBOM*"EXCEPTIONS*" NO_BOM_FOUND *"---------------------------------------------------------- DATA: it_a TYPE TABLE OF sbom. DATA: it_b TYPE TABLE OF sbom. IF parent[] IS INITIAL.* first time that call to the FM SELECT stpo~idnrk INTO TABLE it_a FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr WHERE mast~matnr = matnr AND mast~werks = werks. IF it_a[] IS INITIAL. RAISE no_bom_found. ENDIF. ELSE. SELECT stpo~idnrk INTO TABLE it_a FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr FOR ALL ENTRIES IN parent WHERE mast~matnr = parent-matnr AND mast~werks = werks.* if there is no any sub item, then stop the recursion IF it_a[] IS INITIAL. EXIT. ENDIF.ENDIF.APPEND LINES OF it_a TO children.* get sub items recursivelyCALL FUNCTION 'Z_BOM_EXPLODE' EXPORTING matnr = '' werks = werks TABLES parent = it_a children = it_b.APPEND LINES OF it_b TO children.* delete duplicate sub items at the endIF parent[] IS INITIAL. SORT children BY matnr. DELETE ADJACENT DUPLICATES FROM children.ENDIF.ENDFUNCTION.*使用循环代替递归的一种做法1,更便于做异常处理,程序运行时系统也不要维护递归堆栈。这个程序不好的地方在于要用两个itab频繁copy数据。FUNCTION zbomexplode1.*"--------------------------------------------------------- *"*"Local Interface:*" IMPORTING*" VALUE(MATNR) TYPE MATNR*" VALUE(WERKS) TYPE WERKS_D *" TABLES*" CHILDREN STRUCTURE SBOM *" EXCEPTIONS*" NO_BOM_FOUND *"---------------------------------------------------------DATA: it_a TYPE TABLE OF sbom, it_b TYPE TABLE OF sbom, it_result TYPE TABLE OF sbom.SELECT stpo~idnrkINTO TABLE it_aFROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr WHERE mast~matnr = matnr AND mast~werks = werks. APPEND LINES OF it_a TO it_result. WHILE NOT it_a[] IS INITIAL. SELECT stpo~idnrk INTO TABLE it_b FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr FOR ALL ENTRIES IN it_a WHERE mast~matnr = it_a-matnr AND mast~werks = werks. APPEND LINES OF it_b TO it_result. it_a[] = it_b[]. ENDWHILE.* delete duplicate sub items SORT it_result BY matnr. DELETE ADJACENT DUPLICATES FROM it_result. children[] = it_result[]. ENDFUNCTION. FUNCTION zbomexplode2.*"---------------------------------------------------------- *"*"Local Interface: *" IMPORTING*" VALUE(MATNR) TYPE MATNR*" VALUE(WERKS) TYPE WERKS_D*" TABLES*" CHILDREN STRUCTURE SBOM*" EXCEPTIONS *" NO_BOM_FOUND*"---------------------------------------------------------- DATA: it_result TYPE TABLE OF sbom, wa_bom TYPE sbom. SELECT stpo~idnrk INTO TABLE it_result FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr WHERE mast~matnr = matnr AND mast~werks = werks. LOOP AT it_result INTO wa_bom. SELECT stpo~idnrk APPENDING TABLE it_result FROM mast INNER JOIN stpo ON mast~stlnr = stpo~stlnr WHERE mast~matnr = wa_bom-matnr AND mast~werks = werks. ENDLOOP.* delete duplicate sub items sort it_result by matnr. delete adjacent duplicates from it_result. children[] = it_result[]. ENDFUNCTION.*调用BAPI实现 FUNCTION zbomexplode.*"--------------------------------------------------------- *"*"Local Interface: *" IMPORTING*" VALUE(MATNR) LIKE MARA-MATNR*" VALUE(WERKS) LIKE MARC-WERKS OPTIONAL*" VALUE(CAPID) LIKE TC04-CAPID DEFAULT 'PP01'*" TABLES*" STB STRUCTURE STPOX*" RETURN STRUCTURE BAPIRET2*"--------------------------------------------------------- IF werks IS INITIAL."Added in case external call does not know werks = '1000'. ENDIF. IF capid IS INITIAL. capid = 'PP01'. ENDIF. CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING capid = capid datuv = sy-datum mehrs = 'X' mtnrv = matnr werks = werks TABLES stb = stb EXCEPTIONS no_bom_found = 1. IF sy-subrc <> 0. msg_typ = 'E'. msg_id = 'Z_EF'. msg_no = '002'. msg_v1 = matnr. IF NOT msg_typ IS INITIAL.* append error to table RETURN CALL FUNCTION 'BALW_BAPIRETURN_GET2' EXPORTING type = msg_typ cl = msg_id number = msg_no par1 = msg_v1 par2 = msg_v2 par3 = msg_v3 par4 = msg_v4 parameter = space row = space field = space IMPORTING return = wa_return_tmp. APPEND wa_return_tmp TO return. ENDIF. ENDIF. ENDFUNCTION
0 0
- ABAP Bom按层展开的几种实现方法
- SQL 与 orcale 数据库对BOM多级展开的实现方法
- [abap] 几种定义内表的方法
- ABAP 动态生成内表的几种方法
- ABAP 动态生成内表的几种方法
- ABAP 动态生成内表的几种方法
- abap动态编程的几种实现方式
- 几种网页弹出层的实现
- SQL Server BOM展开方法整理
- SQL Server BOM展开方法整理
- SQL Server BOM展开方法整理
- SQL Server BOM展开方法整理
- 展开BOM
- 展开BOM
- 展开BOM
- 展开BOM
- 展开BOM
- 展开BOM
- Leetcode Count of Smaller Numbers After Self
- .gitignore 比较完善的写法
- JAVA编程风格
- exercise 38 列表操作
- 58. Length of Last Word
- ABAP Bom按层展开的几种实现方法
- 139. Word Break
- HDU 1159 Common Subsequence
- 解决android扫描二维码时,用户禁止权限报错问题
- eMMC 原理 :Flash Memory 简介
- canny边缘检测C++实现
- GitLab的安装实战
- 启动顺序导致的 ntldr is missing 错误情况
- 设计模式---十一个行为型模式