abap alv报表实现消消乐小游戏

       工作之余,突发奇想,尝试用ALV做一个消消乐的小游戏,没想到还真做成了,但是有一些足的地方,写出来和大家讨论一下,看看是否有更好的方法。在文章的最后我会加上代码,只要在SE38打开ABAP编辑器,直接复制粘贴就可以运行了,其他的屏幕和状态都不需要,十分简单。

        实现逻辑是使用CL_GUI_TIMER定时器,定时刷新屏幕,但是这个定时器刷新频率最小只到两秒,这个就让人很抓狂,刷新太慢,游戏体验效果不好。如果能到0.5秒或0.1秒就更好了,我也尝试去使用了多线程的方式去自己创建一个定时器刷新,但是没效果,最后放弃了,改用SAP标准的定时器。不知道有没有其他大顾有更好的刷新方法,或者是我的多线程设置的不对→_→?希望有人能够帮忙改进,告知我解决方法└(^o^)┘。如果ALV刷新率的问题解决了,我感觉还可以用ALV开发坦克大战和俄罗斯方块的小游戏,游戏开发的过程思路都已经有了。

        如下图是效果图,消消乐的游戏大家都玩过吧,相同图案有3个或3个以上排成一条直线就可以消除,计算得分。不能消除的就点击鼠标移动相邻的图案交换位置,凑到一条直线再消除。当游戏消除图案时是鼠标是箭头,当消除完成后,鼠标会变成手指形状,这个时候就可以移动相邻的图案了。

代碼複製到SE38激活就可以運行了

REPORT ZHAPPY_XIAOLE.

DATA: GO_TIMER    TYPE REF TO CL_GUI_TIMER.
DATA: GR_GRID TYPE REF TO CL_GUI_ALV_GRID.

DATA:
  BEGIN OF GS_ICON,
    ICON1  TYPE CHAR10,
    ICON2  TYPE CHAR10,
    ICON3  TYPE CHAR10,
    ICON4  TYPE CHAR10,
    ICON5  TYPE CHAR10,
    ICON6  TYPE CHAR10,
    ICON7  TYPE CHAR10,
    ICON8  TYPE CHAR10,
    ICON9  TYPE CHAR10,
    ICON10 TYPE CHAR10,
    ICON11 TYPE CHAR10,
    ICON12 TYPE CHAR10,
    ICON13 TYPE CHAR10,
    ICON14 TYPE CHAR10,
    ICON15 TYPE CHAR10,
    ICON16 TYPE CHAR10,
    ICON17 TYPE CHAR10,
    ICON18 TYPE CHAR10,
    ICON19 TYPE CHAR10,
    ICON20 TYPE CHAR10,
  END OF GS_ICON.
DATA: GT_ICON LIKE TABLE OF GS_ICON.

TYPES:
  BEGIN OF TY_CELL,
    ROW  TYPE I,
    COL  TYPE I,
    ICON TYPE CHAR10,
    DEL  TYPE C,
  END OF TY_CELL.

DATA:
  BEGIN OF GS_JUZHEN,
    JZ1  TYPE TY_CELL,
    JZ2  TYPE TY_CELL,
    JZ3  TYPE TY_CELL,
    JZ4  TYPE TY_CELL,
    JZ5  TYPE TY_CELL,
    JZ6  TYPE TY_CELL,
    JZ7  TYPE TY_CELL,
    JZ8  TYPE TY_CELL,
    JZ9  TYPE TY_CELL,
    JZ10 TYPE TY_CELL,
    JZ11 TYPE TY_CELL,
    JZ12 TYPE TY_CELL,
    JZ13 TYPE TY_CELL,
    JZ14 TYPE TY_CELL,
    JZ15 TYPE TY_CELL,
    JZ16 TYPE TY_CELL,
    JZ17 TYPE TY_CELL,
    JZ18 TYPE TY_CELL,
    JZ19 TYPE TY_CELL,
    JZ20 TYPE TY_CELL,
  END OF GS_JUZHEN.
DATA: GT_JUZHEN LIKE TABLE OF GS_JUZHEN.

DATA GV_TABCOL TYPE I.
DATA GV_TABROW TYPE I.
DATA GV_TZ TYPE C. "1代表消除,2代表下落,3填充新圖標
DATA GV_HOSTCELL TYPE TY_CELL.
DATA GV_SCORE TYPE INT4.
DATA GV_KAISHI TYPE SY-UZEIT.
*GV_SCORE = '5'.
DATA GV_TEXT1 TYPE CHAR10.
GV_TEXT1 = 'S'.

DATA:
  GS_STABLE       TYPE LVC_S_STBL,
  GS_LAYOUT       TYPE LVC_S_LAYO,
*  Gt_SLIS_T_EXTAB TYPE UI_FUNCTIONS,
  GT_FIELDCAT     TYPE LVC_T_FCAT,
  GS_DISVARIANT   TYPE DISVARIANT,
  GS_VARIANT      TYPE DISVARIANT,
  GT_SLIS_T_EXTAB TYPE SLIS_T_EXTAB,
  GT_EVENTS       TYPE SLIS_T_EVENT,
  GS_FCAT         TYPE LVC_S_FCAT,
  GT_FCAT         TYPE LVC_T_FCAT,
  GS_SORT         TYPE LVC_S_SORT,
  GT_SORT         TYPE LVC_T_SORT,
  GV_SCREEN       TYPE N LENGTH 4.

CLASS LCL_EVENT_RECEIVER DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
      IMPORTING
          E_OBJECT
          E_INTERACTIVE.

    METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
      IMPORTING
          E_UCOMM.

    METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
      IMPORTING
          ER_DATA_CHANGED
          E_ONF4
          E_ONF4_BEFORE
          E_ONF4_AFTER
          E_UCOMM.

    METHODS HANDLE_HOTSPOT_CLICK FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
      IMPORTING
          E_ROW_ID
          E_COLUMN_ID
          ES_ROW_NO.

    METHODS HANDLE_BUTTON_CLICK FOR EVENT BUTTON_CLICK OF CL_GUI_ALV_GRID
      IMPORTING
          ES_COL_ID
          ES_ROW_NO.

    METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
      IMPORTING
          E_ROW
          E_COLUMN
          ES_ROW_NO.

    METHODS HANDLE_ENTE FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
      IMPORTING
          E_MODIFIED
          ET_GOOD_CELLS.

    METHODS HANDLE_TOPOFPAGE FOR EVENT TOP_OF_PAGE OF CL_GUI_ALV_GRID
      IMPORTING
          E_DYNDOC_ID.

    METHODS HANDLE_TIMER FOR EVENT FINISHED OF CL_GUI_TIMER.

*    E_ROW TYPE LVC_S_ROW
*    E_COLUMN TYPE LVC_S_COL
*    ES_ROW_NO TYPE LVC_S_ROID

  PRIVATE SECTION.
ENDCLASS.

CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

  METHOD HANDLE_TOOLBAR.
  ENDMETHOD.

  METHOD HANDLE_USER_COMMAND.
  ENDMETHOD.

  METHOD HANDLE_DATA_CHANGED.
  ENDMETHOD.

  METHOD HANDLE_HOTSPOT_CLICK.
  ENDMETHOD.

  METHOD HANDLE_BUTTON_CLICK.
  ENDMETHOD.

  METHOD HANDLE_DOUBLE_CLICK.
  ENDMETHOD.

  METHOD HANDLE_TOPOFPAGE.
  ENDMETHOD.

  METHOD HANDLE_ENTE.
  ENDMETHOD.

  METHOD HANDLE_TIMER.
  ENDMETHOD.

ENDCLASS.


CLASS LCL_EVENT_RECEIVER_1 DEFINITION INHERITING FROM LCL_EVENT_RECEIVER.
  PUBLIC SECTION.
    METHODS:
      HANDLE_TIMER REDEFINITION.
ENDCLASS.

CLASS LCL_EVENT_RECEIVER_1 IMPLEMENTATION.
  METHOD HANDLE_TIMER.
    CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
      EXPORTING
        NEW_CODE = 'RFSH'.

*&---刷新ALV
    IF GR_GRID IS INITIAL.
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          E_GRID = GR_GRID.
    ENDIF.

*    狀態確定
    PERFORM FRM_GETZHUATAI.

    DATA LV_HOTSPOT TYPE C.
    IF GV_TZ = ''.
      LV_HOTSPOT = 'X'.
      CALL METHOD GO_TIMER->CANCEL
        EXCEPTIONS
          OTHERS = 9.
    ELSE.
      LV_HOTSPOT = ''.
      CALL METHOD GO_TIMER->RUN
        EXCEPTIONS
          OTHERS = 9.
    ENDIF.


    PERFORM FRM_SETXIAOCHU.

    DATA LT_FIELDCAT TYPE LVC_T_FCAT.
    CALL METHOD GR_GRID->GET_FRONTEND_FIELDCATALOG
      IMPORTING
        ET_FIELDCATALOG = LT_FIELDCAT.
    LOOP AT LT_FIELDCAT INTO DATA(WA_FIELDCAT).
      WA_FIELDCAT-HOTSPOT = LV_HOTSPOT.
      MODIFY LT_FIELDCAT FROM WA_FIELDCAT.
    ENDLOOP.
    CALL METHOD GR_GRID->SET_FRONTEND_FIELDCATALOG
      EXPORTING
        IT_FIELDCATALOG = LT_FIELDCAT.

    PERFORM FRM_ADDICON.

    GR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ) ).

  ENDMETHOD.
ENDCLASS.


DATA GR_EVENT_RECEIVER_1 TYPE REF TO LCL_EVENT_RECEIVER_1.

INITIALIZATION.
  PERFORM FRM_INITIAL.


AT USER-COMMAND.
  IF SY-UCOMM = 'RFSH'.
  ENDIF.

START-OF-SELECTION.
*  IF GO_EVT_HNDL IS INITIAL.
*    CREATE OBJECT GO_EVT_HNDL.
*  ENDIF.
  PERFORM FRM_SHOWALV.

*&---------------------------------------------------------------------*
*&      Form  FRM_INITIAL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INITIAL.

  GV_KAISHI = SY-UZEIT.

  CREATE OBJECT GR_EVENT_RECEIVER_1.

  CREATE OBJECT GO_TIMER
    EXCEPTIONS
      OTHERS = 9.
  SET HANDLER GR_EVENT_RECEIVER_1->HANDLE_TIMER FOR GO_TIMER.
  GO_TIMER->INTERVAL = '1'. "間隔3秒
  GV_TZ = '1'. "需要消除
  CALL METHOD GO_TIMER->RUN
    EXCEPTIONS
      OTHERS = 9.

  GV_TABROW = '30'.

  DATA LV_ROW TYPE I.
  DATA LV_COL TYPE I.
  DATA LV_FLAG TYPE C.
  FIELD-SYMBOLS <FS_FIELDD> TYPE ANY.
  FIELD-SYMBOLS <FS_JUZHEN> LIKE GS_JUZHEN.
  ASSIGN GS_JUZHEN TO <FS_JUZHEN>.

  LV_FLAG = ''.
  GV_TABCOL = 0.
  WHILE LV_FLAG IS INITIAL.
    GV_TABCOL = GV_TABCOL + 1.
    ASSIGN COMPONENT GV_TABCOL OF
      STRUCTURE <FS_JUZHEN> TO <FS_FIELDD>.
    IF SY-SUBRC = 0.
    ELSE.
      LV_FLAG = 'X'.
      GV_TABCOL = GV_TABCOL - 1.
    ENDIF.
  ENDWHILE.

  LV_ROW = 0.
  DO GV_TABROW TIMES.
    LV_ROW = LV_ROW + 1.
    LV_COL = 0.
    CLEAR GS_JUZHEN.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      DATA LS_CELL TYPE TY_CELL.
      CLEAR LS_CELL.
      LS_CELL-ROW = LV_ROW.
      LS_CELL-COL = LV_COL.
      PERFORM FRM_GETICON CHANGING LS_CELL-ICON.
      ASSIGN COMPONENT LV_COL OF
        STRUCTURE GS_JUZHEN TO <FS_FIELDD>.
      <FS_FIELDD> = LS_CELL.
    ENDDO.
    APPEND GS_JUZHEN TO GT_JUZHEN.
  ENDDO.
  PERFORM FRM_ADDICON.

ENDFORM.

FORM FRM_GETICON CHANGING US_ICON.

  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      RAN_INT_MAX = 5
      RAN_INT_MIN = 1
*    IMPORTING
*     RAN_INT     = MY_SEED.
    .
  DATA LV_RANDOM LIKE QF00-RAN_INT.
  CALL FUNCTION 'QF05_RANDOM_INTEGER'
    EXPORTING
      RAN_INT_MAX = 11
      RAN_INT_MIN = 1
    IMPORTING
      RAN_INT     = LV_RANDOM.


  CASE LV_RANDOM.
    WHEN '1'.
      US_ICON = ICON_GENERATE.
    WHEN '2'.
      US_ICON = ICON_ADD_ROW.
    WHEN '3'.
      US_ICON = ICON_COLOR.
    WHEN '4'.
      US_ICON = ICON_ACTIVITY.
    WHEN '5'.
      US_ICON = ICON_TIME_INA.
    WHEN '6'.
      US_ICON = ICON_NO_STATUS.
    WHEN '7'.
      US_ICON = ICON_STATUS_ALERT.
    WHEN '8'.
      US_ICON = ICON_LED_INACTIVE.
    WHEN '9'.
      US_ICON = ICON_LED_GREEN.
    WHEN '10'.
      US_ICON = ICON_LED_RED.
    WHEN '11'.
      US_ICON = ICON_LED_YELLOW.
  ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_ADDICON
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ADDICON.

  CLEAR GT_ICON.
  FIELD-SYMBOLS <FS_FIELD1> LIKE GS_ICON-ICON1.
  FIELD-SYMBOLS <FS_FIELD2> LIKE GS_JUZHEN-JZ1.
  DATA LS_JUZHEN LIKE GS_JUZHEN.
  DATA LS_ICON LIKE GS_ICON.
  LOOP AT GT_JUZHEN INTO LS_JUZHEN.
    CLEAR LS_ICON.
    DATA LV_COL TYPE I.
    LV_COL = 0.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      ASSIGN COMPONENT LV_COL OF
        STRUCTURE LS_JUZHEN TO <FS_FIELD2>.
      ASSIGN COMPONENT LV_COL OF
        STRUCTURE LS_ICON TO <FS_FIELD1>.
      <FS_FIELD1> = <FS_FIELD2>-ICON.
    ENDDO.
    APPEND LS_ICON TO GT_ICON.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SHOWALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SHOWALV.


  DATA L_INDEX TYPE I.
  L_INDEX = 0.

  DATA LS_FIELDCAT LIKE LINE OF GT_FIELDCAT.

  DEFINE SUB_ADD_FIELD.
    l_index = l_index + 1.
    clear ls_fieldcat.
    ls_fieldcat-col_pos = l_index.
    ls_fieldcat-fieldname = &1.
    ls_fieldcat-scrtext_l = &2.
    ls_fieldcat-outputlen = &3.
    ls_fieldcat-icon = &4.
    ls_fieldcat-hotspot = ''.
    append ls_fieldcat to gt_fieldcat.
  END-OF-DEFINITION.

  DATA LV_FIELDTEXT TYPE CHAR10.
  DATA LV_FIELDNAME TYPE CHAR10.

  DO GV_TABCOL TIMES.
    LV_FIELDTEXT = SY-INDEX && '列'.
    LV_FIELDNAME = 'ICON' && SY-INDEX.
    SUB_ADD_FIELD LV_FIELDNAME LV_FIELDTEXT '5' 'X'.
  ENDDO.

  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-SEL_MODE = 'A'.
  GS_LAYOUT-EDIT_MODE = '1'.

  CLEAR GS_DISVARIANT.
  GS_DISVARIANT-REPORT = SY-REPID.
  GS_DISVARIANT-HANDLE = '1'.


  PERFORM FRM_EXCLUDE_TB_FUNC.

*&---增加ALV回车事件
  DATA LS_EVENTS LIKE LINE OF GT_EVENTS.
  LS_EVENTS-NAME = 'FRM_CALLER_EXIT'. "'CALLER_EXIT'.
  LS_EVENTS-FORM = 'FRM_CALLER_EXIT'.
  APPEND LS_EVENTS TO GT_EVENTS.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM      = SY-REPID
      I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
      I_CALLBACK_TOP_OF_PAGE  = 'FRM_TOP_OF_PAGE'
      IS_LAYOUT_LVC           = GS_LAYOUT
      IT_FIELDCAT_LVC         = GT_FIELDCAT
      IT_EXCLUDING            = GT_SLIS_T_EXTAB
      IS_VARIANT              = GS_DISVARIANT
    TABLES
      T_OUTTAB                = GT_ICON[]
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


ENDFORM.

FORM FRM_TOP_OF_PAGE.

  DATA: LT_HEADER TYPE SLIS_T_LISTHEADER,
        LS_HEADER TYPE SLIS_LISTHEADER,
        LV_NAMEF  TYPE CHAR30,
        LV_NAMEL  TYPE CHAR30,
        LV_WEEK   TYPE SCAL-WEEK.

  LS_HEADER-TYP  = 'S'.
  LS_HEADER-KEY = '消消樂得分:'.
  LS_HEADER-INFO = GV_SCORE && '分'.
  APPEND LS_HEADER TO LT_HEADER .
  CLEAR  LS_HEADER .

  DATA LV_SECONDS TYPE INT4.
  LV_SECONDS = SY-UZEIT - GV_KAISHI.

  LS_HEADER-TYP  = 'S'.
  LS_HEADER-KEY  = '花費時間:' .
  LS_HEADER-INFO = LV_SECONDS && '秒'.
  APPEND LS_HEADER TO LT_HEADER .
  CLEAR  LS_HEADER .

*  LS_HEADER-TYP  = 'S'.
*  LS_HEADER-KEY  = TEXT-070 .
*  LS_HEADER-INFO = GV_DATUM+0(4) && TEXT-059 && GV_DATUM+4(2) && TEXT-067 && GV_DATUM+6(2) && TEXT-071 .
*  APPEND LS_HEADER TO LT_HEADER .
*  CLEAR  LS_HEADER .

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY = LT_HEADER
*     I_LOGO             = 'ZLOGO'
      I_ALV_FORM         = 'X'.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_caller_exit
*&---------------------------------------------------------------------*
*& 回车事件
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CALLER_EXIT USING PS_DATA TYPE SLIS_DATA_CALLER_EXIT.
  IF GR_GRID IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        E_GRID = GR_GRID.
  ENDIF.
* 设置enter事件
  CALL METHOD GR_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

** 设置hotspot事件
*  CALL METHOD GR_GRID->REGISTER_EDIT_EVENT
*    EXPORTING
*      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_STYLE_HOTSPOT
*    EXCEPTIONS
*      ERROR      = 1
*      OTHERS     = 2.


  SET HANDLER GR_EVENT_RECEIVER_1->HANDLE_ENTE FOR GR_GRID.

ENDFORM.

FORM FRM_USER_STATUS USING PS_EXTAB TYPE SLIS_T_EXTAB.  "GUI
  SET PF-STATUS 'STANDARD' EXCLUDING PS_EXTAB.
  SET TITLEBAR 'TITLE' WITH '開心消消樂'.
*  PERFORM frm_lock_program.
ENDFORM.

FORM FRM_USER_COMMAND USING PV_UCOMM LIKE SY-UCOMM  "user_command
                            PV_SELFIELD TYPE SLIS_SELFIELD.

  IF GR_GRID IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        E_GRID = GR_GRID.
  ENDIF.
*  CALL METHOD GR_GRID->CHECK_CHANGED_DATA. "将更新后的数据传到alv所对应的内表
*  PV_SELFIELD-REFRESH = 'X'. "刷新数据
  CASE PV_UCOMM.
    WHEN '&IC1'.
      PERFORM FRM_HOST USING PV_SELFIELD-TABINDEX PV_SELFIELD-FIELDNAME+4(*).
    WHEN '&F03'.
      LEAVE TO SCREEN 0.
  ENDCASE.
*

**&---刷新ALV
*  GR_GRID->REFRESH_TABLE_DISPLAY( IS_STABLE = VALUE LVC_S_STBL( ROW = 'X' COL = 'X' ) ).

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_EXCLUDE_TB_FUNC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_EXCLUDE_TB_FUNC.

  DATA LS_EXCLUDING LIKE LINE OF GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_MAXIMUM.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_MINIMUM.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_SUBTOT.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_SUM.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_AVERAGE.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_MB_SUM.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_MB_SUBTOT.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_CHECK.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_REFRESH.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_DETAIL.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = CL_GUI_ALV_GRID=>MC_FC_PRINT.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.

  LS_EXCLUDING = '&MB_EXPORT'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&MB_VIEW'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&LOAD'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&COLO'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&SAVE'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&MAINTAIN'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&INFO'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
  LS_EXCLUDING = '&GRAPH'.
  APPEND LS_EXCLUDING TO GT_SLIS_T_EXTAB.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GETZHUATAI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GETZHUATAI.


  DATA LV_ROW TYPE I.
  DATA LV_COL TYPE I.
  DATA LV_YOUZHI TYPE C.
  DATA LV_CELL TYPE TY_CELL.

  IF GV_TZ = '1'. "消除
    LV_YOUZHI = ''.
*    檢查是否需要消除
    LV_ROW = 0.
    DO GV_TABROW TIMES.
      LV_ROW = LV_ROW + 1.
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        CLEAR: LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON <> ''.
          DATA LV_COL2 TYPE I.
          DATA LV_COL3 TYPE I.
          LV_COL2 = LV_COL + 1.
          LV_COL3 = LV_COL + 2.
          DATA LV_CELL2 TYPE TY_CELL.
          DATA LV_CELL3 TYPE TY_CELL.
          CLEAR: LV_CELL2,LV_CELL3.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL2 LV_CELL2.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL3 LV_CELL3.
          IF LV_CELL-ICON = LV_CELL2-ICON AND
             LV_CELL-ICON = LV_CELL3-ICON.
            GV_TZ = '1'. "消除
            LV_YOUZHI = '1'.
            RETURN.
          ENDIF.


          DATA LV_ROW2 TYPE I.
          DATA LV_ROW3 TYPE I.
          LV_ROW2 = LV_ROW + 1.
          LV_ROW3 = LV_ROW + 2.
          CLEAR: LV_CELL2,LV_CELL3.
          PERFORM FRM_GETCELL USING LV_ROW2 LV_COL LV_CELL2.
          PERFORM FRM_GETCELL USING LV_ROW3 LV_COL LV_CELL3.
          IF LV_CELL-ICON = LV_CELL2-ICON AND
             LV_CELL-ICON = LV_CELL3-ICON.
            GV_TZ = '1'. "消除
            LV_YOUZHI = '1'.
            RETURN.
          ENDIF.
        ENDIF.
      ENDDO.
    ENDDO.

    IF LV_YOUZHI <> '1'. "無需消除,檢查是否需要下落
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        LV_ROW = 0.
        LV_YOUZHI = ''.
        DO GV_TABROW TIMES.
          LV_ROW = LV_ROW + 1.
          CLEAR LV_CELL.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
          IF LV_CELL-ICON <> ''.
            LV_YOUZHI = 'X'.
          ELSEIF LV_CELL-ICON = ''.
            IF LV_YOUZHI = 'X'.
              LV_YOUZHI = '2'.
              GV_TZ = '2'. "下落
              RETURN.
            ENDIF.
          ENDIF.
        ENDDO.
      ENDDO.
    ENDIF.

    IF LV_YOUZHI <> '2'. "無需下落,檢查是否需要填充
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        LV_ROW = 0.
        DO GV_TABROW TIMES.
          LV_ROW = LV_ROW + 1.
          CLEAR LV_CELL.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
          IF LV_CELL-ICON = ''.
            GV_TZ = '3'. "填充
            RETURN.
          ENDIF.
        ENDDO.
      ENDDO.
    ENDIF.
    IF LV_YOUZHI <> '3'. "無需填充,則什麼也不用做,結束了
      CLEAR GV_TZ.
    ENDIF.

  ELSEIF GV_TZ = '2'. "下落
    LV_YOUZHI = ''.
    LV_COL = 0.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      LV_ROW = 0.
      LV_YOUZHI = ''.
      DO GV_TABROW TIMES.
        LV_ROW = LV_ROW + 1.
        CLEAR LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON <> ''.
          IF LV_YOUZHI = ''.
            LV_YOUZHI = 'X'.
          ENDIF.
        ELSE.
          IF LV_YOUZHI = 'X'.
            LV_YOUZHI = '2'.
            GV_TZ = '2'. "下落
            RETURN.
          ENDIF.
        ENDIF.
      ENDDO.
    ENDDO.
    IF LV_YOUZHI <> '2'. "沒有需要下落的圖案,則檢查是否需要消除
      LV_ROW = 0.
      DO GV_TABROW TIMES.
        LV_ROW = LV_ROW + 1.
        LV_COL = 0.
        DO GV_TABCOL TIMES.
          LV_COL = LV_COL + 1.
          CLEAR: LV_CELL.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
          IF LV_CELL-ICON <> ''.
            CLEAR: LV_COL2,LV_COL3.
            LV_COL2 = LV_COL + 1.
            LV_COL3 = LV_COL + 2.
            CLEAR: LV_CELL2,LV_CELL3.
            PERFORM FRM_GETCELL USING LV_ROW LV_COL2 LV_CELL2.
            PERFORM FRM_GETCELL USING LV_ROW LV_COL3 LV_CELL3.
            IF LV_CELL-ICON = LV_CELL2-ICON AND
               LV_CELL-ICON = LV_CELL3-ICON.
              GV_TZ = '1'. "消除
              LV_YOUZHI = '1'.
              RETURN.
            ENDIF.


            CLEAR: LV_ROW2,LV_ROW3.
            LV_ROW2 = LV_ROW + 1.
            LV_ROW3 = LV_ROW + 2.
            CLEAR: LV_CELL2,LV_CELL3.
            PERFORM FRM_GETCELL USING LV_ROW2 LV_COL LV_CELL2.
            PERFORM FRM_GETCELL USING LV_ROW3 LV_COL LV_CELL3.
            IF LV_CELL-ICON = LV_CELL2-ICON AND
               LV_CELL-ICON = LV_CELL3-ICON.
              GV_TZ = '1'. "消除
              LV_YOUZHI = '1'.
              RETURN.
            ENDIF.
          ENDIF.
        ENDDO.
      ENDDO.
    ENDIF.
    IF LV_YOUZHI <> '1'. "也沒有需要消除的圖案,則檢查是否需要填充
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        LV_ROW = 0.
        DO GV_TABROW TIMES.
          LV_ROW = LV_ROW + 1.
          CLEAR LV_CELL.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
          IF LV_CELL-ICON = ''.
            LV_YOUZHI = '3'.
            GV_TZ = '3'. "填充
            RETURN.
          ENDIF.
        ENDDO.
      ENDDO.
    ENDIF.
    IF LV_YOUZHI <> '3'. "也不需要填充,則什麼也不做
      CLEAR GV_TZ.
    ENDIF.

  ELSEIF GV_TZ = '3'. "填充
*    上次是填充,則優先判斷是否需要繼續填充
    LV_YOUZHI = ''.
    LV_COL = 0.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      LV_ROW = 0.
      DO GV_TABROW TIMES.
        LV_ROW = LV_ROW + 1.
        CLEAR LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON = ''.
          LV_YOUZHI = '3'.
          GV_TZ = '3'. "填充
          RETURN.
        ENDIF.
      ENDDO.
    ENDDO.
    IF LV_YOUZHI <> '3'. "無需填充,則判斷是否需要消除
      LV_ROW = 0.
      DO GV_TABROW TIMES.
        LV_ROW = LV_ROW + 1.
        LV_COL = 0.
        DO GV_TABCOL TIMES.
          LV_COL = LV_COL + 1.
          CLEAR: LV_CELL.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
          IF LV_CELL-ICON <> ''.
            LV_COL2 = LV_COL + 1.
            LV_COL3 = LV_COL + 2.
            CLEAR: LV_CELL2,LV_CELL3.
            PERFORM FRM_GETCELL USING LV_ROW LV_COL2 LV_CELL2.
            PERFORM FRM_GETCELL USING LV_ROW LV_COL3 LV_CELL3.
            IF LV_CELL-ICON = LV_CELL2-ICON AND
               LV_CELL-ICON = LV_CELL3-ICON.
              GV_TZ = '1'. "消除
              LV_YOUZHI = '1'.
              RETURN.
            ENDIF.

            LV_ROW2 = LV_ROW + 1.
            LV_ROW3 = LV_ROW + 2.
            CLEAR: LV_CELL2,LV_CELL3.
            PERFORM FRM_GETCELL USING LV_ROW2 LV_COL LV_CELL2.
            PERFORM FRM_GETCELL USING LV_ROW3 LV_COL LV_CELL3.
            IF LV_CELL-ICON = LV_CELL2-ICON AND
               LV_CELL-ICON = LV_CELL3-ICON.
              GV_TZ = '1'. "消除
              LV_YOUZHI = '1'.
              RETURN.
            ENDIF.
          ENDIF.
        ENDDO.
      ENDDO.
    ENDIF.
    IF LV_YOUZHI <> '1'. "也不需要消除,則什麼也不做
      CLEAR GV_TZ.
    ENDIF.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GETCELL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_ROW  text
*      -->P_LV_COL  text
*      -->P_LV_CELL  text
*----------------------------------------------------------------------*
FORM FRM_GETCELL USING US_ROW TYPE I
                       US_COL TYPE I
                       US_CELL TYPE TY_CELL.

  READ TABLE GT_JUZHEN INTO DATA(LS_JUZHEN) INDEX US_ROW.
  IF SY-SUBRC = 0.
    FIELD-SYMBOLS <FS_FIELD2> LIKE GS_JUZHEN-JZ1.
    ASSIGN COMPONENT US_COL OF STRUCTURE LS_JUZHEN TO <FS_FIELD2>.
    IF <FS_FIELD2> IS ASSIGNED.
      US_CELL = <FS_FIELD2>.
    ENDIF.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SETXIAOCHU
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SETXIAOCHU.

  IF GV_TZ = 1. "消除
    DATA LV_STABLE TYPE LVC_S_STBL.
    LV_STABLE-ROW = '1'.
    LV_STABLE-COL = '1'.

    DATA LV_ROW TYPE I.
    DATA LV_COL TYPE I.
    DATA LV_COL2 TYPE I.
    DATA LV_COL3 TYPE I.
    DATA LV_COLN TYPE I.
    LV_ROW = 0.
    DO GV_TABROW TIMES.
      LV_ROW = LV_ROW + 1.
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        DATA LV_CELL TYPE TY_CELL.
        CLEAR: LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON <> ''.
          LV_COL2 = LV_COL + 1.
          LV_COL3 = LV_COL + 2.
          DATA LV_CELL2 TYPE TY_CELL.
          DATA LV_CELL3 TYPE TY_CELL.
          CLEAR: LV_CELL2,LV_CELL3.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL2 LV_CELL2.
          PERFORM FRM_GETCELL USING LV_ROW LV_COL3 LV_CELL3.
          IF LV_CELL-ICON = LV_CELL2-ICON AND
             LV_CELL-ICON = LV_CELL3-ICON.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL ''.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL2 ''.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL3 ''.
            PERFORM FRM_SETCELL_DEL USING LV_CELL.
            PERFORM FRM_SETCELL_DEL USING LV_CELL2.
            PERFORM FRM_SETCELL_DEL USING LV_CELL3.
            LV_COLN = LV_COL3 + 1.
            WHILE LV_COLN > 0.
              DATA LV_CELLN TYPE TY_CELL.
              CLEAR LV_CELLN.
              PERFORM FRM_GETCELL USING LV_ROW LV_COLN LV_CELLN.
              IF LV_CELL-ICON = LV_CELLN-ICON.
*                  PERFORM FRM_SETCELL_ICON USING LV_CELLN ''.
                PERFORM FRM_SETCELL_DEL USING LV_CELLN.
                LV_COLN = LV_COLN + 1.
              ELSE.
                LV_COLN = 0.
              ENDIF.
            ENDWHILE.
          ENDIF.

          DATA LV_ROW2 TYPE I.
          DATA LV_ROW3 TYPE I.
          DATA LV_ROWN TYPE I.
          LV_ROW2 = LV_ROW + 1.
          LV_ROW3 = LV_ROW + 2.
          CLEAR: LV_CELL2,LV_CELL3.
          PERFORM FRM_GETCELL USING LV_ROW2 LV_COL LV_CELL2.
          PERFORM FRM_GETCELL USING LV_ROW3 LV_COL LV_CELL3.
          IF LV_CELL-ICON = LV_CELL2-ICON AND
             LV_CELL-ICON = LV_CELL3-ICON.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL ''.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL2 ''.
*              PERFORM FRM_SETCELL_ICON USING LV_CELL3 ''.
            PERFORM FRM_SETCELL_DEL USING LV_CELL.
            PERFORM FRM_SETCELL_DEL USING LV_CELL2.
            PERFORM FRM_SETCELL_DEL USING LV_CELL3.
            LV_ROWN = LV_ROW3 + 1.
            WHILE LV_ROWN > 0.
              CLEAR LV_CELLN.
              PERFORM FRM_GETCELL USING LV_ROWN LV_COL LV_CELLN.
              IF LV_CELL-ICON = LV_CELLN-ICON.
*                  PERFORM FRM_SETCELL_ICON USING LV_CELLN ''.
                PERFORM FRM_SETCELL_DEL USING LV_CELLN.
                LV_ROWN = LV_ROWN + 1.
              ELSE.
                LV_ROWN = 0.
              ENDIF.
            ENDWHILE.
          ENDIF.

        ENDIF.

      ENDDO.
    ENDDO.


    LV_ROW = 0.
    DO GV_TABROW TIMES.
      LV_ROW = LV_ROW + 1.
      LV_COL = 0.
      DO GV_TABCOL TIMES.
        LV_COL = LV_COL + 1.
        CLEAR: LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-DEL = 'X'.
          PERFORM FRM_SETCELL_ICON USING LV_CELL ''.
          GV_SCORE = GV_SCORE + 1.
        ENDIF.
      ENDDO.
    ENDDO.

*    CALL METHOD GS_DYNDOC_ID->INITIALIZE_DOCUMENT
*      EXPORTING
*        BACKGROUND_COLOR = CL_DD_AREA=>COL_TEXTAREA.
*    CALL METHOD GR_ALVGRID_1001->LIST_PROCESSING_EVENTS
*      EXPORTING
*        I_EVENT_NAME = 'TOP_OF_PAGE'
*        I_DYNDOC_ID  = GS_DYNDOC_ID.

  ELSEIF GV_TZ = 2.  "下落
    LV_COL = 0.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      LV_ROW = GV_TABROW.
      WHILE LV_ROW > 1.
        CLEAR LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON = ''.
*            PERFORM FRM_XIACELL USING LV_CELL.
          DATA LV_SCROW TYPE I.
          LV_SCROW = LV_ROW - 1.
          WHILE LV_SCROW > 0.
            DATA LV_SCCELL TYPE TY_CELL.
            CLEAR LV_SCCELL.
            PERFORM FRM_GETCELL USING LV_SCROW LV_COL LV_SCCELL.
            DATA LV_DQCELL TYPE TY_CELL.
            CLEAR LV_DQCELL.
            DATA LV_DQROW TYPE I.
            LV_DQROW = LV_SCROW + 1.
            PERFORM FRM_GETCELL USING LV_DQROW LV_COL LV_DQCELL.
            IF LV_DQCELL-ICON = '' AND LV_SCCELL-ICON <> ''.
              DATA LV_ICON LIKE LV_DQCELL-ICON.
              LV_ICON = LV_DQCELL-ICON.
              PERFORM FRM_SETCELL_ICON USING LV_DQCELL LV_SCCELL-ICON.
              PERFORM FRM_SETCELL_ICON USING LV_SCCELL LV_ICON.
            ENDIF.
            LV_SCROW = LV_SCROW - 1.
          ENDWHILE.
          EXIT.
        ENDIF.
        LV_ROW = LV_ROW - 1.
      ENDWHILE.
    ENDDO.
  ELSEIF GV_TZ = 3. "填充

    LV_COL = 0.
    DO GV_TABCOL TIMES.
      LV_COL = LV_COL + 1.
      LV_ROW = 0.
      DO GV_TABROW TIMES.
        LV_ROW = LV_ROW + 1.
        CLEAR LV_CELL.
        PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.
        IF LV_CELL-ICON = ''.
          IF LV_ROW = 1.
            PERFORM FRM_GETICON CHANGING LV_CELL-ICON.
            PERFORM FRM_SETCELL_ICON USING LV_CELL LV_CELL-ICON.
            EXIT.
          ELSE.
            CLEAR LV_SCROW.
            LV_SCROW = LV_ROW - 1.
            WHILE LV_SCROW > 0.
              CLEAR LV_SCCELL.
              PERFORM FRM_GETCELL USING LV_SCROW LV_COL LV_SCCELL.
              CLEAR LV_DQCELL.
              LV_DQROW = LV_SCROW + 1.
              PERFORM FRM_GETCELL USING LV_DQROW LV_COL LV_DQCELL.
              LV_ICON = LV_DQCELL-ICON.
              PERFORM FRM_SETCELL_ICON USING LV_DQCELL LV_SCCELL-ICON.
              PERFORM FRM_SETCELL_ICON USING LV_SCCELL LV_ICON.
              LV_SCROW = LV_SCROW - 1.
            ENDWHILE.
            IF LV_SCROW = 0.
              DATA LV_1CCELL TYPE TY_CELL.
              CLEAR LV_1CCELL.
              PERFORM FRM_GETCELL USING 1 LV_COL LV_1CCELL.
              PERFORM FRM_GETICON CHANGING LV_1CCELL-ICON.
              PERFORM FRM_SETCELL_ICON USING LV_1CCELL LV_1CCELL-ICON.
            ENDIF.
            EXIT.
          ENDIF.
        ENDIF.

      ENDDO.
    ENDDO.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SETCELL_ICON
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_DQCELL  text
*      -->P_LV_SCCELL_ICON  text
*----------------------------------------------------------------------*
FORM FRM_SETCELL_ICON USING US_CELL TYPE TY_CELL US_ICON.
  READ TABLE GT_JUZHEN ASSIGNING FIELD-SYMBOL(<FS_JUZHEN>) INDEX US_CELL-ROW.
  FIELD-SYMBOLS <FS_FIELD2> LIKE GS_JUZHEN-JZ1.
  ASSIGN COMPONENT US_CELL-COL OF STRUCTURE <FS_JUZHEN> TO <FS_FIELD2>.
  <FS_FIELD2>-ICON = US_ICON.
  <FS_FIELD2>-DEL = ''.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SETCELL_DEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_CELLN  text
*----------------------------------------------------------------------*
FORM FRM_SETCELL_DEL USING US_CELL TYPE TY_CELL.
  READ TABLE GT_JUZHEN ASSIGNING FIELD-SYMBOL(<FS_JUZHEN>) INDEX US_CELL-ROW.
  FIELD-SYMBOLS <FS_FIELD2> LIKE GS_JUZHEN-JZ1.
  ASSIGN COMPONENT US_CELL-COL OF STRUCTURE <FS_JUZHEN> TO <FS_FIELD2>.
  <FS_FIELD2>-DEL = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_HOST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_HOST USING US_ROW US_COL.

  DATA LV_CELL TYPE TY_CELL.
  CLEAR: LV_CELL.
  DATA LV_COL TYPE I.
  DATA LV_ROW TYPE I.
  LV_ROW = US_ROW.
  LV_COL = US_COL.
  PERFORM FRM_GETCELL USING LV_ROW LV_COL LV_CELL.

  IF GV_HOSTCELL IS INITIAL.
    GV_HOSTCELL = LV_CELL.
  ELSE.
    DATA LV_JUEDZ1 TYPE I.
    LV_JUEDZ1 = ABS( GV_HOSTCELL-ROW - LV_CELL-ROW ).
    DATA LV_JUEDZ2 TYPE I.
    LV_JUEDZ2 = ABS( GV_HOSTCELL-COL - LV_CELL-COL ).
    IF ( LV_JUEDZ1 = 0 AND LV_JUEDZ2 = 1 ) OR
       ( LV_JUEDZ1 = 1 AND LV_JUEDZ2 = 0 ).
      PERFORM FRM_SETCELL_ICON USING GV_HOSTCELL LV_CELL-ICON.
      PERFORM FRM_SETCELL_ICON USING LV_CELL GV_HOSTCELL-ICON.
      CLEAR: GV_HOSTCELL.
      GV_TZ = '1'. "消除
      PERFORM FRM_GETZHUATAI. "狀態確定

      IF GV_TZ = '1'. "可以執行消除動作,則取消熱點
        CALL METHOD GO_TIMER->RUN
          EXCEPTIONS
            OTHERS = 9.
        DATA LT_FIELDCAT TYPE LVC_T_FCAT.
        CALL METHOD GR_GRID->GET_FRONTEND_FIELDCATALOG
          IMPORTING
            ET_FIELDCATALOG = LT_FIELDCAT.
        LOOP AT LT_FIELDCAT INTO DATA(WA_FIELDCAT).
          WA_FIELDCAT-HOTSPOT = ''.
          MODIFY LT_FIELDCAT FROM WA_FIELDCAT.
        ENDLOOP.
        CALL METHOD GR_GRID->SET_FRONTEND_FIELDCATALOG
          EXPORTING
            IT_FIELDCATALOG = LT_FIELDCAT.
      ENDIF.

      PERFORM FRM_ADDICON.
      GS_STABLE-ROW = 'X'.
      GS_STABLE-COL = 'X'.
      CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY
        EXPORTING
          IS_STABLE = GS_STABLE
*         I_SOFT_REFRESH =
        EXCEPTIONS
          FINISHED  = 1
          OTHERS    = 2.
      IF SY-SUBRC <> 0.
*     Implement suitable error handling here
      ENDIF.

    ELSE.
      GV_HOSTCELL = LV_CELL.
    ENDIF.
  ENDIF.




ENDFORM.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 请参考以下代码:REPORT Z_ALV_REPORT_DEMO.TABLES: VBAK.DATA: BEGIN OF REPORT_DATA OCCURS 0, VBELN LIKE VBAK-VBELN, KUNNR LIKE VBAK-KUNNR, END OF REPORT_DATA.START-OF-SELECTION. SELECT VBELN KUNNR INTO CORRESPONDING FIELDS OF TABLE REPORT_DATA FROM VBAK.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_CALLBACK_PROGRAM = SY-REPID I_STRUCTURE_NAME = 'REPORT_DATA' I_BACKGROUND_COLOR = 0 I_GRID_TITLE = '销售订单报表' I_GRID_DISPLAY = 'X' EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2.IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF. ### 回答2: ABAP ALV报表是一种用于展示和处理数据的强大工具。以下是一个简单的示例代码,用于创建一个包含基本功能的ALV报表: 1. 数据定义和获取: 首先,我们需要定义和获取报表所需的数据。可以使用内部表、数据库表或函数模块来获取数据。假设数据存储在一个内部表IT_DATA中。 2. 创建ALV对象: 创建一个ALV对象,并设置所需的属性和事件。可以使用CL_SALV_TABLE类来创建和管理ALV对象。下面是一个示例代码: DATA: lo_alv TYPE REF TO cl_salv_table. CREATE OBJECT lo_alv. 3. 设置字段目录: 设置字段目录,即定义报表的列和标题。可以为每个列定义不同的属性,如类型,长度,对齐方式等。以下是一个示例代码: DATA: lt_field_catalog TYPE TABLE OF salv_fcatalog, ls_field_catalog TYPE salv_fcatalog. ls_field_catalog-fieldname = 'COLUMN1'. ls_field_catalog-seltext_l = 'Column 1'. APPEND ls_field_catalog TO lt_field_catalog. ls_field_catalog-fieldname = 'COLUMN2'. ls_field_catalog-seltext_l = 'Column 2'. APPEND ls_field_catalog TO lt_field_catalog. lo_alv->set_table_for_first_display( EXPORTING i_structure_name = 'IT_DATA' CHANGING it_outtab = it_data it_fieldcatalog = lt_field_catalog ). 4. 显示报表: 最后,调用DISPLAY方法来显示报表。这将在屏幕上展示并允许对数据进行操作。以下是一个示例代码: lo_alv->display( ). 这只是一个简单的示例,ABAP ALV报表有很多其他功能和设置可以使用。可以根据具体需求进行更多的自定义和配置。希望这能帮助你入门并了解如何编写ABAP ALV报表代码。 ### 回答3: 下面是一个简单的ABAP ALVABAP列表化显示)报表代码的示例: REPORT z_alv_demo. DATA: lt_data TYPE TABLE OF spfli, ls_data TYPE spfli. START-OF-SELECTION. SELECT * FROM spfli INTO TABLE lt_data. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_top_of_page = 'TOP-OF-PAGE' TABLES t_outtab = lt_data. FORM top-of-page. WRITE: / '飞机从', 20(20) '飞行到', 40(20) '目的地'. ULINE. ENDFORM. 在此示例中,我们使用SPFLI表的数据来显示一个简单的ALV报表。首先,我们在START-OF-SELECTION部分从SPFLI表中选择所有的行,并将其填充到内部表lt_data中。 然后,我们使用函数模块REUSE_ALV_GRID_DISPLAY来显示ALV表格。此函数需要传递参数i_callback_program,它指定了调用程序的名称(这里使用sy-repid表示当前程序的名称),以及i_callback_top_of_page,它指定了在每页的顶部显示的回调功能的名称。 在回调功能TOP-OF-PAGE中,我们使用WRITE语句来打印报表的标题,并使用ULINE语句在标题下方画一条线。 最后,在运行报表时,系统会根据SPFLI表的数据显示一个包含飞机飞行信息的ALV报表。 这只是一个简单的示例,您可以根据您的需求自定义和扩展代码来创建更复杂的报表

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值