*&---------------------------------------------------------------------*
*& Report YMWXBINCLUDE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT YMWXBINCLUDE.
INCLUDE YMWXBINCLUDE_TOP.
PERFORM GET_DATA_FORM.
PERFORM LAYOUT_FORM.
PERFORM FIELD_CAT_FORM.
PERFORM EVENT_WXB_FORM.
PERFORM DISPLAY_FORM.
* form 的声明 ,还是要放在后面, 否则,激活时候,就很容易出错,说变量没声明,或者无法访问等问题。
INCLUDE YMWXBINCLUDE_FORM.
*&---------------------------------------------------------------------*
*& 包含 YMWXBINCLUDE_TOP
*&---------------------------------------------------------------------*
*
*
*开发ALV的基本流程:
*第1步:声明变量定义ALV所要用到的类型池:TYPE-POOLS: SLIS 针对ALV的控制信息数据(Layout & Fieldcat)
*第2步:定义内表存放自定义数据文件的数据,以及在ALV中显示
*第3步:读取数据读取数据存放至Internal TABLE
*第4步:ALV格式控制建立ALV显示样式(layout)和显示字段清单(FIELD Catalogs)
*第5步:定义事件建立事件清单(EVENT Catalogs)
* 事件一共分为 17 种 (比如:设置标题栏的显示和隐藏,用户操作的响应等)
*第6步:显示ALV调用ALV FUNCTION MODULE
* 可以 到 se37 中 查看 REUSE_ALV_EVENTS_GET (这个和数据表一样,名称要记住了),
* 点击进去就可以看到所欲的事件声明了 ,如果要实现具体的 功能就需要写 子例程来实现
*第7步:用户事件定义User按键处理事件
* 属于 第五步中的 事件的一种
* 例如到 VA03 中查看 输入订单编号 10000147 就可以查看 订单明细
* 在配置 ALV显示的时候,点击模式按钮
* 调用函数时候选择 :REUSE_ALV_GRID_DISPLAY 会自动生产函数的配置 ,配置上相应的选项之后,就可以金新股显示了。
* 第一步定义 ALV 相关变量
TYPE-POOLS:SLIS .
* 注意在下面的事件变量的定义中如果 不知道 参考什么 类型 ,
*双击 函数 REUSE_ALV_GRID_DISPLAY ,找到 入参 ,可然后找到要定义的类型 如: IT_EVENTS ,就可以看到 需要参考的类型了
* 直接定义为一样的就可以了 。
DATA:lt_fieldcat TYPE slis_t_fieldcat_alv ," 存储fieldcat的内表
ls_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv , " ALV 格式控制的结构体 :layout
lt_event TYPE slis_t_event , " 定义内表 ,参考声明了结构类型的types 类类型
ls_event TYPE slis_alv_event . " 定义工作区 直接参考了结构体
DATA lv_colpos TYPE int2 .
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 OF ty_alvshow.
DATA:lt_alvshow TYPE TABLE OF ty_alvshow," 定义内表哦
wa_alvshow TYPE ty_alvshow ." 定义工作区
*&---------------------------------------------------------------------*
*& 包含 YMWXBINCLUDE_FORM
*&---------------------------------------------------------------------*
*******************form 定义 ****************************************
FORM WXB_FORM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA lt_vbap TYPE TABLE OF VBAP. " 定义数据库内表
DATA wa_vbap TYPE VBAP." 定义 数据库工作区
CASE R_UCOMM.
WHEN 'ZWXB'.
MESSAGE '点击了自定义的按钮' TYPE 'I'.
WHEN 'ZSAVE'.
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 .
" 要注意的是 vbeln 要放在 条件的第一个 位置, 等于 后面 追加 工作区里面的信息
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 OTHERS.
ENDCASE.
*IF R_UCOMM = 'ZWXB'.
* MESSAGE '点击了自定义的按钮' TYPE 'I'.
*ELSEIF R_UCOMM = 'ZSAVE'.
* MESSAGE '确定要保存吗?' TYPE 'I'.
*ENDIF.
ENDFORM.
FORM WXB_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
* set PF-STATUS 'WXB_STATUS'. " 这里是自定义的工具栏的名称,一个alv启动时候,就会直接调用自定义的工具栏
SET PF-STATUS 'WXB_STATUS'.
ENDFORM .
* 下面是工具栏的自定义设置
FORM WXB_FORM_TOP_OF_PAGE.