- 浏览: 56437 次
- 性别:
- 来自: 北京
最近访客 更多访客>>
最新评论
-
harry_2013:
不能运行
Upload excel file 到 INTERNAL TABLE 的方法 -
dan001:
function dsn()
{
ddd
}
ABAP Standard Report -
linginfanta:
推荐文泉驿
推荐下载WindowsXP字体增强补丁 -
tapestry:
显示InformalParameter只要加入个Mixin就可 ...
Tapstry5.0.5升级到5.0.6中注意的问题
有两个内部表:IT_TAB1(假设N条记录),I T_TAB2(假设M条记录)。
I T_TAB1的结构如下
ID BUKRS BELNR DMBTR
001 A001 1000000010 10000
002 A001 1000000020 20000
…… …… …… ……
I T_TAB2的结构如下
BUKRS BELNR
A001 1000000010
A001 1000000050
…… ……
要求是根据内部表ITAB2对内部表ITAB1进行删除处理,ITAB1中BELNR项与ITAB2中BELNR项相同的全部删除掉,该事例中所得结果应为:
I T_TAB1的结构如下
ID BUKRS BELNR DMBTR
002 A001 1000000020 20000
…… …… …… ……
方法一:循环套循环
外层循环IT_TAB2,里层循环IT_TAB1。
此种方法被一般ABAP开发规约所禁止。
三种方法中,执行时间排第二。
方法二:利用RANGE TABLE
将IT_TAB2导入RANGE TABLE,
在条件中使用IN语句来删除IT_TAB1.
此种方法,由于RANGE TABLE的做成使用了一回循环,
再加上用IN 语句删除,相当于使用了两次循环,所以速度比较慢,
三种方法中,执行时间排第三。
另外此法只适用于比较项目(例如IT_TAB2-BELNR)只有一项时,
而且,作为比较项目的该项值被反复使用时(假设还有内部表IT_TAB3,IT_TAB4…都需要根据IT_TAB2中的BELNR项来作相应处理时),
采用该法,才更显效率。
如果比较项目为复数项时,请使用其他两种方法。
方法三:并行算法
使用该算法,要事先对两个内部表进行排序,
然后两层循环嵌套,
外层是IT_TAB2,里层是IT_TAB1。
与方法一不同的是,
方法一的执行次数为(N * M),方法三的执行次数为( N + M )。
所以该方法在三种方法中,执行时间排第一。
但使用该算法有一个条件限制,
就是IT_TAB1中的记录一定要在IT_TAB2所包含的记录范围内。
嵌套循环时推荐尽可能使用该平行算法。
该法缺点是:1.使用限制条件要判断准确。
2.代码可读性差。
*&---------------------------------------------------------------------* *& 作成者 : KONGXIANGSHUAI *& 作成日 : 2006/03/20 *& 機能概要 : *& 内部テーブルIT_TAB2により、内部テーブルIT_TAB1から *& 同じのレコードを削除する例。 *&---------------------------------------------------------------------* REPORT ZZTEST4 NO STANDARD PAGE HEADING. *----------------------------------------------------------------------* * 構造宣言 *----------------------------------------------------------------------* * 内部テーブル1 TYPES: BEGIN OF T_TAB1, ID TYPE I, "番号 BUKRS TYPE BSID-BUKRS, "会社コード BELNR TYPE BSID-BELNR, "会計伝票番号 DMBTR TYPE BSID-DMBTR, "国内通貨額 END OF T_TAB1. * 内部テーブル2 TYPES: BEGIN OF T_TAB2, BUKRS TYPE BSID-BUKRS, "会社コード BELNR TYPE BSID-BELNR, "会計伝票番号 END OF T_TAB2. *----------------------------------------------------------------------* * 内部テーブルと項目列宣言 *----------------------------------------------------------------------* * 内部テーブル1 DATA : IT_TAB1 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB1 TYPE T_TAB1. * 内部テーブル2 DATA : IT_TAB2 TYPE STANDARD TABLE OF T_TAB2 INITIAL SIZE 0, WA_TAB2 TYPE T_TAB2. * 方法1用 DATA : IT_TAB11 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB11 TYPE T_TAB1. * 方法2用 DATA : IT_TAB12 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB12 TYPE T_TAB1. * 方法3用 DATA : IT_TAB13 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0, WA_TAB13 TYPE T_TAB1. * RANGES TABLE RANGES IT_BELNR FOR BSID-BELNR. DATA WA_BELNR LIKE IT_BELNR. *----------------------------------------------------------------------* * 変数宣言 *----------------------------------------------------------------------* DATA : V_T1 TYPE I, "RUNTIME1 V_T2 TYPE I, "RUNTIME2 V_TIME1 TYPE I, "方法1RUNTIME V_TIME2 TYPE I, "方法2RUNTIME V_TIME3 TYPE I. "方法3RUNTIME *----------------------------------------------------------------------* * START-OF-SELECTION *----------------------------------------------------------------------* START-OF-SELECTION. * テストデータの設定 PERFORM FRM_SET_DATA. * テスト処理 PERFORM FRM_EDIT_DATA. * 結果の出力 PERFORM FRM_OUTPUT_DATA. *&---------------------------------------------------------------------* *& Form FRM_SET_DATA *&---------------------------------------------------------------------* * テストデータの設定 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_SET_DATA. * 内部テーブル1のデータの設定 CLEAR WA_TAB1. WA_TAB1-ID = 1. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000010'. WA_TAB1-DMBTR = 10000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 2. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000020'. WA_TAB1-DMBTR = 20000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 3. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000030'. WA_TAB1-DMBTR = 30000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 4. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000040'. WA_TAB1-DMBTR = 40000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 5. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000050'. WA_TAB1-DMBTR = 10000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 6. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000060'. WA_TAB1-DMBTR = 20000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 7. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000070'. WA_TAB1-DMBTR = 30000. APPEND WA_TAB1 TO IT_TAB1. CLEAR WA_TAB1. WA_TAB1-ID = 8. WA_TAB1-BUKRS = 'A001'. WA_TAB1-BELNR = '1000000080'. WA_TAB1-DMBTR = 40000. APPEND WA_TAB1 TO IT_TAB1. * 内部テーブル2のデータの設定 CLEAR WA_TAB2. WA_TAB2-BUKRS = 'A001'. WA_TAB2-BELNR = '1000000010'. APPEND WA_TAB2 TO IT_TAB2. CLEAR WA_TAB2. WA_TAB2-BUKRS = 'A001'. WA_TAB2-BELNR = '1000000030'. APPEND WA_TAB2 TO IT_TAB2. ENDFORM. "FRM_SET_DATA *&---------------------------------------------------------------------* *& Form FRM_EDIT_DATA *&---------------------------------------------------------------------* * テスト処理 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_EDIT_DATA. SORT IT_TAB1 ASCENDING BY BELNR. SORT IT_TAB2 ASCENDING BY BELNR. * 方法1 IT_TAB11 = IT_TAB1. GET RUN TIME FIELD V_T1. "実行時間比較用 SORT IT_TAB11 ASCENDING BY BELNR. LOOP AT IT_TAB2 INTO WA_TAB2. LOOP AT IT_TAB11 INTO WA_TAB11 WHERE BELNR = WA_TAB2-BELNR. DELETE TABLE IT_TAB11 FROM WA_TAB11. ENDLOOP. ENDLOOP. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME1 = V_T2 - V_T1. "実行時間 * 方法2 IT_TAB12 = IT_TAB1. GET RUN TIME FIELD V_T1. "実行時間比較用 SORT IT_TAB12 ASCENDING BY BELNR. LOOP AT IT_TAB2 INTO WA_TAB2. WA_BELNR-LOW = WA_TAB2-BELNR. WA_BELNR-SIGN = 'I'. WA_BELNR-OPTION = 'EQ'. APPEND WA_BELNR TO IT_BELNR. ENDLOOP. DELETE IT_TAB12 WHERE BELNR IN IT_BELNR. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME2 = V_T2 - V_T1. "実行時間 * 方法3 IT_TAB13 = IT_TAB1. SORT IT_TAB13 ASCENDING BY BELNR. GET RUN TIME FIELD V_T1. "実行時間比較用 DATA V_I TYPE I. V_I = 1. LOOP AT IT_TAB2 INTO WA_TAB2. LOOP AT IT_TAB13 INTO WA_TAB13 FROM V_I. IF WA_TAB13-BELNR = WA_TAB2-BELNR. DELETE TABLE IT_TAB13 FROM WA_TAB13. V_I = V_I + 1. ELSE. EXIT. ENDIF. ENDLOOP. ENDLOOP. GET RUN TIME FIELD V_T2. "実行時間比較用 V_TIME3 = V_T2 - V_T1. "実行時間 ENDFORM. "FRM_EDIT_DATA *&---------------------------------------------------------------------* *& Form FRM_OUTPUT_DATA *&---------------------------------------------------------------------* * 結果の出力 *----------------------------------------------------------------------* * --> なし * <-- なし *----------------------------------------------------------------------* FORM FRM_OUTPUT_DATA. WRITE '内部テーブル1'. LOOP AT IT_TAB1 INTO WA_TAB1. WRITE : / WA_TAB1-ID, WA_TAB1-BUKRS, WA_TAB1-BELNR, WA_TAB1-DMBTR. ENDLOOP. ULINE. WRITE '内部テーブル2'. LOOP AT IT_TAB2 INTO WA_TAB2. WRITE : / WA_TAB2-BUKRS, WA_TAB2-BELNR. ENDLOOP. ULINE. WRITE : '方法1の結果', 'RUNTIME:', V_TIME1. LOOP AT IT_TAB11 INTO WA_TAB11. WRITE : / WA_TAB11-ID, WA_TAB11-BUKRS, WA_TAB11-BELNR, WA_TAB11-DMBTR. ENDLOOP. ULINE. WRITE : '方法2の結果', 'RUNTIME:', V_TIME2. LOOP AT IT_TAB12 INTO WA_TAB12. WRITE : / WA_TAB12-ID, WA_TAB12-BUKRS, WA_TAB12-BELNR, WA_TAB12-DMBTR. ENDLOOP. ULINE. WRITE : '方法3の結果', 'RUNTIME:', V_TIME3. LOOP AT IT_TAB13 INTO WA_TAB13. WRITE : / WA_TAB13-ID, WA_TAB13-BUKRS, WA_TAB13-BELNR, WA_TAB13-DMBTR. ENDLOOP. ENDFORM. "FRM_OUTPUT_DATA
发表评论
-
SAP 中如何寻找增强
2008-08-16 19:55 1732方法一、利用TCODE寻找增强(第二代的增强) 执行一个程序( ... -
SAP-R/3出口(增强)
2008-08-15 20:53 2064首先来讲解一下什么是 ... -
BAPI_GOODSMVT_CREATE --mb01,mb1A
2008-06-17 13:22 1946* BAPI TO Upload Inventory ... -
System Fields for Current Date and Time
2008-06-11 10:47 974The following system fields are ... -
ABAP 表格控制(Table Control)和步循环
2008-06-05 08:04 4796表格控制(Table Control)和步循环 ... -
如何动态改变Table Control的列抬头
2008-06-05 08:00 15391、In the screen painter use Inp ... -
SAP常用的function(转)
2008-06-05 07:59 19361. 获取每个月的最后一天 CALL FUNCTI ... -
程序调用——submit的用法
2008-05-21 18:45 2418ABAP程序的启动方式有两种。一种是直接运行,即在事务代码SE ... -
如何限制自己开发的耗时报表在sap系统中运行的个数,以保证正常业务的进行
2008-05-05 13:02 1151在SAP 系统中经常有许多用户自行开发的报表,有些报表运行很 ... -
源碼下載----批量下载程序和表结构
2008-04-23 07:58 1096REPORT YGJH003 NO STANDARD PAG ... -
ABAP/4编程中用到的系统函数
2008-04-23 07:56 1298sy-index:做无条件循环是的次数值. sy-subrc ... -
sap 函数小结
2008-04-23 07:55 1562函数名 描述 SD_VBAP_READ_WITH_VBELN ... -
获取SAP系统用户出口列表
2008-04-23 07:47 951REPORT Y_FIND_USEREXIT ... -
根据事务代码找User exit
2008-04-23 07:45 960TABLES : tstc, "SAP Tr ... -
Upload excel file 到 INTERNAL TABLE 的方法
2008-04-23 07:43 1663FORM upload_data . DATA:w_tab ... -
自定义BAPI的基本资料
2008-04-23 07:28 1660BAPI的简单实现步骤 一,创建Function Modu ... -
SAP BDC技术
2008-04-23 07:18 1292在SAP系统里,重复输入数据时,(数据不同,但是操作是相同的, ... -
SAP系统常用变量
2008-04-11 07:28 2432系统内部有一个专门存放系统变量的结构SYST,其中最常用的系统 ... -
Users Dialogs: Lists
2008-03-26 13:50 808data: wa_spfli type spfli, ... -
SAP SUBROUTINES SAP子程序
2008-03-25 14:24 1012SAP子程序 是PROGRAM 内部模块单元。用 FORM 开 ...
相关推荐
在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...
C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)(源码)C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)(源码)C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)...
一、使用视图meeting将多表关联整合在一起 二、通过Sql语句筛选数据 三、建立和主从表的关联 四、注意在CrystalReport1表中插入子报表的时候,一定要将主从表的关联字段设置好,否则出乱子
2. **TTable组件**:TTable是用于直接操作单一数据库表的组件,它允许我们打开、关闭、编辑、添加和删除表中的记录。在实现多表关联时,通常会用到TTable组件来代表每个相关的数据库表。 3. **关联字段(Foreign ...
在多表关联设计中,处理数据更新、删除等操作时有两种常见的方法: 1. **手动编写SQL语句:** - **优点:**可以根据具体需求定制SQL语句,灵活性高。 - **缺点:**编写复杂,容易出错;特别是对于大规模数据处理...
本篇文章主要探讨了单表存储与多表关联两种设计模式及其在数据存取上的优缺点。 首先,单表存储是一种将相关数据集成在一个表内的设计方式,例如在表A中有一个字段CustNo,它存放了从基础表B中选取的资料。这种设计...
1. 定义两个临时表`@idtable`和`@lastidtable`,分别用来存储待删除的记录ID和上一轮删除的记录ID。 2. 将即将被删除的记录ID存入`@lastidtable`。 3. 当`@lastidtable`中有ID时,进入循环: - 通过查询找到所有...
对于单个表的删除操作,有以下几种形式: 1. **按条件删除特定行**: ```sql DELETE FROM tableName WHERE columnName = value; ``` 这将删除满足指定条件的所有行。 2. **删除表内所有行**: ```sql DELETE...
如果直接尝试删除“instances”表中的某一行记录,而该记录在其他表中有引用,则会触发数据库级别的完整性检查,并因此导致删除操作失败。 #### 解决方案 解决上述问题的关键在于按照正确的顺序执行删除操作,即先...
本文将深入探讨在Zend Framework中如何进行多表关联的数据库操作以及事务处理。 首先,让我们了解多表关联。在数据库设计中,当多个表之间存在关系时,我们称之为多表关联。例如,用户表和订单表之间的关联,用户...
在这个项目中,我们讨论的核心是如何利用这两个框架来实现两个表的增删改查、表之间的关联以及用户登录功能。 首先,我们要理解 MVC 架构。Model 是业务逻辑处理,它处理数据并响应 View 和 Controller 的请求。...
在数据库设计中,当两个或更多表之间存在关系时,我们通常会创建一个关联表来存储这些关系。例如,在用户和角色的关系中,一个用户可以有多个角色,这种关系就可通过一个关联表来表示,其中包含用户ID和角色ID。 在...
例如,在处理多对多关系时,通常需要一个额外的关系表,即所谓的关联表,用于存储两个表之间的关联数据。在本教程中,`BugsProducts`表充当了关系表的角色,它连接了`Bugs`和`Products`两个表。在`Bugs`和`Products`...
如果错误地执行了删除操作,可能会导致数据丢失。因此,在编写代码时必须非常小心。 **示例代码:** ```abap REPORT ZTEST006 MESSAGE-ID zmess. DATA: lr_t_dtab TYPE REF TO data. "定义一个能够接纳任何数据...
例如,如果有两个关联的表A和B,我们可能需要创建两个对应的JavaBean,一个表示表A,另一个表示表B。在进行联合查询时,这两个Bean可能会被合并成一个复合Bean,用于一次性处理两个表的数据。 接下来,涉及到SSH...
总之,ListView和GridView的全选、反选及关联删除操作是Android应用中常见的功能需求。通过理解Adapter机制和事件监听,开发者可以轻松实现这些功能,提高用户体验。在实现过程中,应注重性能优化,确保操作流畅,...
在ORMLite中,删除操作也很简单。删除一个User会自动删除与其关联的所有Order,因为我们在设置`foreignAutoDelete`为true。更新操作也类似,只需获取对象,修改属性,然后调用update方法即可。 在提供的示例代码中...
在MySQL数据库系统中,当表之间存在关联时,执行删除操作前需要特别小心,因为不当的删除会破坏数据的完整性,导致关联表的结构和数据出现问题。关联表通常通过外键来建立关联关系,外键是用于约束两个表之间数据的...
JOIN操作将两个表连接在一起,基于它们之间的关联字段。例如,如果我们有一个`parent_id`字段在子表中引用父表的`id`,那么可以使用INNER JOIN或LEFT JOIN来获取所有子节点。如果树结构非常深,可能需要递归查询,...