ABAP ALV--REUSE_ALV_GRID_DISPLAY_LVC &单元格编辑、颜色&下拉框&参数(固定列/布局格式/行选择/ALV刷新自动优化列宽) & alv缓存

代码案例:

1.单元格是否可编辑

多个字段的时候,使用INSERT…INTO…INDEX…
使用append会提示索引的错误
在这里插入图片描述

或者使用新语法

在这里插入图片描述

*&---------------------------------------------------------------------*
*& Report ZPPR012
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr012.
TABLES: aufk.

INCLUDE zcommon.

DATA: BEGIN OF gt_itab OCCURS 0,
        aufnr  TYPE aufnr,
        werks  TYPE werks,
        xh(20),
        sel(1),
        ctrl   TYPE lvc_t_styl,
      END OF gt_itab.
DATA: gs_itab LIKE LINE OF gt_itab.

DATA: ls_styl TYPE lvc_s_styl.

SELECTION-SCREEN FUNCTION KEY 1."模板下载

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: bu11 RADIOBUTTON GROUP but DEFAULT 'X' USER-COMMAND sel_type."导入
  SELECTION-SCREEN SKIP 1.
  PARAMETERS: p_file TYPE localfile MODIF ID a.
  SELECTION-SCREEN SKIP 1.
  PARAMETERS: bu12 RADIOBUTTON GROUP but."查询
  SELECTION-SCREEN SKIP 1.
  SELECT-OPTIONS:
  s_aufnr FOR aufk-aufnr MODIF ID b,
  s_werks FOR aufk-werks MODIF ID b.
SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file."搜索帮助按钮
  PERFORM frm_getfilename USING p_file.

AT SELECTION-SCREEN OUTPUT.
  PERFORM frm_change_text.

START-OF-SELECTION.

  IF bu11 IS NOT INITIAL.
    "1.导入:  获取模板数据

  ELSEIF bu12 IS NOT INITIAL.
    "2.查询:  获取日志表最新数据
    gt_itab-aufnr = '1'.
    gt_itab-werks = '1000'.
    gt_itab-xh = '2'.
    APPEND gt_itab.

    gt_itab-aufnr = '2'.
    gt_itab-werks = '1000'.
    gt_itab-xh = '3'.
    APPEND gt_itab.

    CLEAR gs_itab.
    ls_styl-fieldname = 'XH'.
    ls_styl-style = cl_gui_alv_grid=>mc_style_disabled."不可编辑
    APPEND ls_styl TO gs_itab-ctrl.

    MODIFY gt_itab FROM gs_itab TRANSPORTING ctrl WHERE aufnr <> ''.
  ENDIF.

  PERFORM frm_display.

FORM frm_change_text."控制显示隐藏
  IF bu12 IS NOT INITIAL.
    LOOP AT SCREEN.
      IF screen-group1 = 'A'.
        screen-active = '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ELSEIF bu11 IS NOT INITIAL.
    LOOP AT SCREEN.
      IF screen-group1 = 'B'.
        screen-active = '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.
ENDFORM.

FORM frm_display.

  DATA lv_title TYPE lvc_title.
  DATA lv_edit(1).

  IF bu11 IS NOT INITIAL.
    lv_title = '工单创建'.
  ELSEIF bu12 IS NOT INITIAL.
    lv_edit = abap_true.
    lv_title = '工单修改'.

    wa_layout-stylefname = 'CTRL'."控制参数

    add_fieldcat 'SEL' '选择' lv_edit 'X' '' '' '' '' ''.
  ENDIF.

  add_fieldcat 'AUFNR' '工单号' '' '' '' '' '' '' ''.
  add_fieldcat 'WERKS' '工厂' '' '' '' '' '' '' ''.
  add_fieldcat 'XH' '序号' lv_edit '' '' '' '' '' ''.

  "wa_layout-box_fname = 'SEL'."选择框的字段名
  wa_layout-no_rowmark = 'X'."禁用行选择   如果自定义了选择框字段  可以隐藏掉自带的
  wa_layout-zebra = 'X'."颜色交替
  wa_layout-cwidth_opt = 'X' .       " 自动优化列宽

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      is_layout_lvc            = wa_layout   "属性
      it_fieldcat_lvc          = gt_fieldcat "字段
      i_callback_program       = sy-repid    "当前程序
      i_callback_pf_status_set = 'ALV_PF_STATUS_SET'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      i_grid_title             = lv_title
    TABLES
      t_outtab                 = gt_itab
    EXCEPTIONS
      program_error            = 1.

ENDFORM.

FORM alv_pf_status_set USING rt_extab TYPE slis_t_extab.
  DATA: l_extab TYPE LINE OF slis_t_extab.

  IF bu11 IS INITIAL.
    l_extab-fcode = '&CO01'.
    APPEND l_extab TO rt_extab.
  ELSEIF bu12 IS INITIAL.
    l_extab-fcode = '&EDIT'.
    APPEND l_extab TO rt_extab.
    l_extab-fcode = '&SAVE'.
    APPEND l_extab TO rt_extab.
  ENDIF.

  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab."显示/隐藏对应的GUI按钮
ENDFORM.                    "alv_pf_status_set

*&---------------------------------------------------------------------*
*&      Form  alv_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->LS_SELFIELD  text
*----------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm TYPE sy-ucomm
      ls_selfield TYPE slis_selfield.
  "alv的刷新 获取更新后的值
  IF lr_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = lr_grid.
  ENDIF.
  IF lr_grid IS NOT INITIAL.
    CALL METHOD lr_grid->check_changed_data.
  ENDIF.

  "
  CASE r_ucomm.
    WHEN '&CO01'."创建工单

    WHEN '&EDIT'."修改: 序号列->可编辑

      IF r_ucomm <> '&CO01'.
        IF line_exists( gt_itab[ sel = 'X' ] ).
        ELSE.
          MESSAGE e000(zgl01) WITH '未选择行项目!'.
        ENDIF.
      ENDIF.

      "
      CLEAR gs_itab.
      ls_styl-fieldname = 'XH'.
      ls_styl-style = cl_gui_alv_grid=>mc_style_enabled."可编辑
      APPEND ls_styl TO gs_itab-ctrl.

      MODIFY gt_itab FROM gs_itab TRANSPORTING ctrl WHERE sel = 'X'.

    WHEN '&SAVE'."保存修改记录:: 序号列->不可编辑

      IF r_ucomm <> '&CO01'.
        IF line_exists( gt_itab[ sel = 'X' ] ).
        ELSE.
          MESSAGE e000(zgl01) WITH '未选择行项目!'.
        ENDIF.
      ENDIF.

      "
      CLEAR gs_itab.
      ls_styl-fieldname = 'XH'.
      ls_styl-style = cl_gui_alv_grid=>mc_style_disabled."不可编辑
      APPEND ls_styl TO gs_itab-ctrl.

      MODIFY gt_itab FROM gs_itab TRANSPORTING ctrl WHERE sel = 'X'.

    WHEN 'ALL'.
      gs_itab-sel = 'X'.
      MODIFY gt_itab FROM gs_itab TRANSPORTING sel WHERE sel = ''.
    WHEN 'SAL'.
      gs_itab-sel = ''.
      MODIFY gt_itab FROM gs_itab TRANSPORTING sel WHERE sel = 'X'.
  ENDCASE.

  "刷新alv内表!!!!!!!!!!!!!!!!!!!!
  wa_layout-cwidth_opt = 'X'.
  CALL METHOD lr_grid->set_frontend_layout
    EXPORTING
      is_layout = wa_layout.
      
  DATA: ls_stbl TYPE lvc_s_stbl.
  ls_stbl-row = 'X'.
  ls_stbl-col = 'X'.
  CALL METHOD lr_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stbl.
ENDFORM.

zcommon代码

*&---------------------------------------------------------------------*
*& Include ZCOMMON
*&----------------------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值