【收藏】ABAP Bom按层展开的几种实现方法

  1. *递归的方式实现
  2. FUNCTION zbomexplode.
  3. * "--------------------------------------------------------- *"
  4. * "Local Interface:
  5. *"IMPORTING
  6. * "REFERENCE(MATNR) TYPE MATNR
  7. *"REFERENCE(WERKS) TYPE WERKS_D
  8. * "TABLES
  9. *"PARENT STRUCTURE SBOM
  10. * "CHILDREN STRUCTURE SBOM
  11. *"EXCEPTIONS
  12. * " NO_BOM_FOUND *"----------------------------------------------------------
  13. DATA: it_a TYPE TABLE OF sbom.
  14. DATA: it_b TYPE TABLE OF sbom.
  15. IF parent[] IS INITIAL.
  16. * first time that call to the FM
  17. SELECT stpo~idnrk INTO TABLE it_a
  18. FROM mast INNER JOIN stpo
  19. ON mast~stlnr = stpo~stlnr
  20. WHERE mast~matnr = matnr
  21. AND mast~werks = werks.
  22. IF it_a[] IS INITIAL.
  23. RAISE no_bom_found.
  24. ENDIF.
  25. ELSE.
  26. SELECT stpo~idnrk INTO TABLE it_a
  27. FROM mast
  28. INNER JOIN stpo ON mast~stlnr = stpo~stlnr
  29. FOR ALL ENTRIES IN parent
  30. WHERE mast~matnr = parent-matnr
  31. AND mast~werks = werks.
  32. * if there is no any sub item, then stop the recursion IF it_a[] IS INITIAL.
  33. EXIT .
  34. ENDIF .
  35. ENDIF .
  36. APPEND LINES OF it_a TO children .
  37. * get sub items recursively
  38. CALL FUNCTION ' Z_BOM_EXPLODE '
  39. EXPORTING
  40. matnr = ''
  41. werks = werks
  42. TABLES
  43. parent = it_a
  44. children = it_b .
  45. APPEND LINES OF it_b TO children .
  46. * delete duplicate sub items at the end
  47. IF parent [] IS INITIAL .
  48. SORT children BY matnr .
  49. DELETE ADJACENT DUPLICATES FROM children .
  50. ENDIF .
  51. ENDFUNCTION .
  52. *使用循环代替递归的一种做法1,更便于做异常处理,程序运行时系统也不要维护递归堆栈。这个程序不好的地方在于要用两个 itab 频繁 copy 数据。
  53. FUNCTION zbomexplode1 .
  54. *"--------------------------------------------------------- *"
  55. *" Local Interface :
  56. *" IMPORTING
  57. *" VALUE ( MATNR ) TYPE MATNR
  58. *" VALUE ( WERKS ) TYPE WERKS_D *" TABLES
  59. *" CHILDREN STRUCTURE SBOM *" EXCEPTIONS
  60. *" NO_BOM_FOUND *"---------------------------------------------------------
  61. DATA : it_a TYPE TABLE OF sbom ,
  62. it_b TYPE TABLE OF sbom ,
  63. it_result TYPE TABLE OF sbom .
  64. SELECT stpo ~ idnrk
  65. INTO TABLE it_a
  66. FROM mast
  67. INNER JOIN stpo ON mast ~ stlnr = stpo ~ stlnr
  68. WHERE mast ~ matnr = matnr
  69. AND mast ~ werks = werks .
  70. APPEND LINES OF it_a TO it_result .
  71. WHILE NOT it_a [] IS INITIAL .
  72. SELECT stpo ~ idnrk
  73. INTO TABLE it_b
  74. FROM mast INNER JOIN stpo
  75. ON mast ~ stlnr = stpo ~ stlnr
  76. FOR ALL ENTRIES IN it_a
  77. WHERE mast ~ matnr = it_a - matnr
  78. AND mast ~ werks = werks .
  79. APPEND LINES OF it_b TO it_result .
  80. it_a [] = it_b [].
  81. ENDWHILE .
  82. * delete duplicate sub items
  83. SORT it_result BY matnr .
  84. DELETE ADJACENT DUPLICATES FROM it_result .
  85. children [] = it_result [].
  86. ENDFUNCTION .
  87. FUNCTION zbomexplode2 .
  88. *"---------------------------------------------------------- *"
  89. *" Local Interface : *" IMPORTING
  90. *" VALUE ( MATNR ) TYPE MATNR
  91. *" VALUE ( WERKS ) TYPE WERKS_D
  92. *" TABLES
  93. *" CHILDREN STRUCTURE SBOM
  94. *" EXCEPTIONS *" NO_BOM_FOUND
  95. *"----------------------------------------------------------
  96. DATA : it_result TYPE TABLE OF sbom ,
  97. wa_bom TYPE sbom .
  98. SELECT stpo ~ idnrk
  99. INTO TABLE it_result
  100. FROM mast INNER JOIN stpo
  101. ON mast ~ stlnr = stpo ~ stlnr
  102. WHERE mast ~ matnr = matnr
  103. AND mast ~ werks = werks .
  104. LOOP AT it_result INTO wa_bom .
  105. SELECT stpo ~ idnrk
  106. APPENDING TABLE it_result
  107. FROM mast INNER JOIN stpo
  108. ON mast ~ stlnr = stpo ~ stlnr
  109. WHERE mast ~ matnr = wa_bom - matnr
  110. AND mast ~ werks = werks .
  111. ENDLOOP .
  112. *& nbsp; delete duplicate  sub items
  113. sort it_result by matnr.
  114. delete adjacent duplicates from it_result.
  115. children[] = it_result[].
  116. ENDFUNCTION.
  117. *调用BAPI实现
  118. FUNCTION zbomexplode.
  119. * "--------------------------------------------------------- *"
  120. * "Local Interface: *" IMPORTING
  121. * " VALUE(MATNR) LIKE MARA-MATNR
  122. *" VALUE(WERKS) LIKE MARC-WERKS OPTIONAL
  123. * " VALUE(CAPID) LIKE TC04-CAPID DEFAULT 'PP01'
  124. *" TABLES
  125. * " STB STRUCTURE STPOX
  126. *" RETURN STRUCTURE BAPIRET2
  127. * "---------------------------------------------------------
  128. IF werks IS INITIAL."Added in case external call does not know
  129. werks = '1000'.
  130. ENDIF.
  131. IF capid IS INITIAL.
  132. capid = 'PP01'.
  133. ENDIF.
  134. CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
  135. EXPORTING
  136. capid = capid
  137. datuv = sy-datum
  138. mehrs = 'X'
  139. mtnrv = matnr
  140. werks = werks
  141. TABLES
  142. stb = stb
  143. EXCEPTIONS
  144. no_bom_found = 1.
  145. IF sy-subrc & lt;& gt; 0.
  146. msg_typ = 'E'.
  147. msg_id = 'Z_EF'.
  148. msg_no = '002'.
  149. msg_v1 = matnr.
  150. IF NOT msg_typ IS INITIAL.
  151. * append error to table RETURN
  152. CALL FUNCTION 'BALW_BAPIRETURN_GET2'
  153. EXPORTING
  154. type = msg_typ
  155. cl = msg_id
  156. number = msg_no
  157. par1 = msg_v1
  158. par2 = msg_v2
  159. par3 = msg_v3
  160. par4 = msg_v4
  161. parameter = space
  162. row = space
  163. field = space
  164. IMPORTING
  165. return = wa_return_tmp.
  166. APPEND wa_return_tmp TO return.
  167. ENDIF.
  168. ENDIF.
  169. ENDFUNCTION
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值