Showing posts with label CHECK BOX IN ALV. Show all posts
Showing posts with label CHECK BOX IN ALV. Show all posts

Feb 8, 2011

CHECK BOX IN ALV


PASTE THIS CODE IN THE Z PROGRAM OF TYPE M
THIS CODE REQUIRE BASIC KNOWLEDGE OF SCREEN PROGRAMMING.
NO NEED TO BOTHER FRIEND WAIT FOR MY NEXT POST RELATED TO SCREEN PROGRAMMING IN REPORT
 
CODE :
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.  "for event handling
DATA: OK_CODE LIKE SY-UCOMM,
      SAVE_OK LIKE SY-UCOMM,
      G_CONTAINER TYPE SCRFNAME VALUE 'BCALV_GRID_DEMO_0100_CONT1',
      G_GRID  TYPE REF TO CL_GUI_ALV_GRID,
      G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      G_EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER,
      GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_LAYOUT TYPE LVC_S_LAYO,
      G_MAX TYPE I VALUE 100.

TYPESBEGIN OF GS_OUTTAB.
TYPESCHECKBOX TYPE C.                "field for checkbox
TYPES: CELLTAB TYPE LVC_T_STYL.        "field to switch editability
        INCLUDE STRUCTURE SFLIGHT.
TYPESEND OF GS_OUTTAB.

DATA: GT_OUTTAB TYPE GS_OUTTAB OCCURS 0 WITH HEADER LINE.

***********************************************************************
* LOCAL CLASSES
***********************************************************************
*
* This local class only handles event DOUBLE_CLICK.
* WHen the user double clicks on a checkbox cell the status of
* this cell is switched from editable to not editable and vice versa.
*
CLASS LCL_EVENT_RECEIVER DEFINITION.

PUBLIC SECTION.
METHODS: CATCH_DOUBLECLICK
         FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
         IMPORTING
            E_COLUMN
            ES_ROW_NO
            SENDER.
ENDCLASS.

CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

METHOD CATCH_DOUBLECLICK.
  DATA: LS_OUTTAB TYPE GS_OUTTAB,
        LS_CELLTAB TYPE LVC_S_STYL.
*--
* Function:
*  Switch between 'editable' and 'not editable' checkbox.
*--

* If the user clicked on another column there is
* nothing to do.
  IF E_COLUMN-FIELDNAME NE 'CHECKBOX'.
    EXIT.
  ENDIF.

  READ TABLE GT_OUTTAB INTO LS_OUTTAB INDEX ES_ROW_NO-ROW_ID.

* The loop is only needed if there are other columns that
* use checkboxes. At this point the loop could be
* replaced by a READ of the first line of CELLTAB.
      LOOP AT LS_OUTTAB-CELLTAB INTO LS_CELLTAB.
        IF LS_CELLTAB-FIELDNAME EQ 'CHECKBOX'.
* §B4.Switch the style to dis- or enable a cell for input
         IF LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
          LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
         ELSE.
          LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
         ENDIF.
         MODIFY LS_OUTTAB-CELLTAB FROM LS_CELLTAB.
        ENDIF.
      ENDLOOP.
      MODIFY GT_OUTTAB FROM LS_OUTTAB INDEX ES_ROW_NO-ROW_ID.

    CALL METHOD SENDER->REFRESH_TABLE_DISPLAY.
ENDMETHOD.
ENDCLASS.
*
********************************************************************

*---------------------------------------------------------------------*
*       MAIN                                                          *
*---------------------------------------------------------------------*
END-OF-SELECTION.
  CALL SCREEN 100.

*---------------------------------------------------------------------*
*       MODULE PBO OUTPUT                                             *
*---------------------------------------------------------------------*
MODULE PBO OUTPUT.
  SET PF-STATUS 'MAIN100'.
  SET TITLEBAR 'MAIN100'.
  IF G_CUSTOM_CONTAINER IS INITIAL.
    PERFORM CREATE_AND_INIT_ALV.
  ENDIF.

ENDMODULE.
*---------------------------------------------------------------------*
*       MODULE PAI INPUT                                              *
*---------------------------------------------------------------------*
MODULE PAI INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      PERFORM EXIT_PROGRAM.
    WHEN 'SELECT'.
      PERFORM SELECT_ALL_ENTRIES CHANGING GT_OUTTAB[].
    WHEN 'DESELECT'.
      PERFORM DESELECT_ALL_ENTRIES CHANGING GT_OUTTAB[].
    WHEN 'RESET'.
      PERFORM RESET_SELECTED_ENTRIES CHANGING GT_OUTTAB[].
    WHEN 'SWITCH'.
      PERFORM SWITCH_ACTIVATION CHANGING GT_OUTTAB[].
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Form  CREATE_AND_INIT_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_OUTTAB  text
*      <--P_GT_FIELDCAT  text
*      <--P_GS_LAYOUT  text
*----------------------------------------------------------------------*
FORM CREATE_AND_INIT_ALV.

  DATA: LT_EXCLUDE TYPE UI_FUNCTIONS.

  CREATE OBJECT G_CUSTOM_CONTAINER
         EXPORTING CONTAINER_NAME = G_CONTAINER.
  CREATE OBJECT G_GRID
         EXPORTING I_PARENT = G_CUSTOM_CONTAINER.

  PERFORM BUILD_FIELDCAT CHANGING GT_FIELDCAT.

* Exclude all edit functions in this example since we do not need them:
  PERFORM EXCLUDE_TB_FUNCTIONS CHANGING LT_EXCLUDE.

  PERFORM BUILD_DATA.

*§ B3.Use the layout structure to aquaint additional field to ALV.

  GS_LAYOUT-STYLEFNAME = 'CELLTAB'.

  CALL METHOD G_GRID->SET_TABLE_FOR_FIRST_DISPLAY
       EXPORTING IS_LAYOUT             = GS_LAYOUT
                 IT_TOOLBAR_EXCLUDING  = LT_EXCLUDE
       CHANGING  IT_FIELDCATALOG       = GT_FIELDCAT
                 IT_OUTTAB             = GT_OUTTAB[].

  CREATE OBJECT G_EVENT_RECEIVER.
  SET HANDLER G_EVENT_RECEIVER->CATCH_DOUBLECLICK FOR G_GRID.

* Set editable cells to ready for input initially
  CALL METHOD G_GRID->SET_READY_FOR_INPUT
   EXPORTING
    I_READY_FOR_INPUT = 1.


ENDFORM.                               "CREATE_AND_INIT_ALV
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT CHANGING PT_FIELDCAT TYPE LVC_T_FCAT.

  DATA LS_FCAT TYPE LVC_S_FCAT.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
       EXPORTING
            I_STRUCTURE_NAME = 'SFLIGHT'
       CHANGING
            CT_FIELDCAT      = PT_FIELDCAT.

*§A2.Add an entry for the checkbox in the fieldcatalog
  CLEAR LS_FCAT.
  LS_FCAT-FIELDNAME = 'CHECKBOX'.
* Essential: declare field as checkbox and
*            mark it as editable field:
  LS_FCAT-CHECKBOX = 'X'.
  LS_FCAT-EDIT = 'X'.

* do not forget to provide texts for this extra field
  LS_FCAT-COLTEXT = TEXT-F01.
  LS_FCAT-TOOLTIP = TEXT-F02.
  LS_FCAT-SELTEXT = TEXT-F03.

* optional: set column width
  LS_FCAT-OUTPUTLEN = 10.
*
  APPEND LS_FCAT TO PT_FIELDCAT.

ENDFORM.
                            


*&---------------------------------------------------------------------*
*&      Form  EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_EXCLUDE  text
*----------------------------------------------------------------------*
FORM EXCLUDE_TB_FUNCTIONS CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.

  DATA LS_EXCLUDE TYPE UI_FUNC.

  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
  APPEND LS_EXCLUDE TO PT_EXCLUDE.


ENDFORM.                               " EXCLUDE_TB_FUNCTIONS
*&---------------------------------------------------------------------*
*&      Form  build_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_DATA.

  DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT,
        LS_SFLIGHT TYPE SFLIGHT,
        LS_CELLTAB TYPE LVC_S_STYL,
        LT_CELLTAB TYPE LVC_T_STYL,
        L_INDEX TYPE I.

  SELECT * FROM SFLIGHT INTO TABLE LT_SFLIGHT UP TO G_MAX ROWS.
  IF SY-SUBRC NE 0.
* generate own entries if db-table is empty so that this example
* still works
    PERFORM GENERATE_ENTRIES CHANGING LT_SFLIGHT.
  ENDIF.

*§A3.Optionally, check checkboxes initially after selecting data.
* (Omitted in this example)
  LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
    MOVE-CORRESPONDING LS_SFLIGHT TO GT_OUTTAB.
*   if gt_outtab-connid eq '400'.
*     gt_outtab-checkbox = 'X'.
*   endif.
    APPEND GT_OUTTAB.
  ENDLOOP.

* §B2.After selecting data,
*    assign a style for each row of your checkbox column.
*
* Initially, set all checkbox cells editable.
  LS_CELLTAB-FIELDNAME = 'CHECKBOX'.
  LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.

  LOOP AT GT_OUTTAB.
    L_INDEX = SY-TABIX.
    REFRESH LT_CELLTAB.

    LS_CELLTAB-FIELDNAME = 'CHECKBOX'.
    LS_CELLTAB-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
    INSERT LS_CELLTAB INTO TABLE LT_CELLTAB.

    INSERT LINES OF LT_CELLTAB INTO TABLE GT_OUTTAB-CELLTAB.
    MODIFY GT_OUTTAB INDEX L_INDEX.
  ENDLOOP.

ENDFORM.                               " build_data
*---------------------------------------------------------------------*
*       FORM EXIT_PROGRAM                                             *
*---------------------------------------------------------------------*
FORM EXIT_PROGRAM.
  LEAVE PROGRAM.
ENDFORM
.

*&---------------------------------------------------------------------*
*&      Form  generate_entries
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_LT_SLFIGHT  text
*----------------------------------------------------------------------*
FORM GENERATE_ENTRIES CHANGING PT_SLFIGHT TYPE STANDARD TABLE.
*
* This form is only needed for the case that there is no
* data in database table SFLIGHT.
*
  DATA: LS_SFLIGHT TYPE SFLIGHT,
        L_MONTH(2TYPE C,
        L_DAY(2TYPE C,
        L_DATE(8TYPE C.


  LS_SFLIGHT-CARRID = 'LH'.
  LS_SFLIGHT-CONNID = '0400'.
  LS_SFLIGHT-CURRENCY = 'DEM'.
  LS_SFLIGHT-PLANETYPE = '747-400'.
  LS_SFLIGHT-SEATSMAX = 660.

  DO 110 TIMES.
    LS_SFLIGHT-PRICE = SY-INDEX * 100.
    LS_SFLIGHT-SEATSOCC = 660 - SY-INDEX * 6.
    LS_SFLIGHT-PAYMENTSUM = LS_SFLIGHT-SEATSOCC * LS_SFLIGHT-PRICE.

    L_MONTH = SY-INDEX / 10 + 1.
    DO 2 TIMES.
      L_DAY = L_MONTH + SY-INDEX * 2.
      L_DATE+0(4) = '2000'.
      L_DATE+4(2) = L_MONTH+0(2).
      L_DATE+6(2) = L_DAY+0(2).
      LS_SFLIGHT-FLDATE = L_DATE.
      APPEND LS_SFLIGHT TO PT_SLFIGHT.
    ENDDO.
  ENDDO.
ENDFORM.                               " generate_entries
*&---------------------------------------------------------------------*
*&      Form  select_all_entries
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_OUTTAB  text
*----------------------------------------------------------------------*
FORM SELECT_ALL_ENTRIES CHANGING PT_OUTTAB TYPE STANDARD TABLE.
  DATA: LS_OUTTAB TYPE GS_OUTTAB.
  DATA: L_VALID TYPE C,
        L_LOCKED TYPE C.

*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
*       you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD G_GRID->CHECK_CHANGED_DATA
              IMPORTING
                 E_VALID = L_VALID.

  IF L_VALID EQ 'X'.

    LOOP AT PT_OUTTAB INTO LS_OUTTAB.
      PERFORM CHECK_LOCK USING    LS_OUTTAB
                         CHANGING L_LOCKED.
      IF L_LOCKED IS INITIAL
         AND NOT LS_OUTTAB-CHECKBOX EQ '-'.
        LS_OUTTAB-CHECKBOX = 'X'.
      ENDIF.
      MODIFY PT_OUTTAB FROM LS_OUTTAB.
    ENDLOOP.

    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

  ENDIF.

ENDFORM.                               " select_all_entries
*&---------------------------------------------------------------------*
*&      Form  deselect_all_entries
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_OUTTAB[]  text
*----------------------------------------------------------------------*
FORM DESELECT_ALL_ENTRIES CHANGING PT_OUTTAB TYPE STANDARD TABLE.
  DATA: LS_OUTTAB TYPE GS_OUTTAB.
  DATA: L_VALID TYPE C,
        L_LOCKED TYPE C.


*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
*       you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD G_GRID->CHECK_CHANGED_DATA
              IMPORTING
                 E_VALID = L_VALID.

  IF L_VALID EQ 'X'.

    LOOP AT PT_OUTTAB INTO LS_OUTTAB.
      PERFORM CHECK_LOCK USING    LS_OUTTAB
                       CHANGING L_LOCKED.
      IF L_LOCKED IS INITIAL
         AND NOT LS_OUTTAB-CHECKBOX EQ '-'.
        LS_OUTTAB-CHECKBOX = ' '.
      ENDIF.

      MODIFY PT_OUTTAB FROM LS_OUTTAB.
    ENDLOOP.

    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

  ENDIF.



ENDFORM.                               " deselect_all_entries
*&---------------------------------------------------------------------*
*&      Form  reset_selected_entries
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_OUTTAB[]  text
*----------------------------------------------------------------------*
FORM RESET_SELECTED_ENTRIES CHANGING PT_OUTTAB TYPE STANDARD TABLE.
  DATA: LS_OUTTAB TYPE GS_OUTTAB.
  DATA: L_VALID TYPE C.

*§A4b. Before you set, (b)reset or evaluate checkboxes,
*      you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD G_GRID->CHECK_CHANGED_DATA
              IMPORTING
                 E_VALID = L_VALID.

  IF L_VALID EQ 'X'.

    LOOP AT PT_OUTTAB INTO LS_OUTTAB.
      IF     NOT LS_OUTTAB-CHECKBOX IS INITIAL
         AND NOT LS_OUTTAB-CHECKBOX EQ '-'.
        CLEAR LS_OUTTAB.
        MODIFY PT_OUTTAB FROM LS_OUTTAB.
      ENDIF.
    ENDLOOP.

    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

  ENDIF.

ENDFORM.                               " reset_selected_entries

*-----------------------------

FORM SWITCH_ACTIVATION CHANGING PT_OUTTAB TYPE STANDARD TABLE.
  DATA: LS_OUTTAB TYPE GS_OUTTAB.
  DATA: L_VALID TYPE C,
        LT_ROW_NO TYPE LVC_T_ROID WITH HEADER LINE.

*§A4c. Before you set, reset, (c)(de)activate 

*      or evaluate checkboxes, you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD G_GRID->CHECK_CHANGED_DATA
              IMPORTING
                 E_VALID = L_VALID.

  IF L_VALID EQ 'X'.
    CALL METHOD G_GRID->GET_SELECTED_ROWS
      IMPORTING
         ET_ROW_NO     = LT_ROW_NO[].

    LOOP AT LT_ROW_NO.
       READ TABLE PT_OUTTAB INTO LS_OUTTAB INDEX LT_ROW_NO-ROW_ID.
       IF LS_OUTTAB-CHECKBOX NE '-'.
         LS_OUTTAB-CHECKBOX = '-'.
       ELSE.
         LS_OUTTAB-CHECKBOX = ' '.
       ENDIF.
       MODIFY PT_OUTTAB FROM LS_OUTTAB INDEX LT_ROW_NO-ROW_ID.

    ENDLOOP.

    CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.

  ENDIF.

ENDFORM.                               " switch_activation

*&---------------------------------------------------------------------*
*&      Form  check_lock
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LS_OUTTAB  text
*      <--P_L_LOCKED  text
*----------------------------------------------------------------------*
FORM CHECK_LOCK USING    PS_OUTTAB TYPE GS_OUTTAB
                CHANGING P_LOCKED.
  DATA LS_CELLTAB TYPE LVC_S_STYL.

  LOOP AT PS_OUTTAB-CELLTAB INTO LS_CELLTAB.
    IF LS_CELLTAB-FIELDNAME = 'CHECKBOX'.
      IF LS_CELLTAB-STYLE EQ CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
        P_LOCKED = 'X'.
      ELSE.
        P_LOCKED = SPACE.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.                               " check_lock