自建数据库表,并在ALV报表中直接向更新自建表中写数据范例(非常感谢JACK WU)

来源:互联网 发布:mac安装usb网卡驱动 编辑:程序博客网 时间:2024/05/22 03:35

        JACK WU 真是一个大大的好人阿!不但给了我原程序做为参考,还帮我这种ABAP弱智改了改程序,终于可以用拉!真是开心阿!再次感谢一下,欠你两顿汤包。

        前段时间,业务部门提出在SAP中建立各个业务部门流转的大报表,要能够象EXCEL那样留几个空格让自己填写,并储存到数据库中。其实这个问题还没有完全解决,我刚刚在JACK WU的帮助之下解决了第一步:自建数据库表,并在ALV报表中直接向更新自建表.接下来还有很多问题的,例如 数据共享的问题,用户互相锁定的问题,刷新的问题等等。

       先将第一个问题写下来吧:

第一步:自建数据库表(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