ABAP ALV新增可维护的新行

话不多说,直接上代码,复制黏贴既可用!!!!!!!

双击某一行就会新增一行可维护空行!!!!!!!

TYPES:BEGIN OF ty_ekko,
        ebeln TYPE ekko-ebeln,
        verkf TYPE ekko-verkf,
        sel   TYPE c,  "用来标识行选择的字段
        F_STYLE TYPE LVC_T_STYL,
      END OF ty_ekko.
DATA:it_ekko TYPE STANDARD TABLE OF ty_ekko,
     wa_ekko TYPE ty_ekko.

DATA:lt_fieldcat TYPE lvc_t_fcat,
     wa_fieldcat LIKE LINE OF lt_fieldcat,
     wa_layout TYPE lvc_s_layo.
CONSTANTS: gco_callback_user_command TYPE slis_formname  VALUE 'FRM_USER_COMMAND',
           gco_callback_status       TYPE slis_formname  VALUE 'FRM_USER_STATUS'.

START-OF-SELECTION.

  SELECT ebeln
         verkf
    INTO CORRESPONDING FIELDS OF TABLE it_ekko
    FROM ekko
  UP TO 10 ROWS.

  APPEND INITIAL LINE TO it_ekko.

  PERFORM frm_set_catalog.

  PERFORM frm_loop_itdata.
*  wa_layout-zebra = 'X'.
*  wa_layout-box_fname = 'SEL'.  "指定行选择字段
  wa_layout-cwidth_opt = 'X'.
  wa_layout-stylefname = 'F_STYLE'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout_lvc            = wa_layout
      it_fieldcat_lvc          = lt_fieldcat
      i_callback_pf_status_set = gco_callback_status
      i_callback_user_command  = gco_callback_user_command
    TABLES
      t_outtab                 = it_ekko[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc = 0.

  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_status USING i_it_extab TYPE slis_t_extab.
*  SET PF-STATUS '*******' .
ENDFORM.                    " FRM_SET_PF_STATUS

FORM frm_user_command USING i_ucomm       TYPE sy-ucomm
                            i_wa_selfield TYPE slis_selfield.
  CASE i_ucomm.
    WHEN '&IC1'.  "Double click
*     if click on PO field, jump to me23n
*      IF i_wa_selfield-fieldname = 'EBELN'.
*        SET PARAMETER ID 'BES' FIELD i_wa_selfield-value.
*        CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
*      ENDIF.
      PERFORM frm_loop_itdata .
      APPEND INITIAL LINE TO it_ekko.
      i_wa_selfield-refresh = 'X'.
    WHEN OTHERS.

  ENDCASE.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_catalog .

  DEFINE mac_fieldcat.
    clear wa_fieldcat.
    wa_fieldcat-fieldname = &1.
    wa_fieldcat-reptext   = &2.
    wa_fieldcat-tabname   = 'IT_EKKO'.
    wa_fieldcat-outputlen = &3.       "设置输出列宽
    wa_fieldcat-edit      = &4.
    APPEND wa_fieldcat TO lt_fieldcat.
  END-OF-DEFINITION.

  clear wa_fieldcat.
  wa_fieldcat-fieldname = 'SEL'.
  wa_fieldcat-reptext   = '选择框'.
  wa_fieldcat-tabname   = 'IT_EKKO'.
  wa_fieldcat-edit      = 'X'.
  wa_fieldcat-checkbox  = 'X'.
  wa_fieldcat-outputlen = 5.       "设置输出列宽
  APPEND wa_fieldcat TO lt_fieldcat.

  mac_fieldcat 'EBELN' '采购单号' 10 'X'.
  mac_fieldcat 'VERKF' '销售员'   10 'X'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_loop_itdata
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_loop_itdata .
  DATA stylelin TYPE lvc_s_styl.

  LOOP AT it_ekko INTO wa_ekko.
    IF wa_ekko-ebeln IS NOT INITIAL.
      CLEAR :wa_ekko-f_style[].
      CLEAR stylelin.
      stylelin-fieldname = 'EBELN'. " 需要编辑的列名
      stylelin-style = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为不可编辑状态
      APPEND stylelin TO wa_ekko-f_style.

      CLEAR STYLELIN.
      stylelin-fieldname = 'VERKF'.
      stylelin-style = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
      APPEND stylelin TO wa_ekko-f_style.

      MODIFY it_ekko FROM wa_ekko.
    ENDIF.
  ENDLOOP.
ENDFORM.

 有时候会报如下异常:

解决办法如下:

问题:使用LVC_S_STYL参数赋值修改内表LVC_T_STYL表字段时,报ABAP系统错误如下:
'Error inserting into or changing a sorted table';具体代码如下:

IS_STYLE-FIELDNAME = 'ZWEIZHI1'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI2'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.

................

IS_STYLE-FIELDNAME = 'ZWEIZHI9'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI10'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI11'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.


解决:ALV编辑单元格状态或控制单元格显示等可使用参数LVC_S_STYL,
参照LVC_S_STYL定义工作区,参照LVC_T_STYL定义一个表字段,放在显示内表中,
并把该表字段在layout参数中激活STYLEFNAME,即可实现。

对于表字段的具体赋值,CALL FUNCTION和CALL METHOD不同ALV方式的实现方法也不相同。

但是在表字段赋值时,一定要注意FIELDNAME字段的排序方式,按照1 10 11...2 20 21...3...
依次顺序排序,如果append进内表的字段排序顺序不对的话,就会报SORT表的排序错误。
更改后代码为:

IS_STYLE-FIELDNAME = 'ZWEIZHI1'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI10'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI11'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.
IS_STYLE-FIELDNAME = 'ZWEIZHI2'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.

................

IS_STYLE-FIELDNAME = 'ZWEIZHI9'.
IS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
APPEND IS_STYLE TO TAB_G_ZMRM-CELLSTYLES.

 

原文地址:https://www.cnblogs.com/seven1314pp/p/15715614.html