*--------------------声明变量
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.
网友评论