ALV

作者: 聂落尘 | 来源:发表于2023-07-02 07:42 被阅读0次
*--------------------声明变量
TYPE-POOLS: slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, " 存储fieldcat的内表
      wa_fieldcat TYPE slis_fieldcat_alv,
      ls_layout   TYPE slis_layout_alv, "ALV格式控制的结构体
      lv_colpos   TYPE int2 VALUE 1,
      lt_event    TYPE slis_t_event, " 事件的内表
      wa_event    TYPE slis_alv_event.

DATA pgm LIKE sy-repid. "当前程序名字
DATA ls_setting TYPE lvc_s_glay.

"排序数据
DATA: lt_sort TYPE slis_t_sortinfo_alv,
      wa_sort TYPE slis_sortinfo_alv.

*------------------定义内表
TYPES: BEGIN OF ty_alvshow,
         vbeln TYPE vbak-vbeln, " 销售凭证
         erdat TYPE vbak-erdat, "记录建立日期
         ernam TYPE vbak-ernam, "创建对象的人员名称
         kunnr TYPE vbak-kunnr, "售达方
         posnr TYPE vbap-posnr, " 销售凭证项目
         matnr TYPE vbap-matnr, " 物料编号
         matkl TYPE vbap-matkl, " 物料组
         zmeng TYPE vbap-zmeng, " 目标数量
         zieme TYPE vbap-zieme, " 目标数量计量单位
         werks TYPE vbap-werks, " 工厂
         lgort TYPE vbap-lgort, " 库存地点
       END OF ty_alvshow.

DATA: lt_alvshow TYPE TABLE OF ty_alvshow,
      wa_alvshow TYPE ty_alvshow.
*--------------读取数据
SELECT a~vbeln a~erdat a~ernam a~kunnr b~posnr b~matnr b~matkl b~zmeng b~zieme b~werks b~lgort
  FROM vbak AS a INNER JOIN vbap AS b ON a~vbeln = b~vbeln INTO TABLE lt_alvshow UP TO 10 ROWS.

*--------------- ALV格式控制
PERFORM form_create_layout.

*--------------- fieldcat  要显示那些列
PERFORM form_fieldcat_tab.

" 查看ALV支持的事件,用函数 REUSE_ALV_EVENTS_GET

*-----------------定义事件
PERFORM form_event.

" 排序
wa_sort-fieldname = 'ERDAT'. "对凭证日期进行排序
wa_sort-down = 'X'. "降序 如果要升序, wa_sort-up = 'X'
APPEND wa_sort TO lt_sort.
CLEAR wa_sort.

wa_sort-fieldname = 'KUNNR'.
wa_sort-up = 'X'.
APPEND wa_sort TO lt_sort.
CLEAR wa_sort.

ls_setting-edt_cll_cb = 'X'." 实现编辑单元格之后, 返回给程序编辑后的值
pgm = sy-repid.
"标题栏, 状态栏, 点击事件的实现, 可以通过it_events参数,
" 或者时单独设置I_CALLBACK_USER_COMMAND /I_CALLBACK_TOP_OF_PAGE/I_CALLBACK_PF_STATUS_SET

*----------- 显示ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
*   I_INTERFACE_CHECK  = ' '
*   I_BYPASSING_BUFFER = ' '
*   I_BUFFER_ACTIVE    = ' '
    i_callback_program = pgm  " 注意: 这个值一定要设置, 如果不设置,设置的标题不会显示
    "I_CALLBACK_PF_STATUS_SET          = 'FORM_PF_STATUS_SET'
*   I_CALLBACK_USER_COMMAND           = 'FORM_USER_COMMAND'
    "I_CALLBACK_TOP_OF_PAGE            = 'FORM_TOP_OF_PAGE'
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
*   I_STRUCTURE_NAME   =
*   I_BACKGROUND_ID    = ' '
   I_GRID_TITLE       = '试试这个标题栏,怎么显示'
    i_grid_settings    = ls_setting
    is_layout          = ls_layout
    it_fieldcat        = lt_fieldcat
*   IT_EXCLUDING       =
*   IT_SPECIAL_GROUPS  =
    it_sort            = lt_sort
*   IT_FILTER          =
*   IS_SEL_HIDE        =
*   I_DEFAULT          = 'X'
*   I_SAVE             = ' '
*   IS_VARIANT         =
    it_events          = lt_event
*   IT_EVENT_EXIT      =
*   IS_PRINT           =
*   IS_REPREP_ID       =
*   I_SCREEN_START_COLUMN             = 0
*   I_SCREEN_START_LINE               = 0
*   I_SCREEN_END_COLUMN               = 0
*   I_SCREEN_END_LINE  = 0
*   I_HTML_HEIGHT_TOP  = 0
*   I_HTML_HEIGHT_END  = 0
*   IT_ALV_GRAPHICS    =
*   IT_HYPERLINK       =
*   IT_ADD_FIELDCAT    =
*   IT_EXCEPT_QINFO    =
*   IR_SALV_FULLSCREEN_ADAPTER        =
*   O_PREVIOUS_SRAL_HANDLER           =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER           =
*   ES_EXIT_CAUSED_BY_USER            =
  TABLES
    t_outtab           = lt_alvshow
  EXCEPTIONS
    program_error      = 1
    OTHERS             = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

* se41 可以选择复制内容, 比如状态栏

*-------------FORM定义
FORM form_user_command USING r_ucomm LIKE sy-ucomm rs_selfild TYPE slis_selfield.

  DATA: wa_alvshow TYPE ty_alvshow.
  DATA temp TYPE string.

  DATA: lt_vbap TYPE TABLE OF vbap, " 要更新到表vbap的内表
        wa_vbap TYPE vbap.
  CLEAR wa_alvshow.
  CASE sy-ucomm.
    WHEN 'ZADD'.
      SELECT * FROM vbap INTO TABLE lt_vbap FOR ALL ENTRIES IN lt_alvshow WHERE vbeln = lt_alvshow-vbeln AND posnr = lt_alvshow-posnr.
      LOOP AT lt_vbap INTO wa_vbap.
        READ TABLE lt_alvshow INTO wa_alvshow WITH KEY vbeln = wa_vbap-vbeln posnr = wa_vbap-posnr.
        IF sy-subrc = 0.
          wa_vbap-zmeng = wa_alvshow-zmeng.
          MODIFY lt_vbap FROM wa_vbap.
        ENDIF.
        CLEAR wa_alvshow.
        CLEAR wa_vbap.
      ENDLOOP.
      UPDATE vbap FROM TABLE lt_vbap. " 数据库表更新
      IF sy-subrc = 0.
        COMMIT WORK. " 数据库提交
        MESSAGE '数据保存成功' TYPE 'I'.
      ELSE.
        ROLLBACK WORK.
        MESSAGE '保存失败' TYPE 'I'.
      ENDIF.
    WHEN 'ZSAVE'.
      MESSAGE '点击了保存' TYPE 'I'.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

" REUSE_ALV_COMMENTARY_WRITE
FORM form_top_of_page.
  DATA: lv_commentary TYPE slis_t_listheader,
        wa_commentary TYPE slis_listheader.
  wa_commentary-typ = 'H'.
  wa_commentary-info = '销售凭证清单'.
  APPEND wa_commentary TO lv_commentary.

  wa_commentary-typ = 'A'.
  wa_commentary-info = '销售凭证清单'.
  APPEND wa_commentary TO lv_commentary.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = lv_commentary
*     I_LOGO             =
*     I_END_OF_LIST_GRID =
*     I_ALV_FORM         =
    .

  WRITE :/ 'TOP_OF_PAGE 调用'.
ENDFORM.


"FORM form_pf_status_set USING re_exta TYPE slis_extab.
" 注意这个地方类型一定要写对, 上面就是写错了,导致运行的时候报错
FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ALV01_STANDARD'.
ENDFORM.


FORM form_create_layout .
  ls_layout-zebra = 'X'. "呈现颜色交替
  ls_layout-detail_popup = 'X'. " 是否弹出详细信息窗口
  ls_layout-f2code = '&ETA'." 设置触发弹出详细信息窗口的功能码,这里是双击
  ls_layout-colwidth_optimize = 'X'." 优化列宽选项
  "LS_LAYOUT-no_vline = 'X'. "是否显示列间隔线
  ls_layout-detail_titlebar = '详细信息123'. " 设置弹出窗口标题
ENDFORM.

FORM form_fieldcat_tab.
  " 销售凭证
  PERFORM form_create_fieldcat USING 'VBELN' 'X' 'CHAR' '10' '销售凭证'.

  "凭证日期
  PERFORM form_create_fieldcat USING 'ERDAT' '' 'DATS' '8' '凭证日期'.

  "创建对象的人员名称
  PERFORM form_create_fieldcat USING 'ERNAM' '' 'CHAR' '12' '创建对象人员'.

  " 售达方
  PERFORM form_create_fieldcat USING 'KUNNR' '' 'CHAR' '10' '售达方'.

  " 销售凭证项目
  PERFORM form_create_fieldcat USING 'POSNR' '' 'NUMC' '6' '销售凭证项目'.

  " 物料编号
  PERFORM form_create_fieldcat USING 'MATNR' '' 'CHAR' '40' '物料编号'.

  " 物料组
  PERFORM form_create_fieldcat USING 'MATKL' '' 'CHAR' '9' '物料组'.

  " 目标数量
  PERFORM form_create_fieldcat USING 'ZMENG' '' 'QUAN' '13' '目标数量'.

  " 目标数量计量单位
  PERFORM form_create_fieldcat USING 'ZIEME' '' 'UNIT' '3' '目标数量计算单位'.

  " 工厂
  PERFORM form_create_fieldcat_bytable USING 'VBAP' 'WERKS'.

  " 库存地点
  PERFORM form_create_fieldcat_bytable USING 'VBAP' 'LGORT'.

ENDFORM.

FORM form_event.
  wa_event-name = 'USER_COMMAND'. " 用户响应事件
  wa_event-form = 'FORM_USER_COMMAND'.
  APPEND wa_event TO lt_event.
  CLEAR wa_event.

  wa_event-name = 'TOP_OF_PAGE'. " 显示标题
  wa_event-form = 'FORM_TOP_OF_PAGE'.
  APPEND wa_event TO lt_event.
  CLEAR wa_event.

  wa_event-name = 'PF_STATUS_SET'. " 设置GUI状态栏
  wa_event-form = 'FORM_PF_STATUS_SET'.
  APPEND wa_event TO lt_event.
  CLEAR wa_event.
ENDFORM.

FORM form_create_fieldcat USING fieldname key datatype outputlen seltextm.
  CLEAR wa_fieldcat.
  wa_fieldcat-fieldname = fieldname. " 标识 列对应的字段名称(必须要大写)
  wa_fieldcat-col_pos = lv_colpos." 列位置
  wa_fieldcat-key = key. " 当前列是否是关键字
  wa_fieldcat-datatype = datatype. " 字段类型
  wa_fieldcat-outputlen = outputlen." 输出长度
  wa_fieldcat-seltext_m = seltextm." 描述
  IF fieldname EQ 'ZMENG'.
    wa_fieldcat-do_sum = 'X'. " 是否求和
    wa_fieldcat-edit = 'X'. " 是否可修改
    " 当数据可修改时,如果是小数,要指定小数位数(和显示数据保持一致), 否则输入数据后敲回车,会自动缩小
    " 如果是参考表字段,则不需要设置
    wa_fieldcat-decimals_out = 3.
  ENDIF.
  APPEND wa_fieldcat TO lt_fieldcat.
  lv_colpos = lv_colpos + 1.
ENDFORM.

FORM form_create_fieldcat_bytable USING tabname fieldname.
  CLEAR wa_fieldcat.
  " 字段参考的表名, 表名一定要大写
  wa_fieldcat-ref_tabname = tabname.
  wa_fieldcat-col_pos = lv_colpos.
  wa_fieldcat-fieldname = fieldname.
  APPEND wa_fieldcat TO lt_fieldcat.
  lv_colpos = lv_colpos + 1.
ENDFORM.

相关文章

  • SAP ABAP ALV报表(一)

    01 ALV报表功能介绍02 ALV报表开发步骤03 ALV报表开发实战 01 ALV报表功能介绍 AVL报表是A...

  • ABAP-ALV-GRID

    ALV简单实例 ABAP ALV使用实例---sflight航班表及其效果界面ABAP:ALV List报表最后页...

  • SAP ABAP ALV报表(二)

    确定ALV的标题栏 确定ALV的状态栏 确定ALV的按钮 确定ALV按钮的响应事件 添加热点 添加热点的响应事件 ...

  • 《SAP ABAP 开发指南》第七单元前五课时

    程序源代码 选择屏幕 Write Reuse alv ALV Grid SALV

  • abap alv 事件

    alv 事件的创建使用 在实际开发中经常要用到 事件 event,在各个alv中的具体使用如下 REUSE_ALV...

  • ALV的控件使用

    1简单控件创建ALV报表: 实现: 自定义输字段ALV控件实例: 以下输出结果: 在屏幕上建立ALV控件,使用SC...

  • SAP ABAP ALV报表(三)

    ALV报表 获取表数据 ALV报表 添加默认值 设置ALV字段可修改 一、获取表数据 1.准备后台表: 学员信息表...

  • ALV usercommand

    http://tieba.baidu.com/p/2737510394创建alv grid时,有时需要修改alv中...

  • ALV样式定义

    在写好的ALV样式中加入样式,前提你的ALV是可以正确运行的,如果ALV样式有问题,移步于上一篇文章。定义样式首先...

  • ALV( SAP List Viewer)报表

    ALV简介 ALV-ABAP List Viewer,也称SAP List Viewer,这里姑且称之为ABA...

网友评论

      本文标题:ALV

      本文链接:https://www.haomeiwen.com/subject/qftaydtx.html