APAP?ALV進(jìn)階寫法及優(yōu)化詳解
先導(dǎo)
上一期講了在ABAP中,ALV的普通寫法,流程以及相關(guān)屬性,還講了基本DEMO ,但是在真正開發(fā)中,不會寫這么多的代碼.原則上是一切從簡. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天講下如何用少的代碼,標(biāo)準(zhǔn)套路,實現(xiàn)ALV基本功能,滿足開發(fā)生產(chǎn)需求.
流程搭建
萬變不離其宗,首先書寫的還是流程,比如讓你寫一個某某查詢報表. 上來啥都不用想你先這么寫
*數(shù)據(jù)準(zhǔn)備 *常規(guī)定義變量,內(nèi)表結(jié)構(gòu),工作區(qū),內(nèi)表,包。。。。 你的代碼 *系統(tǒng)變量準(zhǔn)備 *如layout,fieldcat 等 系統(tǒng)變量 你的代碼 *選擇屏幕 你的代碼 *INITIALIZATION *at SELECTION-SCREEN . "START-OF-SELECTION "End-OF-SELECTION . “子例程及自定義宏
流程講解

INITIALIZATION.

該事件在屏幕未顯示之前執(zhí)行,對程序設(shè)置值及屏幕元素進(jìn)行初始化賦值。一般作用就是初始值設(shè)定,如選擇屏幕的數(shù)據(jù)賦值,默認(rèn)參數(shù)賦值等。
at SELECTION-SCREEN!

1:選擇屏幕事件,有很多參數(shù),代表不同的擴展信息
2:在這個事件響應(yīng)中,可以對屏幕字段進(jìn)行有效性檢驗,控制屏幕元素的屬性等。
START-OF-SELECTION
該事件在單擊按鈕后觸發(fā),一般是數(shù)據(jù)初始化,數(shù)據(jù)處理操作的地方

End-OF-SELECTION .
該事件應(yīng)用于所有數(shù)據(jù)選擇處理完成,
即START-OF-SELECTION相關(guān)執(zhí)行事件執(zhí)行完成,
但輸出屏幕還未顯示之前 在實際的應(yīng)用于一些執(zhí)行結(jié)果的檢驗等。
一般做為ALV展示及用戶操作按鈕事件等。
演練
這里寫一個簡單的物料明細(xì)查詢報表 ,知識點用到了,宏,循環(huán),opensql,用戶事件等內(nèi)容。
數(shù)據(jù)準(zhǔn)備
TABLES : MARA .
*數(shù)據(jù)準(zhǔn)備
"定義結(jié)構(gòu)
TYPES : BEGIN OF gw_Data ,
MATNR TYPE MATNR ,
MEINS TYPE MEINS ,
MAKTX TYPE MAKTX ,
end of gw_Data .
"定義工作區(qū)及內(nèi)表
data : gs_data TYPE gw_Data .
data :gt_data TYPE table of gw_Data .
"alv 數(shù)據(jù)
*--------------------------------------------------------------------*
* 通用ALV變量
*--------------------------------------------------------------------*
DATA: wa_layout TYPE lvc_s_layo.
DATA:wa_fieldcat TYPE lvc_s_fcat,
gt_fieldcat TYPE lvc_t_fcat.
DATA:gs_glay TYPE lvc_s_glay.
DATA : gv_error TYPE c.
DATA : BS1 TYPE C.
選擇屏幕
SELECTION-SCREEN BEGIN OF BLOCK BLOCK WITH FRAME TITLE TEXT-001 . PARAMETERS p_p1 TYPE mara-matnr OBLIGATORY. "料號 SELECTION-SCREEN END OF BLOCK BLOCK .
INITIALIZATION .
INITIALIZATION . %_p_p1_%_app_%-text = '物料號'. "設(shè)定選擇屏幕初始化名稱
at SELECTION-SCREEN .
at SELECTION-SCREEN . PERFORM check_auth . "權(quán)限檢查
START-OF-SELECTION .
START-OF-SELECTION . PERFORM get_DAta . "獲取數(shù)據(jù)屬性
END-OF-SELECTION .
End-OF-SELECTION . PERFORM diaplay_data. "展示alv
子程序和宏
以下程序都使用新語法.不懂新語法后續(xù)會出相關(guān)內(nèi)容
"獲取數(shù)據(jù)子程序
FORM get_DAta .
select a~matnr,a~MEINS,b~maktx
from mara as a inner join makt as b
on a~matnr = b~MATNR where a~ZMATNR = @p_p1 into table @data(lt_outdata) .
ENDFORM .
*展示alv 子程序 直接復(fù)制
FORM diaplay_data .
PERFORM set_alv_layout. "樣式設(shè)定
PERFORM bulid_fieldcat. "格式設(shè)定
PERFORM call_alv_func. "alv 函數(shù)
ENDFORM.
"樣式設(shè)定 直接復(fù)制
FORM set_alv_layout .
CLEAR: wa_layout.
wa_layout-zebra = 'X'. "斑馬線
wa_layout-cwidth_opt = 'X'. "自動列寬
ENDFORM.
"格式設(shè)定 固定換數(shù)
FORM bulid_fieldcat .
DEFINE add_col.
* ADD 1 TO pos.
* lw_fieldcat-col_pos = pos.
wa_fieldcat-fieldname = &1.
wa_fieldcat-ref_field = &2.
wa_fieldcat-ref_table = &3.
wa_fieldcat-scrtext_l = &4.
wa_fieldcat-outputlen = &5.
wa_fieldcat-no_zero = &6.
wa_fieldcat-edit = &7.
wa_fieldcat-edit_mask = &8.
wa_fieldcat-key = &9.
CASE wa_fieldcat-fieldname.
WHEN 'slbox'.
wa_fieldcat-checkbox = 'X' .
wa_fieldcat-edit = 'X' .
wa_fieldcat-edit_mask = 'X'.
WHEN OTHERS.
ENDCASE .
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR : wa_fieldcat.
END-OF-DEFINITION.
REFRESH: gt_fieldcat.
"add_col 'matnr' space space '物料號' space space space space space.
add_col 'MEINS' space space '單位' space space space space space.
add_col 'maktx' space space '物料名' space space space space space.
ENDFORM.
"刷新 固定復(fù)制
FORM refresh_alv .
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
lw_stable TYPE lvc_s_stbl.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
lw_stable-row = 'X'.
lw_stable-col = 'X'.
lo_grid->refresh_table_display(
EXPORTING
is_stable = lw_stable
EXCEPTIONS
finished = 1
OTHERS = 2 ).
ENDFORM.
"固定,只需要傳內(nèi)表就行
FORM call_alv_func .
gs_glay-edt_cll_cb = abap_true. " 選中復(fù)選款,立刻觸發(fā)data changed 事件
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid "回調(diào)程序
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
i_grid_settings = gs_glay
is_layout_lvc = wa_layout
it_fieldcat_lvc = gt_fieldcat "需要顯示的內(nèi)表的列
i_save = 'A'
TABLES
t_outtab = lt_outdata "需要顯示的數(shù)據(jù)
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDFORM.
"staus 工具欄 直接復(fù)制
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
DATA : lw_tab LIKE LINE OF rt_extab.
REFRESH rt_extab.
SET PF-STATUS 'STD' EXCLUDING rt_extab.
ENDFORM.
"用戶事件 ,這里沒寫. 但是如果設(shè)定函數(shù)雙擊會apap dump
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
* 導(dǎo)入
WHEN '&IMPLE'.
ENDCASE.
ENDFORM.
"權(quán)限檢查,按照不同的情況調(diào)用不同的函數(shù),這里需要更換.
*&---------------------------------------------------------------------*
*& Form check_auth
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM check_auth .
"select SINGLE WERKS, KUNNR into @data(ls_t001w) from t001w WHERE WERKS = @p_p1 .
AUTHORITY-CHECK OBJECT 'M_MSEG_WMB'
ID 'ACTVT' DUMMY
ID 'WERKS' FIELD p_p1 .
IF sy-subrc <> 0.
* Implement a suitable exception handling here
ENDIF.
ENDFORM.
以上就為一個alv 的寫法 ,其中 70%以上的代碼是固定的.
自己需要寫的地方, 選擇屏幕,獲取數(shù)據(jù) ,數(shù)據(jù)處理,用戶事件,權(quán)限. 這四個地方.
總結(jié)
相比較上一個demo 這個例子代碼少了很多, 但是比其他語言來講還是太復(fù)雜了.
大部分還是套路,固定這么寫,就可以. 主要還是在程序及邏輯操作上.
使用新語法可以減少很多不必要的操作,比如定義結(jié)構(gòu),內(nèi)表,關(guān)聯(lián)等.
以上就是APAP ALV進(jìn)階寫法及優(yōu)化詳解的詳細(xì)內(nèi)容,更多關(guān)于APAP ALV寫法優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Window下安裝JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程圖解
這篇文章主要介紹了Window下安裝JDK1.8+Tomcat9.0.27+Mysql5.7.28的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11
typescript?實現(xiàn)RabbitMQ死信隊列和延遲隊列(訂單10分鐘未付歸還庫存)的過程
RabbitMQ作為一款流行的消息隊列服務(wù),提供了死信隊列(Dead?Letter?Exchange)功能,能夠有效地處理消息被拒絕、消息過期以及隊列達(dá)到最大長度等情況,本文將介紹如何利用RabbitMQ的死信隊列來處理這三種情況,并提供了TypeScript示例代碼,需要的朋友可以參考下2024-03-03
VSCode遠(yuǎn)程XHR failed無法連接的問題及解決方案
VSCode進(jìn)行遠(yuǎn)程連接時會檢查服務(wù)端的Server運行情況,如未運行則需要下載安裝,在下載過程中可能需要訪問外網(wǎng),如果外網(wǎng)不通則連接過程失敗,解決方法是手動下載離線安裝包,手動解壓至指定的路徑即可,對VSCode遠(yuǎn)程無法連接問題感興趣的朋友一起看看吧2024-03-03
idea日常報錯之UTF-8不可映射的字符的實現(xiàn)
本文主要介紹了在使用Maven編譯Java項目時遇到“UTF-8不可映射的字符”錯誤的解決方法,具有一定的參考價值,感興趣的可以了解一下2025-02-02

