日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

APAP?ALV進(jìn)階寫法及優(yōu)化詳解_其它綜合

作者:百里落云 ? 更新時(shí)間: 2022-11-03 編程語言

先導(dǎo)

上一期講了在ABAP中,ALV的普通寫法,流程以及相關(guān)屬性,還講了基本DEMO ,但是在真正開發(fā)中,不會(huì)寫這么多的代碼.原則上是一切從簡. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天講下如何用少的代碼,標(biāo)準(zhǔn)套路,實(shí)現(xiàn)ALV基本功能,滿足開發(fā)生產(chǎn)需求.

流程搭建

萬變不離其宗,首先書寫的還是流程,比如讓你寫一個(gè)某某查詢報(bào)表. 上來啥都不用想你先這么寫

*數(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í)行,對(duì)程序設(shè)置值及屏幕元素進(jìn)行初始化賦值。一般作用就是初始值設(shè)定,如選擇屏幕的數(shù)據(jù)賦值,默認(rèn)參數(shù)賦值等。

at?SELECTION-SCREEN!

1:選擇屏幕事件,有很多參數(shù),代表不同的擴(kuò)展信息

2:在這個(gè)事件響應(yīng)中,可以對(duì)屏幕字段進(jìn)行有效性檢驗(yàn),控制屏幕元素的屬性等。

START-OF-SELECTION

該事件在單擊按鈕后觸發(fā),一般是數(shù)據(jù)初始化,數(shù)據(jù)處理操作的地方

End-OF-SELECTION?.

該事件應(yīng)用于所有數(shù)據(jù)選擇處理完成,

即START-OF-SELECTION相關(guān)執(zhí)行事件執(zhí)行完成,

但輸出屏幕還未顯示之前 在實(shí)際的應(yīng)用于一些執(zhí)行結(jié)果的檢驗(yàn)等。

一般做為ALV展示及用戶操作按鈕事件等。

演練

這里寫一個(gè)簡單的物料明細(xì)查詢報(bào)表 ,知識(shí)點(diǎn)用到了,宏,循環(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.   "料號(hào)
  SELECTION-SCREEN END OF BLOCK BLOCK .

INITIALIZATION??.

INITIALIZATION  .
%_p_p1_%_app_%-text = '物料號(hào)'.  "設(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ù)會(huì)出相關(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'.      "自動(dòng)列寬
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 '物料號(hào)'           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ù)雙擊會(huì)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.

以上就為一個(gè)alv 的寫法 ,其中 70%以上的代碼是固定的.

自己需要寫的地方, 選擇屏幕,獲取數(shù)據(jù) ,數(shù)據(jù)處理,用戶事件,權(quán)限. 這四個(gè)地方.

總結(jié)

相比較上一個(gè)demo 這個(gè)例子代碼少了很多, 但是比其他語言來講還是太復(fù)雜了.

大部分還是套路,固定這么寫,就可以. 主要還是在程序及邏輯操作上.

使用新語法可以減少很多不必要的操作,比如定義結(jié)構(gòu),內(nèi)表,關(guān)聯(lián)等.

原文鏈接:https://juejin.cn/post/7140904450901671949

欄目分類
最近更新