ABAP数据库表的增改查

news/2025/2/22 6:16:55

数据表的增改查

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

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

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

数据的查找:

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

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'.

完整代码:

*&---------------------------------------------------------------------*
*& 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


http://www.niftyadmin.cn/n/5861764.html

相关文章

【C/C++】合并两个有序链表 (leetcode T21)

核心考点预览&#xff1a;链表 &#xff08;双指针&#xff09; 技巧&#xff1a;虚拟头结点 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入输出示例1l1 [1,2,4], l2 [1…

3D全景沉浸式看车:虚拟现实重构汽车消费新体验

在传统的汽车消费模式中&#xff0c;消费者往往需要亲自前往展厅&#xff0c;花费大量时间和精力去挑选心仪的车型。这一过程不仅成本高&#xff0c;而且信息的透明度也常常受到质疑。面对琳琅满目的车型&#xff0c;消费者往往难以在短时间内做出决策&#xff0c;而车企则面临…

windows上vscode cmake工程搭建

安装vscode插件&#xff1a; 1.按装fastc&#xff08;主要是安装MinGW\mingw64比较方便&#xff09; 2.安装C&#xff0c;cmake&#xff0c;cmake tools插件 3.准备工作完成之后&#xff0c;按F1&#xff0c;选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…

每日一题——打家劫舍

打家劫舍&#xff08;一&#xff09;与打家劫舍&#xff08;二&#xff09;动态规划解法详解 打家劫舍&#xff08;一&#xff09;问题描述示例解题思路动态规划 代码实现复杂度分析 打家劫舍&#xff08;二&#xff09;问题描述示例解题思路环形问题的拆分 代码实现复杂度分析…

豆包 Marscode + deepseek-R1 使用体验

拥抱 deepseek 这次豆包 Marscode 的新特性&#xff0c;是可以选择当下最热门的 deepseek 的两款模型&#xff1a;V3 和 R1&#xff0c;这让原本好用的 ai 插件&#xff0c;更加好用了&#xff0c;而且是免费使用&#xff0c;程序员的生产力再一次得到提升。 使用过程中的几…

OSPF基础知识总结

基本概念 协议类型:链路状态型IGP(内部网关协议),基于Dijkstra算法计算最短路径树。 协议号:IP层协议,协议号89。 特点:支持分层设计(区域划分)、快速收敛、无环路、支持VLSM/CIDR。 区域(Area) 骨干区域(Backbone Area):Area 0,所有非骨干区域必须直接或通过虚…

信创浪潮下,以 OpManager筑牢安全运维防线

在数字化转型加速和国际形势复杂多变的当下&#xff0c;信创产业的重要性愈发凸显。信创&#xff0c;即信息技术应用创新&#xff0c;旨在实现信息技术领域的自主可控&#xff0c;涵盖从芯片、操作系统、数据库到应用软件等一系列关键技术和产品。它不仅是推动产业升级的重要力…

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…