ABAP 之ALV展示及下钻弹窗数据页面
序
HELLO, 這里是百里一個學習中的ABAPER,這里記錄工作學習中遇到的bug,知識內容等內容.今天講的是在工作中經常會使用的數據下鉆,通過跳出小界面的方式展示關聯數據.今天結合工作經驗這里做下技術總結.
下鉆簡介
在ALV報表展示中.會出現關鍵字段下鉆,展示某個界面或者系統自帶界面.此時需要給增加 user_command 事件. 下鉆內容包括,展示具體某個界面,系統界面,與關鍵字對應的ALV界面.
技術介紹
下鉆彈窗數據展示的關鍵技術為調用函數 cl_salv_table=>factory 展示一個新的ALV容器數據. 首先先跟本身第一層開發ALV方式一樣, 定義默認基礎數據集,權限檢查,定義ALV layout ,fieldcat 等相關屬性內容. 同時設定對應的staus 及usercommd 方便操作用戶事件.設定第一層ALV展示數據的基礎上,設定hot字段,在按照關鍵字段關聯對應下一級ALV展示數據.
TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv "導出ALV的容器對象 CHANGING t_table = lt_item[] ). "內容表 CATCH cx_root INTO cxroot. excmsg = cxroot->get_text( ). MESSAGE e000(oo) WITH excmsg. ENDTRY. go_funlst = go_alv->get_functions( ). go_funlst->set_all( 'X' ).實例展示
此例子第一層為VBAK 表 VBELN 字段,第二層內容為對應VBELN 單號對應的 料號數據及料號長描述例子.
創建數據集
設定ALV 定義相關結構,工作區內表.同時定義必要字段如ALV展示相關變量.usercomed 變量.格式及樣式變量字段.
TYPE-POOLS: slis.TYPE-POOLS: kcde.*&---------------------------------------------------------------------* *& TABLES*&---------------------------------------------------------------------* TABLES: vbap,vbak.*----------------------------------------------------------------------* * GLOBAL INTERNAL TABLES DECLARATION*----------------------------------------------------------------------* DATA: gt_file TYPE filetable.*----------------------------------------------------------------------* * GLOBAL VARIANTS DECLARATION*----------------------------------------------------------------------* DATA: g_repid TYPE sy-repid.DATA: gt_field TYPE slis_t_fieldcat_alv.*定義讀入EXCEL的內表TYPES : BEGIN OF typ_alv , vbeln TYPE vbak-vbeln, erdat TYPE vbak-erdat, "創建日期 vkorg TYPE vbak-vkorg, "銷售組織 vkbur TYPE vbak-vkbur, "銷售辦事處 ernam TYPE vbak-ernam, "創建人 sel TYPE c , " 復選框 END OF typ_alv .DATA : gs_alv TYPE typ_alv, gt_print TYPE TABLE OF typ_alv, gt_alv TYPE TABLE OF typ_alv.* ALV 用DATA: gs_layout TYPE lvc_s_layo, gv_repid TYPE repid, gt_fieldcat TYPE lvc_t_fcat, ls_fieldcat TYPE lvc_s_fcat.DATA: g_grid TYPE REF TO cl_gui_alv_grid.*創建字段宏定義DEFINE add_field. ls_fieldcat-fieldname = '&1' . "字段名稱 ls_fieldcat-ref_table = &2. "關聯表格 ls_fieldcat-ref_field = &3."參考字段 ls_fieldcat-coltext = &4. "描述文本 APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat.END-OF-DEFINITION.設定選擇屏幕
篩選關鍵字段,where 條件.
*--------選擇條件 SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: s_vkorg FOR vbak-vkorg OBLIGATORY,"銷售組織 s_vkbur FOR vbak-vkbur ,"銷售辦公室 s_ernam FOR vbak-ernam."創建人SELECTION-SCREEN END OF BLOCK bl01.獲取數據內容
INITIALIZATION .AT SELECTION-SCREEN OUTPUT .*----------------------------------------------------------------------* * EVENT OCCURS AFTER THE SELECTION SCREEN HAS BEEN PROCESSED*----------------------------------------------------------------------* START-OF-SELECTION. PERFORM frm_auth_check. "權限檢查 PERFORM frm_getdata . "獲取數據 --GETTING DATA PERFORM frm_display_data. "展示ALVEND-OF-SELECTION.*&------------------FORM frm_getdata . SELECT vbak~vbeln, vbak~erdat,"創建日期 vbak~vkorg,"銷售組織 vbak~vkbur, "銷售辦事處 vbak~ernam FROM vbak WHERE vbak~vkorg IN @s_vkorg AND vbak~vkbur IN @s_vkbur AND vbak~ernam IN @s_ernam INTO CORRESPONDING FIELDS OF TABLE @gt_alv.ENDFORM.ALV展示內容
FORM frm_display_data . DATA : lv_html_header TYPE slis_formname .*定義輸出模式 CLEAR:gs_layout,gt_fieldcat. gs_layout-cwidth_opt = 'X'. gs_layout-zebra = 'X'. gs_layout-box_fname = 'SEL'. gv_repid = sy-repid. PERFORM frm_set_fieldcat. .* TRY . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = gv_repid i_callback_user_command = 'FRM_USER_COMMAND' i_callback_pf_status_set = 'FRM_PF_STATUS' is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat i_save = 'A' TABLES t_outtab = gt_alv EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.ENDFORM. FORM frm_set_fieldcat . add_field: vbeln 'VBAK' 'VBELN' '銷售訂單', erdat 'VBAK' 'ERDAT' '創建日期', vkorg 'VBAK' 'VKORG' '銷售組織', vkbur 'VBAK' 'VKBUR' '銷售辦事處', ernam 'VBAK' 'ERNAM' '創建人'.ENDFORM.FORM frm_pf_status USING extab TYPE slis_t_extab. DATA: fcode TYPE TABLE OF sy-ucomm. CLEAR:fcode[]. SET PF-STATUS 'STANDARD' EXCLUDING fcode[] .ENDFORM.*&---------------------------------------------------------------------**& FORM FRM_USER_COMMAND*&---------------------------------------------------------------------** 自定義用戶動作*----------------------------------------------------------------------** --> P1 TEXT* <-- P2 TEXT*----------------------------------------------------------------------**自定義用戶動作FORM frm_user_command USING p_ucomm TYPE sy-ucomm rs_selfield TYPE slis_selfield. DATA : l_ucomm TYPE sy-ucomm . IF g_grid IS INITIAL. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = g_grid. ENDIF. "失去焦點觸發更新內表 CALL METHOD g_grid->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified. CALL METHOD g_grid->check_changed_data. rs_selfield-refresh = 'X'. rs_selfield-col_stable = 'X'. rs_selfield-row_stable = 'X'. l_ucomm = p_ucomm . CLEAR p_ucomm . DATA : l_uname TYPE sy-uname, l_datum TYPE sy-datum, l_uzeit TYPE sy-uzeit. CASE l_ucomm. WHEN '&IC1'. "雙擊 READ TABLE gt_alv INDEX rs_selfield-tabindex INTO DATA(wa_sel_temp). "雙擊行 IF sy-subrc = 0 .* SET PARAMETER ID 'VL' FIELD WA_SEL_TEMP-VBELN .* CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN ."SKIP FIRST SCREEN 忽略SELECTION SCREEN PERFORM displat_item USING wa_sel_temp-vbeln. ENDIF. CLEAR:wa_sel_temp. WHEN OTHERS. ENDCASE.ENDFORM.*&---------------------------------------------------------------------**&---------------------------------------------------------------------**&---------------------------------------------------------------------**& FORM DISPLAT_ITEM*&---------------------------------------------------------------------**& TEXT*&---------------------------------------------------------------------**& --> P1 TEXT*& <-- P2 TEXT*&---------------------------------------------------------------------*FORM displat_item USING p_vbeln. DATA: go_alv TYPE REF TO cl_salv_table, go_funlst TYPE REF TO cl_salv_functions_list. DATA: cxroot TYPE REF TO cx_root, excmsg TYPE c. CLEAR:go_alv,go_funlst. SELECT vbap~vbeln, vbap~posnr, vbap~matnr, vbap~ZMENG, makt~maktx FROM vbap LEFT JOIN makt ON makt~matnr EQ vbap~matnr AND makt~spras = '1' WHERE vbeln = @p_vbeln INTO TABLE @DATA(lt_item). IF sy-subrc = 0. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv "導出ALV的容器對象 CHANGING t_table = lt_item[] ). "內容表 CATCH cx_root INTO cxroot. excmsg = cxroot->get_text( ). MESSAGE e000(oo) WITH excmsg. ENDTRY. go_funlst = go_alv->get_functions( ). go_funlst->set_all( 'X' ). "重新設置列名稱 go_alv->get_columns( )->get_column( 'MAKTX' )->set_long_text( 'TES刪除' )." IF go_alv IS BOUND."設置窗口大小與位置- go_alv->set_screen_popup( start_column = 30 end_column = 160 start_line = 5 end_line = 20 ). go_alv->display( ). ENDIF. ENDIF.ENDFORM.結果展示
如圖展示內容結果,一級對應的字段為,VBAK 表中的 銷售訂單,創建日期,銷售組織,銷售辦事處,創建人等字段, 通過usercomed ,雙擊數據VBELN下鉆到下一層ALV數據. 下層ALV數據展示內容為 銷售訂單憑證,行號,料號,目標數量,同時可以使用 go_alv->get_columns( )->get_column( 'MAKTX' )->set_long_text( 'TES刪除' )." 給對應的字段附加更換列名.
技術總結
ALV數據下鉆是在工作中經常使用的必要內容.能夠熟練使用ALV下鉆并按照關鍵字展示下級相關ALV數據是一個ABAPER 必會內容. 此文詳細講解了必要技術.希望能夠幫助大家 .
貴有恒何必三更起五更睡,最無益只怕一日曝十日寒。 這里是百里,一個年近30的中年程序員.希望能夠幫到您.
最后
最近找到一個VUE的文檔,它將VUE的各個知識點進行了總結,整理成了《Vue 開發必須知道的36個技巧》。內容比較詳實,對各個知識點的講解也十分到位。
有需要的小伙伴,可以點擊下方卡片領取,無償分享
總結
以上是生活随笔為你收集整理的ABAP 之ALV展示及下钻弹窗数据页面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sod
- 下一篇: 2021-05-10基于GIS的交通可达