创建ALV报表

创建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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值