OOALV案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


主程序

前言:

基本上所有的注释应该都是在代码中的,不过多赘述,早期的练习用的有些小问题懒得改,很多东西仅供参考。

代码如下(示例):

REPORT ZSF_OOALV_02.

INCLUDE ZSF_OOALV_02_TOP.    "全局定义(包含OOALV的定义)

INCLUDE ZSF_OOALV_02_TOP2.   "屏幕7000中的定义

INCLUDE ZSF_OOALV_02_SCREEN. "选择屏幕

INCLUDE ZSF_OOALV_02_F01.    "选择屏幕查询与屏幕7000刷新

INCLUDE ZSF_OOALV_02_O01.    "屏幕7000显示

INCLUDE ZSF_OOALV_02_I01.    "屏幕7000中的点击事件

"在8000的屏幕中做修改与删除操作

INCLUDE ZSF_OOALV_02_O02.    "屏幕8000中的显示状态

INCLUDE ZSF_OOALV_02_I02.    "屏幕8000中的点击事件

INCLUDE ZSF_OOALV_02_F02. "存放导入方法,用于新建条目

INCLUDE ZSF_DOWNLOAD.     "下载模板

一、top

代码如下(示例):

TABLES: ZCRM , SSCRFIELDS.

TYPES: BEGIN OF TY_DATA,
  BOX,
  ID     TYPE ZCRM-ID,
  RCODE  TYPE ZCRM-REGION_CODE,
  RNAME  TYPE ZCRM-REGION_NAME,
  PID    TYPE ZCRM-PARENT_ID,
  PCODE  TYPE ZCRM-PARENT_CODE,
  RTYPE  TYPE ZCRM-REGION_TYPE,
  SRCODE TYPE ZCRM-SAP_REGION_CODE,
  END OF TY_DATA.

DATA: GT_SAVE TYPE TABLE OF ZCRM WITH HEADER LINE,
      GT_CHANGE TYPE TABLE OF ZCRM WITH  HEADER LINE,
      GW_CHANGE TYPE ZCRM.

DATA: GT_DATA TYPE TABLE OF TY_DATA,
      GW_DATA TYPE TY_DATA.

*DATA: GW_MARA LIKE LINE OF GT_DATA,
*      GT_MARA TYPE TY_DATA OCCURS 0.

"屏幕7000
"标题输出
*DATA: P_MATNR TYPE MARA-MATNR,
*      P_MTART TYPE MARA-MTART,
*      P_MATKL TYPE MARA-MATKL.
DATA: P_ID     TYPE ZCRM-ID,
      P_RCODE  TYPE ZCRM-REGION_CODE,
      P_RNAME  TYPE ZCRM-REGION_NAME,
      P_PID    TYPE ZCRM-PARENT_ID,
      P_PCODE  TYPE ZCRM-PARENT_CODE,
      P_RTYPE  TYPE ZCRM-REGION_TYPE,
      P_SRCODE TYPE ZCRM-SAP_REGION_CODE.


"屏幕8000
DATA: P_ID2     TYPE ZCRM-ID,
      P_RCODE2  TYPE ZCRM-REGION_CODE,
      P_RNAME2  TYPE ZCRM-REGION_NAME,
      P_PID2    TYPE ZCRM-PARENT_ID,
      P_PCODE2  TYPE ZCRM-PARENT_CODE,
      P_RTYPE2  TYPE ZCRM-REGION_TYPE,
      P_SRCODE2 TYPE ZCRM-SAP_REGION_CODE.



"创建指示标识。
DATA: G_INDIC TYPE C.

DATA: G_CODE TYPE SY-UCOMM.

DATA: GT_ROW TYPE LVC_T_ROID,
        GW_ROW TYPE LVC_S_ROID.


"屏幕定义

"初始化ALV表格控件
DATA : GRID TYPE REF TO CL_GUI_ALV_GRID. "ALV表格控件对应的全局类

"创建ALV控制容器
DATA : C_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER."控件容器

"DATA : GT_FIELDCAT TYPE LVC_T_FCAT. "宏定义
DATA : GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.

DATA : GW_LAYOUT   TYPE LVC_S_LAYO. "ALV布局设置(外观设置)

DATA : OK_CODE(8)."点击事件


DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.

"定义宏结构
DEFINE DE_FIELDCAT.
  CLEAR GT_FIELDCAT.
 GT_FIELDCAT-FIELDNAME     = &1. "字段名
 GT_FIELDCAT-SCRTEXT_L     = &2. "字段长描述
 GT_FIELDCAT-KEY           = &3. "主键,蓝底显示,默认冻结列
 GT_FIELDCAT-CHECKBOX      = &4. "选择
 GT_FIELDCAT-EDIT          = &5. "设置为可编辑
 APPEND GT_FIELDCAT.
END-OF-DEFINITION.

CLASS ALV_DISPLAY_7000 DEFINITION. "定义事件处理类
  PUBLIC SECTION."初始化ALV工具栏对象事件,如增加按钮并设定属性
  METHODS: HANDLE_TOOLBAR
  FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
  IMPORTING E_OBJECT E_INTERACTIVE.

  "alv工具栏按钮点击事件
  METHODS: HANDLE_USER_COMMAND
  FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
  IMPORTING E_UCOMM.

  "alv表格双击事件
  METHODS: HANDLE_DOUBLE_CLICK
  FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
  IMPORTING E_ROW E_COLUMN ES_ROW_NO.


"数据改变触发,alv数据修改事件
*  METHODS: HANDLE_DATA_CHANGED
*  FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
*  IMPORTING ER_DATA_CHANGED.




  PRIVATE SECTION.
  ENDCLASS.


 CLASS ALV_DISPLAY_9000 DEFINITION."定义事件处理类
   PUBLIC SECTION. "初始化ALV工具栏对象事件

   "定义,添加状态栏按钮
   METHODS: HANDLE_TOOLBAR
   FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
   IMPORTING E_OBJECT E_INTERACTIVE.

  "alv工具栏按钮点击事件
  METHODS: HANDLE_USER_COMMAND
  FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
  IMPORTING E_UCOMM.

   PRIVATE SECTION.
   ENDCLASS.


   "批导用的屏幕

二、top2

代码如下(示例):

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_TOP2
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Class (Implementation) ALV_DISPLAY_7000
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS ALV_DISPLAY_7000 IMPLEMENTATION.
  METHOD HANDLE_TOOLBAR.

    DATA: LS_TOOLBAR TYPE STB_BUTTON. "参考STB_BUTTON创建工作区,用于存放自定义按钮
  CLEAR LS_TOOLBAR.
  MOVE 3 TO  LS_TOOLBAR-BUTN_TYPE. "  3 为竖杠
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  CLEAR LS_TOOLBAR.
  MOVE 'B_SUM' TO LS_TOOLBAR-FUNCTION."按钮对应的FunctionCode
  MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.          "0 为标准按钮
  MOVE ICON_DISPLAY TO LS_TOOLBAR-ICON. "按钮图标
  MOVE '总行数' TO LS_TOOLBAR-TEXT.        "按钮标签
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  CLEAR LS_TOOLBAR.
  MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  CLEAR LS_TOOLBAR.
  MOVE 'DESELECT_ALL' TO LS_TOOLBAR-FUNCTION.
  MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.
  MOVE ICON_DESELECT_ALL TO LS_TOOLBAR-ICON.
  MOVE '取消全选' TO LS_TOOLBAR-TEXT.
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  CLEAR LS_TOOLBAR.
  MOVE 'REFRESH' TO LS_TOOLBAR-FUNCTION.
  MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.
  MOVE  ICON_REFRESH TO LS_TOOLBAR-ICON.
  MOVE '刷新' TO LS_TOOLBAR-TEXT.
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  CLEAR LS_TOOLBAR.
  MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.
  APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.


ENDMETHOD.

"alv工具栏单点事件
  METHOD HANDLE_USER_COMMAND.
DATA: RS_SELFIELD TYPE SLIS_SELFIELD.
        "刷新屏幕
DATA: SUM TYPE I.
*IF E_UCOMM = 'B_SUM'.
*  DESCRIBE TABLE GT_DATA LINES SUM.
*  MESSAGE I001(00) WITH '当前ALV表这中的数据总行数为:' SUM DISPLAY LIKE 'E'.
*ENDIF.
CASE E_UCOMM.
  WHEN 'B_SUM'.
  DESCRIBE TABLE GT_DATA LINES SUM.
  MESSAGE I001(00) WITH  '当前ALV表这中的数据总行数为:' SUM .
  WHEN 'REFRESH'.
    "刷新显示事件
    PERFORM REFRESH_DATA.
    PERFORM DISPLAY_DATA.

    RS_SELFIELD-REFRESH = 'X'.
    CALL METHOD GRID->REFRESH_TABLE_DISPLAY.

"    WHEN ''.




ENDCASE.

    ENDMETHOD.



"双击事件
  METHOD HANDLE_DOUBLE_CLICK.

    ENDMETHOD.

    "修改事件
*    METHOD HANDLE_DATA_CHANGED.
*      CALL METHOD UPDATE_DELAT_TBLES( ER_DATA_CHANGED ).
*      ENDMETHOD.
*
*      METHOD UPDATE_DELAT_TBLES.
*        ENDMETHOD.
ENDCLASS.




DATA : EVENT_RECEIVER TYPE REF TO ALV_DISPLAY_7000.



*&---------------------------------------------------------------------*
*& Class (Implementation) ALV_DISPLAY_9000
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS ALV_DISPLAY_9000 IMPLEMENTATION.

  METHOD HANDLE_TOOLBAR.

  DATA: LS_TOOLBAR2 TYPE STB_BUTTON. "参考STB_BUTTON创建工作区,用于存放自定义按钮


  CLEAR LS_TOOLBAR2.
  MOVE 3 TO  LS_TOOLBAR2-BUTN_TYPE. "  3 为竖杠
  APPEND LS_TOOLBAR2 TO E_OBJECT->MT_TOOLBAR.


  CLEAR LS_TOOLBAR2.
  MOVE 'UPLOAD' TO LS_TOOLBAR2-FUNCTION."按钮对应的FunctionCode
  MOVE 0 TO LS_TOOLBAR2-BUTN_TYPE.          "0 为标准按钮
"  MOVE ICON_DISPLAY TO LS_TOOLBAR-ICON. "按钮图标
  MOVE '修改' TO LS_TOOLBAR2-TEXT.        "按钮标签
  APPEND LS_TOOLBAR2 TO E_OBJECT->MT_TOOLBAR.


    ENDMETHOD.

  METHOD HANDLE_USER_COMMAND.

*  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'  "响应后刷新
*    IMPORTING
*      E_GRID = LR_GRID.
*
*  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.

    CASE E_UCOMM.
      WHEN 'UPLOAD'.
        MODIFY ZCRM FROM TABLE @( CORRESPONDING #( GT_CHANGE[] ) ).
        IF SY-SUBRC = 0.
          MESSAGE '更新成功!' TYPE 'S' DISPLAY LIKE 'S'.
        LOOP AT GT_CHANGE INTO GW_CHANGE  .
"          MOVE-CORRESPONDING GW_CHANGE TO GW_DATA.  结构参照不同无法使用
          GW_DATA-ID     = GW_CHANGE-ID.
          GW_DATA-RCODE  = GW_CHANGE-REGION_CODE.
          GW_DATA-RNAME  = GW_CHANGE-REGION_NAME.
          GW_DATA-PID    = GW_CHANGE-PARENT_ID.
          GW_DATA-PCODE  = GW_CHANGE-PARENT_CODE.
          GW_DATA-RTYPE  = GW_CHANGE-REGION_TYPE.
          GW_DATA-SRCODE = GW_CHANGE-SAP_REGION_CODE.
          MODIFY TABLE  GT_DATA  FROM GW_DATA.
        ENDLOOP.

          LEAVE TO SCREEN 0.
          ELSE.
           MESSAGE '更新失败' TYPE 'S' DISPLAY LIKE 'E'.
        ENDIF.


    ENDCASE.
  ENDMETHOD.



ENDCLASS.

DATA : EVENT_RECEIVER2 TYPE REF TO ALV_DISPLAY_9000.

三.SCREEN

代码如下(示例):

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_SCREEN
*&---------------------------------------------------------------------*

*SELECTION-SCREEN BEGIN OF BLOCK B1K1 WITH FRAME TITLE TEXT-T01.
*  SELECTION-SCREEN SKIP.
*
*  SELECTION-SCREEN SKIP.
*  SELECTION-SCREEN END OF BLOCK B1K1.
SELECTION-SCREEN FUNCTION KEY 1.

SELECTION-SCREEN BEGIN OF BLOCK B1K2 WITH FRAME TITLE TEXT-T02.
PARAMETERS: P_RB1 RADIOBUTTON GROUP G1 DEFAULT 'X' USER-COMMAND F1,
            P_RB2 RADIOBUTTON GROUP G1.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: S_ID FOR ZCRM-ID MODIF ID M2.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN PUSHBUTTON /1(12) TEXT_BUT USER-COMMAND BLD MODIF ID M1.
SELECTION-SCREEN SKIP.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME MODIF ID M1 . "上传文件
SELECTION-SCREEN END OF BLOCK B1K2.

INITIALIZATION.
  SSCRFIELDS-FUNCTXT_01 = '@0Q@查询'.
  TEXT_BUT = '@0Q@模板下载'.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. "文件搜索帮助
  PERFORM GET_FILENAME.

"隐藏与显示,查询与批导
  AT SELECTION-SCREEN OUTPUT.
    PERFORM SET_SCREEN.

"查询时按按钮
  AT SELECTION-SCREEN .
    PERFORM SELECTION_SCREEN_PAI.







*&---------------------------------------------------------------------*
*& Form SET_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SET_SCREEN .
  LOOP AT SCREEN.
    IF P_RB1 IS NOT INITIAL.
      IF SCREEN-GROUP1 = 'M1'.
        SCREEN-ACTIVE = 0.

      ENDIF.

    ENDIF.
    IF P_RB2 IS NOT INITIAL.
      IF SCREEN-GROUP1 = 'M2'.
        SCREEN-ACTIVE = 0.

      ENDIF.

    ENDIF.
    MODIFY SCREEN.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM GET_FILENAME .
    CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      PROGRAM_NAME  = SYST-CPROG "此处填SY-CPROG同样
      DYNPRO_NUMBER = SYST-DYNNR
      FIELD_NAME    = ' '
    IMPORTING
      FILE_NAME     = P_FILE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SELECTION_SCREEN_PAI .
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FIND_DATA.
      CALL SCREEN '7000'.
    WHEN 'BLD'.
      PERFORM DOWLOAD_DATA.

  ENDCASE.

ENDFORM.

四.F01

实例代码:

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FIND_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FIND_DATA .

        SELECT
          ID
          REGION_CODE AS RCODE
          REGION_NAME AS RNAME
          PARENT_ID   AS PID
          PARENT_CODE AS PCODE
          REGION_TYPE AS RTYPE
          SAP_REGION_CODE AS SRCODE
          FROM ZCRM
          INTO CORRESPONDING FIELDS OF TABLE GT_DATA
          WHERE ID           IN S_ID.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form REFRESH_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM REFRESH_DATA .
  "刷新屏幕
  CLEAR GT_DATA.
        SELECT
          ID
          REGION_CODE AS RCODE
          REGION_NAME AS RNAME
          PARENT_ID   AS PID
          PARENT_CODE AS PCODE
          REGION_TYPE AS RTYPE
          SAP_REGION_CODE AS SRCODE
          FROM ZCRM
          INTO CORRESPONDING FIELDS OF TABLE GT_DATA.

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

  DATA: NUM TYPE I VALUE 0.
  "修改选中条目

  "第一步,将选中的信息提取出来
LOOP AT GT_ROW INTO GW_ROW.
  READ TABLE GT_DATA INTO GW_DATA INDEX GW_ROW-ROW_ID.
  IF SY-SUBRC = 0.
    GW_DATA-BOX = 'X'.
  ENDIF.

  NUM = NUM + 1.

  MODIFY GT_DATA FROM GW_DATA INDEX SY-TABIX TRANSPORTING BOX.
  CLEAR GW_DATA.
  CLEAR GW_ROW.


ENDLOOP.

IF NUM > 1.
  MESSAGE '每次修改仅可选择一条!' TYPE 'S' DISPLAY LIKE 'E'.
  LEAVE TO SCREEN '7000'.
ENDIF.
SORT GT_DATA BY BOX.
READ TABLE GT_DATA  WITH KEY BOX = 'X' BINARY SEARCH TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
  MESSAGE '在修改前必须进行选择!' TYPE 'S' DISPLAY LIKE 'E'.
  LEAVE TO SCREEN '7000'.
  ELSE.

    "将数据存入屏幕8000中。
LOOP AT GT_DATA INTO GW_DATA WHERE BOX = 'X'.
  P_ID2     = GW_DATA-ID.
  P_RCODE2  = GW_DATA-RCODE.
  P_RNAME2  = GW_DATA-RNAME.
  P_PID2    = GW_DATA-PID.
  P_PCODE2  = GW_DATA-PCODE.
  P_RTYPE2  = GW_DATA-RTYPE.
  P_SRCODE2 = GW_DATA-SRCODE.
ENDLOOP.


ENDIF.





ENDFORM.

五.O01

实例代码:

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module ALV_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE ALV_DISPLAY OUTPUT.
 SET PF-STATUS 'STATUS_7000'.
* SET TITLEBAR 'xxx'.

PERFORM DISPLAY_DATA.


ENDMODULE.
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM DISPLAY_DATA .
  IF C_CUSTOM_CONTAINER IS INITIAL.
    REFRESH GT_FIELDCAT.
*  DE_FIELDCAT 'BOX'    ''            '' ''.
  DE_FIELDCAT 'ID'     '市区域ID'    '' '' ''.
  DE_FIELDCAT 'RCODE'  '市区域码'    '' '' ''.
  DE_FIELDCAT 'RNAME'  '市区域名称'  '' '' ''.
  DE_FIELDCAT 'PID'    '省区域ID'    '' '' ''.
  DE_FIELDCAT 'PCODE'  '省区域码'    '' '' ''.
  DE_FIELDCAT 'RTYPE'  '区域类型码'  '' '' ''.
  DE_FIELDCAT 'SRCODE' 'SAP地区代码' '' '' ''.



  CREATE OBJECT C_CUSTOM_CONTAINER  "创建ALV显示的实例
  EXPORTING
    CONTAINER_NAME = 'CONT1'.
  CREATE OBJECT GRID
  EXPORTING
    I_PARENT = C_CUSTOM_CONTAINER.

  GW_LAYOUT-CWIDTH_OPT = 'X'.

  "复选框
  GW_LAYOUT-SEL_MODE = 'D'.
  "无法用过字段来记录,所以调用方法


"  GW_LAYOUT-STYLEFNAME = 'SRCODE'.





"当查询出来的内表不为空时,显示ALV
IF  GT_DATA IS NOT INITIAL.
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
  EXPORTING
    IS_LAYOUT                     = GW_LAYOUT
  CHANGING
    IT_OUTTAB                     = GT_DATA
    IT_FIELDCATALOG               = GT_FIELDCAT[]
  EXCEPTIONS
    INVALID_PARAMETER_COMBINATION = 1
    PROGRAM_ERROR                 = 2
    TOO_MANY_LINES                = 3
    OTHERS                        = 4
        .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.


ENDIF.


   CREATE OBJECT: EVENT_RECEIVER. " 为ALV按钮注册监听事件

   SET HANDLER: EVENT_RECEIVER->HANDLE_TOOLBAR FOR GRID.
   SET HANDLER: EVENT_RECEIVER->HANDLE_USER_COMMAND FOR GRID.



  ENDIF.
   CALL METHOD GRID->REFRESH_TABLE_DISPLAY.  "刷新内表

  CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
    EXPORTING
      CONTROL = GRID.

ENDFORM.

 六.I01

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_I01
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_7000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_7000 INPUT.
"  DATA  : SELFIELD TYPE SLIS_SELFIELD.

*  RANGES: R_MATNR FOR MARA-MATNR,    "将单值转换为区间形式
*          R_MTART FOR MARA-MTART,
*          R_MATKL FOR MARA-MATKL.

RANGES:   R_ID     FOR ZCRM-ID,
          R_RCODE  FOR ZCRM-REGION_CODE,
          R_RNAME  FOR ZCRM-REGION_NAME,
          R_PID    FOR ZCRM-PARENT_ID,
          R_PCODE  FOR ZCRM-PARENT_CODE,
          R_RTYPE  FOR ZCRM-REGION_TYPE,
          R_SRCODE FOR ZCRM-SAP_REGION_CODE.


"刷新屏幕
DATA: LS_STABLE TYPE LVC_S_STBL. "刷新稳定性
LS_STABLE-ROW = '1'.
LS_STABLE-COL = '1'.


 CASE OK_CODE.
    WHEN 'EXIT' OR 'CANCEL'  OR 'BAC'.
      LEAVE TO SCREEN 0.
      WHEN 'CHEAK'.
*        REFRESH : R_MATNR , R_MTART , R_MATKL.
*        IF P_MATNR IS NOT INITIAL.
*          CLEAR R_MATNR.
*          R_MATNR-OPTION = 'EQ'.
*          R_MATNR-SIGN   = 'I'.
*          R_MATNR-LOW    = P_MATNR.
*          APPEND R_MATNR.
*        ENDIF.
*         IF P_MTART IS NOT INITIAL.
*          CLEAR R_MTART.
*          R_MTART-OPTION = 'EQ'.
*          R_MTART-SIGN   = 'I'.
*          R_MTART-LOW    = P_MTART.
*          APPEND R_MTART.
*        ENDIF.
*          IF P_MATKL IS NOT INITIAL.
*          CLEAR R_MATKL.
*          R_MATKL-OPTION = 'EQ'.
*          R_MATKL-SIGN   = 'I'.
*          R_MATKL-LOW    = P_MATKL.
*          APPEND R_MATKL.
*        ENDIF.
*
*        CLEAR GT_DATA.
*        SELECT
*          MATNR
*          MTART
*          MBRSH
*          MATKL
*          FROM MARA
*          INTO CORRESPONDING FIELDS OF TABLE GT_DATA
*          WHERE MATNR IN R_MATNR
*          AND   MTART IN R_MTART
*          AND   MATKL IN R_MATKL.

        REFRESH : R_ID , R_RCODE , R_RNAME , R_PID , R_PCODE , R_RTYPE , R_SRCODE.
        IF P_ID IS NOT INITIAL.
          CLEAR R_ID.
          R_ID-OPTION = 'EQ'.
          R_ID-SIGN   = 'I'.
          R_ID-LOW    = P_ID.
          APPEND R_ID.
        ENDIF.
        IF P_RCODE IS NOT INITIAL.
          CLEAR R_RCODE.
          R_RCODE-OPTION = 'EQ'.
          R_RCODE-SIGN   = 'I'.
          R_RCODE-LOW    = P_RCODE.
          APPEND R_RCODE.
        ENDIF.
        IF P_RNAME IS NOT INITIAL.
          CLEAR R_RNAME.
          R_RNAME-OPTION = 'EQ'.
          R_RNAME-SIGN   = 'I'.
          R_RNAME-LOW    = P_RNAME.
          APPEND R_RNAME.
        ENDIF.
        IF P_PID IS NOT INITIAL.
          CLEAR R_PID.
          R_PID-OPTION = 'EQ'.
          R_PID-SIGN   = 'I'.
          R_PID-LOW    = P_PID.
          APPEND R_PID.
        ENDIF.
        IF P_PCODE IS NOT INITIAL.
          CLEAR R_PCODE.
          R_PCODE-OPTION = 'EQ'.
          R_PCODE-SIGN   = 'I'.
          R_PCODE-LOW    = P_PCODE.
          APPEND R_PCODE.
        ENDIF.
        IF P_RTYPE IS NOT INITIAL.
          CLEAR R_RTYPE.
          R_RTYPE-OPTION = 'EQ'.
          R_RTYPE-SIGN   = 'I'.
          R_RTYPE-LOW    = P_RTYPE.
          APPEND R_RTYPE.
        ENDIF.
        IF P_SRCODE IS NOT INITIAL.
          CLEAR R_SRCODE.
          R_SRCODE-OPTION = 'EQ'.
          R_SRCODE-SIGN   = 'I'.
          R_SRCODE-LOW    = P_SRCODE.
          APPEND R_SRCODE.
        ENDIF.

        CLEAR GT_DATA.
        SELECT
          ID
          REGION_CODE AS RCODE
          REGION_NAME AS RNAME
          PARENT_ID   AS PID
          PARENT_CODE AS PCODE
          REGION_TYPE AS RTYPE
          SAP_REGION_CODE AS SRCODE
          FROM ZCRM
          INTO CORRESPONDING FIELDS OF TABLE GT_DATA
          WHERE ID           IN R_ID
          AND   REGION_CODE  IN R_RCODE
          AND   REGION_NAME  IN R_RNAME
          AND   PARENT_ID    IN R_PID
          AND   PARENT_CODE  IN R_PCODE
          AND   REGION_TYPE  IN R_RTYPE
          AND   SAP_REGION_CODE IN R_SRCODE.

"刷新屏幕调用
CALL METHOD GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE.

"添加新条目
WHEN 'ADD'.

  CLEAR G_INDIC.
  G_INDIC = 'A'.  "A标识添加add
  CALL SCREEN '8000' STARTING AT 10 8.

"修改选中的条目
  WHEN 'CHANGE'.
*    READ TABLE GT_DATA INTO GW_DATA WITH KEY BOX = 'X' BINARY SEARCH TRANSPORTING NO FIELDS.
*    IF SY-SUBRC = 0.
    CLEAR G_INDIC.

    "返回行号
 CALL METHOD GRID->GET_SELECTED_ROWS
 IMPORTING
   ET_ROW_NO = GT_ROW.
    "将选中的条目存入另一张内表中
    PERFORM CHANGE_DATA.
    "调用屏幕8000,但为显示状态,部分可修改
    G_INDIC = 'C'.
"    CALL SCREEN '9000'.
    CALL SCREEN '8000'STARTING AT 10 8.

*    ELSE.
*      MESSAGE '请选择条目进行更改!' TYPE 'S' DISPLAY LIKE 'E'.
*    ENDIF.
WHEN 'DELETE'.
      "返回行号
 CALL METHOD GRID->GET_SELECTED_ROWS
 IMPORTING
   ET_ROW_NO = GT_ROW.
 "第一步,将选中的信息提取出来
LOOP AT GT_ROW INTO GW_ROW.
  READ TABLE GT_DATA INTO GW_DATA INDEX GW_ROW-ROW_ID.
  IF SY-SUBRC = 0.
    GW_DATA-BOX = 'X'.
  ENDIF.
  MODIFY GT_DATA FROM GW_DATA INDEX SY-TABIX TRANSPORTING BOX.
  CLEAR GW_DATA.
  CLEAR GW_ROW.
ENDLOOP.

LOOP AT GT_DATA INTO GW_DATA WHERE BOX = 'X'.
      DELETE FROM ZCRM WHERE ID = GW_DATA-ID.
      IF SY-SUBRC = 0.
  MESSAGE '删除成功!' TYPE 'S' DISPLAY LIKE 'S'.

      ENDIF.

      DELETE TABLE GT_DATA FROM  GW_DATA.
ENDLOOP.







  ENDCASE.



ENDMODULE.

七.O02

ooalv的显示,我记得这里是创建跟修改是用的同一个屏幕,所以需要设置,创建时全部字段可修改,修改时主键不能动,因为要用主键作为索引取更新数据。

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_O02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_8000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_8000 OUTPUT.
 SET PF-STATUS 'STATUS_8000'.
 SET TITLEBAR '8000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module SET_FIELD_STATUS OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE SET_FIELD_STATUS OUTPUT.
*CHECK G_INDIC = 'A'.
*
**LOOP AT SCREEN.
**  IF SCREEN-NAME = ''.
**
**  ENDIF.
**
**ENDLOOP.
*LOOP AT  SCREEN.
*IF SY-UNAME <> 'KF178'.
*  IF SCREEN-NAME = 'BUTTEN1'.
*    SCREEN-INPUT = 1.
*    MESSAGE '该按钮不可用' TYPE 'S' DISPLAY LIKE 'E'.
*    LEAVE LIST-PROCESSING.
*
*  ENDIF.
*  MODIFY SCREEN.
*ENDIF.
*
*ENDLOOP.


"当为C是,是进行数据修改
CHECK G_INDIC = 'C'.
"当为修改时,其主键ID为不可更改!
LOOP AT SCREEN.
  IF SCREEN-NAME = 'P_ID2'.
    SCREEN-INPUT = 0.   "不可编辑,当为修改时,ID不可修改!
  ENDIF.
  MODIFY SCREEN.

ENDLOOP.





ENDMODULE.

八.I02

屏幕8000的点击事件

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_I02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_8000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_8000 INPUT.
  CLEAR G_CODE.
  G_CODE = SY-UCOMM.
  CALL METHOD GRID->CHECK_CHANGED_DATA.
  CASE G_CODE.
    WHEN 'REF'.
      CLEAR G_CODE.
      LEAVE TO SCREEN 0.
      WHEN 'LEAVE'.
        CLEAR G_CODE.
        LEAVE TO SCREEN 0.
      WHEN 'SAVE'.
        PERFORM SAVE_SAVE.
"        LEAVE TO SCREEN 0.
  ENDCASE.

  CALL METHOD GRID->CHECK_CHANGED_DATA.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  EXIT_8000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE EXIT_8000 INPUT.
  CASE  OK_CODE.
    WHEN 'BACK'.
      CLEAR OK_CODE.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.

九.F01

因为这里使用的数据库表是自己创建练习用的,所以不需要判断数据是否正确,具体数据判断请结合业务场景。

*&---------------------------------------------------------------------*
*& 包含               ZSF_OOALV_02_F02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SAVE_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SAVE_SAVE .


  "暂时不对传入的值做判断

  GT_SAVE-ID              = P_ID2.
  GT_SAVE-REGION_CODE     = P_RCODE2.
  GT_SAVE-REGION_NAME     = P_RNAME2.
  GT_SAVE-PARENT_ID       = P_PID2.
  GT_SAVE-PARENT_CODE     = P_PCODE2.
  GT_SAVE-REGION_TYPE     = P_RTYPE2.
  GT_SAVE-SAP_REGION_CODE = P_SRCODE2.
  APPEND GT_SAVE.


IF GT_SAVE[] IS NOT INITIAL.
  MODIFY ZCRM FROM TABLE @( CORRESPONDING #( GT_SAVE[] ) ).
  IF SY-SUBRC = 0.
    MESSAGE '创建成功!' TYPE 'S' DISPLAY LIKE 'S'.
    LEAVE TO SCREEN 0.

  ENDIF.
ENDIF.
CLEAR GT_SAVE[].

"添加完后需要刷新页面,进行显示


ENDFORM.

十.附加DOWNLOAD

下载模板部分。

*&---------------------------------------------------------------------*
*& 包含               ZSF_DOWNLOAD
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form DOWLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM DOWLOAD_DATA .
  DATA: LV_FILE TYPE STRING.
  DATA: BEGIN OF TY_DOWNLOAD OCCURS 0,
    ID(010)     VALUE '市区域ID',
    RCODE(010)  VALUE '市区域码',
    RNAME(010)  VALUE '市区域名称',
    PID(010)    VALUE '省区域ID(市归属地)',
    PCODE(010)  VALUE '省区域码',
    RTYPE(010)  VALUE '区域类型码',
    SRCODE(010) VALUE 'SAP地区代码',
       END OF TY_DOWNLOAD.

REFRESH TY_DOWNLOAD.  " 清空表体
APPEND TY_DOWNLOAD.   "从表中行增加标题的内容

CALL FUNCTION 'WS_FILENAME_GET'
 EXPORTING
   DEF_FILENAME           = '城市维护导入'
   MASK                   = ',Excel文件(*.xls),*.xls.'
   MODE                   = 'S'
   TITLE                  = '保存文件路径'
 IMPORTING
   FILENAME               = LV_FILE
 EXCEPTIONS
   INV_WINSYS             = 1
   NO_BATCH               = 2
   SELECTION_CANCEL       = 3
   SELECTION_ERROR        = 4
   OTHERS                 = 5 .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.


CHECK LV_FILE IS NOT INITIAL.
CALL FUNCTION 'GUI_DOWNLOAD'
  EXPORTING
    FILENAME                        = LV_FILE
   WRITE_FIELD_SEPARATOR           = 'X'
  TABLES
    DATA_TAB                        = TY_DOWNLOAD
 EXCEPTIONS
   FILE_WRITE_ERROR                = 1
   NO_BATCH                        = 2
   GUI_REFUSE_FILETRANSFER         = 3
   INVALID_TYPE                    = 4
   NO_AUTHORITY                    = 5
   UNKNOWN_ERROR                   = 6
   HEADER_NOT_ALLOWED              = 7
   SEPARATOR_NOT_ALLOWED           = 8
   FILESIZE_NOT_ALLOWED            = 9
   HEADER_TOO_LONG                 = 10
   DP_ERROR_CREATE                 = 11
   DP_ERROR_SEND                   = 12
   DP_ERROR_WRITE                  = 13
   UNKNOWN_DP_ERROR                = 14
   ACCESS_DENIED                   = 15
   DP_OUT_OF_MEMORY                = 16
   DISK_FULL                       = 17
   DP_TIMEOUT                      = 18
   FILE_NOT_FOUND                  = 19
   DATAPROVIDER_EXCEPTION          = 20
   CONTROL_FLUSH_ERROR             = 21
   OTHERS                          = 22
          .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.


ENDFORM.

十一.其它

一些其他的部分,因为ooalv涉及到要自己画屏幕,所以这里只展示画完的样子,同样的也需要自己在GUI状态中设置代码中对应的部分。按钮之类的需要自己添加。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值