OOP ALV

来源:互联网 发布:易语言qq刷屏器源码 编辑:程序博客网 时间:2024/04/30 12:05

 CLASS lcl_alv_receiver DEFINITION DEFERRED.
CLASS lcl_alv_receiver DEFINITION .
   PUBLIC SECTION.
     METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
             IMPORTING e_object e_interactive.
     METHODS: handle_user_command FOR EVENT before_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_f4 FOR EVENT onf4 OF cl_gui_alv_grid
             IMPORTING e_fieldname es_row_no er_event_data et_bad_cells.
ENDCLASS.                    "lcl_event_receiver DEFINITION

CLASS lcl_alv_receiver IMPLEMENTATION.
  METHOD handle_toolbar.
*    DATA: ls_toolbar  TYPE stb_button.
*    CLEAR ls_toolbar.
*    MOVE 3 TO ls_toolbar-butn_type.
*    APPEND ls_toolbar TO e_object->mt_toolbar.
*    CLEAR ls_toolbar.
*    MOVE 'TEST_1'        TO ls_toolbar-function.
*    MOVE  ICON_CHECKED    TO ls_toolbar-icon.
*    MOVE 'TEST flight' TO ls_toolbar-quickinfo.
*    MOVE 'testing'        TO ls_toolbar-text.
*    MOVE SPACE             TO ls_toolbar-disabled.
*    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.
  METHOD handle_user_command.
     "PERFORM handle_user_command USING E_UCOMM.
  ENDMETHOD.

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

  METHOD handle_f4.
      PERFORM handle_f4_sel USING e_fieldname es_row_no er_event_data et_bad_cells.
  ENDMETHOD.
ENDCLASS.               "lcl_ALV_event_receiver

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_NAME LIKE ZSHIPPER-ZSHIPNAME,
        L_ADDR LIKE ZSHIPPER-ZSHIPADDR,
        L_ADDR2 LIKE ZSHIPPER-ZSHIPADDR2.
     CLEAR: L_NAME, L_ADDR.
     if er_data_changed is not initial.  "說明數據有變化
       G_CHANGE = 1.
     endif.
     SORT er_data_changed->mt_mod_cells by row_id.
     SORT GT_SHIP by ZSHIPID.
     loop at er_data_changed->mt_mod_cells into wa_mod_data where fieldname = 'ZSHIP'.
         if wa_mod_data-value is not initial.
              translate wa_mod_data-value to upper case.  "否則錄入小寫時讀不到名稱,地址
              read table GT_SHIP with key zshipid = wa_mod_data-value binary search.
              if sy-subrc = 0.
                 L_NAME   = GT_SHIP-ZSHIPNAME.
                 L_ADDR   = GT_SHIP-ZSHIPADDR.
                 L_ADDR2  = GT_SHIP-ZSHIPADDR2.
              endif.
         endif.
         CALL METHOD er_data_changed->modify_cell
            EXPORTING
               i_row_id    = wa_mod_data-row_id
               i_fieldname = 'ZNAME'
               i_value     = L_NAME.
         CALL METHOD er_data_changed->modify_cell
            EXPORTING
               i_row_id    = wa_mod_data-row_id
               i_fieldname = 'ZADDR'
               i_value     = L_ADDR.
         CALL METHOD er_data_changed->modify_cell
            EXPORTING
               i_row_id    = wa_mod_data-row_id
               i_fieldname = 'ZADDR2'
               i_value     = L_ADDR2.
     endloop.
ENDFORM.

FORM handle_f4_sel USING e_fieldname   TYPE lvc_fname
                         es_row_no     TYPE lvc_s_roid
                         er_event_data TYPE REF TO cl_alv_event_data
                         et_bad_cells  TYPE lvc_t_modi.
  DATABEGIN OF return_tab OCCURS 0 .
          INCLUDE STRUCTURE ddshretval .
  DATAEND OF return_tab.
  FIELD-SYMBOLS: <lt_f4> TYPE lvc_t_modi.
  DATA: ls_f4 TYPE lvc_s_modi.
*     (1)ZSHIP
      if e_fieldname = 'ZSHIP'.
         if GT_SHIP[] is initial.
             MESSAGE TEXT-E05 TYPE 'I' DISPLAY LIKE 'W'.
             EXIT.
         endif.
         CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
           EXPORTING
             retfield        = e_fieldname
             value_org       = 'S'
           TABLES
             value_tab       = GT_SHIP[]
             return_tab      = return_tab
           EXCEPTIONS
             parameter_error = 1
             no_values_found = 2
             OTHERS          = 3.
         ASSIGN er_event_data->m_data->* TO <lt_f4>.
         IF NOT return_tab IS INITIAL.
           ls_f4-fieldname = e_fieldname.
           ls_f4-row_id = es_row_no-row_id.
           ls_f4-value = return_tab-fieldval.
           APPEND ls_f4 TO <lt_f4>.
           clear: ls_f4.
           read table GT_SHIP with key ZSHIPID = return_tab-fieldval.
           ls_f4-fieldname = 'ZNAME'.
           ls_f4-row_id = es_row_no-row_id.
           ls_f4-value = GT_SHIP-ZSHIPNAME.
           APPEND ls_f4 TO <lt_f4>.
           clear: ls_f4.
           ls_f4-fieldname = 'ZADDR'.
           ls_f4-row_id = es_row_no-row_id.
           ls_f4-value = GT_SHIP-ZSHIPADDR.
           APPEND ls_f4 TO <lt_f4>.
           clear: ls_f4.
         ENDIF .
      endif.
*     (2)ZBILL
      databegin of L_IN occurs 0,
              vbeln like vbfa-vbeln,
            end of L_IN.
      if e_fieldname = 'ZBILL'.
         clear: L_IN, L_IN[].
         read table it_all index es_row_no-row_id.
         loop at GT_INVO where vbelv = it_all-vbeln  and
                               posnv = it_all-posnr.
             L_IN-vbeln = GT_INVO-vbeln.
             append L_IN.
             clear  L_IN.
         endloop.
         if L_IN[] is initial.
             MESSAGE TEXT-E05 TYPE 'I' DISPLAY LIKE 'W'.
             EXIT.
         endif.
         CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
           EXPORTING
             retfield        = e_fieldname
             value_org       = 'S'
           TABLES
             value_tab       = L_IN[]
             return_tab      = return_tab
           EXCEPTIONS
             parameter_error = 1
             no_values_found = 2
             OTHERS          = 3.
         ASSIGN er_event_data->m_data->* TO <lt_f4>.
         IF NOT return_tab IS INITIAL.
           ls_f4-fieldname = e_fieldname.
           ls_f4-row_id = es_row_no-row_id.
           ls_f4-value = return_tab-fieldval.
           APPEND ls_f4 TO <lt_f4>.
           clear: ls_f4.
         ENDIF .
      endif.
      er_event_data->m_event_handled = 'X'.    "notice: necessary
ENDFORM.
*----------------------------------------------------------------------*

DATA: CC0999 TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: CCALV TYPE REF TO cl_gui_alv_grid .
DATA: g_alv_application TYPE REF TO lcl_alv_receiver.
DATA: L_LAYOUT    TYPE LVC_S_LAYO.
DATA: LT_EXCLUDE   TYPE UI_FUNCTIONS.
DATA: L_VARIANT    TYPE DISVARIANT.
 

 

  FORM EXCLUE_TB_FUNCTIONS CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.
  DATA: LS_EXCLUDE TYPE UI_FUNC.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_MAXIMUM.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_MINIMUM.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SUBTOT.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SUM.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_AVERAGE.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SORT_ASC.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SORT_DSC.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_DETAIL.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_GRAPH.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_INFO.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_VARIANT.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_URL_COPY_TO_CLIPBOARD.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CALL_XXL.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_WORD_PROCESSOR.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_PC_FILE.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_SEND.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_TO_OFFICE.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CALL_ABC.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_HTML.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_PRINT_PREV.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_VIEW_EXCEL.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_VIEW_LOTUS.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.
*  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_VIEW_GRID.
*    APPEND LS_EXCLUDE TO PT_EXCLUDE.

  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 DROP_DOWN_LIST0999.
  DATA: lt_dropdown TYPE lvc_t_drop,
        ls_dropdown TYPE lvc_s_drop.
  data: L_vendor like table of ZVENDOR049 with header line.
  clear: L_vendor, L_vendor[].
* ZPRI
  ls_dropdown-handle = '1'.
  ls_dropdown-value = 'N'.
  APPEND ls_dropdown TO lt_dropdown.
  ls_dropdown-handle = '1'.
  ls_dropdown-value = 'M'.
  APPEND ls_dropdown TO lt_dropdown.
* LIFNR
  select * into corresponding fields of table L_vendor from ZVENDOR049.
  loop at L_vendor.
     ls_dropdown-handle = '2'.
     ls_dropdown-value = L_vendor-lifnr.
     APPEND ls_dropdown TO lt_dropdown.
  endloop.
*
  CALL METHOD CCALV->set_drop_down_table
    EXPORTING
      it_drop_down = lt_dropdown.
ENDFORM.

FORM ALV_REFRESH.
      CALL METHOD CCALV->check_changed_data.
      CALL METHOD CCALV->refresh_table_display    "All refresh
         EXCEPTIONS
           FINISHED = 1
           OTHERS = 2 .
ENDFORM.

FORM ADD_FIELD_DES USING 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.
  IF L_FIELDNAME = 'ZPRI'.
      TY_FIELDCAT-DRDN_HNDL = '1'.
  ENDIF.
  IF L_FIELDNAME = 'LIFNR'.
      TY_FIELDCAT-DRDN_HNDL = '2'.
  ENDIF.
  if L_FIELDNAME = 'BRGEW' or L_FIELDNAME = 'NTGEW' or
     L_FIELDNAME = 'OKQTY' or L_FIELDNAME = 'DNQTY'.
      TY_FIELDCAT-DATATYPE = 'P'.
  endif.
  if L_FIELDNAME = 'ZROHS'.
      TY_FIELDCAT-LOWERCASE = 'X'.
  endif.
  APPEND TY_FIELDCAT TO IT_FIELDCAT.
ENDFORM.                    "SUB_FIELD_DES

FORM ALV_FIELDCAT.
   CLEAR: IT_FIELDCAT, IT_FIELDCAT[].
   PERFORM ADD_FIELD_DES USING '' 'X'  'CHECK' 'IT_ALL' '' 'X' '' '' ''
           TEXT-A01                   4 .      "Check
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZPDATE' 'IT_ALL' '' '' '' 'ERDAT' 'VBAK'
           TEXT-A02                   10.      "Date
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZPRI' 'IT_ALL' '' '' '' '' ''
           TEXT-A43                   10.      "Print(N/M)
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZBILL' 'IT_ALL' '' '' 'X' '' ''
           TEXT-A24                   10.      "Invoice
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZSHIP' 'IT_ALL' '' '' 'X' '' ''
           TEXT-A26                   10.      "shipper's ID
   PERFORM ADD_FIELD_DES USING '' ''  'ZNAME' 'IT_ALL' '' '' '' '' ''
           TEXT-A03                   15.      "shipper's name
   PERFORM ADD_FIELD_DES USING '' ''  'ZADDR' 'IT_ALL' '' '' '' '' ''
           TEXT-A04                   20.      "shipper's address
   PERFORM ADD_FIELD_DES USING '' ''  'ZADDR2' 'IT_ALL' '' '' '' '' ''
           TEXT-A52                   20.      "shipper's address 2
   if P_RAD1 = 'X'.
       PERFORM ADD_FIELD_DES USING '' ''  'VBELN' 'IT_ALL' '' '' '' '' ''
           TEXT-A05                   10.      "SO No.
   endif.
   if P_RAD2 = 'X'.
       PERFORM ADD_FIELD_DES USING '' ''  'VBELN' 'IT_ALL' '' '' '' '' ''
           TEXT-A25                   10.      "DN No.
   endif.
   PERFORM ADD_FIELD_DES USING '' ''  'POSNR' 'IT_ALL' '' '' '' '' ''
           TEXT-A06                   4 .      "DN No. 或 SO No.  <item>
   PERFORM ADD_FIELD_DES USING '' ''  'VGBEL' 'IT_ALL' '' '' '' '' ''
           TEXT-A34                   10.      "SO#
   PERFORM ADD_FIELD_DES USING '' ''  'AUART' 'IT_ALL' '' '' '' '' ''
           TEXT-A57                   4 .      "Sales Document Type
   PERFORM ADD_FIELD_DES USING '' ''  'KUNNR' 'IT_ALL' '' '' '' '' ''
           TEXT-A07                   10.      "DN No. 或 SO No.  <Customer>
   PERFORM ADD_FIELD_DES USING '' ''  'NAME1' 'IT_ALL' '' '' '' '' ''
           TEXT-A08                   40.      "Name1
   PERFORM ADD_FIELD_DES USING '' ''  'NAME2' 'IT_ALL' '' '' '' '' ''
           TEXT-A09                   40.      "Name2
   PERFORM ADD_FIELD_DES USING '' ''  'NAME3' 'IT_ALL' '' '' '' '' ''
           TEXT-A10                   40.      "Name3
   PERFORM ADD_FIELD_DES USING '' ''  'NAME4' 'IT_ALL' '' '' '' '' ''
           TEXT-A11                   40.      "Name4
   PERFORM ADD_FIELD_DES USING '' ''  'STR_SUPPL1' 'IT_ALL' '' '' '' '' ''
           TEXT-A12                   40.      "Address1
   PERFORM ADD_FIELD_DES USING '' ''  'STR_SUPPL2' 'IT_ALL' '' '' '' '' ''
           TEXT-A13                   40.      "Address2
   PERFORM ADD_FIELD_DES USING '' ''  'STR_SUPPL3' 'IT_ALL' '' '' '' '' ''
           TEXT-A14                   40.      "Address3
   PERFORM ADD_FIELD_DES USING '' ''  'LOCATION' 'IT_ALL' '' '' '' '' ''
           TEXT-A15                   40.      "Address4
   PERFORM ADD_FIELD_DES USING '' ''  'MATNR' 'IT_ALL' '' '' '' '' ''
           TEXT-A16                   15.      "DN No. 或 SO No. Material
   PERFORM ADD_FIELD_DES USING '' ''  'MTART' 'IT_ALL' '' '' '' '' ''
           TEXT-A61                   4 .      "Material Type
   PERFORM ADD_FIELD_DES USING '' 'X'  'ARKTX' 'IT_ALL' '' '' '' '' ''
           TEXT-A17                   40.      "DN No. 或 SO No. Material Desc
   PERFORM ADD_FIELD_DES USING '' 'X'  'MAKTE' 'IT_ALL' '' '' '' '' ''
           TEXT-A32                   40.      "material EN desc
   PERFORM ADD_FIELD_DES USING '' 'X'  'MAKTZ' 'IT_ALL' '' '' '' '' ''
           TEXT-A33                   40.      "material ZH desc
   PERFORM ADD_FIELD_DES USING '' 'X'  'BSTKD' 'IT_ALL' '' '' '' '' ''
           TEXT-A35                   35.      "Customer po number
   PERFORM ADD_FIELD_DES USING '' 'X'  'KDMAT' 'IT_ALL' '' '' '' '' ''
           TEXT-A18                   35.      "DN No. 或 SO No. Part#
   if P_RAD2 = 'X'.
       PERFORM ADD_FIELD_DES USING '' ''  'DNQTY' 'IT_ALL' '' '' '' 'KWMENG' 'VBAP'
           TEXT-A51                   13.      "DN No Total qty
   endif.
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZQTY' 'IT_ALL' '' '' '' 'KWMENG' 'VBAP'
           TEXT-A19                   13.      "DN No. 或 SO No. Qty
   PERFORM ADD_FIELD_DES USING '' 'X'  'GROES' 'IT_ALL' '' '' '' '' ''
           TEXT-A20                   32.      "Dimensions
   PERFORM ADD_FIELD_DES USING '' 'X'  'NTGEW' 'IT_ALL' '' '' '' '' ''
           TEXT-A21                   10.      "Net Weight
   PERFORM ADD_FIELD_DES USING '' 'X'  'BRGEW' 'IT_ALL' '' '' '' '' ''
           TEXT-A22                   12.      "Gross Weight
   PERFORM ADD_FIELD_DES USING '' 'X'  'GEWEI' 'IT_ALL' '' '' 'X' 'GEWEI' 'MARA'
           TEXT-A36                   3 .      "Weight Unit
   PERFORM ADD_FIELD_DES USING '' 'X'  'UMREZ' 'IT_ALL' '' '' '' '' ''
           TEXT-A23                   7 .      "Carton
   PERFORM ADD_FIELD_DES USING '' 'X'  'WAERK' 'IT_ALL' '' '' 'X' 'WAERK' 'VBAK'
           TEXT-A55                   5 .      "SO Currency
   PERFORM ADD_FIELD_DES USING '' 'X'  'MEINS' 'IT_ALL' '' '' 'X' 'MEINS' 'MARA'
           TEXT-A50                   3 .      "Unit
   PERFORM ADD_FIELD_DES USING '' 'X'  'LIFNR' 'IT_ALL' '' '' '' '' ''
           TEXT-A28                   10.      "Vendor number
   PERFORM ADD_FIELD_DES USING '' 'X'  'LAND1' 'IT_ALL' '' '' '' '' ''
           TEXT-A31                   3 .      "Country Key
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZREV' 'IT_ALL' '' '' '' '' ''
           TEXT-A38                   10.      "REV
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZCAV' 'IT_ALL' '' '' '' '' ''
           TEXT-A39                   10.      "Cavity
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZDEXP' 'IT_ALL' '' '' '' '' ''
           TEXT-A40                   3 .      "Date of Expiry
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZLAB1' 'IT_ALL' '' '' '' '' ''
           TEXT-A44                   60.      "Remark 1
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZLAB2' 'IT_ALL' '' '' '' '' ''
           TEXT-A45                   60.      "Remark 2
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZCKNO' 'IT_ALL' '' '' '' '' ''
           TEXT-A46                   20.      "Checking NO.
   PERFORM ADD_FIELD_DES USING '' 'X'  'ZPALL' 'IT_ALL' '' '' '' '' ''
           TEXT-A47                   20.      "Pallets
   PERFORM ADD_FIELD_DES USING '' 'X'  'CHARG' 'IT_ALL' '' '' '' '' ''
           TEXT-A48                   10.      "Batch Number
ENDFORM.

FORM GET_GT_F4.
  CLEAR: gs_f4, gt_f4, gt_f4[].
  gs_f4-fieldname = 'ZSHIP'.
  gs_f4-register = 'X'.
  gs_f4-getbefore = 'X'.
  gs_f4-chngeafter = 'X'.
  INSERT gs_f4 INTO TABLE gt_f4.
  gs_f4-fieldname = 'ZBILL'.
  gs_f4-register = 'X'.
  gs_f4-getbefore = 'X'.
  gs_f4-chngeafter = 'X'.
  INSERT gs_f4 INTO TABLE gt_f4.
ENDFORM.

FORM SUB_SELECT USING P_SEL.
   loop at it_all.
       it_all-check = P_SEL.
       modify it_all.
   endloop.
   G_CHANGE = 1.    "數據有變化
ENDFORM.

FORM CHECK_SELECT 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 CCALV->set_selected_rows
         EXPORTING
            IT_INDEX_ROWS            = r_rows
            IS_KEEP_OTHER_SELECTIONS = ''.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0999  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0999 OUTPUT.
DATA:  rt_extab TYPE slis_t_extab.
   clear: rt_extab, rt_extab[].
   if P_RAD2 <> 'X'.   "不是DN,則不能打放行條(成品)
      APPEND 'SLIP' TO rt_extab.
      APPEND 'DNBG' TO rt_extab.
   else.               "-P_RAD1='X' "只有SO,否則不能打放行條(樣板)
      APPEND 'SLIT' TO rt_extab.
      APPEND 'DNTP' TO rt_extab.
   endif.
   SET PF-STATUS 'ZGS0999' EXCLUDING rt_extab.
   SET TITLEBAR  '0999'.
   IF CC0999 IS INITIAL.
      CREATE OBJECT CC0999
        EXPORTING
          CONTAINER_NAME = 'CON999'.
      CREATE OBJECT CCALV
      EXPORTING
        i_parent = CC0999.
      create object g_alv_application.
      SET HANDLER g_alv_application->handle_f4 FOR CCALV.
*      SET HANDLER g_alv_application->handle_user_command FOR CCALV.
*      SET HANDLER g_alv_application->handle_toolbar      FOR CCALV.
      SET HANDLER g_alv_application->handle_data_changed FOR CCALV.
      PERFORM GET_GT_F4.
      CALL METHOD CCALV->register_f4_for_fields
        EXPORTING
          IT_F4 = GT_F4.
      PERFORM ALV_FIELDCAT.
      PERFORM EXCLUE_TB_FUNCTIONS CHANGING LT_EXCLUDE.
      PERFORM DROP_DOWN_LIST0999.
      L_VARIANT = SY-REPID.   "Layout fo report
      L_LAYOUT-CWIDTH_OPT = 'X'.    "auto fix to width
      CALL METHOD CCALV->set_table_for_first_display
        EXPORTING
          IS_VARIANT           = L_VARIANT
          IS_LAYOUT            = L_LAYOUT
          I_SAVE               = 'A'
          IT_TOOLBAR_EXCLUDING = LT_EXCLUDE
        CHANGING
          it_outtab             = IT_ALL[]
          IT_FIELDCATALOG       = IT_FIELDCAT[].
      CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
        EXPORTING
          CONTROL = CCALV.
      CALL METHOD CCALV->REGISTER_EDIT_EVENT
        EXPORTING
          I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
      CALL METHOD CCALV->REGISTER_EDIT_EVENT
        EXPORTING
          i_event_id = cl_gui_alv_grid=>mc_evt_modified.   "auto refresh(錄入失去焦點時)
   ENDIF.
ENDMODULE.                 " STATUS_0999  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0999  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0999 INPUT.
data: L_CHE type c length 1.
data: l_ans type c length 1.
  GG_CODE = OK_CODE.   "記憶999的TCODE,總不清除
*------------------------------------------------
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  SY-UCOMM = OK_CODE.
  CASE SAVE_OK.
    WHEN 'BACK'.
      if G_CHANGE = 1.   "數據有變化時,提示用戶是否需要保存數據
          CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
            EXPORTING
              textline1 = TEXT-P01
              titel     = TEXT-P02
            IMPORTING
              answer    = l_ans.
          if l_ans EQ 'J'.   "yes
            PERFORM ALV_REFRESH.
            PERFORM SAVE_DATA.
          elseif l_ans EQ 'N'.  "no
            FREE: CC0999, CCALV, g_alv_application.
            LEAVE TO SCREEN 0.
          endif.
      else.
          FREE: CC0999, CCALV, g_alv_application.
          LEAVE TO SCREEN 0.
      endif.
    WHEN 'ZSEL'.
      PERFORM ALV_REFRESH.
      PERFORM SUB_SELECT USING 'X'.
      PERFORM ALV_REFRESH.
    WHEN 'ZDSE'.
      PERFORM ALV_REFRESH.
      PERFORM SUB_SELECT USING ''.
      PERFORM ALV_REFRESH.
    WHEN 'ZCHE'.
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING 'SHIP' 'INVO' ''.
    WHEN 'ZSAV'.
      PERFORM ALV_REFRESH.
      PERFORM SAVE_DATA.
*   --------------------------------------------------------
    WHEN 'PACK'.     "packing list   sreen:100  smartforms:ZSF_CNPC_PACKLIST
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING 'SHIP' 'INVO' ''.
      PERFORM PACK_LIST_DATA.
    WHEN 'DNBG'.    "Delivery Note (Finished Goods)  screen:801 smartforms:ZSF_CNPC_DN
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' 'CUST'.
      PERFORM DELIVERY_NOTE.
    WHEN 'SLIP'.    "(Finished Goods) slip screen:800 smartforms:ZSLIP_049
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' 'CUST'.
      PERFORM GOODS_SLIP_LIST.
    WHEN 'DNTP'.    "Delivery Note (Template)   screen:801 smartforms:ZSF_CNPC_DN
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' 'CUST'.
      PERFORM CHECK_ORDER_TYPE USING L_CHE.   "檢查SO TYPE是否存在控制的范圍
      IF L_CHE = 'X'.
      PERFORM DELIVERY_NOTE.
      ENDIF.
    WHEN 'SLIT'.    "(Template) slip screen:800 smartforms:ZSLIP_049
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' 'CUST'.
      PERFORM CHECK_ORDER_TYPE USING L_CHE.  "檢查SO TYPE是否存在控制的范圍
      IF L_CHE = 'X'.
      PERFORM GOODS_SLIP_LIST.
      ENDIF.
    WHEN 'DNVT'.    "Vitalink delivery note screen 802 smartforms:ZSF_VTL_DN
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' 'CUST'.
      PERFORM DELIVERY_NOTE_VTL.
*   --------------------------------------------------------
    WHEN 'BTLB'.     "Batch label(M) screen:700 smartforms:ZSF_CNPC_BTLB
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
      PERFORM BATCH_M_LABEL.
    WHEN 'RELB'.     "Ext. carton(R) screen:400 smartforms:ZSF_CNPC_EXTRCAR
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
      PERFORM GET_SHOW_DIALOG USING TEXT-P04 TEXT-P02 l_ans.
      if l_ans EQ 'J'.   "yes
         PERFORM RELB_GET_SAVE_DATA USING 'RELB' G_PRINUM.
      elseif l_ans EQ 'N'.  "no
           PERFORM USER_LOCKED USING G_MAXNUM G_DIGIT G_PRINUM. "next form to check g_maxnum
         PERFORM EXT_RELB_CARTON USING G_MAXNUM G_DIGIT G_PRINUM.  "用戶更改羅輯不嚴密,G_MAXNUM值控制有問題,作用不大
      endif.
    WHEN 'NELB'.     "Ext. carton(N) screen:300 smartforms:ZSF_CNPC_EXTNCAR
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
      PERFORM GET_SHOW_DIALOG USING TEXT-P04 TEXT-P02 l_ans.
      if l_ans EQ 'J'.   "yes
         PERFORM NELB_GET_SAVE_DATA USING 'NELB' G_PRINUM.
      elseif l_ans EQ 'N'.  "no
           PERFORM USER_LOCKED USING G_MAXNUM G_DIGIT G_PRINUM. "next form to check g_maxnum
         PERFORM EXT_N_CARTON USING G_MAXNUM G_DIGIT G_PRINUM.    "用戶更改羅輯不嚴密,G_MAXNUM值控制有問題,作用不大
      endif.
*   --------------------------------------------------------
    WHEN 'MILB'.     "inner carton(M) screen:600 smartforms:ZCNPC_MILB
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
      PERFORM INNER_MILB_CARTON.
    WHEN 'NILB'.     "inner carton(N) screen:200 smartforms:ZSF_CNPC_INNCAR
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
      PERFORM INNER_N_CARTON.
    WHEN 'MCLB'.     "Per Carton(M)   screen:500 smartforms:ZSF_CNPC_CARTON
      PERFORM ALV_REFRESH.
      PERFORM CHECK_MAIN_DATA USING '' '' ''.
        PERFORM USER_LOCKED USING G_MAXNUM G_DIGIT G_PRINUM.  "next form to check g_maxnum
      PERFORM PER_M_CARTON USING G_MAXNUM G_DIGIT G_PRINUM.   "G_MAXNUM有用
    "--OTHERS
*   --------------------------------------------------------
  ENDCASE.
  CLEAR SAVE_OK.
ENDMODULE.                 " USER_COMMAND_0999  INPUT