Code20080715 - ooxxvv/MySAPnotes GitHub Wiki

Code20080715

  • ALV 的範例程式,包含 Call function 及 Class 的方式。

Code

***********************************************************************
**Program name: ZJOEYTEST
**Description : 實作 ALV  (By function, By Class) 的簡單範例
**Date/Author : 2008.07.15 / Joey Lee
***********************************************************************
** M O D I F I C A T I O N  L O G
***********************************************************************
** ChangeDate  Programmer  Request     Description
** ==========  ==========  ==========  ==================
** 2008.07.15  Joey Lee                New Program
***********************************************************************
REPORT  zjoeytest NO STANDARD PAGE HEADING
                       LINE-SIZE 135
                       LINE-COUNT 58(2).
*======================================================================
*================================================Global Date declear===
*-----------引用在SAP上預設的 Data Pool,已預先定義好所有ALV所需之變數型態
TYPE-POOLS: slis.
*-----For data
DATA: BEGIN OF it_vbap OCCURS 0,
        vbeln           LIKE vbap-vbeln,
        matnr           LIKE vbap-matnr,
        matkl           LIKE vbap-matkl,
   END OF it_vbap.

*======================================================================
*=======================================================Initial Data===
*LOAD-OF-PROGRAM
*INITIALIZATION.

*======================================================================
*============================================Selection Screen Events===
*AT SELECTION-SCREEN OUTPUT.
*AT SELECTION-SCREEN ON VALUE-REQUEST for <para/sel-opt>.
*AT SELECTION-SCREEN.
*AT SELECTION-SCREEN ON <f>.
*AT SELECTION-SCREEN ON BLOCK <>.

*======================================================================
*======================================================Report Events===
START-OF-SELECTION.
*-Get data
  SELECT vbeln posnr matnr matkl kwmeng vrkme
    INTO CORRESPONDING FIELDS OF TABLE it_vbap
    FROM vbap UP TO 100 ROWS
    WHERE vbeln NE space.

**-Output by function
*  PERFORM output_alv_function.

*-Output by class
  PERFORM output_alv_class.

END-OF-SELECTION.

*======================================================================
*========================================================List Events===
*TOP-OF-PAGE.
*END-OF-PAGE.
*AT LINE-SELECTION.
*TOP-OF-PAGE DURING LINE-SELECTION.
*AT USER-COMMAND.

*======================================================================
*========================================================Subroutines===
*&--------------------------------------------------------------------*
*&      Form  user_command
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM user_command USING ucomm    LIKE sy-ucomm
                        selfield TYPE slis_selfield.
*-User按鍵處理事件的程式碼
  READ TABLE it_vbap INDEX selfield-tabindex.
  CHECK sy-subrc = 0.

  CASE ucomm.
    WHEN '&IC1'.
      CASE selfield-sel_tab_field.
        WHEN 'IVBAP-VBELN'.
          SET PARAMETER ID 'AUN' FIELD it_vbap-vbeln.
          CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
        WHEN 'IVBAP-MATNR'.
          SET PARAMETER ID 'MAT' FIELD it_vbap-matnr.
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
      ENDCASE.

  ENDCASE.

ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  output_alv_function
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM output_alv_function .
*-Internal tabel for ALV content
  DATA: BEGIN OF lt_alv OCCURS 0.
          INCLUDE STRUCTURE it_vbap.
  DATA:   rowcolors(4)    TYPE c,           "用來儲存單一列在 ALV 中的底色
          cellcolors      TYPE lvc_t_scol,  "用來儲存單一欄位在 ALV 中的底色
        END OF lt_alv.
*-For ALV setting
  DATA: fieldcat      TYPE slis_t_fieldcat_alv,
        fieldcat_ln   LIKE LINE OF fieldcat,
        sortcat       TYPE slis_t_sortinfo_alv,
        sortcat_ln    LIKE LINE OF sortcat,
        lw_layout     TYPE slis_layout_alv,
        pgm           LIKE sy-repid,
        col_pos       TYPE i.
  DATA: lw_cellcolors TYPE lvc_s_scol.

  IF it_vbap[] IS INITIAL.
    EXIT.
  ENDIF.

  LOOP AT it_vbap.
    MOVE-CORRESPONDING it_vbap TO lt_alv.

    IF sy-tabix EQ 10.
*-----設定單一行的底色
      lt_alv-rowcolors       = 'C100'.
*-----設定單一欄位的底色
      lw_cellcolors-fname     = 'MATKL'.
      lw_cellcolors-color-col = '6'.
      lw_cellcolors-color-int = '0'.
      lw_cellcolors-color-inv = '1'.
      lw_cellcolors-nokeycol  = ''.
      APPEND lw_cellcolors TO lt_alv-cellcolors.
    ENDIF.

    APPEND lt_alv.
    CLEAR lt_alv.
  ENDLOOP.

*-將底色設定的 Fieldname 存入設定中
  lw_layout-info_fieldname   = 'ROWCOLORS'.
  lw_layout-coltab_fieldname = 'CELLCOLORS'.

*------設定要顯示欄位的相關屬性 ( Field Catalogs )
  ADD 1 TO col_pos.
*------------在 Dictionary 中所關連的 TABLE 名稱
  fieldcat_ln-ref_tabname = 'VBAP'.
*------------在 ALV 中表格的名稱
  fieldcat_ln-tabname     = 'LT_ALV'.
*------------在 ALV 中欄位的名稱 field name
  fieldcat_ln-fieldname   = 'VBELN'.
*------------是否為 key
  fieldcat_ln-key         = 'X'.
*------------是否要計算總合
  fieldcat_ln-do_sum      = space.
*------------欄位排列的順序
  fieldcat_ln-col_pos     = col_pos.
*------------是否要隱藏此欄位
  fieldcat_ln-no_out      = space.
*------------指定此欄位的 quantity (在 Internal Table 中的名稱)
  fieldcat_ln-qfieldname  = space.
*------------此欄位是否要改變滑鼠游標
  fieldcat_ln-hotspot     = 'X'.
  APPEND fieldcat_ln TO fieldcat.

  ADD 1 TO col_pos.
  fieldcat_ln-ref_tabname = 'VBAP'.
  fieldcat_ln-tabname     = 'LT_ALV'.
  fieldcat_ln-fieldname   = 'MATNR'.
  fieldcat_ln-key         = space.
  fieldcat_ln-do_sum      = space.
  fieldcat_ln-col_pos     = col_pos.
  fieldcat_ln-no_out      = space.
  fieldcat_ln-qfieldname  = space.
  fieldcat_ln-hotspot     = space.
  APPEND fieldcat_ln TO fieldcat.

  ADD 1 TO col_pos.
  fieldcat_ln-ref_tabname = 'VBAP'.
  fieldcat_ln-tabname     = 'LT_ALV'.
  fieldcat_ln-fieldname   = 'MATKL'.
  fieldcat_ln-key         = space.
  fieldcat_ln-do_sum      = space.
  fieldcat_ln-col_pos     = col_pos.
  fieldcat_ln-no_out      = space.
  fieldcat_ln-qfieldname  = space.
  fieldcat_ln-hotspot     = space.
  APPEND fieldcat_ln TO fieldcat.

*------設定預設的排序方式
*------------排列的優先順序
  sortcat_ln-spos      = '1'.
*------------要排列的欄位(Internal Table)
  sortcat_ln-fieldname = 'MATNR'.
*------------是否昇冪
  sortcat_ln-up        = 'X'.
*------------是否降冪
  sortcat_ln-down      = space.
*------------此欄位是否要小計
  sortcat_ln-subtot    = 'X'.
  APPEND sortcat_ln TO sortcat.

*------呼叫ALV Function Module
  pgm = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = pgm
      i_callback_user_command = 'USER_COMMAND'
      it_fieldcat             = fieldcat
      it_sort                 = sortcat
      i_save                  = 'A'
      is_layout               = lw_layout
    TABLES
      t_outtab                = lt_alv
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.

  IF sy-subrc <> 0.
    EXIT.
  ENDIF.

ENDFORM.                    " output_alv_function
*&---------------------------------------------------------------------*
*&      Form  output_alv_class
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM output_alv_class .
*--------For ALV content
  TYPES: BEGIN OF ty_alv.
          INCLUDE STRUCTURE it_vbap.
  TYPES:  cellcolors TYPE lvc_t_scol,  "用來儲存單一欄位在 ALV 中的底色
         END OF ty_alv.
  DATA: lt_alv TYPE TABLE OF ty_alv,
        lw_alv TYPE ty_alv.
*-------ALV 相關變數
  DATA: gr_table      TYPE REF TO cl_salv_table,
        gr_functions  TYPE REF TO cl_salv_functions,
        gr_display    TYPE REF TO cl_salv_display_settings,
        l_field_name  TYPE lvc_fname,
        l_field_s     TYPE scrtext_s,
        l_field_m     TYPE scrtext_m,
        l_field_l     TYPE scrtext_l,
        l_title       TYPE lvc_title,
        gr_columns    TYPE REF TO cl_salv_columns_table,
        gr_column     TYPE REF TO cl_salv_column_table,
        lr_layout     TYPE REF TO cl_salv_layout,
        ls_layout_key TYPE salv_s_layout_key,
        lw_cellcolors TYPE lvc_s_scol,
        lw_color      TYPE lvc_s_colo.

  IF it_vbap[] IS INITIAL.
    EXIT.
  ENDIF.

  LOOP AT it_vbap.
    MOVE-CORRESPONDING it_vbap TO lw_alv.

    CLEAR lw_cellcolors.
    IF sy-tabix EQ 10.
*-----設定單一欄位的底色
      lw_cellcolors-fname     = 'MATKL'.
      lw_cellcolors-color-col = '6'.
      lw_cellcolors-color-int = '0'.
      lw_cellcolors-color-inv = '1'.
      lw_cellcolors-nokeycol  = ''.
      APPEND lw_cellcolors TO lw_alv-cellcolors.
    ELSEIF sy-tabix EQ 12.
*-----設定整列變色
      lw_cellcolors-color-col = '6'.
      lw_cellcolors-color-int = '0'.
      lw_cellcolors-color-inv = '1'.
      lw_cellcolors-nokeycol  = ''.
      APPEND lw_cellcolors TO lw_alv-cellcolors.
    ENDIF.

    APPEND lw_alv TO lt_alv.
    CLEAR lw_alv.
  ENDLOOP.

*-設定主要資料的 Internal Table
  cl_salv_table=>factory( IMPORTING r_salv_table = gr_table
                          CHANGING  t_table = lt_alv ).

*-設定工具列
  gr_functions = gr_table->get_functions( ).
  gr_functions->set_all( abap_true ).
  lr_layout = gr_table->get_layout( ).
  ls_layout_key-report = sy-repid.
  lr_layout->set_key( ls_layout_key ).
  lr_layout->set_default( abap_true ).
  lr_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).

*-設定最上方的標題
  gr_display = gr_table->get_display_settings( ).
  gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
  l_title = 'Title by Program'.
  gr_display->set_list_header( l_title ).

*-設定欄位屬性
  l_field_s = 'VBELN-Title'.
  l_field_m = 'VBELN-Title'.
  l_field_l = 'VBELN-Title'.

  gr_columns = gr_table->get_columns( ).
  gr_column ?= gr_columns->get_column( 'VBELN' ).
  gr_column->set_short_text( l_field_s ).
  gr_column->set_medium_text( l_field_m ).
  gr_column->set_long_text( l_field_l ).
*-設定顏色
*------------設定顏色欄位的名稱(列或儲存格時)
  gr_columns->set_color_column( 'CELLCOLORS' ).

*------------設定顏色(整行時)
  gr_column ?= gr_columns->get_column( 'VBELN' ).
  lw_color-col = '6'.
  lw_color-int = '0'.
  lw_color-inv = '1'.
  gr_column->set_color( lw_color ).

*-秀出 ALV 報表
  gr_table->display( ).

ENDFORM.                    " output_alv_class


*======================================================================