ALV案例

1.首頁

INCLUDE Z_MAT_TOP.   "数据定义
INCLUDE Z_YY_E01.       "选择事件
INCLUDE Z_YY_F01.       "子例程

2.数据定义

*&---------------------------------------------------------------------*
*& Include          Z_MAT_TOP
*&---------------------------------------------------------------------*
TABLES:mara , makt.

* reuse_alv_list_display用法的命名
DATA: "lt_fieldcat TYPE slis_t_fieldcat_alv, " 列名内表宏
      ls_fieldcat TYPE slis_fieldcat_alv,   "  结构  列名工作区、
      ls_layout   TYPE slis_layout_alv.     "   结构  alv全局属性

*定義結構
TYPES: BEGIN OF ty_mat,
*         icon_mark type icon-internal,
*         sel(1),
*         ckbox as checkbox,
         status type char04,     "状态
         matnr TYPE mara-matnr,
         maktx TYPE makt-maktx,
         mtart TYPE mara-mtart,
         matkl TYPE mara-matkl,
         ernam TYPE mara-ernam,
         ersda TYPE mara-ersda,
         laeda TYPE mara-laeda,
         aenam TYPE mara-aenam,
         lvorm TYPE mara-lvorm,
       END OF ty_mat.

DATA: lt_mat  TYPE TABLE OF ty_mat,
      wa_mat  TYPE ty_mat,
      lt_mat1 TYPE TABLE OF ty_mat,
      wa_mat1 TYPE ty_mat,
      git_mot TYPE TABLE OF ty_mat,
      wa_mot  TYPE  ty_mat.
include <icon>.
constants: light_r LIKE icon-internal VALUE '@0A@',"红灯
           light_y LIKE icon-internal VALUE '@09@',"黄灯
           light_g  LIKE icon-internal VALUE '@08@',"绿灯
           light_non LIKE icon-internal VALUE '@EB@'."全熄灭

DATA is_variant LIKE disvariant.
DATA: ls_setting TYPE lvc_s_glay.
DATA: headdata    LIKE bapimathead.
DATA: maktdesc  TYPE TABLE OF bapi_makt WITH HEADER LINE.
DATA: return       TYPE bapiret2,
      g_no_changes TYPE c.
DATA: lt_sval TYPE TABLE OF sval WITH HEADER LINE,
      ls_sval TYPE sval.
DATA l_return_code TYPE C.
 DATA: lr_grid TYPE REF TO cl_gui_alv_grid.


 SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-t01.
  SELECT-OPTIONS:
                      cons1    FOR mara-matnr,         "'物料符号
                      cons2    FOR mara-mtart ,        "'物料类型'
                      cons3    FOR mara-matkl.         "'物料组'
SELECTION-SCREEN END OF BLOCK bk1.

3.选择事件

INITIALIZATION.

AT SELECTION-SCREEN.

START-OF-SELECTION.

  PERFORM display_alv.

END-OF-SELECTION.

4.function

FORM display_alv.

*抓取数据资料
  SELECT *  FROM mara AS a INNER JOIN makt AS b ON a~matnr = b~matnr  INTO  CORRESPONDING FIELDS OF TABLE  lt_mat UP TO 50 ROWS
    WHERE  b~spras =  sy-langu
  AND a~matnr IN cons1 AND a~matkl IN cons3 AND a~mtart IN cons2 .
  IF lt_mat IS NOT INITIAL.
    lt_mat1[] = lt_mat.
  ENDIF.


*alv定義報表格式
  DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.


  DEFINE fieldcatset.       " 定义宏来设置fieldcat属性
    CLEAR fieldcat.
    fieldcat-fieldname = &1.
    fieldcat-seltext_l = &2.
*    fieldcat-outputlen = &3.
    fieldcat-edit = &4.
    fieldcat-no_out = &3.
    fieldcat-icon = 'X'.   " 图标功能
    APPEND fieldcat.
  END-OF-DEFINITION.

  fieldcatset 'STATUS'                 '状态'                  '10' 'X'.
  fieldcatset 'MATNR'                  '物料符号'              '40' ''.
  fieldcatset 'MAKTX'                  '物料描述'              '20'  'X'  .
  fieldcatset 'MTART'                   '物料类型'             '20' ''  .
  fieldcatset 'MATKL'                   '物料组'               '20' ''  .
  fieldcatset 'ERNAM'                  '物料创建人'            '20'  ''  .
  fieldcatset 'CREATE_AT_TIME'          '物料创建日期时间'      '20' ''  .
  fieldcatset 'AENAM'                   '物料修改人'                 '20' ''  .
  fieldcatset 'LAEDA'                    '物料修改日期时间'     '20' ''  .
  fieldcatset 'LVORM'                   '冻结标识'              '20' '' .

*alv 控制

  ls_setting-edt_cll_cb = 'X'. "实现编辑单元格后,返回给程序编辑后的值
  ls_layout-zebra = 'X'. "交替顏色
*  ls_layout-detail_popup = 'X'. "是否出現詳細信息窗口
*  ls_layout-detail_titlebar = '詳細信息'. "
*  ls_layout-f2code = '&ETA'. "&ETA雙擊 出現詳細信息.
  ls_layout-colwidth_optimize = 'X'. "優化列寬

*制作红绿灯
LOOP AT lt_mat into wa_mat.
  if wa_mat-matnr <= '1760'.
    wa_mat-status = '@0A@'.
    endif.
    if wa_mat-matnr > '1760' and wa_mat-matnr <= '1775'.
      wa_mat-status = '@09@'.
    endif.
       if wa_mat-matnr > '1775'.
    wa_mat-status = '@08@'.
    endif.
    modify lt_mat from wa_mat.
ENDLOOP.


* 定义事件
*ALVX
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_bypassing_buffer       = 'X'
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_top_of_page   = 'FORM_TOP_OF_PAGE'
      i_grid_title             = 'ALV TEST'
      i_grid_settings          = ls_setting     "設置保存 "实现编辑单元格后,返回给程序编辑后的值
      is_layout                = ls_layout
      it_fieldcat              = fieldcat[]
      i_default                = 'X'
      i_save                   = 'A'
      is_variant               = is_variant
    TABLES
      t_outtab                 = lt_mat
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.



FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
  DATA: lt_rows TYPE lvc_t_row WITH HEADER LINE.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.
  CALL METHOD lr_grid->check_changed_data.
  rs_selfield-refresh = 'X'.     "更新修改后的数据至内表  CASE r_ucomm.
  case r_ucomm.
      WHEN 'ZSAVE'.
        PERFORM frm_save_data.
      WHEN '&IC1'.   "
        MESSAGE 'double click!' TYPE 'S'.
        PERFORM popup_save_data. "USING rs_selfield-tabindex   rs_selfield-fieldname rs_selfield-value    USING r_ucomm rs_selfield
      WHEN  OTHERS.
    ENDCASE.

  CALL METHOD lr_grid->check_changed_data.
  rs_selfield-refresh = 'X'.     "更新修改后的数据至内表
*      lr_grid->set_frontend_layout( is_layout = ls_layout ).
"Refresh ALV display
*      lr_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = 'X'  col = 'X' ) ).


ENDFORM.

FORM set_pf_status  USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'.  "SE37 --> SALV --> SE41  SAPLSALV
ENDFORM.

**调用自定义按钮事件 刷新alV

*&---------------------------------------------------------------------*
*& Form popup_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM popup_save_data.     "USING p_tabindex p_fieldname p_value   USING  r_ucomm rs_selfield

*DATA FIELDS TYPE STANDARD TABLE OF SVAL.
*           matnr TYPE mara-matnr,
*         maktx TYPE makt-maktx,
*         mtart TYPE mara-mtart,

  CLEAR: ls_sval,lt_sval,lt_sval[].
  ls_sval-tabname = 'MARA'.
  ls_sval-fieldname = 'MATNR'. "'MTART '. "  AKTX
*  ls_sval-value = p_value.
  ls_sval-field_obl = 'X'.
  APPEND ls_sval TO lt_sval.
  CLEAR ls_sval.
  ls_sval-tabname = 'MAKT'.
  ls_sval-fieldname = 'MAKTX'.
  ls_sval-field_obl = 'X'.
  APPEND ls_sval TO lt_sval.
  CLEAR ls_sval.
  ls_sval-tabname = 'MARA'.
  ls_sval-fieldname = 'MTART'.
  ls_sval-field_obl = 'X'.
  APPEND ls_sval TO lt_sval.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
*     NO_VALUE_CHECK  = ' '
      popup_title     = '物料描述'
*     START_COLUMN    = '5'
*     START_ROW       = '5'
    IMPORTING
      returncode      = l_return_code
    TABLES
      fields          = lt_sval
    EXCEPTIONS
      error_in_fields = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
  CLEAR headdata.
  READ TABLE lt_sval WITH KEY fieldname = 'MATNR'.
  IF sy-subrc = 0.
    headdata-material = lt_sval-value.
    headdata-basic_view = 'X'.
  ENDIF.
  CLEAR maktdesc[].
  READ TABLE lt_sval WITH KEY fieldname = 'MAKTX'.
  IF sy-subrc = 0.
    maktdesc-langu = sy-langu.
    maktdesc-matL_desc = lt_sval-value.

    APPEND maktdesc TO maktdesc[].
  ENDIF.
  READ TABLE lt_sval WITH KEY fieldname = 'MTART'.
  IF sy-subrc = 0.
    headdata-matl_type = lt_sval-value.
    headdata-basic_view = 'W'.
  ENDIF.
* 数据回写
  IF l_return_code <> 'A'.  " A 取消
*  CLEAR return.
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
      EXPORTING
        headdata            = headdata
      IMPORTING
        return              = return
      TABLES
        materialdescription = maktdesc.
    IF return-type NE 'E'.
      MESSAGE 'ok!' TYPE 'S'.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.
    WRITE : / return-type , return-message.
    MOVE  headdata-material TO wa_mat-matnr .
    MOVE  maktdesc-matL_desc TO wa_mat-maktx .
    MOVE  headdata-matl_type TO wa_mat-mtart .
    modify  lt_mat  from wa_mat transporting maktx where matnr = headdata-material .
*    update lt_mat set MAKTX = maktdesc-matL_desc
*    where matnr = headdata-material ."mtart = headdata-matl_type.

  ENDIF.

ENDFORM.

FORM frm_save_data.
  CALL FUNCTION 'CTVB_COMPARE_TABLES'
    EXPORTING
      table_old  = lt_mat1
      table_new  = lt_mat
      key_length = 40
    IMPORTING
      table_mod  = git_mot
      no_changes = g_no_changes.
  IF g_no_changes IS INITIAL.
    IF lt_mat1 IS NOT INITIAL.
      LOOP AT git_mot INTO wa_mot.
        CLEAR headdata.
        headdata-material = wa_mot-matnr.
        headdata-basic_view = 'X'.
        CLEAR maktdesc[].
        maktdesc-langu = sy-langu.
        maktdesc-matl_desc = wa_mot-maktx.
        APPEND maktdesc TO maktdesc[].
        CLEAR return.
        CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
          EXPORTING
            headdata            = headdata
          IMPORTING
            return              = return
          TABLES
            materialdescription = maktdesc.
        IF return-type NE 'E'.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.
        CLEAR wa_mot.
      ENDLOOP.
      WRITE : / return-type , return-message.
    ENDIF.
  ENDIF.
ENDFORM.



FORM form_top_of_page .
  DATA lt_commentary TYPE slis_t_listheader.
  DATA wa_commentary TYPE slis_listheader.
  wa_commentary-typ = 'H'. "標題大小 H大  S中  A小
  wa_commentary-info = '物料查询修改报表'.
  APPEND wa_commentary TO lt_commentary.
  CLEAR wa_commentary.
  wa_commentary-typ = 'S'.
  wa_commentary-info = '物料查询修改报表'.
  APPEND wa_commentary TO lt_commentary.
  CLEAR wa_commentary.

  wa_commentary-typ = 'A'.
  wa_commentary-info = '物料查询修改报表'.
  APPEND wa_commentary TO lt_commentary.
  CLEAR wa_commentary.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = lt_commentary
      i_logo             = 'Z1783_ALV'.
ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值