先将第一个问题写下来吧:
第一步:自建数据库表(TCODE:SE11)
1 在“Delivery and Maintenance”Tab屏幕设置“Data Browser/Table view Maint.”属性为“允许通过标准表格维护工具维护”
2 设计表格字段
3 设置表格技术设置,菜单:转到-》技术设置
4 保存激活。
就是第三步ABAP中用到的ZTEST1。需要注意的是一定要将关键字设置好,还有,关键字要将MANDT 客户端设置进去。
第二步:往数据库表里面增加一些范例的数据(TCODE:SE16)
第三步:编写报表()
*&---------------------------------------------------------------------*
*& Report Z_MM_TEST
*&
*&---------------------------------------------------------------------*
*&
*&ALV中输入数据进行修改
*&---------------------------------------------------------------------*
REPORT Z_MM_TEST MESSAGE-ID zmc01 NO STANDARD PAGE HEADING LINE-SIZE 500.
TABLES : ZTEST1,vbak.
TYPE-POOLS: slis.
************************************************************
*INTERNAL TABLE DEFINITION
************************************************************
DATA: BEGIN OF gt_yf occurs 0,
vbeln like vbak-vbeln,
ERNAM LIKE VBAK-ERNAM,
ERDAT like VBAK-erdat,
BZ01(20),
END OF gt_yf.
************************************************************
* Variable DEFINITION
***********************************************************
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
gs_layout TYPE slis_layout_alv,
usercommand TYPE slis_fieldname VALUE 'USERCOMMAND',
gt_sort TYPE slis_t_sortinfo_alv.
DATA: progname LIKE sy-repid,
title(70).
DATA : gv_cancel(1) TYPE c,
gv_flag TYPE i.
************************************************************
* SELECTION-SCREEN
************************************************************
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS:
so_vbeln FOR vbak-vbeln,"提货日期
so_erdat FOR vbak-erdat."录入日期
SELECTION-SCREEN END OF BLOCK bl1.
***********************************************************
* START OF SELECTION
***********************************************************
START-OF-SELECTION.
PERFORM get_date.
END-OF-SELECTION.
PERFORM output_date.
*&---------------------------------------------------------------------*
*& Form GET_DATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_date .
SELECT vbak~VBELN vbak~ERNAM vbak~ERDAT
FROM vbak
INTO (gt_yf-VBELN, GT_YF-ERNAM ,GT_YF-ERDAT)
where vbak~vbeln IN so_vbeln "销售凭证
AND vbak~erdat IN so_erdat. "录入日期
* loop at gt_yf
select single bz01 from ZTEST1
into gt_yf-bz01
where vbeln = gt_yf-vbeln.
* modify gt_yf.
* clear gt_yf.
* endloop.
*modify gt_yf.
append gt_yf.
clear gt_yf.
endselect.
ENDFORM. " GET_DATE
*&---------------------------------------------------------------------*
*& Form OUTPUT_DATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM output_date .
REFRESH gt_fieldcat.
progname = sy-repid.
title = 'GLORIA TESTING 往自建内表填写数据'.
gs_layout-zebra = 'X'. "设置每行的背景颜色交错 显示。
gs_layout-colwidth_optimize = 'X'. "ALV输出时候自动优化宽 度
gs_layout-detail_popup = 'X'.
*2此处代码设置屏幕的chekbox选中字段
* gt_fieldcat-fieldname = 'GV_CHECK'.
* gt_fieldcat-seltext_m = '选择'.
* gt_fieldcat-outputlen = 1.
* gt_fieldcat-checkbox = 'X'.
* gt_fieldcat-input = 'X'.
* gt_fieldcat-edit = 'X'.
* APPEND gt_fieldcat.
* CLEAR gt_fieldcat.
*
gt_fieldcat-fieldname = 'VBELN'.
gt_fieldcat-seltext_m = '销售凭证'.
gt_fieldcat-outputlen = 50.
APPEND gt_fieldcat.
CLEAR gt_fieldcat.
gt_fieldcat-fieldname = 'ERDAT'.
gt_fieldcat-seltext_m = '提货日期'.
gt_fieldcat-outputlen = 10.
APPEND gt_fieldcat.
CLEAR gt_fieldcat.
gt_fieldcat-fieldname = 'ERNAM'.
gt_fieldcat-seltext_m = '创建人员'.
gt_fieldcat-outputlen = 10.
APPEND gt_fieldcat.
CLEAR gt_fieldcat.
gt_fieldcat-fieldname = 'BZ01'.
gt_fieldcat-seltext_m = '备注'.
gt_fieldcat-outputlen = 20.
gt_fieldcat-edit = 'X'.
APPEND gt_fieldcat.
CLEAR gt_fieldcat.
*3设置处理代码
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = progname
is_layout = gs_layout
it_fieldcat = gt_fieldcat[]
i_grid_title = title
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = usercommand
* i_save = 'A'
TABLES
t_outtab = gt_yf
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " OUTPUT_DATE
*&---------------------------------------------------------------------*
*& FORM user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM usercommand USING ucomm TYPE sy-ucomm
selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
data: l_valid type c.
*4此处代码将用户输入读入内表(这一步不可少)
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
*5此处代码阻止'REUSE_ALV_GRID_DISPLAY创建新的屏幕,造成屏幕多层
selfield-refresh = 'X'.
CASE sy-ucomm.
* WHEN 'DELE'.
* CLEAR sy-ucomm.
* LOOP AT gt_yf.
* IF gt_yf-gv_check = 'X'.
*请填写删除操作
* DELETE gt_yf.
* delete from ztest1 where vbeln = gt_yf-vbeln.
* ENDIF.
* ENDLOOP.
* 保存操作
WHEN 'SAVE'.
LOOP AT gt_yf.
* IF gt_yf-gv_check = 'X'.
*请填写修改操作
move-corresponding gt_yf to ztest1.
modify ztest1 from ztest1.
* ENDIF.
ENDLOOP.
COMMIT WORK.
ENDCASE.
ENDFORM. "USER_COMMAND
*******************************************************************************
form save_data.
endform.
*&---------------------------------------------------------------------*
*& FORM PF_STATUS_SET
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'YFDJ' .
ENDFORM. "frm_PF_STATUS_SET