今天寫一個簡單的ALV報表吧,僅顯示的那種,這是前兩天剛入門的ABAP小伙伴的小考題,
需求是這樣的:
需求描述:
1.選擇屏幕為:
勾選時,才顯示銷售憑證的選項
2.展示訂單,行項目,訂單類型,物料號等信息的ALV展示
3.單擊銷售訂單跳轉到VA03查詢頁面
4.當訂單數目小於10時,用紅色標注
代碼如下:
*&---------------------------------------------------------------------* *& Report ZALV_SIMPLE *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zalv_simple. TABLES:vbak. TYPES:BEGIN OF gty_data, vbeln TYPE vbak-vbeln, posnr TYPE vbap-posnr, auart TYPE vbak-auart, matnr TYPE vbap-matnr, maktx TYPE makt-maktx, kwmeng TYPE vbap-kwmeng, scol TYPE lvc_t_scol, "用來控制單元格顏色 END OF gty_data. DATA gs_fieldcat TYPE lvc_s_fcat. DATA gt_fieldcat TYPE lvc_t_fcat. DATA gs_layout TYPE lvc_s_layo. DATA gs_data TYPE gty_data. DATA gt_data TYPE TABLE OF gty_data. PARAMETERS p_auart TYPE vbak-auart . PARAMETERS p_vkorg TYPE vbak-vkorg . SELECT-OPTIONS:s_erdat FOR vbak-erdat. PARAMETERS p_cbox AS CHECKBOX USER-COMMAND uc1. SELECT-OPTIONS:s_vbeln FOR vbak-vbeln MODIF ID md1. INITIALIZATION. AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF screen-name = 'P_AUART' OR screen-name = 'P_VKORG'. screen-required = '2'. MODIFY SCREEN. ENDIF. IF screen-group1 = 'MD1'. IF p_cbox EQ 'X'. screen-active = '1'. ELSE. screen-active = '0'. ENDIF. MODIFY SCREEN. ENDIF. ENDLOOP. START-OF-SELECTION. IF p_auart IS INITIAL OR p_vkorg IS INITIAL. MESSAGE '請輸入必填項' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. PERFORM frm_get_data. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . DATA ls_scol TYPE lvc_s_scol."控制顏色的結構 IF p_cbox IS INITIAL. CLEAR s_vbeln[]. ENDIF. "抓取銷售訂單,行項目,類型,物料,物料描述,訂單數量 SELECT a~vbeln,b~posnr,a~auart,b~matnr,c~maktx,b~kwmeng INTO TABLE @DATA(lt_data) FROM vbak AS a INNER JOIN vbap AS b ON b~vbeln = a~vbeln INNER JOIN makt AS c ON c~matnr = b~matnr WHERE a~auart = @p_auart AND a~vkorg = @p_vkorg AND a~erdat IN @s_erdat AND a~vbeln IN @s_vbeln AND c~spras = @sy-langu. IF sy-subrc EQ 0. MOVE-CORRESPONDING lt_data[] TO gt_data[]. LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs>) WHERE kwmeng < 10. CLEAR ls_scol. ls_scol-fname = 'KWMENG'. ls_scol-color-col = '6'."6:為紅色 1:強化 0:顏色為背景 ls_scol-color-int = '1'."6:為紅色 1:強化 0:顏色為背景 ls_scol-color-inv = '0'."6:為紅色 1:強化 0:顏色為背景 APPEND ls_scol TO <fs>-scol. ENDLOOP. gs_layout-sel_mode = 'D' ."模式 gs_layout-zebra = 'X'. "ALV表格按斑馬線條紋顯示 gs_layout-cwidth_opt = 'X'. "將ALV字段寬度設置為最優化 gs_layout-ctab_fname = 'SCOL'."ALV 控制: 帶有復雜單元格顏色編碼的字段名稱 PERFORM frm_build_cat. PERFORM frm_display. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_BUILD_CAT *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_build_cat . DATA lv_pos TYPE i. DATA ls_fieldcat LIKE LINE OF gt_fieldcat. DEFINE %%append_fieldcat. lv_pos = lv_pos + 1. ls_fieldcat-col_pos = lv_pos. ls_fieldcat-fieldname = &1."字段名 ls_fieldcat-coltext = &2."文本 ls_fieldcat-key = &3."關鍵字 ls_fieldcat-ref_table = &4."參考的表 ls_fieldcat-ref_field = &5."參考的字段 APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat. END-OF-DEFINITION. %%append_fieldcat: 'VBELN' '' 'X' 'VBAK' 'VBELN', 'POSNR' '' 'X' 'VBAP' 'POSNR', 'AUART' '' '' 'VBAK' 'AUART', 'MATNR' '' '' 'VBAP' 'MATNR', 'MAKTX' '' '' 'MAKT' 'MAKTX', 'KWMENG' '' '' 'VBAP' 'KWMENG'. READ TABLE gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs>) INDEX 1. IF sy-subrc EQ 0. <fs>-hotspot = 'X'."激活熱點,單機跳轉功能 ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_display . "調用FM 顯示報表 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = * I_BUFFER_ACTIVE = i_callback_program = sy-repid i_callback_pf_status_set = 'FRM_SET_STATUS' "狀態欄form i_callback_user_command = 'FRM_ALV_USER_COMMAND' "用戶命令form * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat * IT_EXCLUDING = * IT_SPECIAL_GROUPS_LVC = * IT_SORT_LVC = * IT_FILTER_LVC = * IT_HYPERLINK = * IS_SEL_HIDE = * I_DEFAULT = 'X' * I_SAVE = ' ' * IS_VARIANT = * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT_LVC = * IS_REPREP_ID_LVC = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = * I_HTML_HEIGHT_END = * IT_ALV_GRAPHICS = * IT_EXCEPT_QINFO_LVC = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES t_outtab = gt_data * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDFORM. FORM frm_set_status USING p_extab TYPE slis_t_extab. SET PF-STATUS 'ZSTANDARD_FULLSCREEN' . "se41 從程序saplkkbl 狀態STANDARD_FULLSCREEN 復制 ENDFORM. " frm_set_status FORM frm_alv_user_command USING p_ucomm TYPE sy-ucomm p_rs_selfield TYPE slis_selfield. CASE p_ucomm. WHEN '&IC1'."單擊 READ TABLE gt_data INTO DATA(ls_data) INDEX p_rs_selfield-tabindex. IF sy-subrc EQ 0 AND p_rs_selfield-fieldname = 'VBELN'. "跳轉畫面 SET PARAMETER ID: 'AUN' FIELD ls_data-vbeln. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDIF. WHEN OTHERS. ENDCASE. ENDFORM.