大家好, 学习abap一个来月了,对程序的基本构架有一定的了解,基本语法有一定的了解。但是整个程序 总是不能很好的理解,特别是在看到form 中select ,if 和write 头就疼了,不想往下看,前 我觉得最好的办法是一边看一边测试,你可以自己创建一个程序,然后把那个程序拷贝过来,删掉几 行,或者慢慢添加,每添加几行执行一下看看结果,你就可以很明了的知道,这几行到底是干什么用 的,呵呵,其次就是多看看F1,遇到不知道的变量,记住双击可以追述的,这个功能一定要用好,呵呵, 能帮上大忙呢!
定义数据类型用关键字 TYPES
定义数据对象用关键字 DATA
在abap程序中用abap基本数据类型(预定义类型)定义局部数据类型,还可以定义包含多个abap基本数据类型的结构体类型。
参考现有的数据对象(LIKE)
DATA A2 LIKE A1"A1对象
参考现有的数据类型(TYPE)
DATA A2 LIKE A1"A1类型
VALUE关键字来指定数据对象的初始值。
DATA NUM1 TYPE I VALUE 10 "NUM1初始值为10
LENGHT关键字指变量长度。
DATA NUM2 TYPE C LENGHT8
DATA NUM2(8) TYPE C
DATA语句没有指定 TYPE则默认长度为1的C类型。
SY-SUBRC:系统执行某命令后,表示执行成功与否的变量,'0'表示成功
SY-UNAME:当前使用者的name
SY-DATUM:当前系统日期
SY-UZEIT:当前系统时间
SY-TCODE:当前执行程序的Tcode
数值文字不加单引号
123,-123
字符文字加单引号
'HELLO','1234','123E4'
CONSTANTS语句用来定义常数,必须有VALUE值
CONSTANTS a1 TYPE TNAME VALUE8
一个汉字占两个长度
赋值
MOVE 对象/对象字段 TO 对象/对象字段
对象/对象字段 = 对象/对象字段
所有的符号都要用空格隔开,圆括号和 *** 作符都是关键字需要跟 *** 作数之间至少用一个空格隔开。
例:( 20 + 10) 10 + 10 / 2
用'/'去大值 用DIV取小值
ABS(n):取绝对值
SIGN(n):判断数值符号
n为正,返回1;n为0,返回0;n为负,返回-1;
CEIL(n):取大于数值n的最小整数
例:WRITE CEIL(123) 输出2
WRITE CEIL(-223) 输出-2
FLOOR(n):取小于数值n的最小整数
例:WRITE FLOOR(123) 输出1
WRITE FLOOR(-223) 输出-3
TRUNC(n):去数值的整数部分
例:WRITE TRUNC(123) 输出1
WRITE TRUNC(-223) 输出-2
FRAC(n):去数值的小数部分
例:WRITE FRAC(123) 输出023
具体用法:
ABAP的动态数据对象包括字段符号(filed symbols)和数据引用(data reference)两种形式。
普通数据对象的寻址静态地通过该对象名称进行;而上述两种数据对象则只有在运行时,系统才知道该数据对象的名称和属性,并进行寻址。
在程序运行期内可将数据对象分配给字段符号。成功分配后,使用字段符号或其所代表数据对象本身,是没有任何区别的。换句话说,如果用赋值语句修改字段符号的值,字段符号所代表的数据对象本身的值也随之改变。
声明字段符号需使用 FIELD-SYMBOLS 语句,基本语法格式如下
FIELD-SYMBOLS <fs> [ TYPE type | LIKE dobj ]
声明字段符号时可以指定类型,该类型决定了运行时何种数据对象可以被分配给一个字段符号,此处可以指定一般性类型和完全限定类型,如果不指定类型,则系统默认该字段符号为一般性类型ANY。
字段符号声明之后,可以进行字段分配,所分配的数据对象应符合字段符号定义时的类型说明。字段符号可以反复进行分配,且分配方式有静态和动态之区分。
在将数据对象分配给字段符号的过程中,可以进行类型的强制转换,即所有数据对象都可以被视为一个特定类型。强制类型转换通过ASSIGN语句中的CASTING附加项指定,该选项的出现意味着可以将一个与字段符号指定类型不兼容的数据对象赋给字段符号。强制类型转换分为显式和隐式两种情况。
如果一个字段符号的类型是完全指定的,或者是ABAP内置类型C,N,P,X之一,可以使用下列格式实现隐式强制类型转换 ASSGIN f TO <fs> CASTING 当字段分配后,无论其原始数据对象类型如何,系统内表都按照字段符号定义类型对分配的数据对象进行处理。
程序中使用的所有数据对象均存储在运行时分配的内存中,每一个对象均对应有其起始的内存地址,该地址是由编译器分配的,一般不能被随意 *** 作。数据对象的内存地址也常常被称作引用。通常情况下,声明数据后,程序通过数据对象的名称对其进行 *** 作,然而有时也通过字段符号或者引用通过其他地址进行 *** 作。
在ABAP中,引用以数据引用和对象引用两种形式存在。
引用变量中包含地址引用,是指向其它数据对象的指针,其实际内容代表某数据对象的内存地址,在ABAP程序中是不可见的。引用类型定义和引用变量声明的语法格式如下:
TYPES t_dref TYPE REF TO DATA
DATA dref TYPE REF TO DATA
引用变量在ABAP作为结构类型的组件时可以被视为时普通基本类型,即引用变量可以作为复杂类型的结构组件或者独立出现。
引用变量声明时没有指向任何数据对象,因而也不能进行解除引用 *** 作。下述 *** 作可以使该引用对象指向实际的数据对象。
数据引用变量之间可以相互赋值,目标对象和源引用变量指向相同的数据对象,但不能将对象引用或非引用对象的值传递给引用变量。
所有通过DATA语句创建的数据对象都属于静态创建的数据对象,当程序开始运行时,这些变量已经存在。要在程序运行期间动态的创建对象,可通过数据引用变量进行。
CREATE DATA dref TYPE type | LIKE obj
该语句在运行期间内动态创建一个数据对象,同时引用变量dref指向这一对象。该对象没有名称,只能通过数据引用变量进行寻址,但在 *** 作该数据对象之前,需要通过字段符号解除引用。当没有任何数据引用变量指向该对象时,他将被sap中的垃圾收集装置从系统内存中删除。
在该语句中,必须指定数据类型。也可以通过变量动态的指定所创建的数据对象类型,这种指定类型的方式在所有ABAP语句中是唯一的。
CREATE DATA dref TYPE (name) 此处的变量name中包含具体的类型名称(如“C”)。
使用GET语句可以使一个引用变量获得已经存在的数据对象的地址引用。
GET REFERENCE OF obj INTO dref
其中obj可以是一个通过DATA语句定义的静态变量,也可以是指向某数据对象的字段符号。如果将引用变量指向一个过程内部的局域变量,则该变量在离开过程后将不能再使用,也不能进行解引用 *** 作。
解除引用是访问引用所指向的数据对象的前提,ABAP数据引用变量的解引用语法格式如下 ASSGIN dref-> TO <fs> [CASTING ]
该语句将数据引用变量dref指向的数据对象赋给字段符号,如果 *** 作成功,系统字段SY-SUBRC将返回0。系统将检查数据对象类型是否与字段符号声明类型相匹配,且该过程中可能出现强制类型转换。如果数据引用变量的值为初始值或者不正确,则无法进行解引用 *** 作,字段符号将保持原值不变,而系统字段SY-SUBRC将返回。对于动态创建的数据对象,解引用是获取其内容的唯一方式。
SD 定价公式(例程,即Formula) (2008/12/22)
使用事物 VOFM 定义公式,并用 abap 编写公式代码
SAP ERP 实施中,经常会用到例程开发(TCODE:VOFM)。
创建例程需要ACCESS KEY,这个可以通过申请得到,创建后例程会被包含在一个REQUEST下,例程创建之后还不能马上使用,需要激活,如图所示。
否则无法正常使用。
REQUEST释放后可以传输到目标系统,但是问题就出现在传输。如果只是传输,是无法正常使用的。
这是SAP的一个BUG。要了解这个BUG,先要了解SAP例程的工作原理。
例程工作原理:
例程,即Formula,是使用在销售、采购、发票、交货等单据中定价过程的一小段程序。之所以有Formula存
在,是因为在不同的业务场景下,定价过程可能千差万别,但是却可以拆分为一些关键的组成部分,如复制请
求、数据传输、要求、公式,每个例程就是一小段专用程序,这些例程程序会被标准程序动态调用:如:
PERFORM XXX IN XXXX IF FOUND 我们可以在例程中编写代码片段,修改运行环境中的数据。具体的每种例
程都有不同的环境变量和接口数据,在此就不详细说明了。
创建例程的过程,实际上是做了以下几件事,我们以要求–定价–909例程为例说明:
1 创建了程序:RV61A909,改程序可通过SE38查看
2 在表TFRM、TFRMT中添加数据,记录创建的例程编号等信息
3 激活例程时,RV61A909被INCLUDE 在RV61ANNN,即在RV61ANNN中添加一行:INCLUDE RV61A909
下面解释下传输后无法正常使用。
CHANGE REQUEST释放后传输,1、2两步可以正常完成,但是第三步,虽然在目标系统中激活了,但是未
能INCLUDE在RV61ANNN程序中,因此定价过程配置好之后,会出现ABAP DUMP
解决方法:在目标系统中运行程序:RV80HGEN即可修复BUG,而不需要在目标系统中通过VOFM激活例程。该程
序的作用是根据表TFRM,TFRMT在RV61ANNN等程序中增加INCLUDE RV61A909这样的代码,如此才能正常运行。具体见Notes:28683
可以利用这个语法,做一个批量的下载程序,
READ REPORT it_prog-name INTO it_text
该句话的意思是将 it_prog-name 这个程序代码写入 内表it_text中。
以上就是关于初学者如何看懂abap代码全部的内容,包括:初学者如何看懂abap代码、ABAP基本、ABAP基础-动态数据对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)