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