创建ALV报表
*------第一步:声明ALV相关变量------*
TYPE-POOLS:slis.
DATA:lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
ls_filedcat TYPE slis_fieldcat_alv, "工作区
ls_layout TYPE slis_layout_alv, "ALV格式控制的结构体:layout
lt_event TYPE slis_t_event, "事件的内表
ls_event TYPE slis_alv_event. "工作区
DATA lv_colpos TYPE int2.
DATA pgm LIKE sy-repid.
DATA lt_sort TYPE slis_t_sortinfo_alv. "排序内表
DATA wa_sort TYPE slis_sortinfo_alv. "工作区
DATA ls_setting TYPE lvc_s_glay. "实现保存按钮
*------第二步:定义内表:显示作用------*
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 BEGIN OF ty_alvshow.
DATA:lt_alvshow TYPE TABLE OF ty_alvshow, "内表
wa_alvshow TYPE ty_alvshow. "工作区
*------第三步:读取数据------*
SELECT
a~vbele a~erdat a~ernam kunnr
posnr matnr matkl zmeng
zieme werks lgort
FROM vbak AS a INNER JOIN vbap AS b
ON a~vbeln = b~vbeln
INTO TABLE lt_alvshow
UP TO 15 ROWS. "固定取值
*------第四步:ALV格式控制------*
*layout
ls_layout-zebra = 'X'. "呈现颜色交替
ls_layout-detail_popup = 'X'. "是否弹出详细信息的窗口
ls_layout-detail_titlebar = '详细信息'. "设置弹出窗口的标题栏
ls_layout-f2code = '&ETA'. "设置触发弹出详细信息窗口的功能吗,这里是双击
ls_layout-colwidth_optimize = 'X'. "优化列宽选项是否设置
*fieldcat:字段清单;要显示的列
*销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = 'VBELN'. "注意字段名称
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'. "设置Key值
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '销售凭证'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*凭证日期
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'ERDAT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'DATS'.
ls_fieldcat-outputlen = '8'.
ls_fieldcat-seltext_m = '凭证日期'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*销售人
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'ERNAM'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '12'.
ls_fieldcat-seltext_m = '销售人'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*售达方
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'KUNNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '12'.
ls_fieldcat-seltext_m = '售达方'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*项目编码
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'POSNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'NUMC'.
ls_fieldcat-outputlen = '6'.
ls_fieldcat-seltext_m = '项目编码'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*物料
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '18'.
ls_fieldcat-seltext_m = '物料'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*物料组
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'MATKL'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '9'.
ls_fieldcat-seltext_m = '物料组'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*销售数量
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'ZMENG'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'QUAN'.
ls_fieldcat-outputlen = '13'.
ls_fieldcat-seltext_m = '销售数量'.
ls_fieldcat-decimals_out = 3. "当编辑数量字段时,如果是小数,要指定小数位,否则输入数据后保存,会自动缩小;如果是不可编辑状态可以不设置此项
ls_fieldcat-do_sum = 'X'. "开始就求和只需添加此列
ls_fieldcat-edit = 'X'. "修改:添加此列
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*单位
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'ZIEME'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-datatype = 'UNIT'.
ls_fieldcat-outputlen = '3'.
ls_fieldcat-seltext_m = '单位'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*工厂
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'WERKS'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*库存
lv_colpos = lv_colpos + 1.
ls_fieldcat-fieldname = 'LGORT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.
CREAT ls_fieldcat.
*------第五步:定义事件------*
ls_event-name = 'USER_COMMAND'. "用户响应事件
ls_event-form = 'FORM_USER_COMMAND'. "定义子例程
APPEND ls_event TO lt_event. "添加到内表
CLEAR ls_event.
ls_event-name = 'TOP_OF_PAGE'. "显示标题大、中、小
ls_event-form = 'FORM_TOP_OF_PAGE'.
APPEND ls_event TO lt_event.
CLEAR ls_event.
ls_event-name = 'PF_STATUS_SET'. "设置状态栏-gui-status
ls_event-form = 'FORM_PF_STATUS_SET'.
APPEND ls_event TO lt_event.
CLEAR ls_event.
*定义子例程:程序最后面
*------第六步:排序------*
wa_sort-fieldname = 'ERDAT'. "排序字段;对销售日期排序
wa_sort-down = 'X'. "down降序
APPEND wa_sort TO it_sort.
CLEAR wa_sort.
wa_sort-fieldname = 'MATNR'. "对物料排序
wa_sort-up = 'X'. "up升序
APPEND wa_sort TO it_sort.
CLEAR wa_sort.
*------第七步:显示ALV------*
*点击Pattem(模式)调用函数 使用以下参数:
ls_setting-edt_cll_cb = 'X'. "编辑单元格之后,返回给程序编辑后的值
pgm = sy-repid.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_progrm = pgm
*...
i_grid_settings = ls_setting "编辑单元格之后,返回给程序编辑后的值
is_layout = ls_layout
it_fieldcat = lt_fieldcat
it_sort = lt_sort "排序;设置变量用来传值
it_events = lt_event
*...
TABLES
t_outtab= lt_alvshow "自己定义的内表
EXCEPTIONS
program_error = 1
OTHERS = 2
IF sy-subrc <> 0.
*...
ENDIF.
*------定义子例程form------*
FORM form_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. "固定参数:USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield
DATA:lt_vbap TYPE TABLE OF vbap, "要更新到表VBAP的内表
wa_vbap TYPE vbap.
*为'添加'加入触发事件;用户功能比较少用‘IF’,多用‘CASE’
* IF r_ucomm = 'ZADD'. "ZADD为功能码
* MESSAGE '你触发了用户按钮' TYPE 'I'.
* ENDIF.
CASE r_ucomm.
WHEN 'ZADD'.
MESSAGE '你触发了用户按钮' TYPE 'I'.
WHEN 'ZSAVE'.
SELECT * FROM vbap INTO TABLE it_vbap "lt_alvshow字段如果不全通过数据库来取
FOR ALL ENTRIES IN it_alvshow
WHERE vbeln = lt_alvshow-vbeln
AND posnr = lt_alvshow-posnr.
LOOP AT lt_vbap INTO wa_vbap. "以lt_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 it_vbap FROM wa_vbap. "内表更新
ENDIF.
CLEAR wa_vabp.
CLEAR wa_alvshow.
ENDLOOP.
UPDATE vbap FROM TABLE lt_vbap. "数据库表的更新
IF sy-subrc = 0.
COMMIT WORK. "数据库提交
MESSAGE '保存成功!' TYPE 'I'.
ELSE.
ROLLBACK WORK.
MESSAGE '保存失败!' TYPE 'I'.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM.
FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'. "复制工具栏"STANDARD" ,注意是自己的状态栏名称
ENDFORM.
FORM form_top_of_page. "不需要参数
DATA: lt_commentary TYPE slis_t_listheader. "定义内表
DATA: wa_commentary TYPE slis_listheader. "定义工作区;参考的是表类型对应的结构
*赋值
wa_commentary-typ = 'H'. "指定大标题
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 = '' "写入对象标识
* I_END_OF_LIST_GRID =
* I_ALV_FORM =
ENDFORM.