ALV Checkbox選中某單號時,可以把其它相同單號的記錄也選中

主要是在data_changed中處理

 

REPORT  ZUBATSDN.

TABLES: VBAK,VBUP,LIKP,VBAP, ZTSDN.

*TYPE-POOLS VRM.
DATA:  IT_FIELDCAT1 TYPE LVC_T_FCAT,
       TY_FIELDCAT TYPE LVC_S_FCAT.


Data w_style TYPE lvc_s_styl.
Data t_style TYPE lvc_t_styl.
DATA: G_ALV_CHANGE TYPE C LENGTH 1 VALUE ''.
DATA: OK_CODE  LIKE SY-UCOMM.

*--SO
DATA:  G_SO_HEADERX   TYPE   BAPISDH1X,
           G_SO_HEADER     TYPE   BAPISDH1,
       G_SO_RETURN    TYPE   BAPIRET2         OCCURS 0 WITH HEADER
LINE,
       G_SO_ITEM      TYPE   BAPISDITM        OCCURS 0 WITH HEADER
LINE,
       G_SO_ITEMX     TYPE   BAPISDITMX       OCCURS 0 WITH HEADER
LINE.
DATA: BEGIN OF IT_VBELN OCCURS 0,
         VBELN LIKE VBAK-VBELN,
      END OF IT_VBELN.
DATA: BEGIN OF IT_SO OCCURS 0,
         CBOX(1) TYPE C,    "CHECK
         VBELN  LIKE VBAP-VBELN,
         POSNR  LIKE VBAP-POSNR,
         MATNR  LIKE VBAP-MATNR,
         ARKTX  LIKE VBAP-ARKTX,
         KWMENG LIKE VBAP-KWMENG,
         LIGHT  TYPE C LENGTH 1,
         MESS   TYPE C LENGTH 120,
      END OF IT_SO.

data: it_save_data LIKE TABLE OF ZTSDN WITH HEADER LINE.
*--SO

DATA: BEGIN OF IT_DN OCCURS 0,
         CBOX(1) TYPE C,    "CHECK
         VBELN  LIKE LIPS-VBELN,
         POSNR  LIKE LIPS-POSNR,
         MATNR  LIKE LIPS-MATNR,
         LFIMG  LIKE LIPS-LFIMG,
         VGBEL  LIKE LIPS-VGBEL,   "SO NUMBER
         VGPOS  LIKE LIPS-VGPOS,   "SO ITEM
         LIGHT  TYPE C LENGTH 1,
         MESS   TYPE C LENGTH 120,
      END OF IT_DN.

DATA: BEGIN OF IT_BILL OCCURS 0,
        VGBEL LIKE VBRP-VGBEL,   "dn number
        VGPOS LIKE VBRP-VGPOS,   "dn item
        VBELN LIKE VBRP-VBELN,   "billing number
        POSNR LIKE VBRP-POSNR,   "billing item
      END OF IT_BILL.


CLASS lcl_alv_receiver100 DEFINITION DEFERRED.
CLASS lcl_alv_receiver100 DEFINITION .
   PUBLIC SECTION.
       DATA: L_ITEMNO TYPE I.
     METHODS: handle_button_click FOR EVENT button_click OF
cl_gui_alv_grid
                                 IMPORTING ES_COL_ID ES_ROW_NO,

              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,
              HANDLE_DATA_CHANGED_FINISHED FOR EVENT
DATA_CHANGED_FINISHED OF cl_gui_alv_grid
                                  IMPORTING E_MODIFIED ET_GOOD_CELLS.
ENDCLASS.                    "lcl_event_receiver DEFINITION

CLASS lcl_alv_receiver100 IMPLEMENTATION.
  METHOD handle_button_click.
*         PERFORM CHECK_SELECT100 USING ES_ROW_NO-ROW_ID.

  ENDMETHOD.

  METHOD handle_data_changed.
      PERFORM handle_data_changed USING er_data_changed.
  ENDMETHOD.                    "handle_data_changed

  METHOD HANDLE_DATA_CHANGED_FINISHED.
      IF G_ALV_CHANGE = '1'.
         G_ALV_CHANGE = '2'.
         PERFORM ALV_REFRESH100.
      ELSEIF G_ALV_CHANGE = '2'.
         G_ALV_CHANGE = '0'.
      ENDIF.
  ENDMETHOD.
ENDCLASS.               "lcl_ALV_event_receiver


DATA: G_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: LC_ALV_OBJ TYPE REF TO cl_gui_alv_grid.
DATA: LT_EXCLUDE100   TYPE UI_FUNCTIONS.
DATA: L_VAR100    TYPE DISVARIANT.
DATA: GS_LAYOUT100    TYPE LVC_S_LAYO.
DATA: lc_alv_rec_obj TYPE REF TO lcl_alv_receiver100.
data: G_REFRESH TYPE C LENGTH 1 VALUE '1'.

SELECTION-SCREEN SKIP.
PARAMETERS: P_SO RADIOBUTTON GROUP G1 USER-COMMAND GC1 DEFAULT 'X',
            P_DN RADIOBUTTON GROUP G1.

SELECTION-SCREEN:  BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
*  (0)
   SELECT-OPTIONS: SP_VKORG FOR VBAK-VKORG OBLIGATORY DEFAULT '3231'.  
"?售??  "共用條件

*  (A.1)
   SELECT-OPTIONS: SP_DN FOR LIKP-VBELN MODIF ID S2.

*  (B.1)
   SELECT-OPTIONS: SP_VBELN FOR VBAK-VBELN MODIF ID S1,
                   SP_VTWEG FOR VBAK-VTWEG OBLIGATORY DEFAULT '00'
MODIF ID S1,   "分?渠道
                   SP_SPART FOR VBAK-SPART OBLIGATORY DEFAULT '00'
MODIF ID S1.   "?品?
   SELECTION-SCREEN SKIP.
*      (A.2)
       PARAMETERS: P_BILL AS CHECKBOX DEFAULT '' MODIF ID S2.

*      (B.2)
       PARAMETERS: P_NCLR RADIOBUTTON GROUP G2 DEFAULT 'X' MODIF ID
S1,
                   P_YCLR RADIOBUTTON GROUP G2 MODIF ID S1.
SELECTION-SCREEN: END OF BLOCK B1.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
        IF SCREEN-GROUP1 = 'S1'.
            IF P_SO = 'X'.
                SCREEN-ACTIVE = '1'.
            ELSE.
                SCREEN-ACTIVE = '0'.
            ENDIF.
        ELSEIF SCREEN-GROUP1 = 'S2'.
            IF P_DN = 'X'.
                SCREEN-ACTIVE = '1'.
            ELSE.
                SCREEN-ACTIVE = '0'.
            ENDIF.
        ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

INITIALIZATION.


START-OF-SELECTION.
   CASE 'X'.
     WHEN P_SO.
           PERFORM GET_SO_NUMBER.
           PERFORM GET_SO_ITEM.
     WHEN P_DN.
           if P_BILL <> 'X'.
               PERFORM GET_DN_ITEM.
           else.
               PERFORM GET_DN_BILL.
           endif.
     WHEN OTHERS.
   ENDCASE.
END-OF-SELECTION.

FORM GET_SO_NUMBER.
   CLEAR: IT_VBELN, IT_VBELN[].
   SELECT VBELN INTO CORRESPONDING FIELDS OF TABLE IT_VBELN
     FROM VBAK
   WHERE VBELN IN SP_VBELN  AND
         VKORG IN SP_VKORG  AND
         VTWEG IN SP_VTWEG  AND
         SPART IN SP_SPART.
   IF IT_VBELN[] IS INITIAL.
       MESSAGE TEXT-E01 TYPE 'S' DISPLAY LIKE 'E'.
       STOP.
   ENDIF.
ENDFORM.

FORM GET_SO_ITEM.
   CLEAR: IT_SO, IT_SO[].
   CASE 'X'.
     WHEN P_NCLR.   "未清且未拒絕
          SELECT VBAP~VBELN
                 VBAP~POSNR
                 VBAP~MATNR
                 VBAP~ARKTX
                 VBAP~KWMENG
            INTO CORRESPONDING FIELDS OF TABLE IT_SO
            FROM VBAP INNER JOIN VBUP ON VBAP~MANDT = VBUP~MANDT AND
                                         VBAP~VBELN = VBUP~VBELN AND
                                         VBAP~POSNR = VBUP~POSNR
            FOR ALL ENTRIES IN IT_VBELN
          WHERE VBAP~VBELN = IT_VBELN-VBELN  AND
                VBUP~ABSTA = 'A'             AND      "未拒絕
                VBUP~GBSTA IN ('A','B').              "未清
     WHEN P_YCLR.   "已清且已拒絕
          SELECT VBAP~VBELN
                 VBAP~POSNR
                 VBAP~MATNR
                 VBAP~ARKTX
                 VBAP~KWMENG
            INTO CORRESPONDING FIELDS OF TABLE IT_SO
            FROM VBAP INNER JOIN VBUP  ON VBAP~MANDT = VBUP~MANDT  
AND
                                          VBAP~VBELN = VBUP~VBELN  
AND
                                          VBAP~POSNR = VBUP~POSNR
                      INNER JOIN ZTSDN ON VBAP~MANDT = ZTSDN~MANDT 
AND
                                          VBAP~VBELN = ZTSDN~VBELN 
AND
                                          VBAP~POSNR = ZTSDN~POSNR
            FOR ALL ENTRIES IN IT_VBELN
          WHERE VBAP~VBELN = IT_VBELN-VBELN  AND
                VBUP~ABSTA = 'C'             AND      "拒絕
                VBUP~GBSTA NOT IN ('A','B').                     "已

     WHEN OTHERS.
   ENDCASE.
   IF IT_SO[] IS NOT INITIAL.
       CALL SCREEN 100.
   ELSE.
       MESSAGE TEXT-E01 TYPE 'S' DISPLAY LIKE 'E'.
       STOP.
   ENDIF.
ENDFORM.

FORM GET_DN_ITEM.
   CLEAR: IT_DN, IT_DN[].
   SELECT LIPS~VBELN
          LIPS~POSNR
          LIPS~MATNR
          LIPS~LFIMG
          LIPS~VGBEL   "SO NUMBER
          LIPS~VGPOS   "SO ITEM
     INTO CORRESPONDING FIELDS OF TABLE IT_DN
   FROM VBUK INNER JOIN LIKP ON VBUK~MANDT = LIKP~MANDT  AND
                                VBUK~VBELN = LIKP~VBELN
             INNER JOIN LIPS ON VBUK~MANDT = LIPS~MANDT  AND
                                VBUK~VBELN = LIPS~VBELN
   WHERE VBUK~VBELN IN SP_DN     AND
         VBUK~WBSTK = 'A'        AND
         LIKP~VKORG IN SP_VKORG.
   IF IT_DN[] IS NOT INITIAL.
       CALL SCREEN 100.
   ELSE.
       MESSAGE TEXT-E01 TYPE 'S' DISPLAY LIKE 'E'.
       STOP.
   ENDIF.
ENDFORM.

FORM GET_DN_BILL.
   CLEAR: IT_BILL, IT_BILL[].
   SELECT VBRP~VGBEL
          VBRP~VGPOS
          VBRP~VBELN
          VBRP~POSNR
     INTO CORRESPONDING FIELDS OF TABLE IT_BILL
   FROM VBRP INNER JOIN LIKP ON VBRP~MANDT = LIKP~MANDT   AND
                                VBRP~VGBEL = LIKP~VBELN
   WHERE LIKP~VKORG IN SP_VKORG.
   IF IT_BILL[] IS NOT INITIAL.
       CALL SCREEN 100.
   ELSE.
       MESSAGE TEXT-E01 TYPE 'S' DISPLAY LIKE 'E'.
       STOP.
   ENDIF.
ENDFORM.

form select_all_entries using pf_sel.
    IF P_SO = 'X'.
        LOOP AT IT_SO.   "-- WHERE CBOX <> pf_sel.
            IT_SO-CBOX = pf_sel.
            if IT_SO-LIGHT = '3'.
                IT_SO-CBOX = ''.
            endif.
            MODIFY IT_SO.
        ENDLOOP.
    ENDIF.
    IF P_DN = 'X'.
        LOOP AT IT_DN.   "-- WHERE CBOX <> pf_sel.
            IT_DN-CBOX = pf_sel.
            if IT_DN-LIGHT = '3'.
                IT_DN-CBOX = ''.
            endif.
            MODIFY IT_DN.
        ENDLOOP.
    ENDIF.
endform.

form deal_data_so.
  CLEAR: it_save_data, it_save_data[].
  LOOP AT IT_SO WHERE CBOX = 'X'.
*   --表頭參數
    G_SO_HEADERX-UPDATEFLAG = 'U'.
    G_SO_HEADERX-TAX_CLASS2 = 'X'.
    G_SO_HEADER-TAX_CLASS2   = ''.
*   --明細參數
    CLEAR: G_SO_ITEM, G_SO_ITEM[].
    G_SO_ITEM-ITM_NUMBER   = IT_SO-POSNR.
    IF P_NCLR = 'X'.
      G_SO_ITEM-REASON_REJ   = '01'.
    ELSEIF P_YCLR = 'X'.
      G_SO_ITEM-REASON_REJ   = ''.
    ENDIF.
    APPEND G_SO_ITEM.
    CLEAR: G_SO_ITEMX, G_SO_ITEMX[].
    G_SO_ITEMX-UPDATEFLAG  = 'U'.
    G_SO_ITEMX-ITM_NUMBER  = IT_SO-POSNR.
    G_SO_ITEMX-REASON_REJ  = 'X'.
    APPEND G_SO_ITEMX.
    CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
       EXPORTING
          SALESDOCUMENT      = IT_SO-VBELN     "必需參數
        ORDER_HEADER_IN      = G_SO_HEADER               "修改表頭內
容時需要
          ORDER_HEADER_INX   = G_SO_HEADERX   "必需參數updateflag =
'U'.
       TABLES
          RETURN             = G_SO_RETURN    "返回Message參數
          ORDER_ITEM_IN      = G_SO_ITEM      "修改明細內容
          ORDER_ITEM_INX     = G_SO_ITEMX.    "修改明細內容相應字段
    READ TABLE G_SO_RETURN WITH KEY TYPE = 'E'.
    IF SY-SUBRC <> 0.
       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
               WAIT = 'X'.
       IT_SO-LIGHT = '3'.
       IT_SO-MESS  = 'OK'.
       IT_SO-CBOX  = ''.   "ok的就取消選擇
*      --SAVE DATA
       MOVE-CORRESPONDING IT_SO TO it_save_data.
       APPEND it_save_data.
       CLEAR  it_save_data.
*      --END
    ELSE.
       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
       IT_SO-LIGHT = '1'.
       IT_SO-MESS  = G_SO_RETURN-MESSAGE.
    ENDIF.
    MODIFY IT_SO.
  ENDLOOP.
  if it_save_data[] is not INITIAL.
      CASE 'X'.
        WHEN P_NCLR.   "未清且未拒絕
           insert ZTSDN from table it_save_data.
        WHEN P_YCLR.   "已清且已拒絕
           delete ZTSDN from table it_save_data.
        WHEN OTHERS.
          ...
      ENDCASE.
      if sy-subrc = 0.
          commit work.
      else.
          rollback work.
      endif.
  endif.
endform.

*---------------------------------------------
DATA: BEGIN OF IT_BDCTAB1 OCCURS 0,
         PROGRAM  LIKE BDCDATA-PROGRAM,
         DYNPRO   LIKE BDCDATA-DYNPRO,
         DYNBEGIN LIKE BDCDATA-DYNBEGIN,
         FNAM     LIKE BDCDATA-FNAM,
         FVAL     LIKE BDCDATA-FVAL,
      END OF IT_BDCTAB1.

FORM BDC_TAB USING FLAG VAR1 VAR2.
        CLEAR: IT_BDCTAB1.
        IF FLAG = 'X'.
          IT_BDCTAB1-PROGRAM      = VAR1.
          IT_BDCTAB1-DYNPRO       = VAR2.
          IT_BDCTAB1-DYNBEGIN     = 'X'.
        ELSE.
          IT_BDCTAB1-FNAM         = VAR1.
          IT_BDCTAB1-FVAL         = VAR2.
        ENDIF.
        APPEND IT_BDCTAB1.
ENDFORM.                    " BDC_TAB

FORM BDC_VL02N TABLES PF_BDCMSG USING PF_VBELN.
   REFRESH: IT_BDCTAB1, PF_BDCMSG.
   PERFORM BDC_TAB USING 'X' 'SAPMV50A' '4004'.
   PERFORM BDC_TAB USING '' 'BDC_CURSOR' 'LIKP-VBELN'.
   PERFORM BDC_TAB USING '' 'BDC_OKCODE' '/00'.
   PERFORM BDC_TAB USING '' 'LIKP-VBELN' PF_VBELN.

   PERFORM BDC_TAB USING 'X' 'SAPMV50A' '1000'.
   PERFORM BDC_TAB USING '' 'BDC_OKCODE' '=MKAL_T'.
   PERFORM BDC_TAB USING '' 'BDC_CURSOR' 'LIKP-BLDAT'.

   PERFORM BDC_TAB USING 'X' 'SAPMV50A' '1000'.
   PERFORM BDC_TAB USING '' 'BDC_OKCODE' '=POLO_T'.
   PERFORM BDC_TAB USING '' 'BDC_CURSOR' 'LIKP-BLDAT'.

   PERFORM BDC_TAB USING 'X' 'SAPMV50A' '1000'.
   PERFORM BDC_TAB USING '' 'BDC_OKCODE' '=SICH_T'.
   PERFORM BDC_TAB USING '' 'BDC_CURSOR' 'LIKP-BLDAT'.
*   PERFORM BDC_TAB USING '' '' ''.
*   PERFORM BDC_TAB USING '' '' ''.
   CALL TRANSACTION 'VL02N'  USING IT_BDCTAB1  MODE 'P' MESSAGES INTO
PF_BDCMSG.   "MODE=A可以做測試
ENDFORM.

form deal_data_dn.
DATA: LT_BDCMSG LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: LT_DN_NUMBER LIKE TABLE OF IT_DN WITH HEADER LINE.
    CLEAR: LT_DN_NUMBER, LT_DN_NUMBER[].
    LOOP AT IT_DN WHERE CBOX = 'X'.
          LT_DN_NUMBER-VBELN = IT_DN-VBELN.
          APPEND LT_DN_NUMBER.
          CLEAR  LT_DN_NUMBER.
    ENDLOOP.
    SORT LT_DN_NUMBER BY VBELN.
    DELETE ADJACENT DUPLICATES FROM LT_DN_NUMBER COMPARING VBELN.
    LOOP AT LT_DN_NUMBER.
       PERFORM BDC_VL02N TABLES LT_BDCMSG USING LT_DN_NUMBER-VBELN.
       READ TABLE LT_BDCMSG WITH KEY MSGTYP = 'S'.
       IF SY-SUBRC = 0.
           LOOP AT IT_DN WHERE VBELN = LT_DN_NUMBER-VBELN.
               IT_DN-LIGHT = '3'.
               IT_DN-MESS  = 'OK'.
               IT_DN-CBOX  = ''.   "ok的就取消選擇
               MODIFY IT_DN.
           ENDLOOP.
       ELSE.
           READ TABLE LT_BDCMSG WITH KEY MSGTYP = 'E'.
           LOOP AT IT_DN WHERE VBELN = LT_DN_NUMBER-VBELN.
               IT_DN-LIGHT = '1'.
               IT_DN-MESS  = LT_BDCMSG-MSGV2.
               MODIFY IT_DN.
           ENDLOOP.
       ENDIF.
    ENDLOOP.
endform.
*--------------------------------------
module USER_COMMAND_0100 input.
    OK_CODE = SY-UCOMM.
    CASE OK_CODE.
          WHEN 'EXIT' OR 'BACK' OR 'CANC'.
            SET SCREEN 0.
          WHEN 'SELECTALL'.
            PERFORM ALV_REFRESH100.
            perform select_all_entries using 'X'.
          WHEN 'DISELECT'.
            PERFORM ALV_REFRESH100.
            perform select_all_entries using ''.
          WHEN 'EXEC'.
            PERFORM ALV_REFRESH100.
            if P_SO = 'X'.
               perform deal_data_so.
            endif.
            if P_DN = 'X'.
               perform deal_data_dn.
            endif.
    ENDCASE.
    CLEAR OK_CODE.
endmodule.                 " USER_COMMAND_0100  INPUT


FORM GET_CELL_VALUE USING er_data_changed TYPE REF TO
cl_alv_changed_data_protocol
                    FP_ROWID FP_FNAME FP_VALUE.
     CALL METHOD er_data_changed->get_cell_value
              EXPORTING
               i_row_id    = FP_ROWID
               i_fieldname = FP_FNAME
              IMPORTING
               e_value     = FP_VALUE.
ENDFORM.
FORM MODIFY_CELL USING er_data_changed TYPE REF TO
cl_alv_changed_data_protocol
                       FP_ROWID FP_FNAME FP_VALUE.
     CALL METHOD er_data_changed->modify_cell
                  EXPORTING
                    i_row_id    = FP_ROWID
                    i_fieldname = FP_FNAME
                    i_value     = FP_VALUE.
ENDFORM.

FORM handle_data_changed USING er_data_changed TYPE REF TO
cl_alv_changed_data_protocol.
  data: wa_mod_data TYPE lvc_s_modi.
   DATA: L_VBELN LIKE LIPS-VBELN,
         L_FLAG TYPE C LENGTH 1.

   DATA: L_FOCIND TYPE C.
*IF G_REFRESH = '1'.
     IF G_ALV_CHANGE = '2'.
         G_ALV_CHANGE = '0'.
         EXIT.
     ENDIF.
     SORT er_data_changed->mt_mod_cells by row_id.
     loop at er_data_changed->mt_mod_cells into wa_mod_data.
        if wa_mod_data-fieldname EQ 'CBOX' and wa_mod_data-VALUE =
'X'.
             if P_SO = 'X'.
                 READ TABLE IT_SO INDEX wa_mod_data-row_id.
                 IF IT_SO-LIGHT = '3'.
                     PERFORM MODIFY_CELL USING er_data_changed
wa_mod_data-row_id 'CBOX' ''.
                     G_ALV_CHANGE = '1'.
                 ENDIF.
             endif.
        endif.
        if P_DN = 'X'.
                 READ TABLE IT_DN INDEX wa_mod_data-row_id.
                 L_VBELN = IT_DN-VBELN.
                 L_FLAG  = IT_DN-CBOX.
                 IF IT_DN-LIGHT = '3'.
                      PERFORM MODIFY_CELL USING er_data_changed
wa_mod_data-row_id 'CBOX' ''.
                      G_ALV_CHANGE = '1'.
                 ENDIF.
                 LOOP AT IT_DN WHERE VBELN = L_VBELN.
                       IF IT_DN-LIGHT = '3'.
                         IT_DN-CBOX = ''.
                       ELSE.
                         IF L_FLAG = 'X'.    "因為ALV與內表的變更正好
相反(慢一步)
                            IT_DN-CBOX = ''.
                         ELSE.
                            IT_DN-CBOX = 'X'.
                         ENDIF.
                       ENDIF.
                       MODIFY IT_DN.
                       G_ALV_CHANGE = '1'.
                 ENDLOOP.
        endif.
     endloop.
*     G_REFRESH = '2'.
*     CALL METHOD LC_ALV_OBJ->refresh_table_display    "All refresh
*         EXCEPTIONS
*           FINISHED = 1
*           OTHERS = 2 .

*ELSE.
*     G_REFRESH = '1'.
*ENDIF.
ENDFORM.


FORM ALV_REFRESH100.
DATA ls_stable TYPE lvc_s_stbl.
   ls_stable-row = 'X'.
   ls_stable-col = 'X'.
      CALL METHOD LC_ALV_OBJ->check_changed_data.
      CALL METHOD LC_ALV_OBJ->refresh_table_display    "All refresh
         EXPORTING
           is_stable = ls_stable
         EXCEPTIONS
           FINISHED = 1
           OTHERS = 2 .
ENDFORM.

FORM CHECK_SELECT100 USING P_CUR_ROWS.
  data: r_rows  type lvc_t_row.
      clear: r_rows, r_rows[].
      append P_CUR_ROWS to r_rows.
      CALL METHOD LC_ALV_OBJ->set_selected_rows
         EXPORTING
            IT_INDEX_ROWS            = r_rows
            IS_KEEP_OTHER_SELECTIONS = ''.
ENDFORM.

FORM EXCLUE_TB_100 CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.
  DATA: LS_EXCLUDE TYPE UI_FUNC.

  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK.
    APPEND LS_EXCLUDE TO PT_EXCLUDE.
  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_PRINT_BACK.
    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_COPY.
    APPEND LS_EXCLUDE TO PT_EXCLUDE.
  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_CUT.
    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_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_DELETE_ROW.
    APPEND LS_EXCLUDE TO PT_EXCLUDE.
ENDFORM.                    "exclue_tb_functions

FORM ALV_FIELDCAT100.
   REFRESH: IT_FIELDCAT1.
*--------------so
IF P_SO = 'X'.
   PERFORM ADD_FIELD_DES USING '' '' ''  'LIGHT' 'IT_SO' 'X' 'X' ''
'' ''
           TEXT-T00                   6 .            "
   PERFORM ADD_FIELD_DES USING '' '' 'X'  'CBOX' 'IT_SO' 'X' 'X' ''
'' ''
           TEXT-T01                   6 .      "Check
   PERFORM ADD_FIELD_DES USING '' '' ''  'VBELN' 'IT_SO' '' '' '' ''
''
           TEXT-T02                   10.      "
   PERFORM ADD_FIELD_DES USING '' '' ''  'POSNR' 'IT_SO' '' '' '' ''
''
           TEXT-T03                   10.      "
   PERFORM ADD_FIELD_DES USING '' '' ''  'MATNR' 'IT_SO' '' '' '' ''
''
           TEXT-T04                   18.      "
   PERFORM ADD_FIELD_DES USING '' '' ''  'ARKTX' 'IT_SO' '' '' '' ''
''
           TEXT-T05                   40.      "
   PERFORM ADD_FIELD_DES USING '' '' ''  'KWMENG' 'IT_SO' '' '' '' ''
''
           TEXT-T06                   15.      "
   PERFORM ADD_FIELD_DES USING '' '' ''  'MESS' 'IT_SO' '' '' '' '' ''
           TEXT-T07                   30.      "
ENDIF.
*--------------dn
IF P_DN = 'X'.
     IF P_BILL <> 'X'.
         PERFORM ADD_FIELD_DES USING '' '' ''  'LIGHT' 'IT_DN' 'X'
'X' '' '' ''
                 TEXT-T00                   6 .            "
         PERFORM ADD_FIELD_DES USING '' '' 'X'  'CBOX' 'IT_DN' 'X'
'X' '' '' ''
                 TEXT-T01                   6 .      "Check
         PERFORM ADD_FIELD_DES USING '' '' ''  'VBELN' 'IT_DN' '' ''
'' '' ''
                 TEXT-T08                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'POSNR' 'IT_DN' '' ''
'' '' ''
                 TEXT-T09                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'MATNR' 'IT_DN' '' ''
'' '' ''
                 TEXT-T04                   18.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'VGBEL' 'IT_DN' '' ''
'' '' ''
                 TEXT-T02                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'VGPOS' 'IT_DN' '' ''
'' '' ''
                 TEXT-T03                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'LFIMG' 'IT_DN' '' ''
'' '' ''
                 TEXT-T06                   15.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'MESS' 'IT_DN' '' ''
'' '' ''
                 TEXT-T07                   30.      "
     ELSE.
         PERFORM ADD_FIELD_DES USING '' '' ''  'VGBEL' 'IT_BILL' ''
'' '' '' ''
                 TEXT-T08                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'VGPOS' 'IT_BILL' ''
'' '' '' ''
                 TEXT-T09                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'VBELN' 'IT_BILL' ''
'' '' '' ''
                 TEXT-T10                   10.      "
         PERFORM ADD_FIELD_DES USING '' '' ''  'POSNR' 'IT_BILL' ''
'' '' '' ''
                 TEXT-T11                   10.      "
     ENDIF.
ENDIF.
ENDFORM.


FORM ADD_FIELD_DES USING L_TYPE      TYPE C
                         L_EDIT_MASK TYPE C
                         L_EDIT      TYPE C
                         L_FIELDNAME TYPE C
                         L_TABNAME   TYPE C
                         L_KEY       TYPE C
                         L_CHECKBOX  TYPE C
                         L_F4        TYPE C
                         L_REF_FLD   TYPE C
                         L_REF_TAB   TYPE C
                         L_SELTEX_L  TYPE C
                         L_OUTPUTLEN TYPE I.

  CLEAR TY_FIELDCAT.
  TY_FIELDCAT-EDIT_MASK  = L_EDIT_MASK.
  TY_FIELDCAT-EDIT       = L_EDIT.
  TY_FIELDCAT-FIELDNAME  = L_FIELDNAME.  "must upper case
  TY_FIELDCAT-TABNAME    = L_TABNAME.    "internal table name
  TY_FIELDCAT-KEY        = L_KEY.        "column with key-color AND
frozen
  TY_FIELDCAT-CHECKBOX   = L_CHECKBOX.   "the column is checkbox
  TY_FIELDCAT-F4AVAILABL = L_F4.
  TY_FIELDCAT-REF_FIELD  = L_REF_FLD.
  TY_FIELDCAT-REF_TABLE  = L_REF_TAB.
  TY_FIELDCAT-COLTEXT    = L_SELTEX_L.
  TY_FIELDCAT-SELTEXT    = L_SELTEX_L.
  TY_FIELDCAT-OUTPUTLEN  = L_OUTPUTLEN.
   APPEND TY_FIELDCAT TO IT_FIELDCAT1.
ENDFORM.                    "SUB_FIELD_DES

 

FORM OUTPUT_ALV100 TABLES PF_TABLE.
 IF G_CONTAINER IS INITIAL.
      CREATE OBJECT  G_CONTAINER
        EXPORTING
          CONTAINER_NAME = 'G_CONTAINER'.
      CREATE OBJECT LC_ALV_OBJ
      EXPORTING
        i_parent =  G_CONTAINER.
      create object lc_alv_rec_obj.
      SET HANDLER   lc_alv_rec_obj->handle_button_click FOR
LC_ALV_OBJ.
      SET HANDLER   lc_alv_rec_obj->handle_data_changed FOR
LC_ALV_OBJ.
      SET HANDLER   lc_alv_rec_obj->HANDLE_DATA_CHANGED_FINISHED FOR
LC_ALV_OBJ.

      PERFORM ALV_FIELDCAT100.
      PERFORM EXCLUE_TB_100 CHANGING LT_EXCLUDE100.
      L_VAR100 = SY-REPID.   "Layout fo report
*      GS_LAYOUT100-CWIDTH_OPT = 'X'.    "auto fix to width
      GS_LAYOUT100-EXCP_FNAME = 'LIGHT'.
      IF P_DN = 'X' AND P_BILL = 'X'.
        GS_LAYOUT100-EXCP_FNAME = ''.
      ENDIF.
      CALL METHOD LC_ALV_OBJ->set_table_for_first_display
        EXPORTING
          IS_VARIANT           = L_VAR100
          IS_LAYOUT            = GS_LAYOUT100
          I_SAVE               = 'A'
          IT_TOOLBAR_EXCLUDING = LT_EXCLUDE100
        CHANGING
          it_outtab             = PF_TABLE[]
          IT_FIELDCATALOG       = IT_FIELDCAT1[].
      CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
        EXPORTING
          CONTROL = LC_ALV_OBJ.
      CALL METHOD LC_ALV_OBJ->REGISTER_EDIT_EVENT
        EXPORTING
          I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
      CALL METHOD LC_ALV_OBJ->REGISTER_EDIT_EVENT
        EXPORTING
          i_event_id = cl_gui_alv_grid=>mc_evt_modified.   "auto
refresh(錄入失去焦點時)
 ELSE.
   PERFORM ALV_REFRESH100.
 ENDIF.
 "call method LC_ALV_OBJ->refresh_table_display.
ENDFORM.
*&-------------------------------------------------------------------
--*
*&      Module  STATUS_0100  OUTPUT
*&-------------------------------------------------------------------
--*
*       text
*--------------------------------------------------------------------
--*
module STATUS_0100 output.
DATA:  rt_extab TYPE slis_t_extab.
   clear: rt_extab, rt_extab[].
  IF P_DN = 'X' AND P_BILL = 'X'.
      APPEND 'EXEC' TO rt_extab.
      APPEND 'DISELECT' TO rt_extab.
      APPEND 'SELECTALL' TO rt_extab.
  ENDIF.
  SET PF-STATUS 'ZPF_STATUS100' EXCLUDING rt_extab.
  SET TITLEBAR 'Z_SO'.
  CASE 'X'.
    WHEN P_SO.
       PERFORM OUTPUT_ALV100 TABLES IT_SO.
    WHEN P_DN.
       if P_BILL <> 'X'.
           PERFORM OUTPUT_ALV100 TABLES IT_DN.
       else.
           PERFORM OUTPUT_ALV100 TABLES IT_BILL.
       endif.
    WHEN OTHERS.
       ...
  ENDCASE.
endmodule.                 " STATUS_0100  OUTPUT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章