ABAP数据库表的增改查

数据表的增改查

接到一个任务,是对数据库表的增改查,增和查现在已经比较熟练了,关键是改,还有一个要求是要求系统能自动更新修改人和修改日期以及时间。

找到数据库表,新增这三个字段

这里另提一句,一般数据库表不建议自己在不确定的情况下修改的,什么数据类型还是数据元素啥的,因为你不知道这个表关联了哪些程序,改了数据类型的话会很麻烦。

数据的查找:

很简单,就是一个最基本的报表的写法

1.定义一个内表用来装数据

2.从数据库表里取数据装入内表

3.alv显示数据

数据的新增

这里我的思路是通过excel上传数据新增数据,那种类似于点个按钮增加的还没研究会(sad)

1.SMW0上传模版

注意要选二进制数据,有一次不小心上传到HTML了结果找不到模版

上传模版之前有提过,就不详细写了

2.显示下载模版按钮

3.显示上传文件的输入框

4.读取excel

我在这里给时间日期以及用户赋了值,记录每次上传的数据

5.ALV显示

这里status = 'X'. 要加上,不然显示不了按钮

6.数据的保存

数据的修改

1.alv选择可以更改

这里第二个值为X的时候表示能够更改

2.获取修改后alv的数据

关键是这段代码,能够及时获取alv更改后的数据,不然,每次都要按一下ctrl s 才能更新gt_itab里的数据。

3.数据的保存

这样就结束辽

遇到了一个小问题,就是在alv界面修改的时候,小数点总是自动往前移,解决方法就是在要修改的字段前加上FIELDCAT_LN-INTTYPE = 'C'.

完整代码:

java 复制代码
*&---------------------------------------------------------------------*
*& Report  ZLXY007
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZLXY007.

INCLUDE zpub_lvc_func."包含功能模块
INCLUDE <icon>."包含图标定义
TABLES: sscrfields,zboxsize.

* 定义类型池
TYPE-POOLS: vrm.
TYPE-POOLS: slis.

DATA:BEGIN OF gt_itab OCCURS 0.
INCLUDE TYPE ZBOXSIZE.
DATA:
END OF gt_itab.
DATA gt_itab1 LIKE TABLE OF gt_itab WITH HEADER LINE.

DATA ztext1 TYPE string."提示是否保存信息
DATA: functxt TYPE smp_dyntxt."定义动态文本类型变量
* 选择屏幕定义
PARAMETERS p1 RADIOBUTTON GROUP grp1 USER-COMMAND cmd1 DEFAULT 'X'."查询数据
PARAMETERS p2 RADIOBUTTON GROUP grp1   ."修改数据
PARAMETERS p3 RADIOBUTTON GROUP grp1   ."新增数据

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_zcode1  FOR zboxsize-zcode MODIF ID M1,
                s_zsize1  FOR zboxsize-zsize MODIF ID M1.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_zcode2  FOR zboxsize-zcode MODIF ID M2,
                s_zsize2  FOR zboxsize-zsize MODIF ID M2.
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-001.
PARAMETERS:  p_file  LIKE rlgrap-filename OBLIGATORY DEFAULT '.XLS'  MODIF ID M3.
SELECTION-SCREEN END OF BLOCK b3.

INITIALIZATION.
  sscrfields-ucomm  = 'FC01' .
  functxt-icon_id   = icon_export.  "文本字
  functxt-icon_text = '下载导入模版'.  "菜单制作器:
  sscrfields-functxt_01 = functxt.
  SELECTION-SCREEN: FUNCTION KEY 1.

AT SELECTION-SCREEN .
  CASE sscrfields-ucomm.
    WHEN 'FC01'."下载模版
      CALL FUNCTION 'ZDOWNLOAD_TEMPLE_FILE'
        EXPORTING
          p_templename = 'ZMMR120'.
    WHEN OTHERS .
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      mask          = ',*.xls,*.xls;,*.xlsx,*.xlsx.'
    CHANGING
      file_name     = p_file
    EXCEPTIONS
      mask_too_long = 1
      OTHERS        = 2.


AT SELECTION-SCREEN OUTPUT.  " 指定在选择屏幕输出之前执行以下代码。
  LOOP AT SCREEN. "screen-active = 0.   0 隐藏,默认1 显示
    IF p1 <> 'X' AND screen-group1 = 'M1'.
      screen-active = 0.
    ENDIF.
    IF p2 <> 'X' AND screen-group1 = 'M2'.
      screen-active = 0.
    ENDIF.
    IF p3 <> 'X' AND screen-group1 = 'M3'.
      screen-active = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

START-OF-SELECTION.
  IF p1 = 'X'.
    PERFORM get_data.
    PERFORM alv_data.
  ENDIF.
  IF p2 = 'X'.
    PERFORM get_data1.
    PERFORM deal_data.
  ENDIF.
  IF p3 = 'X'.
    PERFORM excel_data.
    PERFORM add_data.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GET_DATA.
  SELECT *
    FROM zboxsize
    INTO TABLE gt_itab
    WHERE zcode  IN s_zcode1
      AND zsize  IN s_zsize1.

ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      Form  GET_DATA1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GET_DATA1.
  SELECT *
    FROM zboxsize
    INTO TABLE gt_itab
    WHERE zcode  IN s_zcode2
      AND zsize  IN s_zsize2.

  SELECT *
    FROM zboxsize
    INTO TABLE gt_itab1
    WHERE zcode  IN s_zcode2
      AND zsize  IN s_zsize2.

ENDFORM.                    "GET_DATA


*&---------------------------------------------------------------------*
*&      Form  deal_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM deal_data.
  alv_clear_data.
  status = 'X'.        "保存按钮



  alv_add_data 'GT_ITAB' '' 'X' '' '' '' '' 'ZSIZE' '尺寸代码'.
  alv_add_data 'GT_ITAB' '' 'X' '' '' '' '' 'ZCODE' '代码'.
  FIELDCAT_LN-INTTYPE = 'C'.
  alv_add_data 'GT_ITAB' '' 'X' '' '' '' '' 'MENGE' '数量'.
  alv_add_data 'GT_ITAB' '' 'X' '' '' '' '' 'MEINS' '基本计量单位'.
  FIELDCAT_LN-INTTYPE = 'C'.
  alv_add_data 'GT_ITAB' '' 'X' '' '' '' '' 'ZBOXSIZE' '数量'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'CPUTM' '输入时间'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'AEDAT' '更改日期'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'USNAM' '用户名'.
  PERFORM get_leng TABLES  GT_ITAB i_fieldcat . "使ALV长度默认为其本身的字段
  alv_show_data   GT_ITAB.

ENDFORM.                    "deal_data

*&---------------------------------------------------------------------*
*&      Form  alv_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_data.
*三、ALV显示
  alv_clear_data.
*  status = 'X'.        "

  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZSIZE' '尺寸代码'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZCODE' '代码'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'MENGE' '数量'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'MEINS' '基本计量单位'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZBOXSIZE' '数量'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'CPUTM' '输入时间'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'AEDAT' '更改日期'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'USNAM' '用户名'.
  PERFORM get_leng TABLES  GT_ITAB i_fieldcat . "使ALV长度默认为其本身的字段
  alv_show_data   GT_ITAB.
ENDFORM.                    "alv_data
*&---------------------------------------------------------------------*
*&      Form  ADD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM ADD_DATA.
  alv_clear_data.
  status = 'X'. "

  "设置可编辑字段
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZSIZE' '尺寸代码'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZCODE' '代码'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'MENGE' '数量'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'MEINS' '基本计量单位'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'ZBOXSIZE' '数量'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'CPUTM' '输入时间'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'AEDAT' '更改日期'.
  alv_add_data 'GT_ITAB' '' '' '' '' '' '' 'USNAM' '用户名'.

  PERFORM get_leng TABLES gt_itab i_fieldcat.
  alv_show_data gt_itab.

ENDFORM.                    "ADD_DATA
*&---------------------------------------------------------------------*
*&      Form  set_pf_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSAVE'.
ENDFORM.                    "set_pf_status
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command  USING r_ucomm LIKE sy-ucomm
                          rs_selfield TYPE slis_selfield.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = l_o_grid1.
  CALL METHOD l_o_grid1->check_changed_data.



  TYPES: BEGIN OF ty_extab,
   row_id TYPE i,
 END OF ty_extab.
  DATA: et_index_rows TYPE STANDARD TABLE OF ty_extab.

  CASE r_ucomm.
    WHEN '&ZPY'.
      IF sy-subrc = 0.
*        MESSAGE 'E:数据有误,请检查' TYPE 'S' DISPLAY LIKE 'E'.
*        EXIT.
      ENDIF.
      ztext1 = '是否确定保存数据'.
*      PERFORM do_message.
      PERFORM save_data .
      rs_selfield-refresh = 'X'.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  sava_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM save_data.
*  LOOP AT gt_itab.
*    INSERT zboxsize FROM TABLE gt_itab.
*  ENDLOOP.
*  IF sy-subrc = 0.
*    MESSAGE '数据更新成功' TYPE 'S'.
*  ELSE.
*    MESSAGE '数据更新失败' TYPE 'S' DISPLAY LIKE 'E'.
*  ENDIF.

  IF p3 = 'X'.
    modify zboxsize FROM TABLE gt_itab.

  IF sy-subrc = 0.
    MESSAGE '数据更新成功' TYPE 'S'.
  ELSE.
    MESSAGE '数据更新失败' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.

  ENDIF.

  IF p2 = 'X'.
    LOOP AT GT_ITAB.
    loop at gt_itab1 WHERE zcode = gt_itab-zcode and zsize = gt_itab-zsize.
      if ( gt_itab1-MENGE <> gt_itab-MENGE ) or ( gt_itab1-MEINS <> gt_itab-MEINS ) or ( gt_itab1-ZBOXSIZE <> gt_itab-ZBOXSIZE ).
        gt_itab-usnam = sy-uname. "自动记录用户
        gt_itab-aedat = sy-datum. "自动记录日期
        gt_itab-cputm = sy-uzeit. "自动记录时间
        MODIFY gt_itab.
      else.
        CONTINUE.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
 update zboxsize FROM TABLE gt_itab.

  IF sy-subrc = 0.
    MESSAGE '数据更新成功' TYPE 'S'.
  ELSE.
    MESSAGE '数据更新失败' TYPE 'S' DISPLAY LIKE 'E'.
  ENDIF.

  ENDIF.






ENDFORM.                    "sava_data
*&---------------------------------------------------------------------*
*&      Form  save_data1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*FORM save_data1.
*
*  LOOP AT GT_ITAB.
*    loop at gt_itab1 WHERE zcode = gt_itab-zcode and zsize = gt_itab-zsize.
*      if ( gt_itab1-MENGE <> gt_itab-MENGE ) or ( gt_itab1-MEINS <> gt_itab-MEINS ) or ( gt_itab1-ZBOXSIZE <> gt_itab-ZBOXSIZE ).
*        gt_itab-usnam = sy-uname. "自动记录用户
*        gt_itab-aedat = sy-datum. "自动记录日期
*        gt_itab-cputm = sy-uzeit. "自动记录时间
*        MODIFY gt_itab.
*      else.
*        CONTINUE.
*      ENDIF.
*    ENDLOOP.
*  ENDLOOP.
* update zboxsize FROM TABLE gt_itab.
*
*  IF sy-subrc = 0.
*    MESSAGE '数据更新成功' TYPE 'S'.
*  ELSE.
*    MESSAGE '数据更新失败' TYPE 'S' DISPLAY LIKE 'E'.
*  ENDIF.
*
*ENDFORM.                    "sava_data

*&---------------------------------------------------------------------*
*&      Form  excel_data
*&---------------------------------------------------------------------*
*       excel取数,读取excel导入的目标数据
*----------------------------------------------------------------------*
FORM excel_data.
  DATA: i_excel TYPE TABLE OF alsmex_tabline .
  DATA w_excel TYPE alsmex_tabline.
  DATA: zitem TYPE i.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = '1'"从第一列开始读取
      i_begin_row             = '2'                         "从第1行开始读取
      i_end_col               = '5' "Excel的列数,一共读取八列
      i_end_row               = '9999'
    TABLES
      intern                  = i_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE e208(00) WITH 'EXCEL读取错误' RAISING error_msg.
  ENDIF.
  FIELD-SYMBOLS : <fs> .
  SORT i_excel BY row col .
  DATA num_col TYPE i .
  LOOP AT i_excel INTO w_excel.
    CASE w_excel-col.
      WHEN 1.
        gt_itab-ZSIZE = w_excel-value.
      WHEN 2.
        gt_itab-ZCODE = w_excel-value.
      WHEN 3.
        gt_itab-MENGE = w_excel-value.
      WHEN 4.
        gt_itab-MEINS = w_excel-value.
      WHEN 5.
        gt_itab-ZBOXSIZE = w_excel-value.
      WHEN OTHERS.
    ENDCASE.
    AT END OF row.
      gt_itab-usnam = sy-uname. "自动记录用户
      gt_itab-aedat = sy-datum. "自动记录日期
      gt_itab-cputm = sy-uzeit. "自动记录时间
      APPEND gt_itab.
      CLEAR:gt_itab.
    ENDAT .
    CLEAR w_excel.
  ENDLOOP.
ENDFORM.                    "excel_data
相关推荐
企鹅侠客16 分钟前
开源免费文档翻译工具 可支持pdf、word、excel、ppt
人工智能·pdf·word·excel·自动翻译
祈澈菇凉17 分钟前
Webpack的基本功能有哪些
前端·javascript·vue.js
小纯洁w24 分钟前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
weixin_4258782332 分钟前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
左灯右行的爱情43 分钟前
Redis数据结构总结-listPack
数据结构·数据库·redis
life_time_1 小时前
C语言(22)
c语言·开发语言
Minner-Scrapy1 小时前
DApp 开发入门指南
开发语言·python·web app
想睡好1 小时前
css文本属性
前端·css
qianmoQ1 小时前
第三章:组件开发实战 - 第五节 - Tailwind CSS 响应式导航栏实现
前端·css
zhoupenghui1681 小时前
golang时间相关函数总结
服务器·前端·golang·time