多屏幕ALV ZCL_ALV_MULTI

對于SAP的開發(fā)者來說,ALV大家并不陌生腥光,這也可能是在開發(fā)的過程中接觸最多的東西关顷,

到目前為止,本人用過的用于實現(xiàn)Alv的方式有以下幾種:

1. Function的alv:??REUSE_ALV_GRID_DISPLAY

? ? ? ? ? ? ? ? ? ? ? ? ? ? ??REUSE_ALV_GRID_DISPLAY_LVC(?升級版?)?增加了對于單元格的處理

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

??? EXPORTING

????? i_callback_program?????? = lv_repid

????? is_variant?????????????? = ls_variant

????? i_callback_pf_status_set = 'ALV_STATUS'

????? i_callback_user_command? = 'USER_COMMAND'

????? is_layout_lvc??????????? = gs_layout

????? it_fieldcat_lvc????????? = gt_field

??? TABLES

????? t_outtab???????????????? = gt_data

??? EXCEPTIONS

????? program_error??????????? = 1

????? OTHERS?????????????????? = 2.

? IF sy-subrc <> 0.

* Implement suitable error handling here

? ENDIF.? ? ?

缺點:alv的事件處理相對麻煩一點武福,無法滿足同時顯示多個ALV的需求

2. ooalv:?cl_gui_alv_grid

???????gcl_alv->set_table_for_first_display(

??????????? EXPORTING

????????????? is_layout?????? = ls_layout

????????????? i_save????????? = 'A'

????????????? is_variant????? = ls_variant

??????????? CHANGING

????????????? it_outtab?????? = gt_head

????????????? it_fieldcatalog = lt_fcat ).

3. salv? cl_salv_table

? ??? TRY.

??????? cl_salv_table=>factory( IMPORTING r_salv_table = cl_salv

??????? CHANGING t_table = gt_data ).

????? CATCH cx_salv_msg.

??? ENDTRY.

SALV可以像使用函數(shù)方式那樣生成alv议双,不需要創(chuàng)建屏幕,而且可以在后臺運行

感覺更像是?ooalv的?的升級版

4. Falv?zcl_falv

lcl_falv=>create( CHANGING ct_table = gt_data )-display( ).

一個開源的ALV類捉片,能夠更加方便的實現(xiàn)一個ALV

目前來說Falv是個人使用最多的一個是實現(xiàn)ALV的方式平痰,更便捷,更快速

但是以上的ALV都沒有辦法快速的實現(xiàn)一個多ALV的展示方法

通常如果我們要展示一個上下屏伍纫,或者左右屏的alv都需要先創(chuàng)建一個屏幕

在屏幕的PBO里使用類?cl_gui_custom_container?屏(需要在屏幕繪制控制區(qū)域)按需繪制好觉增,然后跟alv做綁定

或者cl_gui_docking_container來跟屏幕做關(guān)聯(lián)生成一個存放alv的容器,再調(diào)用splliter的類來分割容器

那有沒有辦法能夠像上面的Falv一樣能夠快速的來生成多個ALV呢翻斟,經(jīng)過一段時間的構(gòu)思逾礁,它來了

????? TRY.

????????? NEW zcl_alv_multi(

??????????? it_mapping = VALUE #( ( objid = '1' tabname = 'GT_VBAK' )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?( objid = '2' tabname = 'GT_VBAP' ) )

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?iv_mode = '21' )->call_screen( ).

??????? CATCH zcx_alv_error INTO lcx.

????? ENDTRY.

像Falv一樣能夠快捷的實現(xiàn)一個多屏幕的ALV,通過?it_mapping?來構(gòu)建?alv?跟內(nèi)表的關(guān)聯(lián),通過iv_mode來實現(xiàn)alv的展示效果

11 單屏

12?橫向兩個alv?

13 橫向三個??

21?縱向兩個?

31?縱向三個 依次類推

而且嘹履,已經(jīng)將alv的事件類繼承進去腻扇,只需要在代碼中創(chuàng)建一個cl_alv_event(必須要是這個名字,因為后邊會從堆棧中查找該子類)的事件子類即可砾嫉,通過類的屬性objid來控制區(qū)分是第幾個alv

大部分的alv事件?F1?F4?雙擊?按鈕?點擊按鈕后?修改單元格等事件都已涵蓋幼苛,按需重定義方法即可,下面是demo程序的相關(guān)代碼

"事件類,只能使用cl_alv_event 來命名

CLASS cl_alv_event DEFINITION INHERITING FROM zcl_alv_event_receiver.

? PUBLIC SECTION.

??? METHODS double_click REDEFINITION."雙擊

??? METHODS user_command REDEFINITION."點擊按鈕后

??? METHODS toolbar REDEFINITION."按鈕

??? METHODS hotspot_click REDEFINITION."單擊

??? METHODS change_fieldcat REDEFINITION."更改fieldcat

ENDCLASS.

CLASS cl_alv_event IMPLEMENTATION.

按鈕事件在第一個alv中增加保存按鈕?

? METHOD toolbar.

??? DATA:ls_toolbar TYPE stb_button.

??? DEFINE mar_toolbar.

????? ls_toolbar-function?? = &1.

????? ls_toolbar-text?????? = &2.

????? ls_toolbar-quickinfo? = &3.

????? ls_toolbar-icon?????? = &4.

????? APPEND ls_toolbar TO e_object->mt_toolbar .

????? CLEAR ls_toolbar.

??? END-OF-DEFINITION.

??? CASE objid.

????? WHEN '1'.

??????? mar_toolbar 'SAVE' '' '保存' icon_system_save.

????? WHEN '2'.

????? WHEN OTHERS.

??? ENDCASE.

? ENDMETHOD.

? METHOD user_command.

??? CASE e_ucomm.

????? WHEN 'SAVE'.?

??????? MESSAGE '保存成功' TYPE 'I' DISPLAY LIKE 'S'.

??????? "如果是刷新當(dāng)前的alv,只需要使用get_alv_grid即可

??????? TRY.

??????????? refresh( get_alv_grid( ) ).

????????? CATCH zcx_alv_error INTO DATA(cx).

??????? ENDTRY.

??? ENDCASE.

? ENDMETHOD.

雙擊第一個alv的銷售訂單來過濾出第二個alv的銷售訂單行項目焕刮,double_click方法也已經(jīng)進行代碼封裝舶沿,e_data就是當(dāng)前雙擊行的內(nèi)容

? METHOD double_click.

??? CASE objid.

????? WHEN '1'.

??????? "按照銷售訂單來過濾第二個alv

??????? ASSIGN e_data->* TO FIELD-SYMBOL(<ls_data>).

? ? ? ?這里使用filter的方式來過濾alv,調(diào)用set_filter即可按照字段來生成相關(guān)參數(shù)

??????? DATA(lt_filter) = set_filter( EXPORTING i_fields = VALUE #( ( name = 'VBELN' ) )

??????????????????????????????????????????????? i_data?? = e_data ).

? ? ? 這里要刷新第二個alv配并,首先使用ge_alv_grid的方法獲取到第二個alv括荡,然后刷新即可

??????? TRY.

??????????? get_alv_grid( '2' )->set_filter_criteria( lt_filter ).

??????????? refresh( get_alv_grid( '2' ) ).

????????? CATCH zcx_alv_error INTO DATA(cx).

??????? ENDTRY.

??? ENDCASE.

? ENDMETHOD.

?

單擊事件,單擊第一個alv的vbeln 來跳轉(zhuǎn)到va03 溉旋,同doubleclick一樣畸冲,直接使用e_data即可?

? METHOD hotspot_click.

??? CASE objid.

????? WHEN '1'.

??????? "單擊vbeln來跳轉(zhuǎn)到va03

??????? ASSIGN e_data->* TO FIELD-SYMBOL(<ls_data>).

??????? ASSIGN COMPONENT e_column_id-fieldname OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<value>).

??????? CASE e_column_id-fieldname.

????????? WHEN 'VBELN'.

??????????? SET PARAMETER ID 'AUN' FIELD <value>.

??????????? CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.

??????? ENDCASE.

??? ENDCASE.

? ENDMETHOD.

?這里是設(shè)置alv的fieldcat,系統(tǒng)會自動根據(jù)內(nèi)表生成fieldcat观腊,這里只需要對ct_fcat的字段進行增刪改即可

? METHOD change_fieldcat.

??? LOOP AT ct_fcat ASSIGNING FIELD-SYMBOL(<ls_fcat>).

????? CASE <ls_fcat>-fieldname.

??????? WHEN 'VBELN'.

????????? <ls_fcat>-hotspot = abap_true.

????? ENDCASE.

??? ENDLOOP.

? ENDMETHOD.

layout由于基本上每個alv的使用方法一樣邑闲,這里就沒有重定義,使用的父類的梧油,如果有需要也可以重定義

ENDCLASS.

START-OF-SELECTION.

? gt_vbak = VALUE #( ( vbeln = '1' erdat = sy-datum )

? ( vbeln = '2' erdat = sy-datum )

? ( vbeln = '3' erdat = sy-datum ) ).

? gt_vbap = VALUE #(

? ( vbeln = '1' posnr = '1' )

? ( vbeln = '1' posnr = '2' )

? ( vbeln = '1' posnr = '3' )

? ( vbeln = '2' posnr = '1' )

? ( vbeln = '2' posnr = '2' )

? ( vbeln = '3' posnr = '1' )

? ( vbeln = '3' posnr = '2' )

? ( vbeln = '3' posnr = '3' )

? ( vbeln = '3' posnr = '4' ) ).

? "調(diào)用alv展示

? " iv_mode? 12? 13代表 豎向 2/3 個alv苫耸, 21? 31代表橫向 2/3 個alv

? "系統(tǒng)會根據(jù)tcode自動獲取tcode的描述作為標(biāo)題,如果想指定儡陨,iv_title 給值即可

? CASE abap_true.

??? WHEN p_1."單個屏幕

????? TRY.

????????? NEW zcl_alv_multi(

??????????? it_mapping = VALUE #( ( objid = '1' tabname = 'GT_VBAK' ) ) )->call_screen( ).

??????? CATCH zcx_alv_error INTO DATA(lcx).

????? ENDTRY.

????? "單個屏幕的也推薦使用falv

??? WHEN p_2."多個屏幕

????? TRY.

????????? NEW zcl_alv_multi(

??????????? it_mapping = VALUE #( ( objid = '1' tabname = 'GT_VBAK' )

??????????? ( objid = '2' tabname = 'GT_VBAP' ) )

??????????? iv_mode = '21' )->call_screen( ).

??????? CATCH zcx_alv_error INTO lcx.

????? ENDTRY.

??? WHEN OTHERS.

? ENDCASE.

實現(xiàn)效果如下

ALV事件類以及構(gòu)建類

第一次發(fā)表公眾號文章鲸阔,排版不好,請見諒迄委,話不多說褐筛,直接上安裝包

鏈接:https://pan.baidu.com/s/1lo1VV2ImsI06Hg0x0YPVRQ

提取碼,請關(guān)注后發(fā)送信息? 我想要 進行獲取叙身,感謝S嬖!P沤巍晃痴!

如果你在使用中覺得好,請幫忙多多分享财忽,如有使用BUG請公眾號聯(lián)系本人解決

請使用abapgit進行安裝倘核,對于abapgit的介紹以及相關(guān)安裝方法請參照下圖連接博主氫氦的文章

https://www.cnblogs.com/hhelibeb/p/7735421.html

本文使用 文章同步助手 同步

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市即彪,隨后出現(xiàn)的幾起案子紧唱,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏益,死亡現(xiàn)場離奇詭異蛹锰,居然都是意外死亡,警方通過查閱死者的電腦和手機绰疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門铜犬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轻庆,你說我怎么就攤上這事癣猾。” “怎么了余爆?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵纷宇,是天一觀的道長。 經(jīng)常有香客問我龙屉,道長呐粘,這世上最難降的妖魔是什么满俗? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任转捕,我火速辦了婚禮,結(jié)果婚禮上唆垃,老公的妹妹穿的比我還像新娘五芝。我一直安慰自己,他們只是感情好辕万,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布枢步。 她就那樣靜靜地躺著,像睡著了一般渐尿。 火紅的嫁衣襯著肌膚如雪醉途。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天砖茸,我揣著相機與錄音隘擎,去河邊找鬼。 笑死凉夯,一個胖子當(dāng)著我的面吹牛货葬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播劲够,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼震桶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了征绎?” 一聲冷哼從身側(cè)響起蹲姐,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淤堵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝衫,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年拐邪,在試婚紗的時候發(fā)現(xiàn)自己被綠了慰毅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡扎阶,死狀恐怖汹胃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情东臀,我是刑警寧澤着饥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站惰赋,受9級特大地震影響宰掉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赁濒,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一轨奄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拒炎,春花似錦挪拟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丁侄,卻和暖如春惯雳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸿摇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工石景, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人户辱。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓鸵钝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庐镐。 傳聞我的和親對象是個殘疾皇子恩商,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容