ABAP 基础知识及语法使用注意事项

  • Clear、Refresh、Free

clear 内表  -------如果没有表头的话,该语句将会把内表的记录清空,有表头行的话则清空表头行

clear 内表[] ---------清空内表

refresh 删除所有记录但保留表头,内表所占内存仍保留

free 删除所有记录同时删除内表所占内存

  •  AT  NEW OF/AT END OF/AT FIRST OF/AT LAST OF.

AT NEW F.

代码段..

ENDAT.

F是内表的一个字段,以f为分组条件,在每组的第一条记录时执行时,即如果f及f前面的字段与上一行不一致时,执行其中的代码段

AT END OF F.

代码段..

ENDAT.

F是内表的一个字段,以f为分组条件,在每组的最后一条记录时执行时,即如果f及f前面的字段与下一行不一致时,执行其中的代码段。 

 at new of...endat.  at end of. ... end at.使用注意事项

  1. AT事件前一定要用主键(关键字段前面的字段 即f及f之前的字段)对内表排序
  2. AT 事件块中(AT ENDAT之间的逻辑行)关键字段后的字段值会被设置为初始值(数字)或被*(字符)或空(字符串)填充。可使用field-symbol或者对象引用
  3. LOOP + AT事件时,尽量少使用where条件,如果需要使用 where条件需使用关键字段,即f之前的字段

AT FIRST.

代码段..

ENDAT.

循环内表的第一行时执行

4. AT LAST.

代码段.

ENDAT.

循环内表的最后一行时执行。而且不用对Loop进行排序

on change of it-p1 [or it-p2 ……].  当指定字段与上一条字段有所改变时,触发该事件,on change无分组合计的功能

  •  FOR ALL ENTRIES IN使用注意事项
  1. 使用前要对内表判空,如果为空,就会使WHERE条件失效,相当于没有指定任何限制的取值
  2. 默认会去重,所以取数时要把必要的主键取出
  3. 内表很大的时候会占用很大内存,而且会达到使用上限,尽量避免大数据时使用
  4. 内表中与数据库关联字段必须要是相同的数据类型和长度
  5. 使用该语句时order by 和having 语句将不能使用
  6. 使用该语句时除count(*)外的聚合函数均不能使用
  •  ABAP内存和SAP内存

ABAP 内存被视为内部区域中ABAP程序的存储区,数据存储在程序调用中,这些程序调用允许将数据从一个程序调用传递到另一个程序调用。SAP内存可以将数据从一个会话传递到另一个会话,SAP内存是对当前会话都可以访问到的,除非用户退出系统,不然整个登录期间都有效,ABAP内存只针对一个会话,你用哪个会话设置的那么就只能在当前的会话可以取到值,新开的或是其他会话是访问不到的 。

1.读取方式不同

SAP内存使用GET/SET Parameter ID,ABAP内存使用Export和Import方法,Memory ID

SAP内存
DATA:GV_INDEX TYPE INT4.
SET PARAMETER ID 'ZINDEX_H' FIELD GV_INDEX.
GET PARAMETER ID 'ZINDEX_H' FIELD GV_INDEX.
PARARMETERS:P_INDEX TYPE N MEMORY ID ZINDEX_H.

ABAP内存
EXPORT … TO … 向MEMORY ID传出数据
IMPORT … FROM … 从MEMORY ID传入数据
FREE MEMORY ID,删除ABAP内存
EXPORT GV_INDEX TO MEMORY ID GV_INDEX.
IMPORT GV_INDEX FROM MEMORY ID GV_INDEX.

2.共享范围不同

SAP内存可以被所有的会话访问,可以是不同会话之间,可以是同一个会话不同程序之间,ABAP内存只是同一个会话不同程序之间传值

3.作用范围不同

SAP内存在整个终端会话时间有效,ABAP内存只能在一个会话时间内有效

4.使用范围一般原则

SAP内存用于屏幕默认值输入

ABAP内存用于模块之前传递数据

程序之间调用
SUBMIT ZHQ_19
   WITH P_YEAR = P_YEAR
    VIA SELECTION-SCREEN  "停留在选择界面
    AND RETURN."执行完成后停留在当前程序
  • 视图

视图类型

说明

数据库视图

Database View

数据库视图通过INNER JOIN的方式把数据库表连接起来,连接条件需要自定义,可以类似的作为一个数据库表在ABAP里使用

投影视图

Projection View

投影视图通过OUTER JOIN的方式,必须定义在单个透明表上,可以用于屏蔽一些字段(可以起到保护数据的作用)

维护视图

Maintenance View

维护视图通过OUTER JOIN的方式把数据表连接起来,主要用于在SM30中维护数据

帮助视图

Help View

用于创建搜索帮助

  • 表 

表类型

说明

标准表STANDARD TABLE, 系统为该表的每一行数据生成一个逻辑索引。 填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行。在对表进行插入、删除等操作时,各数据行在内存中的位置不变,系统仅重新排列各数据行的索引值。
排序表 SORTED TABLE, 也具有一个逻辑索引,不同之处是排序表总是按其关键字升序排序后再进行存储,其访问方式与标准表相同。 必须指定KEY(作为排序参考字段),可以指定UNIQUE KEY或者是NON-UNIQUE KEY
哈希表 HASHED TABLE, 没有索引,只能通过关键字来访问。系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间和表的行数无关。必须指定KEY,并且是UNIQUE KEY
  • ABAP调试技巧

F5单步执行,F6遇到子程序或函数会直接执行,F7会一次性执行完当前代码所在的过程,若在主程序中则执行完该程序,F8跳过后面所有的断点执行。

1、外部断点,用户注销后再登录还是有效,但只针对同一用户有效
2、会话断点,在同一登录会话不同窗口有效,用户注销后消失
3、调试断点,debug时打的断点,程序运行完就会消失
4、静态断点, BREAK 'sapecc' 会在用于sapecc 运行时暂停 
BREAK-POINT所有的用户在运行程序时都会暂停
5、语句断点,函数断点,子过程断点,类方法断点,异常断点等
都是在已进入调试模式的情况下进行的(断点-》断点位置)-》
6、条件断点(Watch point),输入观察变量及观察的表达式
7、/H启动调试,若遇到弹出框
[Function]
Command=/H
Type=SystemCommand 使用文本,将文件拖到窗口松手

  • 如何通过消息id查找对应报错代码 

1、事务码SE91,找到对应的消息类及对应消息,使用Where Used List功能。

2、使用观察点:设置观察变量SY-MSGID,直接执行F8则会直接跳到相应的报错位置

3、使用语句处断点:命令设置为MESSAGE

4、源代码扫描:SAP 提供了两个扫描工具,程序工具RS_ABAP_SOURCE_SCAN
和事务码工具CODE_SCANNER

  • 表维护生成器及分配TCODE

数据表维护:

1.SE11-》应用程序-》维护表生成器 ,数据维护SM30.
 2.SE54生成表维护,维护表tcode.

TCODE分配:
1.可以用SE93进行维护(选择Transaction with parameters (parameter transaction)-》

事务栏输入“SM30”;选中“跳过起始屏幕”;选中“Inherit GUI attribute”;输入默认字段:VIEWNAME = '自定义的表名' 和UPDATE = 'X';保存激活即可;)
2、使用函数View_Maintenance_Call
3、使用函数RS_TABLE_LIST_CREATE 

  • 锁 

SE11新建锁对象,SM12进行锁查看和维护,自定义的锁都必须以EZ/EY开头命名,激活保存后会自动生成两个函数ENQUEUE_<LOCK OBJECT>(加锁)和DENQUEUE_<LOCK OBJECT>(解锁)

S锁(Share lock),又名共享锁、读取锁,同一时间允许多个用户读取同一数据,但是一旦某个用户修改数据后,其他用户将不能访问数据,当一个事务执行Select 语句时,可以为这个数据库加一把共享锁,来锁定被查询的数据。

兼容性:如果数据资源上放置了共享锁,还能再放置共享锁(S)和更新锁(E)

并发性强:当多个事务读相同的数据时,每个事务都会获得一把共享锁,因此可以同时读锁定的数据.

E锁(Exclusive lock),又名更新锁,写入锁,同一时间内只能被一个用户读取或修改
同一时间类其他非同一事务类的排他锁或共享锁请求都会拒绝,当一个事务执行update语句时,数据库系统会先为事务分配一把更新锁。

兼容性:更新锁与共享锁是兼容的,也就是说,一个资源可以同时放置更新锁和共享锁,但是最多只能放置一把更新锁。

并发性:允许多个事务同时读锁定的资源,但不允许其他事务修改它。

X锁( Exclusive but not cumulative lock),又名独占锁、排他锁,适用于修改数据的场合,它所锁定的资源,其他事务不能读取也不能修改专用,

兼容性:独占锁不能和其他锁兼容,如果数据资源上已经加了独占锁,就不能再放置其他的锁。同样,如果数据资源上已经有了其他的锁,就不能再放置独占锁。

并发性:独占锁一直到事务结束才能被解除。只允许有一个事务访问锁定的数据,如果其他事务也需要访问该数据,就必须等待。

通用锁:通用加锁与解锁函数不需要创建表的锁对象就可以直接使用

ENQUEUE_E_TABLE表加锁

DEQUEUE_E_TABLE表解锁

ENQUEUE_ESFUNCTION函数加锁
DEQUEUE_ESFUNCTION函数解锁

程序锁:SAP提供了两个函数来解决程序运行时的同步锁定问题:

ENQUEUE_ES_PROG 加锁

DEQUEUE_ES_PROG 解锁

  • LUW(Logical Unit of Work)逻辑工作单元

1、什么是LUW?

 在SAP系统中,可以把一系列的数据库操作统一提交和回滚,从而来保证数据库更新的一致性。两个数据一致状态中的时间间隔为LUW,分SAP LUW 和DB LUW。

 DB LUW:这是底层数据库自身提供的保持数据一致性的机制,和底层DBMS有关, 是数据   库级别的,与SAP系统无关,它可以被显示或隐式的触发,显示触发如在ABAP程序中使用commit work语句,隐式提交如一个dialog结束进入下一个屏幕,调用FM进入另一个工作进程,隐式回滚如出错等。

 SAP LUW(多个 DB LUW):SAP LUW是数据库 LUW的一个增强,受体系结构限制,SAP程序每次屏幕切换时,都会触发一个隐式的数据库提交,一个程序在运行是会产生多个数据库的 LUW,这样无法做到全部提交或全部回滚,在某些业务场景下,这种事务的提交机制不足以保证数据的一致性,为此有了 SAP LUW 机制,SAP LUW 是一种延迟执行的技术,它将本来需要执行的程序块记录下来。记录的位置在内存或DB Table中,如 PERFORM … ON COMMIT 会记录到内存中,Update Funciton module即可以记录到内存也可以记录到 VBMOD 和 VBDATA 表中.系统在执行COMMIT WORK的时候会查询记录,真正执行需要运行的代码,进行整体修改或整体取消,从而提供了多个会话操作过程中保持数据的一致性的解决方案。

SAP事务:SAP事务即SAP应用程序,一个事务代码开启一个SAP事务,它包含一个或多个SAP LUW。

CALL FUNCTION … IN UPDATE TASK

  在定义 FUNCTION 时将其定义为 Update module,同时在调用时使用 IN UPDATE TASK 参数,该模块不是马上被执行,而是被放置于应用服务器中的一个特殊的更新工作过程(Update Work Process)中,因此可以将多个分布在不同对话过程中的类似模块捆扎在一起,当 SAP LUW 结束时,确保所有模块同时被成功执行或整体放弃,因此可通过该方式封装分布在不同对话过程中的所有数据库更新操作
非本地方式:注册的更新函数记录在 VBMOD 和VBDATA 表中,COMMIT WORK 时更新操作在 UPDATE进程中执行,此时调用程序不等待被调用函数的返回,使用的为异步方式。如果使用COMMIT WORK AND WAIT,此时调用程序等待被调用函数的返回,使用的为同步方式。

本地方式: 在调用函数前需要执行 SET UPDATE TASK LOCAL 。这样所有在该语句后使用 CALL FUNCTION … IN UPDATE TASK 注册的更新函数不会记录到数据库中,而是记录在内存中,在 COMMIT WORK 之后,会从内存取得待执行的函数,在同一个 Dialog 进程中执行数据的更新,本地方式更新采用的是同步方式,即使在 COMMIT WORK 后指定了AND WAIT 参数,仍然是同步执行。

优缺点对比:
       本地方式不将待执行的更新函数写到数据表中,减少了 I/O 操作,效率上较高,但由于采用的是同步方式,程序需等待更新结果,用户交互时的会感觉程序运行较慢。非本地方式会将更新结果记录到数据表中,可以通过SM13查看更新情况,同时由于可以进行异步更新,用户交互时感觉会比较快。

PERFORM … ON COMMIT [ LEVEL n ]

效果与上面相同,此方法更高效,但是此时子过程不能传递参数。 LEVEL 表示优先级,n取整数。n 越小越先执行。使用 ON COMMIT 参数注册的 Subroutine,如果同样名字的 Subroutine 被注册了多次,在 COMMIT WORK 时只执行一次,IN UPDATE TASK 方式执行的 Funciton 没有这个限制,PERFORM ON COMMIT 会优先执行,如果中断,CALL FUNCTION … IN BACKGROUND TASK 和 CALL FUNCTION … IN UPDATE TASK … DESTINATION 将不会执行,可以保证数据的全部提交和全部回滚。建议不要混合使用 CALL FUNCTION … IN BACKGROUND TASK 和 CALL FUNCTION … IN UPDATE TASK,因为一个是针对本地数据进行的更新,一个是远程数据,从技术上猜测,跨数据库的提交与回滚很难实现,故同时使用这两种方式可能会带来数据不一致的问题,除非本地和远程数据不需要保持数据的一致。

  • APPEND

标准表:默认追加数据到最后一行,可以使用APPEND …SORTED BY <f>语句,向内表加入数据行时会根据<f>的降序位置来插入到相应位置,不一定是最后位置。不能指定排序方式,默认就是降序,还需用[INITIAL SIZE n]指定内表大小

排序表:需要将追加的数据按关键字排列好,且不能插入重复的数据,否则程序会报错

哈希表: 不能使用APPEND语句

APPEND INITIAL LINE 追加空行。

APPEND LINES OF jtab FROM 2 TO 3 TO itab.. "添加多行,itab必须是索引表

APPEND LINES OF itab FROM 2 to 3  USING KEY sort_key to itab2。“”按第二索引sort_key的排序方式(升序),取index 2 到 3 的记录,并附加到 itab2中

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值