今天写一个简单的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.