ABAP算法:找出递归的物料
生活随笔
收集整理的這篇文章主要介紹了
ABAP算法:找出递归的物料
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天有人在群里問了這樣一個問題,一個內表有2個字段:f1和f2,每個條目代表物料f1消耗了f2。有一種可能是,f1消耗了f2,f2直接或間接又消耗了f1,形成一種遞歸關系。
現在希望找出內表中所有的這種物料,因為這些物料對成本分攤有不良影響。比如:[a,b]?[b,c] [a,d] [b,d] [c,a];則結果包含a,b,c,不包含d。乍一看需求有點暈,仔細一想,其實就是將內表中所有條目,兩兩之間進行運算而已。
程序思路:每次取內表中的一個條目,將它與內表中位于其前面的所有條目進行運算;運算過程中,如果生成了新對應關系,則將其添加到內表后面(也等待著與內表中所有條目進行運算);如此循環……等到內表循環結束,所有可能的對應關系,自然都被考慮到了。
DATA:?BEGIN?OF?wa1,
????????f1?TYPE?c,
????????f2?TYPE?c,
??????END?OF?wa1.
DATA:?wa2?LIKE?wa1,
??????tabix?LIKE?sy-tabix,
??????itab?LIKE?TABLE?OF?wa1?WITH?HEADER?LINE,
??????itab2?TYPE?TABLE?OF?c?WITH?HEADER?LINE.
itab-f1?=?'a'.
itab-f2?=?'b'.
APPEND?itab.
itab-f1?=?'b'.
itab-f2?=?'c'.
APPEND?itab.
itab-f1?=?'a'.
itab-f2?=?'d'.
APPEND?itab.
itab-f1?=?'b'.
itab-f2?=?'d'.
APPEND?itab.
itab-f1?=?'c'.
itab-f2?=?'a'.
APPEND?itab.
LOOP?AT?itab?INTO?wa1.
??tabix?=?sy-tabix?-?1.
??LOOP?AT?itab?INTO?wa2?TO?tabix.
????IF?wa2-f2?=?wa1-f1.?"運算一
??????READ?TABLE?itab?WITH?KEY
????????f1?=?wa2-f1?f2?=?wa1-f2.
??????IF?sy-subrc?<>?0.
????????IF?wa2-f1?=?wa1-f2.
??????????APPEND?wa2-f1?TO?itab2.?"存到結果表
????????ELSE.
??????????itab-f1?=?wa2-f1.
??????????itab-f2?=?wa1-f2.
??????????APPEND?itab.?"添加新對應關系到內表
????????ENDIF.
??????ENDIF.
????ENDIF.
????IF?wa2-f1?=?wa1-f2.?"運算二
??????READ?TABLE?itab?WITH?KEY
????????f1?=?wa1-f1?f2?=?wa2-f2.
??????IF?sy-subrc?<>?0.
????????IF?wa1-f1?=?wa2-f2.
??????????APPEND?wa1-f1?TO?itab2.?"存到結果表
????????ELSE.
??????????itab-f1?=?wa1-f1.
??????????itab-f2?=?wa2-f2.
??????????APPEND?itab.?"添加新對應關系到內表
????????ENDIF.
??????ENDIF.
????ENDIF.
??ENDLOOP.
ENDLOOP.
SORT?itab2.
DELETE?ADJACENT?DUPLICATES?FROM?itab2.
LOOP?AT?itab2.?"輸出結果表
??WRITE:?/?itab2.
ENDLOOP.
LOOP?AT?itab.?"輸出所有對應關系作參考
??WRITE:?/?itab-f1,?itab-f2.
ENDLOOP.
程序運行過程: 1,[a,b][b,c][a,d][b,d][c,a],他們相互間運算完畢后,生成了新對應關系[a,c][c,b][b,a][c,d]; 2,[a,c][c,b][b,a][c,d]這些新對應關系與老對應關系兩兩運算,同時相互間也兩兩運算,生成了新對應關系[c,c][a,a][b,b]。這是特殊的對應關系(即遞歸關系),它們不需要重新參與運算,直接寫到了我們的結果表。 由于沒有新對應關系的生成,程序運行完畢,結果表中形成了a,b,c三條記錄。
DATA:?BEGIN?OF?wa1,
????????f1?TYPE?c,
????????f2?TYPE?c,
??????END?OF?wa1.
DATA:?wa2?LIKE?wa1,
??????tabix?LIKE?sy-tabix,
??????itab?LIKE?TABLE?OF?wa1?WITH?HEADER?LINE,
??????itab2?TYPE?TABLE?OF?c?WITH?HEADER?LINE.
itab-f1?=?'a'.
itab-f2?=?'b'.
APPEND?itab.
itab-f1?=?'b'.
itab-f2?=?'c'.
APPEND?itab.
itab-f1?=?'a'.
itab-f2?=?'d'.
APPEND?itab.
itab-f1?=?'b'.
itab-f2?=?'d'.
APPEND?itab.
itab-f1?=?'c'.
itab-f2?=?'a'.
APPEND?itab.
LOOP?AT?itab?INTO?wa1.
??tabix?=?sy-tabix?-?1.
??LOOP?AT?itab?INTO?wa2?TO?tabix.
????IF?wa2-f2?=?wa1-f1.?"運算一
??????READ?TABLE?itab?WITH?KEY
????????f1?=?wa2-f1?f2?=?wa1-f2.
??????IF?sy-subrc?<>?0.
????????IF?wa2-f1?=?wa1-f2.
??????????APPEND?wa2-f1?TO?itab2.?"存到結果表
????????ELSE.
??????????itab-f1?=?wa2-f1.
??????????itab-f2?=?wa1-f2.
??????????APPEND?itab.?"添加新對應關系到內表
????????ENDIF.
??????ENDIF.
????ENDIF.
????IF?wa2-f1?=?wa1-f2.?"運算二
??????READ?TABLE?itab?WITH?KEY
????????f1?=?wa1-f1?f2?=?wa2-f2.
??????IF?sy-subrc?<>?0.
????????IF?wa1-f1?=?wa2-f2.
??????????APPEND?wa1-f1?TO?itab2.?"存到結果表
????????ELSE.
??????????itab-f1?=?wa1-f1.
??????????itab-f2?=?wa2-f2.
??????????APPEND?itab.?"添加新對應關系到內表
????????ENDIF.
??????ENDIF.
????ENDIF.
??ENDLOOP.
ENDLOOP.
SORT?itab2.
DELETE?ADJACENT?DUPLICATES?FROM?itab2.
LOOP?AT?itab2.?"輸出結果表
??WRITE:?/?itab2.
ENDLOOP.
LOOP?AT?itab.?"輸出所有對應關系作參考
??WRITE:?/?itab-f1,?itab-f2.
ENDLOOP.
程序運行過程: 1,[a,b][b,c][a,d][b,d][c,a],他們相互間運算完畢后,生成了新對應關系[a,c][c,b][b,a][c,d]; 2,[a,c][c,b][b,a][c,d]這些新對應關系與老對應關系兩兩運算,同時相互間也兩兩運算,生成了新對應關系[c,c][a,a][b,b]。這是特殊的對應關系(即遞歸關系),它們不需要重新參與運算,直接寫到了我們的結果表。 由于沒有新對應關系的生成,程序運行完畢,結果表中形成了a,b,c三條記錄。
總結
以上是生活随笔為你收集整理的ABAP算法:找出递归的物料的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP:下载服务器文件到本机
- 下一篇: ABAP:利用SAP定时器自动刷新LIS