abap--关于在REUSE_ALV_GRID_DISPLAY将单元或行标识不同的颜色的处理收集

这篇博客详细介绍了如何在ABAP的REUSE_ALV_GRID_DISPLAY中设置行和列的颜色,包括指定行显示不同颜色、不同列显示不同颜色以及特定单元格显示不同颜色的方法,提供了具体的代码示例。

一、指定行显示不同颜色
参见:http://blog.youkuaiyun.com/CompassButton/archive/2006/09/08/1195672.aspx 

二、不同列显示不同颜色
1)对于非key字段则可以通过设置字段格式(slis_fieldcat_alv)的emphasize指定,代码如下:
  data: wa_fieldcat type slis_fieldcat_alv.
  clear wa_fieldcat.
  wa_fieldcat-ref_fieldname = im_ref_field.
  wa_fieldcat-ref_tabname = im_ref_table.
  wa_fieldcat-fieldname = im_fieldname.
  wa_fieldcat-tabname   = im_tabname.
  wa_fieldcat-key       = ‘’.
  wa_fieldcat-fix_column = IM_fix.
  wa_fieldcat-checkbox  = im_checkbox.
  wa_fieldcat-do_sum     = im_dosum.
  wa_fieldcat-no_zero     = im_zero.
  wa_fieldcat-no_out     = im_out.
  wa_fieldcat-seltext_l = im_seltex_l.
  wa_fieldcat-seltext_m = im_seltex_l.
  wa_fieldcat-seltext_s = im_seltex_l.
  wa_fieldcat-outputlen = im_outputlen.
  wa_fieldcat-decimals_out = im_dec.
  wa_fieldcat--emphasize = 'C500'.
*  wa_fieldcat-col_pos   = IM_colpos.
  append wa_fieldcat to re_field.
2)对于key字段的设置参见单元颜色设置一个特例(整列的所有单元)

三、指定单元格显示不同颜色(参见红色代码)
代码
report  Ztest_fullscreencolor.
type-pools: slis.
class cl_gui_resources definition load.
types: begin of g_ty_s_test,
         select_amount            type i,
         color_rows               type i occurs 0,
         color_fields_column      type lvc_fname occurs 0,
         color_fields_cell        type lvc_fname occurs 0,
       end of   g_ty_s_test,

       begin of g_ty_s_outtab_slis.
include type alv_t_t2.
 *定义颜色设置字段
types:   color(4)  type c,
         tabcolor  type slis_t_specialcol_alv,

       end   of g_ty_s_outtab_slis,
       g_ty_t_outtab_slis type table of g_ty_s_outtab_slis.

constants: con_true         type char1 value 'X'.

field-symbols: <gt_outtab> type standard table.

data: gs_test   type g_ty_s_test,
      gt_outtab_slis  type g_ty_t_outtab_slis,
      g_repid type sy-repid.

data: g_field     type lvc_s_fcat-fieldname,
      g_int_field type i.
*----------------------------------------------------------------------*
* SELECTION-SCREEN                                                     *
*----------------------------------------------------------------------
selection-screen begin of block col with frame title text-col.
parameters:
p_col01 as checkbox.
select-options:
p_colf01 for g_int_field no intervals default 1.
parameters:
p_col02 as checkbox  default 'X'.
select-options:
p_colf02 for g_field no intervals default 'CARRID'.
parameters:
p_col03 as checkbox .
select-options:
p_colf03 for g_field no intervals default 'CONNID'.
selection-screen end of block col.

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST                                 *
*----------------------------------------------------------------------*
at selection-screen on value-request for p_colf02-low.
  perform f01_f4_fcode changing p_colf02-low.

at selection-screen on value-request for p_colf03-low.
  perform f01_f4_fcode changing p_colf03-low.

*----------------------------------------------------------------------*
* START-OF-SELECTION                                                   *
*----------------------------------------------------------------------*
start-of-selection.
  g_repid               = sy-repid.

  gs_test-select_amount = 30.

  if p_col01 eq con_true.
    loop at p_colf01.
      if not p_colf01-low is initial.
        append p_colf01-low to gs_test-color_rows.
      endif.
    endloop.
  endif.
  if p_col02 eq con_true.
    loop at p_colf02.
      if not p_colf02-low is initial.
        append p_colf02-low to gs_test-color_fields_column.
      endif.
    endloop.
  endif.
  if p_col03 eq con_true.
    loop at p_colf03.
      if not p_colf03-low is initial.
        append p_colf03-low to gs_test-color_fields_cell.
      endif.
    endloop.
  endif.
*----------------------------------------------------------------------*
* END-OF-SELECTION                                                     *
*----------------------------------------------------------------------*
end-of-selection.
  perform f01_call_fullscreen.

*&---------------------------------------------------------------------*
*&      Form  f01_call_fullscreen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_call_fullscreen .
  data: ls_layo   type slis_layout_alv,
        lt_fcat   type slis_t_fieldcat_alv.
  perform f01_get_outtab.
  perform f01_set_layo changing ls_layo.
  perform f01_set_fcat changing lt_fcat.
  perform f01_set_color changing lt_fcat  ls_layo.
  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      i_callback_program                = g_repid
*传入控制信息
      is_layout                         = ls_layo
      it_fieldcat                       = lt_fcat

    tables
      t_outtab                          = <gt_outtab>
   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.                    " f01_call_fullscreen
*&---------------------------------------------------------------------*
*&      Form  f01_get_outtab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_get_outtab.
      select * from alv_t_t2
               into corresponding fields of table gt_outtab_slis
               up to gs_test-select_amount rows
               order by primary key.

      assign gt_outtab_slis to <gt_outtab>.
endform.                    " f01_get_outtab
*&---------------------------------------------------------------------*
*&      Form  f01_set_layo
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_set_layo changing cs_layo type slis_layout_alv.

  data: l_text00 type sy-title,
        l_text01 type sy-title,
        l_text02 type sy-title,
        l_text03 type sy-title.
*... Display options
  cs_layo-colwidth_optimize      = space.
  cs_layo-no_colhead             = space.
  cs_layo-no_hotspot             = space.
  cs_layo-zebra                  = space.
  cs_layo-no_vline               = space.
  cs_layo-no_hline               = space.
  cs_layo-cell_merge             = space.
  cs_layo-no_min_linesize        = space.
  cs_layo-min_linesize           = space.
  cs_layo-max_linesize           = space.
  sy-title = 'Test'.
  set titlebar 'D0100' with cs_layo-window_titlebar.
  cs_layo-no_uline_hs            = space.
  cs_layo-countfname             = space.
*... Exceptions
  cs_layo-lights_fieldname       = space.
  cs_layo-lights_tabname         = space.
  cs_layo-lights_rollname        = space.
  cs_layo-lights_condense        = space.
*... Sums
  cs_layo-no_sumchoice           = space.
  cs_layo-no_totalline           = space.
  cs_layo-totals_before_items    = space.
  cs_layo-totals_only            = space.
  cs_layo-totals_text            = space.
  cs_layo-no_subchoice           = space.
  cs_layo-no_subtotals           = space.
  cs_layo-subtotals_text         = space.
  cs_layo-numc_sum               = space.
  cs_layo-no_unit_splitting      = space.
*... Interaction
  cs_layo-box_fieldname          = space.
  cs_layo-box_tabname            = space.
  cs_layo-box_rollname           = space.
  cs_layo-expand_fieldname       = space.
  cs_layo-hotspot_fieldname      = space.
  cs_layo-no_input               = space.
  cs_layo-f2code                 = space.
  cs_layo-confirmation_prompt    = space.
  cs_layo-key_hotspot            = space.
  cs_layo-flexible_key           = space.
  cs_layo-reprep                 = space.
  cs_layo-group_buttons          = space.
  cs_layo-no_keyfix              = space.
  cs_layo-get_selinfos           = space.
  cs_layo-group_change_edit      = space.
  cs_layo-no_scrolling           = space.
  cs_layo-expand_all             = space.
  cs_layo-no_author              = space.
*... Detailed screen
  cs_layo-detail_popup           = space.
  cs_layo-detail_initial_lines   = space.
  cs_layo-detail_titlebar        = space.
*... PF-status
  cs_layo-def_status             = space.
*... Display variants
  cs_layo-header_text            = space.
  cs_layo-item_text              = space.
  cs_layo-default_item           = space.
*... colour
  cs_layo-info_fieldname         = space.
  cs_layo-coltab_fieldname       = space.
*... others
  cs_layo-list_append            = space.
endform.                    " f01_set_layo

*&---------------------------------------------------------------------*
*&      Form  f01_set_fcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_set_fcat changing ct_fcat type slis_t_fieldcat_alv.
  call function 'REUSE_ALV_FIELDCATALOG_MERGE'
    exporting
      i_structure_name             = 'ALV_T_T2'
    changing
      ct_fieldcat                  = ct_fcat
    exceptions
      inconsistent_interface       = 1
      program_error                = 2
      others                       = 3.
  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.                    " f01_set_fcat

*&---------------------------------------------------------------------*
*&      Form  f01_set_color
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_set_color changing ct_fcat type slis_t_fieldcat_alv
                            cs_layo type slis_layout_alv.
  field-symbols: <ls_outtab> type any,
                 <ls_fcat>   type slis_fieldcat_alv,
                 <l_any>     type any,
                 <lt_table>  type standard table.
  data: l_row         type i,
        l_field       type lvc_fname,
        l_color_index type i,
        lt_fcat       type slis_t_fieldcat_alv,
        lt_color_lvc  type lvc_t_scol,
        ls_color_lvc  type lvc_s_scol,
        lt_color_slis type slis_t_specialcol_alv,
        ls_color_slis type slis_specialcol_alv.
*Set Row Color through info_fieldname
*对不同行对Color字段填写不同颜色值

  cs_layo-info_fieldname = 'COLOR'.

  loop at gs_test-color_rows into l_row.
    read table <gt_outtab> assigning <ls_outtab> index l_row.
    if sy-subrc eq 0.
      assign component 'COLOR' of structure <ls_outtab> to <l_any>.
      if sy-subrc eq 0.
        <l_any> = 'C610'.
      endif.
    endif.
  endloop.
  lt_fcat = ct_fcat.
  delete lt_fcat where tech ne space or no_out ne space.
*对于非关键字段可以通过emphasize设置颜色
  loop at gs_test-color_fields_column into l_field.
    read table lt_fcat assigning <ls_fcat>
               with key fieldname = l_field.
    if sy-subrc eq 0 and <ls_fcat>-key eq space.
      read table ct_fcat assigning <ls_fcat>
                 with key fieldname = <ls_fcat>-fieldname.
      if sy-subrc eq 0.
        <ls_fcat>-emphasize = 'C500'.
      endif.
    else.
*对于关键字段可以通过则通过cs_layo-coltab_fieldname = 'TABCOLOR'来设置颜色
      ls_color_slis-fieldname = <ls_fcat>-fieldname.
      ls_color_slis-color-col = cl_gui_resources=>list_col_positive.
      ls_color_slis-color-int = cl_gui_resources=>list_intensified.
      ls_color_slis-color-inv = 0.
      ls_color_slis-nokeycol  = con_true.
      append ls_color_slis to lt_color_slis.
      loop at <gt_outtab> assigning <ls_outtab>.
        assign component 'TABCOLOR' of structure <ls_outtab> to <l_any>.
        if sy-subrc eq 0.
           <l_any> = lt_color_slis.
        endif.
      endloop.
    endif.
  endloop.

  cs_layo-coltab_fieldname = 'TABCOLOR'.
*TABCOLOR表可以填写多条,也就可以同行控制多个单元的颜色。

  loop at <gt_outtab> assigning <ls_outtab>.
    add 1 to l_color_index.
    clear lt_color_slis.
    case l_color_index.
      when 1.
        ls_color_slis-color-col = cl_gui_resources=>list_col_background.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 2.
        ls_color_slis-color-col = cl_gui_resources=>list_col_background.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 3.
        ls_color_slis-color-col = cl_gui_resources=>list_col_heading.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 4.
        ls_color_slis-color-col = cl_gui_resources=>list_col_heading.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 5.
        ls_color_slis-color-col = cl_gui_resources=>list_col_normal.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 6.
        ls_color_slis-color-col = cl_gui_resources=>list_col_normal.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 7.
        ls_color_slis-color-col = cl_gui_resources=>list_col_total.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 8.
        ls_color_slis-color-col = cl_gui_resources=>list_col_total.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 9.
        ls_color_slis-color-col = cl_gui_resources=>list_col_key.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 10.
        ls_color_slis-color-col = cl_gui_resources=>list_col_key.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 11.
        ls_color_slis-color-col = cl_gui_resources=>list_col_positive.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 12.
        ls_color_slis-color-col = cl_gui_resources=>list_col_positive.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 13.
        ls_color_slis-color-col = cl_gui_resources=>list_col_negative.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 14.
        ls_color_slis-color-col = cl_gui_resources=>list_col_negative.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 15.
        ls_color_slis-color-col = cl_gui_resources=>list_col_group.
        ls_color_slis-color-int = 0.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
      when 16.
        ls_color_slis-color-col = cl_gui_resources=>list_col_group.
        ls_color_slis-color-int = cl_gui_resources=>list_intensified.
        ls_color_slis-color-inv = 0.
        ls_color_slis-nokeycol  = con_true.
        clear l_color_index.
    endcase.
*查找同行多少列需要设置颜色,则生成多条颜色纪录
    loop at gs_test-color_fields_cell into l_field.
      read table lt_fcat assigning <ls_fcat>
                 with key fieldname = l_field.
      if sy-subrc eq 0.
        ls_color_slis-fieldname = <ls_fcat>-fieldname.
        append ls_color_slis to lt_color_slis.
      endif.
    endloop.
*将颜色纪录添加到数据输出表的TABCOLOR字段
    assign component 'TABCOLOR' of structure <ls_outtab> to <lt_table>.
    if sy-subrc eq 0.
      append lines of lt_color_slis to <lt_table>.
    endif.
  endloop.
endform.                    " f01_set_color
*&---------------------------------------------------------------------*
*&      Form  f01_f4_fcode
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form f01_f4_fcode changing c_value type lvc_s_fcat-fieldname.

  data: lt_fcat type slis_t_fieldcat_alv,
        ls_fcat type slis_fieldcat_alv.
  data: lt_values type table of seahlpres,
        lt_fields type table of dfies,
        lt_return type table of ddshretval,
        ls_value  type seahlpres,
        ls_field  type dfies,
        ls_return type ddshretval.
  perform f01_set_fcat changing lt_fcat.
  clear ls_field.
  ls_field-fieldname = 'FIELDNAME'.
  ls_field-intlen    = 30.
  ls_field-leng      = 30.
  ls_field-outputlen = 30.
  ls_field-scrtext_s = ls_field-fieldname.
  ls_field-scrtext_m = ls_field-fieldname.
  ls_field-scrtext_l = ls_field-fieldname.
  ls_field-reptext   = ls_field-fieldname.
  append ls_field to lt_fields.
  loop at lt_fcat into ls_fcat where tech eq space.
    ls_value-string = ls_fcat-fieldname.
    append ls_value to lt_values.
  endloop.
  call function 'F4IF_INT_TABLE_VALUE_REQUEST'
   exporting
     retfield               = 'FIELDNAME'
     display                = space
   tables
     value_tab              = lt_values
     field_tab              = lt_fields
     return_tab             = lt_return
   exceptions
     parameter_error        = 1
     no_values_found        = 2
     others                 = 3.
  if sy-subrc <> 0 and sy-subrc ne 3.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
  read table lt_return into ls_return  with key fieldname = 'FIELDNAME'.
  if sy-subrc eq 0.
    c_value = ls_return-fieldval.
  endif.
endform.                    " f01_f4_fcode

 
以下是一个结合 **REUSE_ALV_GRID_DISPLAY** 和 **SAP Smartforms** 的 **ABAP 报表程序**,实现 **生产订单缺料检查报表**,**不使用 CLASS**,涵盖数据查询、ALV展示、Smartforms打印及用户交互功能: ```ABAP REPORT z_pp_material_shortage_report NO STANDARD PAGE HEADING. *----------------------------------------------------------------------* * 数据定义 *----------------------------------------------------------------------* TABLES: aufk, afpo, mara, marc, mard, ekbe, resb, makt, t440, t441. * ALV 数据结构 TYPES: BEGIN OF ty_alv_output, aufnr TYPE aufnr, " 生产订单号 matnr TYPE matnr, " 物料编号 maktx TYPE maktx, " 物料描述 werks TYPE werks_d, " 工厂 lgort TYPE lgort_d, " 库存地点 req_qty TYPE menge_d, " 需求数量 avail_qty TYPE menge_d, " 可用数量 short_qty TYPE menge_d, " 短缺数量 stock_type TYPE string, " 库存类型 pr_status TYPE string, " PR状态(已创建/待创建) pr_number TYPE banfn, " PR编号 END OF ty_alv_output. DATA: gt_alv_output TYPE TABLE OF ty_alv_output, gs_alv_output TYPE ty_alv_output. * Smartforms 数据结构 TYPES: BEGIN OF ty_smartform_data, aufnr TYPE aufnr, matnr TYPE matnr, maktx TYPE maktx, short_qty TYPE menge_d, pr_number TYPE banfn, END OF ty_smartform_data. DATA: gt_smartform_data TYPE TABLE OF ty_smartform_data, gs_smartform_data TYPE ty_smartform_data. * 配置表:检查规则 TYPES: BEGIN OF ty_check_rule, matkl TYPE matkl, check_group TYPE string, include_in_transit TYPE abap_bool, auto_pr_trigger TYPE abap_bool, END OF ty_check_rule. DATA: gt_check_rules TYPE TABLE OF ty_check_rule, gs_check_rule TYPE ty_check_rule. * 屏幕字段 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_aufnr TYPE aufnr OBLIGATORY, " 生产订单号 p_plant TYPE werks_d DEFAULT '1000', " 工厂 p_lgort TYPE lgort_d DEFAULT '0001', " 库存地点 p_print TYPE abap_bool AS CHECKBOX DEFAULT abap_false. " 打印报表 SELECTION-SCREEN END OF BLOCK b1. *----------------------------------------------------------------------* * 主程序 *----------------------------------------------------------------------* START-OF-SELECTION. " 1. 初始化配置 PERFORM initialize_check_rules. " 2. 获取生产订单缺料数据 PERFORM get_material_shortage_data. " 3. 显示ALV报表 PERFORM display_alv_report. " 4. 如果选择打印,调用Smartforms IF p_print = abap_true. PERFORM call_smartform_report. ENDIF. *&---------------------------------------------------------------------* *& Form INITIALIZE_CHECK_RULES *&---------------------------------------------------------------------* * 初始化检查规则(模拟T440/T441配置) *----------------------------------------------------------------------* FORM initialize_check_rules. " 规则1:标准原材料 gs_check_rule-matkl = '001'. gs_check_rule-check_group = 'RAW'. gs_check_rule-include_in_transit = abap_true. gs_check_rule-auto_pr_trigger = abap_true. APPEND gs_check_rule TO gt_check_rules. " 规则2:半成品 gs_check_rule-matkl = '002'. gs_check_rule-check_group = 'SEMI'. gs_check_rule-include_in_transit = abap_false. gs_check_rule-auto_pr_trigger = abap_false. APPEND gs_check_rule TO gt_check_rules. ENDFORM. *&---------------------------------------------------------------------* *& Form GET_MATERIAL_SHORTAGE_DATA *&---------------------------------------------------------------------* * 获取生产订单缺料数据 *----------------------------------------------------------------------* FORM get_material_shortage_data. " 1. 获取生产订单项目 SELECT afpo~aufnr, afpo~matnr, afpo~psmng, afpo~wemng, mara~matkl, mara~meins, makt~maktx FROM afpo INNER JOIN mara ON afpo~matnr = mara~matnr LEFT JOIN makt ON afpo~matnr = makt~matnr AND makt~spras = sy-langu WHERE afpo~aufnr = @p_aufnr INTO TABLE @DATA(lt_order_items). " 2. 检查每个物料的库存 LOOP AT lt_order_items INTO DATA(ls_order_item). CLEAR gs_alv_output. gs_alv_output-aufnr = ls_order_item-aufnr. gs_alv_output-matnr = ls_order_item-matnr. gs_alv_output-maktx = ls_order_item-maktx. gs_alv_output-werks = p_plant. gs_alv_output-lgort = p_lgort. gs_alv_output-req_qty = ls_order_item-psmng - ls_order_item-wemng. " 剩余需求量 " 获取物料组对应的检查规则 READ TABLE gt_check_rules INTO gs_check_rule WITH KEY matkl = ls_order_item-matkl. IF sy-subrc <> 0. gs_check_rule-include_in_transit = abap_true. gs_check_rule-auto_pr_trigger = abap_false. ENDIF. " 检查库存可用性(简化逻辑) SELECT SINGLE labst FROM mard INTO @DATA(lv_avail_qty) WHERE matnr = @ls_order_item-matnr AND werks = @p_plant AND lgort = @p_lgort. IF sy-subrc <> 0. lv_avail_qty = 0. ENDIF. " 检查在途库存(简化) IF gs_check_rule-include_in_transit = abap_true. SELECT SUM( menge ) FROM ekbe INTO @DATA(lv_in_transit) WHERE matnr = @ls_order_item-matnr AND werks = @p_plant AND bewtp = 'E'. " 采购订单收货 IF sy-subrc = 0. lv_avail_qty = lv_avail_qty + lv_in_transit. ENDIF. ENDIF. " 计算短缺数量 gs_alv_output-avail_qty = lv_avail_qty. IF lv_avail_qty < gs_alv_output-req_qty. gs_alv_output-short_qty = gs_alv_output-req_qty - lv_avail_qty. gs_alv_output-stock_type = '短缺'. IF gs_check_rule-auto_pr_trigger = abap_true. gs_alv_output-pr_status = '待创建PR'. ELSE. gs_alv_output-pr_status = '需手动处理'. ENDIF. ELSE. gs_alv_output-short_qty = 0. gs_alv_output-stock_type = '充足'. gs_alv_output-pr_status = '无需PR'. ENDIF. " 准备Smartforms数据(仅短缺物料) IF gs_alv_output-short_qty > 0. MOVE-CORRESPONDING gs_alv_output TO gs_smartform_data. APPEND gs_smartform_data TO gt_smartform_data. ENDIF. APPEND gs_alv_output TO gt_alv_output. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form DISPLAY_ALV_REPORT *&---------------------------------------------------------------------* * 显示ALV报表 *----------------------------------------------------------------------* FORM display_alv_report. DATA: lt_fieldcat TYPE lvc_t_fcat, ls_layout TYPE lvc_s_layo, ls_variant TYPE disvariant. " 1. 准备字段目录 PERFORM build_fieldcatalog CHANGING lt_fieldcat. " 2. 设置布局 ls_layout-zebra = abap_true. ls_layout-sel_mode = 'A'. " 可选择 ls_layout-cwidth_opt = abap_true. " 优化列宽 " 3. 调用ALV显示 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = ls_layout it_fieldcat_lvc = lt_fieldcat i_save = 'A' TABLES t_outtab = gt_alv_output EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE 'ALV显示失败' TYPE 'E'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form BUILD_FIELDCATALOG *&---------------------------------------------------------------------* * 构建ALV字段目录 *----------------------------------------------------------------------* FORM build_fieldcatalog CHANGING pt_fieldcat TYPE lvc_t_fcat. DATA: ls_fieldcat TYPE lvc_s_fcat. " 字段1:生产订单号 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'AUFNR'. ls_fieldcat-seltext_l = '生产订单'. ls_fieldcat-col_pos = 1. APPEND ls_fieldcat TO pt_fieldcat. " 字段2:物料编号 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'MATNR'. ls_fieldcat-seltext_l = '物料编号'. ls_fieldcat-col_pos = 2. APPEND ls_fieldcat TO pt_fieldcat. " 字段3:物料描述 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'MAKTX'. ls_fieldcat-seltext_l = '物料描述'. ls_fieldcat-col_pos = 3. APPEND ls_fieldcat TO pt_fieldcat. " 字段4:需求数量 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'REQ_QTY'. ls_fieldcat-seltext_l = '需求数量'. ls_fieldcat-col_pos = 4. ls_fieldcat-do_sum = abap_true. " 汇总 APPEND ls_fieldcat TO pt_fieldcat. " 字段5:可用数量 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'AVAIL_QTY'. ls_fieldcat-seltext_l = '可用数量'. ls_fieldcat-col_pos = 5. ls_fieldcat-do_sum = abap_true. APPEND ls_fieldcat TO pt_fieldcat. " 字段6:短缺数量 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'SHORT_QTY'. ls_fieldcat-seltext_l = '短缺数量'. ls_fieldcat-col_pos = 6. ls_fieldcat-do_sum = abap_true. ls_fieldcat-emphasize = 'C100'. " 高亮显示 APPEND ls_fieldcat TO pt_fieldcat. " 字段7:PR状态 CLEAR ls_fieldcat. ls_fieldcat-fieldname = 'PR_STATUS'. ls_fieldcat-seltext_l = 'PR状态'. ls_fieldcat-col_pos = 7. APPEND ls_fieldcat TO pt_fieldcat. ENDFORM. *&---------------------------------------------------------------------* *& Form CALL_SMARTFORM_REPORT *&---------------------------------------------------------------------* * 调用Smartforms打印报表 *----------------------------------------------------------------------* FORM call_smartform_report. DATA: lv_formname TYPE tdsfname VALUE 'ZPP_MATERIAL_SHORTAGE', " Smartform名称 lv_control TYPE ssfctrlop, lv_output TYPE ssfcompop, lv_job_output TYPE ssfcresop. " 1. 检查Smartforms是否存在 CALL FUNCTION 'SSF_CHECK_FORM_EXISTENCE' EXPORTING formname = lv_formname EXCEPTIONS not_exist = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE 'Smartforms ZPP_MATERIAL_SHORTAGE 不存在' TYPE 'E'. RETURN. ENDIF. " 2. 设置打印控制参数 lv_control-no_dialog = abap_true. " 后台打印 lv_control-preview = abap_false. " 不预览 lv_control-getotf = abap_true. " 获取OTF数据 " 3. 调用Smartforms CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = lv_formname IMPORTING fm_name = DATA(lv_fm_name). CALL FUNCTION lv_fm_name EXPORTING control_parameters = lv_control output_options = lv_output user_settings = abap_false aufnr = p_aufnr IMPORTING job_output_info = lv_job_output TABLES it_data = gt_smartform_data EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc = 0. MESSAGE '报表已发送至打印机' TYPE 'S'. ELSE. MESSAGE '打印失败' TYPE 'E'. ENDIF. ENDFORM. ``` --- ### **程序功能说明** #### **核心功能** 1. **数据查询**: - 从`AFPO`获取生产订单项目数据。 - 从`MARD`和`EKBE`检查物料库存和在途库存。 2. **ALV报表展示**: - 使用`REUSE_ALV_GRID_DISPLAY_LVC`显示缺料报表。 - 支持字段汇总、高亮显示短缺数量。 3. **Smartforms打印**: - 调用Smartforms(需提前创建`ZPP_MATERIAL_SHORTAGE`)打印短缺物料清单。 - 支持后台打印(`NO_DIALOG = 'X'`)。 4. **用户交互**: - 屏幕字段选择生产订单、工厂和库存地点。 - 复选框控制是否打印报表。 --- ### **Smartforms 设计要点** 1. **表单名称**:`ZPP_MATERIAL_SHORTAGE`(需提前创建)。 2. **数据源**:从程序传递`GT_SMARTFORM_DATA`(仅短缺物料)。 3. **关键字段**: - 生产订单号(`AUFNR`) - 物料编号(`MATNR`) - 短缺数量(`SHORT_QTY`) - PR状态(`PR_STATUS`) --- ### **测试用例** | **测试场景** | **输入数据** | **预期结果** | |--------------------|-------------------------------|------------------------------------------| | 标准缺料报表 | 生产订单1000,工厂1000 | ALV显示短缺物料,高亮显示短缺数量 | | 打印报表 | 勾选“打印报表”复选框 | 调用Smartforms打印短缺清单 | | 无缺料情况 | 生产订单2000(库存充足) | ALV显示“无需PR”,不调用Smartforms | --- ### **相关问题** 1. 如何实现ALV的双击事件(如查看物料明细)? 2. Smartforms中如何动态调整表格列宽? 3. 如何将ALV报表导出为Excel? 4. 是否支持多语言(如物料描述的中文/英文切换)? 5. 如何优化大数据量下的ALV性能? ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值