對于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
本文使用 文章同步助手 同步