当前位置:文档之家› 很全abap入门知识

很全abap入门知识

ABAP入门知识

1.ST05是用于在开发ABAP程序时,对应事务码取得的字段是“数据结构”而不是“透

明表”的时候,通过ST05的“SQL跟踪”来获得相关“Select”的语句;一般查看“REC”列耗时比较多的“Select”语句;

2.跟踪时如果有涉及到“数量”这类有对数据表进行更新或插入操作的,则直接去查

Update和Insert的SQL语句;

3.在跟踪后,直接双击“对象名”列的名称,点选“表格字段”转到“SE11”的表字段表;

4.ABAP程序开头的Tables:“数据表名”,只有在屏幕中有用到的表,才需要声明;

在程序中用到的表则不需要进行在Tables内声名;

5.抓SAP“文本”字段的数据,要先自定义变量,然后通过SE37的函数

“FUNCTION ?ZREAD_TEXT?”取回文本数据;

6.新建的ABAP程序,在测试运行的时候要先进行“激活”,才能测试运行;

7.SE93:把ABAP写好的程序指定一个事务码执行;

8.abap引号内的字符??必须要是大写;

9.ABAP select 里面的语句,不能像mssql有那么丰富的函数使用,需要导到内

表后再对数据进行操作;

10.?EQ?是单个数据值,?BT?是between区间的意思。

11.在写select inner join 里面,要注意是否需要加上销售组织的条件;on 条

件1 and 销售组织条件。

12.SELECTION-SCREEN,里面有两个子项,PARAMETERS和select-options。

PARAMETERS 一般是用于必输项的屏幕参数设置,如果这个参数不是必输项的,就要用select-options。在select ...where条件里,用PARAMETERS的条件语法是“数据字段 = 屏幕字段”;而select-options的条件语法是“数据字段 in 屏幕字段”。

13.在where判断一个日期型数据是空,不是DEAKT = ??,也不是DEAKT is

initial,而应该写成DEAKT = ?00000000? (8个0)。

14.一对多的inner join,如果取出的数据有重复,前面加上distinct,用法和

MSSQL相同。

15.sy-subrc,指上一个语句执行是否成功;执行成功返回0,执行不成功返回非0。

用if判断。

16.如果一个语句中,该名称同时可能代表内表或者同名表工作区,则需要在内表名称

之后加“[]”指明当前操作的是内表对象。不提倡使用带有表头行的内表,而是应该总是声明结构相同的其他数据对象作为显示工作区进行内表行操作。

17.如何调整ABAP程序的性能(copy)

a)使用where语句

不推荐

Select * from zflight.

Check : zflight-airln = …LF? and zflight-fligh = …BW222?.

Endselect.

推荐

Select * from zflight where airln = …LF? and fligh = …222?.

Endselect.

b)使用聚合函数

不推荐

Maxnu = 0.

Select * from zflight where airln = …LF? and cntry = …IN?.

Check zflight-fligh > maxnu.

Maxnu = zflight-fligh.

Endselect.

推荐

Select max( fligh ) from zflight into maxnu where airln =

…LF? and cntry = …IN?.

c)使用视图代替基本表查询

不推荐

Select * from zcntry where cntry like …IN%?. [Page]

Select single * from zflight where cntry = zcntry-cntry and

airln = …LF?.

Endselect.

推荐

Select * from zcnfl where cntry like …IN%? and airln = …LF?.

Endselect.

d)使用INTO table 代替select endselect

不推荐

Refresh: int_fligh.

Select * from zflight into int_fligh.

Append int_fligh. Clear int_fligh.

Endselect.

推荐

Refresh: int_fligh.

Select * from zflight into table int_fligh.

e)使用批量修改内表代替逐行修改

不推荐

Loop at int_fligh.

If int_fligh-flag is initial.

Int_fligh-flag = …X?.

Endif.

Modify int_fligh.

Endloop.

推荐

Int_fligh-flag = …X?.

Modify int_fligh transporting flag where flag is initial.

f)使用二分法查询,提高查询内表数据速度

不推荐

Read table int_fligh with key airln = …LF?.

推荐

Read table int_fligh with key airln = …LF? binary search.

g)两个内表添加使用批量增加代替逐行

不推荐

Loop at int_fligh1.

Append int_fligh1 to int_fligh2.

Endloop.

推荐

Append lines of int_fligh1 to int_fligh2.

h)使用table buffering

Use of buffered tables is recommended to improve the performance considerably. The buffer is bypassed while using the following statements Select distinct

Select … for update

Order by, group by, having clause

Joins

Use the Bypass buffer addition to the select clause in order to explicitly bypass the buffer while selecting the data.

i)使用FOR ALL Entries

不推荐

Loop at int_cntry.

Select single * from zfligh into int_fligh where

cntry = int_cntry-cntry.

Append int_fligh.

Endloop.

推荐

Select * from zfligh appending table int_fligh

For all entries in int_cntry

Where cntry = int_cntry-cntry.

j)10、正确地使用where语句,使查询能使用索引When a base table has

multiple indices, the where clause should be in the order

of the index, either a primary or a secondary index k)To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that

has the same order of the fields. One more tip is that if

a table begins with MANDT, while an index does not, there

is a high possibility that the optimizer might not use that

index.

l)正确地使用MOVE语句

Instead of using the move-corresponding clause it is

advisable to use the move statement instead. Attempt should

be made to move entire internal table headers in a single

shot, rather than moving the fields one by one.

m)正确地使用inner join

Let us take an example of 2 tables, zairln and zflight. The

table zairln has the field airln, which is the airline code

and the field lnnam, which is the name of the airline. The

table zflight has the field airln, the airline code and other

fields which hold the details of the flights that an airline

operates. [Page]

Since these 2 tables are logically joined by the airln field,

it is advisable to use the inner join.

Select a~airln a~lnnam b~fligh b~cntry into table int_airdet From zairln as a inner join zflight as b on a~airln = b~airln.

In order to restrict the data as per the selection criteria,

a where clause can be added to the above inner join.

n)使用sort by 代替order by

o)避免使用SELECT DISTINCT语句

使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.

18.定义内表与工作区最方便的方法

*定义名为 ITAB 的内表,内表结构参照表TABLE。

DATA: ITAB TYPE TABLE OF TABLE.

*定义名为 WA 的工作区,其行结构与内表 ITAB 相同。

DATA: WA LIKE LINE OF ITAB.

19.使用occurs 0,定义的不再是对象,而是internal table

20.使用with header line后缀,定义为internal table的同时也定义了一个

同名对象,因此可以用以下语句:

LOOP AT STH.

WRITE: / STH.

ENDLOOP.

21.TYPE后面接结构,LIKE后面接对象

22.OBLIGATORY为必输字段

23.DATA SEPARATER. = DATA SEPARATER TYPE C.

24.关于内表的结构描述,它的当前记录数据是放在header line中的,Occurs 是

分配数据缓冲区,大小不重要,系统会自动分配。但定义内表不用occurs就需要用with header line,occurs语句记得是为了向下兼容。

25.occurs 指明的數量是有一點學問的.

a)當你知道可能每次用Select命中或交換的紀錄數xxx時,可指明 occurs

xxx.

b)如用occurs 0 聲明時, buffers 由系統自動分配.

26.SELECT在into时记得一般都要加上table,不然是into一个工作区,即wa,

而工作区要写入内表,则需要再append,所以直接定放内表即可,内表和工作区的区别就在于工作区就相当于表头,是有一行,data定义begin of itab时不加occurs就是工作区,加了就是内表,occurs *,后面表示系统初始分配给此内表多少行,每次满时再多分配多少行,我们平常为了节约内存,一般直接用0,with header line是为了定义含表头的内表,平常occurs就直接带表头,而with header line一般是在itab1 like itab occurs 0 with header line 时用,这是参照一个内表定义另一内表,如果要带表头,一定要加with header line。

27.你这样问不是办法,最好不懂时直接接F1,查到SAP的帮助即可. check是检查

后面的逻缉是否满足,不满足则在上例是跳出form,不的执行下面的语句。说实在,初略的看了一下上面的程序,写得太烂了,竟然将usr01或usr03透明表中的字段按条件取到一个表工作区,竟然不加single,象这种不加single的select按理说应该是调不过的,必须在后面再对应一个endselect,而这种select加endselect用每次去读一次透明表,访问数据库的次数太多了,换个好一点程序自己研究吧。

SAP ABAP PA certification 培训笔记

28.常见数据类型

P (4) 长度4个字节

Xstring (10) 长度为10个字节,可以容纳20个数字

29.大结构体与小结构体的兼容

Move 大 to 小大的覆盖小的大结构体的剩余部分保持不变

Move 小 to 大匹配的部分被小的覆盖, 其余的字段被初始化

30.P 类型与 F类型的优缺点

P:计算精确,适合商业结算,但范围短

F:储存范围大,计算不精确

31.P 与 F 类型的运算方式

F IEEE 用二进制数进行运算

P 采用半字节储存一个数字的方式进行运算

32.字段结构体兼容问题

字段兼容:类型和长度相同

结构体:字段按顺序兼容,并且字段数相同

内表兼容:行类型相同, KEY 兼容,表类型相同

如果字符串 move 到一个比字符串小的结构体 ,

[][][][] ---à [][]

[][]

33.一个字段 move 到一个内表中

Internal table 内表.

静态数据对象包括: 简单数据类型(除了string 和xstring 类型), 结构体(不包含string 和xstring 类型)

2. 动态数据对象:string , xstring , 包含string 或 xstring 的结构

体, 内表

34.一个结构体是否可以包含STRING 或xstring, 如果可以结构体可以拓展吗?

定义一个只有一个字段的内表字段长度是c(18),

定义一个结构体结构体里包含三个字段, 类型随意, 第二个类型,是另一个结构体

定义一个内表内表的行类型是第一个结构体.

再用第二个结构体定义一个内表 ,利用这个内表作为行类型,做一个内表。

35.内表的三个基本属性

line type 行类型

key definition 键类型

table kind 表类型

1)在standard table 中使用 table key的查找方式为 table scan 全表

扫描

2)在 sorted table 中使用table key 在遵循; left-aligned 从左至右

匹配, no gaps 没有间隔,使用”=” 填充字段时, 使用二分查找法 ,其它情况下使用 table scan查找+

3) 对hash表访问, 只能通过key访问单条记录, 访问的速度不依赖于表中的

数据量,而在其余两种表中,查询的时间与表中数据量成正比,其它情况是否代表,只是顺序不符合left-aligned. 哈希表可以通过部分的key 进行访问吗?

定义内表

a)定义一个局部内表类型,通过该类型定义内表变量

b)直接定义字段直接定义内表变量(隐藏了一个内表类型)

c)通过全局内表类型定义内表变量

36.标准的定义内表语句

Types or DATA name

TYPE table_kind OF line_type WITH key_def [INITIAL SIZE n.] Table kind and key. 表类型和表键

注意:在定义standard类型的内表时,如果使用 WITH DEFAULT KEY. 系统会自动将内表中的字符类型字段(c,n,d,t,x,string,xstring)组合成table key.

37.内表的key

a)standard标准表: key 不唯一.

b)sorted排序表: 可以指定KEY是否唯一

c)Hash 哈希表: KEY必须是唯一

38.在内表中使用不是结构体类型的行类型,当内表的行类型只有一列的时候,需要使

用pseudo-compnent 伪列,用途:设置一个按钮工具栏,用只含有一列的内表.

对内表的操作

a)move对内表的拷贝

b)clear 将数据清空

c)free 释放内存

d)compare表之间的操作,比较

e)sort 排序表

f)array fetch

39.递归比较

a)先对内表之间的行数进行比较

b)如果有必有的话,还需要对行的组件进行比较

40.内表之间的比较

a)用行数比较, 有必要的话可以用内容比较

b)定义两个内表两个内表不兼容一个有3个字段一个有5个

41.对两个内表进行比较.

a)定义两个内表, 结构一样 , 变量不一样

b)全做成数字型字段

c)第一个添加小数字

d)第二个内表添加大数字

e)排序可以指定升序降序.

42.对内表具体操作

1.Insert 插入

2. Read 读取

3.Change 修改

4.Delete 删除

5.Insert summated collect. 插入累计

43.对内表中的数据行进行限制条件操作

对数据的访问

一、单条数据访问

1) 通过 table key访问

2) 通过 line index 访问(对于line index 类型内表)

3) 通过 condition条件访问

二、多条数据访问

1) 通过condition条件访问

2) 通过 index interval 通过行区间访问

指定访问数据的传输方式

1. 使用结构体 work area 进行 copy 对内表数据进行操作

2. 定义 field symblo 指针指向访问数据,(可以直接访问数据)

3. 通过将内表插入内表的操作

重要: 不能通过line index 对hash 表进行访问, 在排序表中插入数据.除非插入的位置正好是排序表中规定的位置,否则会出现运行期异常(强烈不推荐使用insert往 sorted b表中插入数据)

Field symbol 指针

作用: 直接对内表进行操作,而不用再重新定义结构体对目标内表数据进行拷贝, 增大了效率.

定义指针语法:

Data: var_a TYPE I VALUE 4.

FIELD-SYMBOLS: TYPE i.

ASSIGN var_a TO .

= 77.

重要: 定义的指针名,必须加”<>”

Insert 插入操作

一、单条数据的插入操作

1)标准表: 可以使用 index (推荐) 和 table key 方式插入

2)排序表: 可以通过 table key方式插入 , 但也可以用index插入(强烈不推

荐, 很有可能出现运行错误)

3) Hash表: 只能够用table key 方式插入

二、多条记录的插入

1)源内表index table:则可以指定源内表的数据范围,并插入到目标内表中

2)目标内表为index table: 则可以可以指定目标内表被插入数据的具体index

位置.

具体的语句插入语法:

Insert wa INTO TABLE itab. 单条插入不指定位置

Insert wa INTO itab INDEX n. 单条插入指定插入位置

INSERT LINES OF itab1 [from n1 to n2]

INTO TABLE itab2.

INTO itab2 [ INDEX n]

读取内表的一条将数据读到结构体中,如果系统独到行 sy-subrc = 0 . 然后读取到结构体中,Sy-tfill 存放总行数,Sy-tleng 行的长度,Transporting 指定特定列传输字段,传送部分字段TRANSPORTING NO Fields 不传值,作用,看内表中有没有这条数据Camparing有一个结构体和内表

C1 C2 C3

Lh 0019 17

Lh 0018 18

通过comparing 后的值,可以判断读取的值是否符合要求.现在结构体中需要比较的字段赋值,先判相应字段是否相等比较成sy-subrc = 0 Zmycompare_2009 用一个结构作为查询条件,到内表查询符合条件的数据With key 可以用 table key 或普通字段作为条件使用field symbol

通过一个内表定义一个结构体作为指针

Read table itab [index n / key ] assigning .

Write: / -field_1.

直接修改 的值会怎么样?

Change 修改内表

Transporting 的传输方向

通过 field symbol

直接修改内表

重要: 不能直接指针对sorted 和 hash表进行操作

Delete

Delete table itab key

Key: from wa ()

With table key k1 = f1….

不能用sort 对排序表进行排序对sorted表进行insert modify,使用不当可能会出错.

HASH表不能通过 index 进行操作

Header line

With head line 关键字定义废弃用法

Occur + 整数, 10 ,

Occur 0 , 默认大小,

Occur 0 with head line 废弃用法了

重要: 在面向环境中不能用带有 head line 的内表

Data: so_carr LIKE RANGE OF carrid.

Loop 内表

Where 条件从起始点二分查找

标准表可以部分指定顺序

From 1 to 5

对于一个标准表来说, 加上二分查找是不是先排序

先把标准表排序, 然后再二分

必须先手工排序,再进行二分查找

关于ABAP内表(about abap internal tabl e)

44.内表的类型及定义:

1)ANY TABLE:即任意表类型,此种定义方式只能在传递参数的时候定义。

例如:FORM XXX USING/CHANGING TYPE ANY TABLE .

ANY TABLE包括了两种类型:INDEX TABLE和HASHED TABLE 。

INDEX TABLE:包括了STANDARD TABLE和SORTED TABLE

A.STANDARD TABLE:其实就是一个线性表,通过key访问内表是线性查找的,

也就是说,随着表中记录的增加,对表的操作的时间开销也相应的增加。

定义方法:TYPES/DATA: LIKE/TYPE STANDARD TABLE OF .

B.SORTED TABLE:顾名思义,表中的记录是按照一定的顺序排列的。访问表的

主要方式是表中定义的key,如果key不唯一,则选择index最小的那个。

也可以通过index来访问排序表,如果你想通过index插入一条记录,系统

会自动检查你插入的位置是否正确。所以,如果插入的时间比插入到标准表的

时间会长。因此,尽量选择key来对排序表进行操作。

定义方法:TYPES/DATA: LIKE/TYPE SORTED TABLE OF .

45.HASHED TABLE:对哈希表只能用你定义的key进行操作,而不能使用index进

行操作。因此,定义哈希表必须定义uniquekey 。注意:所有关于使用index 操作表的语句都不能用于操作哈希表。例如:sort,loop等。

定义方法:TYPES/DATA: LIKE/TYPE HASHED TABLE OF .

46.内表的操作:

1)创建:

A.定义一个结构,然后type/like这个结构

例如:

TYPES: BEGIN OF ,

...i>

...,

...

END OF .

DATA TYPE STANDARD TABLE OF WITH NON-UNIQUE

DEFAULT KEY INITIAL SIZE WITH HEADER LINE.

B.type/like系统表或者数据库表或者结构

DATA TYPE STANDARD TABLE OF <系统表名>

INITIAL SIZE

WITH HEADER LINE.

2)添加数据:

A.APPEND:直接向表中添加数据

1. APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING |REFERENCE

INTO dref].

2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.

3. APPEND [wa TO] itab SORTED BY f [ASSIGNING

B.向表中插入数据:

1. INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx]

[ASSIGNING |REFERENCE INTO dref].

2. INSERT [wa INTO|INITIAL LINE INTO] TABLE itab [ASSIGNING

|REFERENCE INTO dref].

3. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2

[INDEX idx3].

4. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE

itab2.

C.相同字段求和向表里添加:

Basic form COLLECT [wa INTO] itab.

Extras:

1. ... ASSIGNING

2. ... REFERENCE INTO dref

3. ... SORTED BY f

3)删除数据:

1. DELETE itab.

2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.

3. DELETE TABLE itab [FROM wa].

4. DELETE itab INDEX idx.

5. DELETE itab FROM idx1 TO idx2.

6. DELETE itab WHERE logexp.

7. DELETE ADJACENT DUPLICATES FROM itab.

4)修改数据:

1. MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING |REFERENCE

INTO dref] [TRANSPORTING f1 ... fn].

2. MODIFY TABLE itab [FROM wa]

[ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].

3. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond.

ABAP 内表(internal tabl e) 标题行(header line) 工作区(work area) 简介OCCURS 0

先是用TYPES关键字定义一个行(row)的类型.

如下:

TYPES: BEGIN OF line,

field1 TYPE i,

field2 TYPE i,

END OF line.

这里的line,就相当于一个自定义的类型,表示一行(row)的字段(field).这里一行有两个字段field1和field2.

然后是声明一个work area: DATA wa TYPE line.

我用C++(还是对cpp最有好感^^)的概念理解就是,line是一个class,而wa是一个object.

接着是声明一个每一行的类型是line的internal table:

DATA itab TYPE line OCCURS 0.

我在暂时把OCCURS作为了区别工作区和内表的标志.OCCURS应该有更深层次的意义,但我目前只能领悟至此...

当我们用以上这个方法来声明一个iternal table时,可以选择是否有无header line.

上面这句就是没有header line的.改成如下就有了:

DATA itab TYPE line OCCURS 0 WITH HEADER LINE.

有无header line的区别就是,header line可以当作一个work area来使用(参照我之前的一个日志).

有一下两种方式操作itab:

a)wa-field1 = 1.

wa-field2 = 2.

APPEND wa TO itab.

b)itab-field1 = 1.

itab-field2 = 2.

APPEND itab.

这里wa就是上面那个已经定义的work area.

有header line的时候,这两种都可以.无header line的时候,只能用第1种. 第2种里,itab的意义是一个header line,而不是内表.因为"DATA itab TYPE line OCCURS 0 WITH HEADER LINE."这样的声明,已经隐式声明了一个与内表同

名的header line.所以OCCURS用来声明内表可能造成二义性(ambiguous).

于是,OCCURS被认为是old的东西,采用一下方式声明一个内表比较好:

DATA itab TYPE STANDARD TABLE OF line.

还有一种声明内表的方法:

DATA: BEGIN OF itab OCCURS 0,

field1 TYPE i,

field2 TYPE i,

END OF itab.

这样的itab就自动有了一个同名的header line.

好像不会有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 这样的用法... 如果没有OCCURS 0,比如这样:

DATA: BEGIN OF itab,

field1 TYPE i,

field2 TYPE i,

END OF itab.

那么这个itab就不是内表咯,只是一个structure,可以作为itab的work area.

写到这里发现,归根到底就是TYPES和DATA这两个关键字的区别嘛.

还有有无OCCURS的区别.

这样一想,简单明了~~

OCCURS 是在3.0以前申明内表的关键字。意思是内表初始的时候有多少行。现在不提倡使用。看到了认识就行。

=======================================================

ABAP Work Area & Header Line -

1. Difference between Work Area and Header Line

工作区与标题行的不同之处

在对内表进行一些操作的时候,比如增加或者取回一条记录.我们必须暂时保存这条记录.这条记录就保存在内表的工作区里(work area).内表的工作区必须和内表有相同的结构.内表由主体(body)和一个可选的标题行(head line)组成.

标题行是一个隐式的(implicit)工作区.在内表声明的时候,可以选择有无标题行.

e.g.

data: begin of itab occurs 10,

ab type c,

cd type i,

end of itab.

这样的内表itab,是有标题行的.

data: wa_itab like itab.

这样的wa_itab是显式(explicit)声明的一个itab的工作区.

data: itab1 like itab occurs 10.

这样的内表itab1,是没有标题行的.

标题行是一个和内表主体有着一样结构的字段的串,标题行只有一行.

所以,标题行相当于一个缓冲区(buffer),用于存放被操作的纪录,是内表的缺省的工作区.

2. Using Header Lines as Work Areas

把标题行当工作区来使用

当你在创建一个内表的时候,你同时也声明了一个具有相同名称的标题行(这个好像很奇特的样子么...).可以把这个标题行当作工作区来对内表进行操作.

如果一个内表有标题行,则对其进行操作的ABAP语句会简短一些,因为这些语句会自动认为标题行是一个隐式的工作区.语句的不同如下表:

Operations without header line

Operations with header line

Operations for all Table Types

INSERT INTO TABLE .

INSERT TABLE ITAB.

COLLECT INTO .

COLLECT .

READ TABLE ... INTO .

READ TABLE ...

MODIFY TABLE FROM ...

MODIFY TABLE ...

MODIFY FROM ...WHERE ...

MODIFY ... WHERE ...

DELETE TABLE FROM .

DELETE TABLE .

LOOP AT ITAB INTO ...

LOOP AT ITAB ...

Operations for Index Tables

APPEND TO .

APPEND .

INSERT INTO ...

INSERT ...

MODIFY FROM ...

MODIFY ...

但是,用隐式的工作区,代码难以被理解,所以还是用一个不同名称的工作区比较好.

=======================================================

sap abap---通过例子学习ABAP--初始化内表清空内表

初始化内表的作用是清空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表过程中需要注意之处仍然是初始化无表头行内表和有表头行内表的区别,以及初始化内表和表头行的区别。

(1)CLEAR ITAB. 同时清空表头和行内表的值

(2)CLEAR ITAB. 只清空内表本身的值,保留表头行的值。

(3)REFRESH ITAB 只清空内表本身的值,保留表头行的值。

(4)FREE ITAB. 只清空内表本身的值,保留表头行的值。

DATA: BEGIN OF line,

col1(1) TYPE c,

col2(1) TYPE c,

END OF line.

DATA itab LIKE TABLE OF line WITH HEADER LINE.

line-col1 = 'A'. line-col2 = 'B'.

APPEND line TO itab.

loop at itab.

write : itab-col1.

endloop.

clear itab.

"在这里可以尝试CLEAR ITAB[],FREE ITAB,REFRESH ITAB,看看效果是不是如上所说这样。

IF itab IS INITIAL.

WRITE 'ITAB is empty'.

ENDIF.

很多程序BUG,就是这一类不起眼的东西引起的~

Clear & Refresh Internal Table.

1. with headerline.

CLEAR itab. : Clear the headerline of the Internal Table only.

CLEAR itab[]. : Clear the contents of the Internal Table except the headerline.

REFRESH itab. : Same as CLEAR itab[].

REFRESH itab[]. : Same as CLEAR itab[].

2. without headerline. ( all four commands have same functionality ) CLEAR itab. : Clear all contents of the Internal Table. CLEAR itab[]. : Same as CLEAR itab.

REFRESH itab. : Same as CLEAR itab.

REFRESH itab[]. : Same as CLEAR itab.

如何一次性的给内表的一列赋值,不用LOOP循环来做,比如把第一列都给设置成空.

CLEAR 对应工作区清空

MODIFY 内表 FROM 内表对应工作区

TRANSPORTING 修改字段

WHERE 修改字段 <> SPACE.

MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond

这句话的意思是凡是内表itab中满足条件cond的记录都被工作区wa的数据修改,修改的字段是f1...fn

sap abap programming----CALL TRANSACTION USING bdc_tab for Data Transfer

https://www.doczj.com/doc/6c6739606.html,/saphelp_sm32/helpdata/en/fa/09715a543b11d1 898e0000e8322d00/frameset.htm

DATA: it_bdcdata TYPE TABLE OF bdcdata,

wa_bdcdata TYPE bdcdata.

wa_bdcdata-program = 'SAPLBTCH'.

wa_bdcdata-dynpro = '2170'.

wa_bdcdata-dynbegin = 'X'.

APPEND wa_bdcdata TO it_bdcdata.

CLEAR wa_bdcdata.

wa_bdcdata-fnam = 'BTCH2170-JOBNAME'.

wa_bdcdata-fval = '*'.

APPEND wa_bdcdata TO it_bdcdata.

wa_bdcdata-fnam = 'BTCH2170-USERNAME'.

wa_bdcdata-fval = sy-uname.

APPEND wa_bdcdata TO it_bdcdata.

CALL TRANSACTION 'SM37' USING it_bdcdata.

--------------------------------------------------------

Submit to executable program via selection options

-------------------------------------------------------- SUBMIT zrmm0001 VIA SELECTION-SCREEN

AND RETURN

WITH p_matnr = itab-matnr

WITH p_werks = itab-werks

WITH p_lgort = itab-lgort

WITH s_charg = itab-charg

WITH p_num = p_label

WITH p_dest = p_print.

---------------------------------------------------------- Submit to program which not has selection screen

----------------------------------------------------------

SET PARAMETER ID 'RBN' FIELD S_ARSEG-BELNR.

SET PARAMETER ID 'GJR' FIELD S_ARSEG-GJAHR.

CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.

sap abap programming----execute--Call Underlying Database Store Procedure in ABAP

摘自https://www.doczj.com/doc/6c6739606.html,群中Robbin和徐的交流

1. 配置个外部DB, T-code为: DB59, DB50N, 测试连接

2. 执行Native SQL

eg:

EXEC SQL.

EXECUTE PROCEDURE EAI_ETL_CONTROL(IN :XX1,IN :XX2,IN :wa_datet_update,IN :XX3,OU

T :YY1)

ENDEXEC.

18:09 | 添加评论 | 固定链接 | 写入日志 | SAP ABAP

sap ABAP 常用函数(sap abap function)

RS_VARIANT_VALUES_TECH_DATA

可以返回一个内表, 里面存的是PARAMETER SELECT-OPTION的名字以及对应的值. 可用于background job中对vaiant的修改.

函数名描述

SD_VBAP_READ_WITH_VBELN 根据销售订单读取表vbap中的信息

EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新组织VIEW_MAINTENANCE_CALL 维护表视图

函数名描述

DY_GET_FOCUS 获得屏幕焦点

DY_GET_SET_FIELD_VALUE 获得或者设置屏幕字段的值

函数名描述

F4IF_INT_TABLE_VALUE_REQUEST 显示检索help

READ_TEXT 读取长文本

CONVERSION_EXIT_CUNIT_OUTPUT 单位转换

SJIS_DBC_TO_SBC 全角转半角

SJIS_SBC_TO_DBC 半角转换为全角

CO_R0_CHECK_DECIMAL_POINT 根据单位检查数据的小数位

POSTAL_CODE_CHECK 检查邮政编码

函数名描述

CONVERSION_EXIT_ALPHA_INPUT 全数字则在前面补0

CONVERSION_EXIT_ALPHA_INPUT 和上面相反

GET_JOB_RUNTIME_INFO 获得job相关信息

TERMINAL_ID_GET 获得端末id

DATE_CONVERT_TO_FACTORYDATE 把输入日期转为工厂日历日期

MESSAGE_TEXT_BUILD 把消息转为文本

函数名描述

POPUP_TO_CONFIRM 弹出确认窗口

函数名描述

CONVERSION_EXIT_MATN1_INPUT 物料号码转换函数

CONVERSION_EXIT_MATN1_OUTPUT 同上相反

CONVERT_TO_LOCAL_CURRENCY 按照指定日期汇率转换金额为指定货币类型

SSF_FUNCTION_MODULE_NAME 根据form名取得对应的函数名(SmartForm)

函数名描述

DATE_CHECK_PLAUSIBILITY 日期CHECK

cl_gui_frontend_services=>gui_upload 上传到服务器

cl_gui_frontend_services=>gui_download 下载到服本地

SSF_FUNCTION_MODULE_NAME SMARTFORMS输出报表时,生成一个函数名称,然后CALL这个名称

函数名描述

POPUP_TO_DECIDE_LIST 弹出供选择窗口

ABAP_DOCU_DOWNLOAD –以HTML格式下载ABAP文档。

ARFC_GET_TID –以十六进制形式返回终端的IP地址。

BAL_* -容纳了SAP的应用程序日志所有的函数模块。

BP_EVENT_RAISE –在 ABAP/4 程序中触发一个事件。

BP_JOBLOG_READ –获得job log的执行结果。

CLOI_PUT_SIGN_IN_FRONT –将负号前置, SAP默认将负号放在数字后面。CLPB_EXPORT –从内表导入到剪贴板。

CLPB_IMPORT –从剪贴板导入内表。

COMMIT_TEXT -To load long text into SAP 。

CONVERSION_EXIT_ALPHA_INPUT - 数字串前补0

example:

input = 123

output = 0000000000000。。。000000000000123

CONVERSION_EXIT_ALPHA_OUTPUT –消除数字串前的0

example:

input = 00000000000123

output = 123

CONVERT_OTF –将SAP文档(SAP Script)转换成其他类型。

example:

CALL FUNCTION 'CONVERT_OTF'

EXPORTING

FORMAT = 'PDF'

IMPORTING

BIN_FILESIZE = FILE_LEN

TABLES

OTF = OTFDATA

LINES = PDFDATA

EXCEPTIONS

ERR_MAX_LINEWIDTH = 1

ERR_FORMAT = 2

ERR_CONV_NOT_POSSIBLE = 3

OTHERS = 4.

DATE_GET_WEEK –返回一个日期所在的周数。

DATE_CHECK_PLAUSIBILITY –检查一个日期是否是SAP的有效格式。

DYNP_VALUES_READ –读取SCREEN字段的值,也可以用来读取报表SELECTION SCREEN。

DYNP_VALUES_UPDATE -更新屏幕字段的值。

ENQUE_SLEEP –在继续处理之前等待一个指定的时间。

ENQUEUE_ESFUNCTION –锁定一个ABAP程序使它不可以被执行:

RELID = 'ZZ'

SRTF2 = 0

SRTF = (your report name)

注意不要用SY-REPID来传递你的报表名字,当把SY-REPID作为参数传递给函数模块的时候,SY-REPID的值实际上已经发生了变化。

EPS_GET_FILE_ATTRIBUTES –获得文件属性。

EPS_GET_DIRECTORY_LISTING –返回一个本地或网络目录的文件列表。

F4_DATE - 弹出一个窗口显示一个日历允许用户选择一个日期。

F4IF_SHLP_EXIT_EXAMPLE – F4接口模块。

FILENAME_GET –弹出一个文件选择对话框。

DATA out(60) TYPE c.

CALL FUNCTION 'FILENAME_GET'

EXPORTING

filename = 'c:\1.txt'

title = 'GET FILENAME'

IMPORTING

filename = OUT.

FTP_CONNECT –打开并登陆FTP服务器的连接。

FTP_COMMAND –在FTP服务器上执行一个命令。

FTP_DISCONNECT –关闭指向FTP服务器的连接。

FORMAT_MESSAGE - Takes a message id and number, and puts it into a variable。 Works better than WRITE_MESSAGE, since some messages use $ as a place holder, and WRITE_MESSAGE does not accommodate that, it only replaces the ampersands (&) in the message。

GET_GLOBAL_SYMBOLS –返回一个程序的tables, select options, texts, etc 。甚至包含selection screen的文本定义。

GET_INCLUDETAB –获得一个程序的INCLUDES列表。

GUI_CREATE_DIRECTORY –在显示服务器端创建一个目录。

GUI_DELETE_FILE –在显示服务器端删除一个文件。

GUI_DOWNLOAD –从应用服务器下载内表到显示服务器。

GUI_EXEC –调用一个文件或程序,取代了WS_EXECUTE。

GUI_GET_DESKTOP_INFO –获得客户端桌面信息,取代了WS_QUERY。

GUI_REMOVE_DIRECTORY –从显示服务器删除一个目录。

GUI_RUN –启动一个文件或程序。

GUI_UPLOAD –从显示服务器上传文件到应用服务器,取代了WS_UPLOAD。

HELP_START –为一个字段显示帮助。 Useful for doing AT SELECTION SCREEN ON VALUE REQUEST for those fields that do not provide F4 help at the DDIC level。

HOLIDAY_GET –基于Factory Calendar&/ Holiday Calendar提供了一个节日表。

INIT_TEXT –上传长文本到SAP。

K_WERKS_OF_BUKRS_FIND –返回一个特定公司代码的所有工厂。

LIST_TO_ASCII –将ABAP报表从 OTF形式转换成ASCII 形式。

LIST_FROM_MEMORY – Retrieves the output of a report from memory when the report was executed using SUBMIT。。。EXPORTING LIST TO MEMORY。 See also WRITE_LIST。

MONTH_NAMES_GET –获得所有的月和名字

**** MS_EXCEL_OLE_STANDARD_OLE –创建一个文件并自动启动Excel 。CONVERT_OTFSPOOLJOB_2_PDF - converts a OTF spool to PDF (i。e。 Sap script document)

CONVERT_ABAPSPOOLJOB_2_PDF -convert ABAP spool output to PDF POPUP_TO_CONFIRM_LOSS_OF_DATA –弹出一个对话框告知用户有可能丢失数据,询问是否操作继续。

POPUP_TO_CONFIRM_STEP -弹出一个对话框询问用户是否操作继续。

POPUP_TO_CONFIRM_WITH_MESSAGE 可以显示定制的提示信息的确认窗口类似POPUP_TO_CONFIRM_STEP,只是多三行的文本错误诊断提示。

POPUP_TO_CONFIRM_WITH_VALUE 用此函数可以建立一个对话框用于询问用户是

相关主题
文本预览
相关文档 最新文档