ABAP 动态的实现任意表的ALV显示
生活随笔
收集整理的這篇文章主要介紹了
ABAP 动态的实现任意表的ALV显示
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
程序沒有什么實(shí)用性,就是把一個表的內(nèi)容全部顯示出來了,僅用于看看數(shù)據(jù)都是什么樣子的,但是其中的動態(tài)的方法還是值得研究學(xué)習(xí)的。這些方法是從我的前輩身上學(xué)到的,我小小的實(shí)踐了一下,本來認(rèn)為在編寫程序的可以盡可能的實(shí)現(xiàn)程序的可配置型,然后這種想法是雖然好,不過自己沒有辦法實(shí)現(xiàn)。例如 我想 DATA 內(nèi)表 TYPE TABLE OF 任意表的名稱。 開始 簡單的認(rèn)為 DATA GR_TABNAME TYPE TABNAME. DATA ?內(nèi)表 TYPE TABLE OF (GR_TABNAME). 然而這是行不通的。于是采用了動態(tài)的方式實(shí)現(xiàn)了類似的思想。 第一部分:程序框架 REPORT ?ZALV_20090304_EVENT.
INCLUDE ZALV_DATA_INTI. INCLUDE ZALV_EVENT_F01.
START-OF-SELECTION.
PERFORM SUB_ALV_DATA_GET. 第二部分:INCLUDE ZALV_DATA_INTI. ?TYPE-POOLS:ABAP. PARAMETERS P_NAME TYPE OBJNAME. DATA LT_TABLE TYPE TABLE OF DFIES. DATA LS_TABLE TYPE DFIES.
CALL FUNCTION 'DDIF_NAMETAB_GET' ?EXPORTING ? ?TABNAME ? ? ? ? ?= P_NAME TABLES * ? X031L_TAB ? ? ? ? = ? DFIES_TAB ? ? ? ? =LT_TABLE EXCEPTIONS ? NOT_FOUND ? ? ? ? = 1 ? OTHERS ? ? ? ? ? ?=2 ? ? ? ? ?. IF SY-SUBRC <> 0. ?MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO ? ? ? ? ?WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4. ENDIF.
DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR. DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR. DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR. DATA LR_DATA ?TYPE REF TO CL_ABAP_DATADESCR. DATA L_STRING TYPE STRING. DATA LT_COMP TYPE ?ABAP_COMPONENT_TAB. DATA LS_COMP LIKE LINE OF ?LT_COMP. DATA E_WA TYPE REF TO DATA. DATA E_TABLE TYPE REF TO DATA.
FIELD-SYMBOLS <FS_TABLE> TYPE STANDARDTABLE. FIELD-SYMBOLS <FS_STRUC> TYPE ANY.
LOOP AT LT_TABLE INTO LS_TABLE. ?CONCATENATE LS_TABLE-TABNAME '-'LS_TABLE-FIELDNAME INTO L_STRING. * ?L_STRING = LS_COMP-NAME. ?LS_COMP-NAME = LS_TABLE-FIELDNAME. ?CALL METHODCL_ABAP_DATADESCR=>DESCRIBE_BY_NAME ? ?EXPORTING ? ? ?P_NAME ? ? ? ? =L_STRING ? ?RECEIVING ? ? ?P_DESCR_REF ? ?=LR_TYPE ? ?EXCEPTIONS ? ? ?TYPE_NOT_FOUND = 1 ? ? ?OTHERS ? ? ? ? =2. ?IF SY-SUBRC <> 0. ? ?MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO ? ? ? ? ? ? ? WITHSY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ?ENDIF.
?LS_COMP-TYPE ?= LR_TYPE. ?APPEND LS_COMP TO LT_COMP. ?CLEAR LS_COMP. ENDLOOP.
CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE ?EXPORTING ? ?P_COMPONENTS = LT_COMP ?RECEIVING ? ?P_RESULT ? ? = LR_STRUC ? ?.
CALL METHOD CL_ABAP_TABLEDESCR=>CREATE ?EXPORTING ? ?P_LINE_TYPE ?= LR_STRUC ?RECEIVING ? ?P_RESULT ? ? = LR_TABLE ? ?.
CREATE DATA E_WA ? ?TYPE HANDLE LR_STRUC. CREATE DATA E_TABLE TYPE HANDLE LR_TABLE.
ASSIGN E_WA->* TO <FS_STRUC>. ASSIGN E_TABLE->* TO <FS_TABLE>. 第三部分:INCLUDE ZALV_EVENT_F01. ?FORM SUB_ALV_DATA_GET .
SELECT * INTO CORRESPONDING FIELDS OF TABLE<FS_TABLE> FROM (P_NAME). ? CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' ? ? ?EXPORTING ? ? ? ?I_STRUCTURE_NAME ?? ? ? ? ? ? ? ?=P_NAME ? ? ? TABLES ? ? ? ? T_OUTTAB ? ?? ? ? ? ? ? ? ? ?? ?= <FS_TABLE> ? ? ?EXCEPTIONS ? ? ? ?PROGRAM_ERROR ? ?? ? ? ? ? ? ? ? = 1 ? ? ? ?OTHERS ? ? ?? ? ? ? ? ? ? ? ?? ?= 2 ? ? ? ? ? ? ? . ? ? IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO ? ? ? ? WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4. ? ? ENDIF. ENDFORM. ? ? ? ? ? ? ?? ? ?" SUB_ALV_DATA_GET 已投稿到: 排行榜 圈子 閱讀(83)|評論(7)|收藏(0)|打印|舉報(bào) 前一篇:ABAP 的 一些小技巧總結(jié) 后一篇:ABAP中ALV函數(shù)積累的實(shí)戰(zhàn)技巧與原理 評論 ? ?重要提示:警惕虛假中獎信息,點(diǎn)擊查看詳情[發(fā)評論] 新浪網(wǎng)友:2009-03-14 11:00:59 Hi 關(guān)于動態(tài)的實(shí)現(xiàn)任意表的ALV顯示的文章。 我測試了下,輸入一個table是可以的,但是輸入一個試圖就出錯了,怎么改進(jìn)呢 博主回復(fù):2009-03-16 09:33:19HI,我查了一些資料,做了一些試驗(yàn),有一些東西先來共同的探討一下: sap的視圖的類型有五種
Database views :和數(shù)據(jù)庫的視圖形同,連接條件是必須自定義.? Projection views: 用于屏蔽一些字段(一般用于保護(hù)數(shù)據(jù)時使用).? Help views: 該類視圖可以用搜索幫助的"selectionmethod"中使用,參與連接表必須存在外鍵.? Maintenance views:允許你進(jìn)行對幾個表的數(shù)據(jù)進(jìn)行修改,參與連接表必須存在外鍵,他們的連接條件是不能自定義的.?? Append Views:這種視圖主要用于增強(qiáng);. ? 如果database視圖和Protection視圖能進(jìn)行select操作,其他視圖不能進(jìn)行查詢;
對于多表連接的database視圖,只能進(jìn)行讀操作;
如果database視圖是單個表,則可以插入紀(jì)錄;
如果database視圖含有表的所有關(guān)鍵字,則可以修改;
對其他三種視圖都可以進(jìn)行插入和修改操作,具體參見maintance status的設(shè)置. 基于以上的分類,只有兩種視圖是可以支持SELECT語句的,所有只有前兩種視圖是可以顯示的,我做了一個簡單的例子,發(fā)現(xiàn)可以顯示。 新浪網(wǎng)友:2009-03-14 11:20:27 另外我想把每個字段的字段名稱作為ALV顯示的第一行,字段名稱的描述作為ALV顯示的第二行,怎么做呢,從表里邊的值從第三行開始 李:2009-03-16 10:24:21 朋友, 我在輸入視圖V_T683S的時候會有一個dump,你看看有無,怎么改進(jìn)呢。 Maint. view ? ? ? ?V_T683S Short Description ?Schema (&1&2)
謝謝了。
菩提大仙:2009-03-16 23:37:49 通過對V_T683S的屬性進(jìn)行研究,發(fā)現(xiàn)在MAINTANENCESTATUS中 的一個屬性使用的是 DISPLAY/MAINTANENCE ALLOWED WITH DESTRICTIONS.其中的DESTRICTIONS是限制的意思,這個限制指的是權(quán)限限制,當(dāng)我們生成一張視圖 并且可以進(jìn)行維護(hù)的時候,即GOTO->生成維護(hù)視圖,需要設(shè)置一個權(quán)限組,我猜測:不是所有的用戶都可以維護(hù)這個視圖,需要指定的限制權(quán)限組才可以。 關(guān)于第三行顯示ALV的我認(rèn)為可行,正在調(diào)試代碼?
菩提大仙:2009-03-17 22:07:07 個人分析: 從字面的意思上就可以看出Maintenance views是一個維護(hù)視圖,用來維護(hù)數(shù)據(jù)的。而視圖中可以用來查詢數(shù)據(jù)的只有在SE11中創(chuàng)建視圖類型---- Database views?(數(shù)據(jù)庫視圖類型)和Projection views(投影視圖)也只有這兩個視圖可以使用SELECT語句進(jìn)行查詢。因此才可以用ALV進(jìn)行顯示。其他的三種視圖都是維護(hù)數(shù)據(jù)的方式。? 新浪網(wǎng)友:2009-03-18 10:16:59 版主,你的分析是對的,我測試了下select是不支持Maintenance views的。 REPORT ?Z0001.
TABLES V_T683S. SELECT * FROM V_T683S . ?WRITE: / V_T683S-KVEWE, V_T683S-KAPPL, ? ? ? ? ? V_T683S-KALSM,V_T683S-STUNR. ENDSELECT.
同樣的錯誤提示‘"V_T683S" is not defined in the ABAP Dictionary as atable, projection view, or database view"。 新浪網(wǎng)友:2009-03-18 10:29:49其實(shí)我初始的用意是想從視圖中讀取我需要的數(shù)據(jù),拿視圖V_T683S來說,他比表T683S多一個字段VTEXT(Description),如果僅僅讀取表T683S的話,會缺這一列數(shù)據(jù)。
INCLUDE ZALV_DATA_INTI. INCLUDE ZALV_EVENT_F01.
START-OF-SELECTION.
PERFORM SUB_ALV_DATA_GET. 第二部分:INCLUDE ZALV_DATA_INTI. ?TYPE-POOLS:ABAP. PARAMETERS P_NAME TYPE OBJNAME. DATA LT_TABLE TYPE TABLE OF DFIES. DATA LS_TABLE TYPE DFIES.
CALL FUNCTION 'DDIF_NAMETAB_GET' ?EXPORTING ? ?TABNAME ? ? ? ? ?= P_NAME TABLES * ? X031L_TAB ? ? ? ? = ? DFIES_TAB ? ? ? ? =LT_TABLE EXCEPTIONS ? NOT_FOUND ? ? ? ? = 1 ? OTHERS ? ? ? ? ? ?=2 ? ? ? ? ?. IF SY-SUBRC <> 0. ?MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO ? ? ? ? ?WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4. ENDIF.
DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR. DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR. DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR. DATA LR_DATA ?TYPE REF TO CL_ABAP_DATADESCR. DATA L_STRING TYPE STRING. DATA LT_COMP TYPE ?ABAP_COMPONENT_TAB. DATA LS_COMP LIKE LINE OF ?LT_COMP. DATA E_WA TYPE REF TO DATA. DATA E_TABLE TYPE REF TO DATA.
FIELD-SYMBOLS <FS_TABLE> TYPE STANDARDTABLE. FIELD-SYMBOLS <FS_STRUC> TYPE ANY.
LOOP AT LT_TABLE INTO LS_TABLE. ?CONCATENATE LS_TABLE-TABNAME '-'LS_TABLE-FIELDNAME INTO L_STRING. * ?L_STRING = LS_COMP-NAME. ?LS_COMP-NAME = LS_TABLE-FIELDNAME. ?CALL METHODCL_ABAP_DATADESCR=>DESCRIBE_BY_NAME ? ?EXPORTING ? ? ?P_NAME ? ? ? ? =L_STRING ? ?RECEIVING ? ? ?P_DESCR_REF ? ?=LR_TYPE ? ?EXCEPTIONS ? ? ?TYPE_NOT_FOUND = 1 ? ? ?OTHERS ? ? ? ? =2. ?IF SY-SUBRC <> 0. ? ?MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO ? ? ? ? ? ? ? WITHSY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ?ENDIF.
?LS_COMP-TYPE ?= LR_TYPE. ?APPEND LS_COMP TO LT_COMP. ?CLEAR LS_COMP. ENDLOOP.
CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE ?EXPORTING ? ?P_COMPONENTS = LT_COMP ?RECEIVING ? ?P_RESULT ? ? = LR_STRUC ? ?.
CALL METHOD CL_ABAP_TABLEDESCR=>CREATE ?EXPORTING ? ?P_LINE_TYPE ?= LR_STRUC ?RECEIVING ? ?P_RESULT ? ? = LR_TABLE ? ?.
CREATE DATA E_WA ? ?TYPE HANDLE LR_STRUC. CREATE DATA E_TABLE TYPE HANDLE LR_TABLE.
ASSIGN E_WA->* TO <FS_STRUC>. ASSIGN E_TABLE->* TO <FS_TABLE>. 第三部分:INCLUDE ZALV_EVENT_F01. ?FORM SUB_ALV_DATA_GET .
SELECT * INTO CORRESPONDING FIELDS OF TABLE<FS_TABLE> FROM (P_NAME). ? CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' ? ? ?EXPORTING ? ? ? ?I_STRUCTURE_NAME ?? ? ? ? ? ? ? ?=P_NAME ? ? ? TABLES ? ? ? ? T_OUTTAB ? ?? ? ? ? ? ? ? ? ?? ?= <FS_TABLE> ? ? ?EXCEPTIONS ? ? ? ?PROGRAM_ERROR ? ?? ? ? ? ? ? ? ? = 1 ? ? ? ?OTHERS ? ? ?? ? ? ? ? ? ? ? ?? ?= 2 ? ? ? ? ? ? ? . ? ? IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO ? ? ? ? WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4. ? ? ENDIF. ENDFORM. ? ? ? ? ? ? ?? ? ?" SUB_ALV_DATA_GET 已投稿到: 排行榜 圈子 閱讀(83)|評論(7)|收藏(0)|打印|舉報(bào) 前一篇:ABAP 的 一些小技巧總結(jié) 后一篇:ABAP中ALV函數(shù)積累的實(shí)戰(zhàn)技巧與原理 評論 ? ?重要提示:警惕虛假中獎信息,點(diǎn)擊查看詳情[發(fā)評論] 新浪網(wǎng)友:2009-03-14 11:00:59 Hi 關(guān)于動態(tài)的實(shí)現(xiàn)任意表的ALV顯示的文章。 我測試了下,輸入一個table是可以的,但是輸入一個試圖就出錯了,怎么改進(jìn)呢 博主回復(fù):2009-03-16 09:33:19HI,我查了一些資料,做了一些試驗(yàn),有一些東西先來共同的探討一下: sap的視圖的類型有五種
Database views :和數(shù)據(jù)庫的視圖形同,連接條件是必須自定義.? Projection views: 用于屏蔽一些字段(一般用于保護(hù)數(shù)據(jù)時使用).? Help views: 該類視圖可以用搜索幫助的"selectionmethod"中使用,參與連接表必須存在外鍵.? Maintenance views:允許你進(jìn)行對幾個表的數(shù)據(jù)進(jìn)行修改,參與連接表必須存在外鍵,他們的連接條件是不能自定義的.?? Append Views:這種視圖主要用于增強(qiáng);. ? 如果database視圖和Protection視圖能進(jìn)行select操作,其他視圖不能進(jìn)行查詢;
對于多表連接的database視圖,只能進(jìn)行讀操作;
如果database視圖是單個表,則可以插入紀(jì)錄;
如果database視圖含有表的所有關(guān)鍵字,則可以修改;
對其他三種視圖都可以進(jìn)行插入和修改操作,具體參見maintance status的設(shè)置. 基于以上的分類,只有兩種視圖是可以支持SELECT語句的,所有只有前兩種視圖是可以顯示的,我做了一個簡單的例子,發(fā)現(xiàn)可以顯示。 新浪網(wǎng)友:2009-03-14 11:20:27 另外我想把每個字段的字段名稱作為ALV顯示的第一行,字段名稱的描述作為ALV顯示的第二行,怎么做呢,從表里邊的值從第三行開始 李:2009-03-16 10:24:21 朋友, 我在輸入視圖V_T683S的時候會有一個dump,你看看有無,怎么改進(jìn)呢。 Maint. view ? ? ? ?V_T683S Short Description ?Schema (&1&2)
謝謝了。
菩提大仙:2009-03-16 23:37:49 通過對V_T683S的屬性進(jìn)行研究,發(fā)現(xiàn)在MAINTANENCESTATUS中 的一個屬性使用的是 DISPLAY/MAINTANENCE ALLOWED WITH DESTRICTIONS.其中的DESTRICTIONS是限制的意思,這個限制指的是權(quán)限限制,當(dāng)我們生成一張視圖 并且可以進(jìn)行維護(hù)的時候,即GOTO->生成維護(hù)視圖,需要設(shè)置一個權(quán)限組,我猜測:不是所有的用戶都可以維護(hù)這個視圖,需要指定的限制權(quán)限組才可以。 關(guān)于第三行顯示ALV的我認(rèn)為可行,正在調(diào)試代碼?
菩提大仙:2009-03-17 22:07:07 個人分析: 從字面的意思上就可以看出Maintenance views是一個維護(hù)視圖,用來維護(hù)數(shù)據(jù)的。而視圖中可以用來查詢數(shù)據(jù)的只有在SE11中創(chuàng)建視圖類型---- Database views?(數(shù)據(jù)庫視圖類型)和Projection views(投影視圖)也只有這兩個視圖可以使用SELECT語句進(jìn)行查詢。因此才可以用ALV進(jìn)行顯示。其他的三種視圖都是維護(hù)數(shù)據(jù)的方式。? 新浪網(wǎng)友:2009-03-18 10:16:59 版主,你的分析是對的,我測試了下select是不支持Maintenance views的。 REPORT ?Z0001.
TABLES V_T683S. SELECT * FROM V_T683S . ?WRITE: / V_T683S-KVEWE, V_T683S-KAPPL, ? ? ? ? ? V_T683S-KALSM,V_T683S-STUNR. ENDSELECT.
同樣的錯誤提示‘"V_T683S" is not defined in the ABAP Dictionary as atable, projection view, or database view"。 新浪網(wǎng)友:2009-03-18 10:29:49其實(shí)我初始的用意是想從視圖中讀取我需要的數(shù)據(jù),拿視圖V_T683S來說,他比表T683S多一個字段VTEXT(Description),如果僅僅讀取表T683S的話,會缺這一列數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的ABAP 动态的实现任意表的ALV显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abap--REUSE_ALV_GRID
- 下一篇: 动态内表 动态ALV显示