OOnbsp;ALV常用功能完整简例(热键单击…
OO ALV 常用功能簡介
目錄
OO ALV 常用功能簡介... 1
一、所用類:... 2
二、效果圖:... 2
單擊... 2
雙擊... 2
F4幫助... 3
編輯某單元格并校驗... 3
三、實現過程:... 3
1、 創建一個屏幕9001,不需要畫任何控件
2、 定義數據:... 3
3、 獲取顯示數據:... 4
4、 alv?顯示數據:... 4
?
一、所用類:
cl_gui_alv_grid
cl_gui_docking_container
二、效果圖:
???? 執行:
??單擊
???? 單擊航線單元格:
?
雙擊
??? 雙擊連接號碼單元格:
?
F4幫助
?? 航班單元格上F4或點擊 后面的小按鈕
?
? ?(本功能在設置字段樣式時實現DEFINE?mac_fieldlog.
?? ??"設置參考表和參考字段,為了提供搜索幫助
??wa_fieldcatalog-ref_table???????=?&4.????????????"參考表
??wa_fieldcatalog-ref_field???????=?&5.????????????"參考字段
????
? ? ?編輯某單元格并校驗
?修改價格后隨便點擊某個按鈕或者雙擊某個字段,觸發:handle_data_changed
?
三、實現過程:
1、 創建一個屏幕9001,不需要畫
2、 定義數據:
*&---------------------------------------------------------------
*&??ALV??全局變量
*&---------------------------------------------------------------
DATA:?g_alv_grid????TYPE?REF?TO?cl_gui_alv_grid,"ALV控件
??????alv_ctner?????TYPE?REF?TO?cl_gui_docking_container.
DATA:?wa_fieldcatalog????TYPE?lvc_s_fcat,????"顯示數據列內表工作區域
??????it_fieldcatalog????TYPE?lvc_t_fcat.????"顯示數據列內表
DATA:?g_event????????????? TYPE?REF?TO?alv_event_receiver.
*&---------------------------------------------------------------
*&??全局變量
*&---------------------------------------------------------------
DATA:
??????BEGIN?OF?str_spfli,
????????checkbox?TYPE?char1,????????????????????? "復選框
????????carrid???TYPE??sflight-carrid???????,?"航線承運人ID
????????connid???TYPE??sflight-connid???????,?"航班連接?Id
????????fldate???TYPE??sflight-fldate???????,?"航班日期
????????price????TYPE??sflight-price????????,?"航空運費
??????END?OF??str_spfli.
DATA:
??????g_it_show?LIKE?TABLE?OF?str_spfli?WITH?KEY?checkbox?carrid.
??????g_wa_show?LIKE?str_spfli.
?
?
3、 獲取顯示數據:
??"獲取數據
??SELECT?carrid
?????????connid
?????????fldate
?????????price
????FROM?sflight?INTO?CORRESPONDING?FIELDS?OF??TABLE?g_it_show.
4、 alv?顯示數據:
PROCESS?BEFORE?OUTPUT.
?MODULE?STATUS_9001.
?"alv?顯示數據
?MODULE?MDL_ALV_SHOW.
*&---------------------------------------------------------------
module?MDL_ALV_SHOW?output.
PERFORM?zform_alv_show.
endmodule.???????
*&---------------------------------------------------------------
?
FORM?zform_alv_show?.
??DATA:???l_style??????TYPE?i,
??????????ls_layout????TYPE?lvc_s_layo,
??????????is_stable????TYPE?lvc_s_stbl,
??????????l_disvariant?TYPE?disvariant.
*?屏幕初始化
??IF?alv_ctner?IS?INITIAL.
????CREATE?OBJECT?alv_ctner
??????EXPORTING
????????repid???????????????????????=?sy-repid
????????dynnr???????????????????????=?'9001'
*???????side????????????????????????=?cl_gui_docking_container=>dock_at_right??????”ALV貼屏幕右邊,從屏幕右邊開始算寬度
????????side????????????????????????=?cl_gui_docking_container=>dock_at_left???????"ALV貼屏幕左邊,從左邊算屏幕寬度,
????????extension???????????????????=?900??????????????????????????????????????????"屏幕寬度
????????style???????????????????????=?cl_gui_control=>ws_child?????????????????????"可選參數,設置ALV是否可用手動拖動大小
??????EXCEPTIONS
????????cntl_error??????????????????=?1
????????cntl_system_error???????????=?2
????????create_error????????????????=?3
????????lifetime_error??????????????=?4
????????lifetime_dynpro_dynpro_link?=?5
????????OTHERS??????????????????????=?6.
????IF?sy-subrc?<>?0.
??????MESSAGE?s001(00)?WITH?'屏幕初始化失敗'.
??????LEAVE?LIST-PROCESSING.
????ENDIF.
*添加自定義工具條
????PERFORM?frm_set_alv_toolbar.
*
????CREATE?OBJECT?g_alv_grid
??????EXPORTING
????????i_parent?=?alv_ctner.
*構建顯示字段樣式
????PERFORM?frm_build_fieldcat.
????"Set/Reset?Ready?for?Input?Status
????CALL?METHOD?g_alv_grid->set_ready_for_input
??????EXPORTING
????????i_ready_for_input?=?1.
*?layout?設定樣式
????CLEAR?ls_layout.
????ls_layout-cwidth_opt?=?'X'.?????"優化列寬
????CLEAR?l_disvariant.
????l_disvariant-report?=?sy-repid.?"當前程序
*?event??綁定事件
????CREATE?OBJECT?g_event.
???? "自定義工具條
????SET?HANDLER?g_event->toolbar?????????????FOR?g_alv_grid.??
??? "數據修改事件??
SET?HANDLER?g_event->handle_data_changed?FOR?g_alv_grid.
"單擊某一單元格事件
????SET?HANDLER?g_event->handle_cell_click???FOR?g_alv_grid.
"用戶點擊工具條上按鈕觸發的事件
????SET?HANDLER?g_event->handle_user_command?FOR?g_alv_grid.
"雙擊某一單元格事件
????SET?HANDLER?g_event->handle_double_click?FOR?g_alv_grid.
?
"以下兩個方法達到的效果是:光標離開正在編輯的單元格時,
就觸發了handle_data_changed
??? "如果不注釋掉以下兩個方法,
則只有執行下一操作時才會觸發handle_data_changed,比如點保存、刪除
????CALL?METHOD?g_alv_grid->register_edit_event
??????EXPORTING
????????i_event_id?=?cl_gui_alv_grid=>mc_evt_modified.
????CALL?METHOD?g_alv_grid->register_edit_event
??????EXPORTING
????????i_event_id?=?cl_gui_alv_grid=>mc_evt_enter.
*???"顯示內表數據
????CALL?METHOD?g_alv_grid->set_table_for_first_display
??????EXPORTING
????????is_layout????????????=?ls_layout
????????is_variant???????????=?l_disvariant
????????it_toolbar_excluding?=?gt_tools
??????CHANGING
????????it_fieldcatalog??????=?it_fieldcatalog[]
????????it_outtab????????????=?g_it_show[].
??ELSE.
????"沖銷設置tcode?為?RELOAD,防止因為原來的tcode影響程序執行
????CALL?METHOD?cl_gui_cfw=>set_new_ok_code
??????EXPORTING
????????new_code?=?'RELOAD'.
????"ALV?控制:刷新穩定性?按行刷新,可選參數
????CLEAR?is_stable.
????is_stable-col?=?'X'.
????"刷新
????CALL?METHOD?g_alv_grid->refresh_table_display
??????EXPORTING
????????is_stable?=?is_stable
????????i_soft_refresh?=?'X'.
????"提交
????CALL?METHOD?cl_gui_cfw=>flush.
??ENDIF.
ENDFORM.????????????????????"?ZFORM_ALV_SHOW
?
?
其中:
添加工具條上常用按鈕
FORM?frm_set_alv_toolbar?.
??REFRESH?gt_tools[].
"你也可以刪除標準的功能按鈕
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&DETAIL'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&REFRESH'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&LOCAL&UNDO'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&SORT_ASC'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&SORT_DSC'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&FIND'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&FIND_MORE'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_FILTER'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUM'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_SUBTOT'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_EXPORT'.
? ? DELETE e_object->mt_toolbar WHERE FUNCTION = '&MB_VARIANT'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '插入行'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '刪除行'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '剪切'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '復制文本'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '插入總覽'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '附加行'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '復制行'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '視圖'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '顯示圖形'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '撤銷'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '明細'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '打印'.
? ? DELETE e_object->mt_toolbar WHERE quickinfo = '最終用戶文檔'.
??APPEND?cl_gui_alv_grid=>mc_fc_check?????????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_cut???????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_copy??????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_copy_row??????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_delete_row????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_insert_row????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_move_row??????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_paste?????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_paste_new_row?TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_sum???????????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_info??????????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_refresh???????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_graph?????????????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_append_row????TO?gt_tools.
??APPEND?cl_gui_alv_grid=>mc_fc_loc_undo??????????TO?gt_tools.
ENDFORM.????????????????????"?FRM_SET_ALV_TOOLBAR
?
設置顯示字段和其參考字段
DEFINE?mac_fieldlog.
*?g_pos?=?g_pos?+?1.???????????????????????????????"第幾列
*?wa_fieldcatalog-col_pos?????????=?g_pos.?????????"列
??wa_fieldcatalog-fieldname???????=?&1.????????????"字段名稱
*?wa_fieldcatalog-coltext?????????=?&2.????????????"顯示名稱,跟reptext效果基本相同
??wa_fieldcatalog-reptext?????????=?&2.
??wa_fieldcatalog-outputlen???????=?&3.????????????"顯示長度
??"設置參考表和參考字段,為了提供搜索幫助
??wa_fieldcatalog-ref_table???????=?&4.????????????"參考表
??wa_fieldcatalog-ref_field???????=?&5.????????????"參考字段
??"設置復選框可編輯
??if?&1?eq?'CHECKBOX'.
????wa_fieldcatalog-checkbox??????=?'X'.
????wa_fieldcatalog-edit??????????=?'X'.
??endif.
??"設置?價格PRICE字段?可修改
??if?&1?eq?'PRICE'.
????wa_fieldcatalog-edit?=?'X'.
??endif.
??"設置???航線承運人字段?CARRID?為熱鍵
??if?&1?eq?'CARRID'.
????wa_fieldcatalog-hotspot?=?'X'.
??endif.
??append?wa_fieldcatalog?to?it_fieldcatalog.
??clear?wa_fieldcatalog.
END-OF-DEFINITION.
?
FORM?frm_build_fieldcat?.
mac_fieldlog?'CHECKBOX'?'選擇'?????????''????'?'?????'?'??.
mac_fieldlog?'CARRID'???'航線承運人'???''????'SFLIGHT'?'CARRID'.
mac_fieldlog?'CONNID'???'航班數量'?????''????'SFLIGHT'?'CONNID'?.
??mac_fieldlog?'FLDATE'???'國家'?????????''????'SFLIGHT'?'FLDATE?'.??"最后兩個字段?參考表內字段,可以作為幫助
??mac_fieldlog?'PRICE'????'起飛城市'?????''????'SFLIGHT'?'PRICE'??.
ENDFORM.?"?FRM_BUILD_FIELDCAT
?
事件的定義
*----------------------------------------------------------------
*???????CLASS?ALV_EVENT_RECEIVER?DEFINITION
*----------------------------------------------------------------
CLASS?alv_event_receiver?DEFINITION.
??PUBLIC?SECTION.
????"添加工具條
????METHODS?toolbar??????????????FOR?EVENT?toolbar?????OF?cl_gui_alv_grid
???????IMPORTING
?????????e_object
?????????e_interactive.
????"子都修改時觸發
????METHODS?handle_data_changed??FOR?EVENT?data_changed?OF?cl_gui_alv_grid
??????IMPORTING
????????er_data_changed.
????"某字段設置熱鍵后,單擊此單元格時觸發
????METHODS??handle_cell_click???FOR?EVENT?hotspot_click?OF?cl_gui_alv_grid
??????IMPORTING
????????e_row_id
????????e_column_id
????????es_row_no.
????"雙擊時觸發
????METHODS?handle_double_click??FOR?EVENT?double_click??OF?cl_gui_alv_grid
??????IMPORTING
????????e_row
????????e_column
????????es_row_no.
????"按F1時觸發
????METHODS?handle_onf1??????????FOR?EVENT?onf1??????????OF?cl_gui_alv_grid
???????IMPORTING
????????e_fieldname
????????es_row_no
????????er_event_data.
????"當用戶按屏幕上按鈕時觸發
????METHODS?handle_user_command??FOR?EVENT?user_command??OF?cl_gui_alv_grid
???????IMPORTING
?????????e_ucomm.
????.
ENDCLASS.????????????????????"alv_event_receiver?DEFINITION
*&---------------------------------------------------------------------*
*&??Class?(Implementation)??ALV_EVENT_RECEIVER
*&---------------------------------------------------------------------*
CLASS?alv_event_receiver?IMPLEMENTATION.
??METHOD?handle_data_changed.
????DATA:
??????????l_it_data???TYPE??lvc_t_modi,
??????????l_wa_data???LIKE?LINE?OF?l_it_data.
????DATA:?l_price_old?TYPE?string,
??????????l_price_new?TYPE?string,
??????????l_msg???????TYPE?string.
????l_it_data?=?er_data_changed->mt_mod_cells.
????LOOP?AT?er_data_changed->mt_mod_cells?INTO?l_wa_data?WHERE??fieldname?=?'PRICE'.
??????READ?TABLE?g_it_show?INTO?g_wa_show?INDEX?l_wa_data-row_id.
??????IF?sy-subrc?=?0.
????????l_price_old?=?g_wa_show-price?.
????????l_price_new?=?l_wa_data-value?.
????????IF?l_price_old?<>?l_price_new.
??????????CONCATENATE?'價格由'?l_price_old?'改為'?l_price_new?INTO?l_msg.
??????????MESSAGE?l_msg?TYPE?'I'.
????????ENDIF.
??????ENDIF.
????ENDLOOP.
??ENDMETHOD.????????????????????"handle_data_changed
??METHOD?toolbar.
????DATA:?ls_toolbar??TYPE?stb_button.
????CLEAR?ls_toolbar.
????MOVE?3????????????TO?ls_toolbar-butn_type.??????"分隔符
????APPEND?ls_toolbar?TO?e_object->mt_toolbar.
????CLEAR?ls_toolbar.
????MOVE?'SEL_ALL'???????TO?ls_toolbar-function.??????"添加兩個按鈕?全選??和?取消全選
????MOVE?icon_select_all?TO?ls_toolbar-icon.
????MOVE?'全選'??????????TO?ls_toolbar-quickinfo.
????MOVE?'?'?????????????TO?ls_toolbar-disabled.
????APPEND?ls_toolbar????TO?e_object->mt_toolbar.
????CLEAR?ls_toolbar.
????MOVE?'CAN_ALL'??????????TO?ls_toolbar-function.
????MOVE?icon_deselect_all??TO?ls_toolbar-icon.
????MOVE?'全部取消?'?????????TO?ls_toolbar-quickinfo.
????MOVE?'?'????????????????TO?ls_toolbar-disabled.
????APPEND?ls_toolbar???????TO?e_object->mt_toolbar.
????CLEAR?ls_toolbar.
????MOVE?0?????????????TO?ls_toolbar-butn_type.??????????????"按鈕
????MOVE?'DELETE'??????TO?ls_toolbar-function.???????????????"功能碼
????MOVE?'DELETE'??????TO?ls_toolbar-text.???????????????????"顯示名稱
????MOVE?icon_cancel???TO?ls_toolbar-icon.???????????????????"圖標
????MOVE?'刪除選中行'???TO?ls_toolbar-quickinfo.??????????????"鼠標停留時的提示信息
????MOVE?'?'???????????TO?ls_toolbar-disabled.???????????????"可用
????APPEND?ls_toolbar??TO?e_object->mt_toolbar.
??ENDMETHOD.????????????????????"toolbar
??METHOD?handle_cell_click.
????"獲取單擊字段
????DATA:?l_msg??????TYPE?string,
??????????l_wa_click?LIKE?LINE?OF?g_it_show,
??????????l_row??????TYPE?string,
??????????l_field????TYPE?string.
????l_row??????=?es_row_no-row_id.???????????????"選中行
????l_field????=?e_column_id.????????????????????"選中的字段
????READ?TABLE?g_it_show?INTO?l_wa_click?INDEX?es_row_no-row_id.
????IF?sy-subrc?=?0.
??????"得到所單擊值
??????CONCATENATE?'您選中第'?l_row??'行,字段為:'?l_field??',選中值為'?l_wa_click-carrid?INTO?l_msg.
??????MESSAGE?l_msg?TYPE?'I'.
????ENDIF.
??ENDMETHOD.????????????????????"handle_cell_click
??METHOD?handle_double_click.
????"獲取單擊字段
????DATA:?l_msg??????TYPE?string,
??????????l_wa_click?LIKE?LINE?OF?g_it_show,
??????????l_row??????TYPE?string,
??????????l_field????TYPE?string.
????l_field??????=?e_column-fieldname.???????????????"選中行
????l_row????????=?es_row_no-row_id.?????????????????"選中的字段
????READ?TABLE?g_it_show?INTO?l_wa_click?INDEX?es_row_no-row_id?.
????IF?sy-subrc?=?0.
??????"得到所單擊值
??????CONCATENATE?'您選中第'?l_row??'行,字段為:'?l_field??',選中值為:'??INTO?l_msg.
??????CASE?l_field.
????????WHEN?'CONNID'.
??????????CONCATENATE?l_msg?l_wa_click-connid?INTO?l_msg.
??????????MESSAGE?l_msg?TYPE?'I'.
????????WHEN?'FLDATE'.
??????????CONCATENATE?l_msg?l_wa_click-fldate?INTO?l_msg.
??????????MESSAGE?l_msg?TYPE?'I'.
??????ENDCASE.
????ENDIF.
??ENDMETHOD.????????????????????"handle_DOUBLE_CLICK
??METHOD?handle_onf1.
??ENDMETHOD.????????????????????"handle_ONF1
*&---------------------------------------------------------------------------&*
*&????????????????????????????????????????????????????????????????????????????*
*&??????HANDLE_USER_COMMAND???????????????????????????????????????????????????*
*&---------------------------------------------------------------------------&*
??METHOD?handle_user_command.
????REFRESH:lt_cols,??lt_rows.
????CALL?METHOD?g_alv_grid->get_selected_rows
??????IMPORTING
????????et_index_rows?=?lt_rows.
????CALL?METHOD?g_alv_grid->get_selected_columns
??????IMPORTING
????????et_index_columns?=?lt_cols.
????CALL?METHOD?cl_gui_cfw=>flush.
????CASE??e_ucomm.
??????WHEN?'SEL_ALL'.
????????LOOP?AT?g_it_show?INTO?g_wa_show.
??????????g_wa_show-checkbox?=?'X'.
??????????MODIFY?g_it_show??FROM?g_wa_show.
????????ENDLOOP.
??????WHEN?'CAN_ALL'.
????????LOOP?AT?g_it_show?INTO?g_wa_show.
??????????g_wa_show-checkbox?=?'?'.
??????????MODIFY?g_it_show??FROM?g_wa_show.
????????ENDLOOP.
??????WHEN?'DELETE'.
????????LOOP?AT?g_it_show?INTO?g_wa_show?WHERE?checkbox?IS?NOT?INITIAL.
??????????DELETE?TABLE?g_it_show?FROM?g_wa_show.
????????ENDLOOP.
??????WHEN?OTHERS.
????ENDCASE.
????CALL?METHOD?cl_gui_cfw=>set_new_ok_code
??????EXPORTING
????????new_code?=?'RELOAD'.
??ENDMETHOD.????????????????????"HANDLE_USER_COMMAND
ENDCLASS.?"ALV_EVENT_RECEIVER
關于刪除標準按鈕,我也debug的
然后可以根據功能碼或者quickinfo刪除
轉載于:https://www.cnblogs.com/senlinmu110/p/3802135.html
總結
以上是生活随笔為你收集整理的OOnbsp;ALV常用功能完整简例(热键单击…的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 送给同事的5个新年计划
- 下一篇: 博客搬到CSDN了,以后就老实的呆在这儿