SAP ABAP快速指南

2018-12-27 09:53 更新

SAP ABAP - 概述

ABAP代表高级业务应用程序编程,4GL(第4代)语言。 目前,它与Java一起被定位为SAP应用服务器编程的主要语言。

让我们从SAP系统的高级架构开始。 典型SAP系统的3层客户端/服务器体系结构如下所示。

3-tier Client/Server Architecture

表示层包含可用于控制SAP系统的任何输入设备。 这可以是web浏览器,移动设备等。 所有中央处理都在应用程序服务器中进行。 应用服务器本身不仅仅是一个系统,而且它可以是处理系统的多个实例。 服务器与通常保存在单独服务器上的数据库层进行通信,主要是出于性能原因以及安全性。 通信发生在系统的每一层之间,从表示层到数据库,然后备份链。

注意 - ABAP程序在应用程序服务器级别运行。 软件的技术分发与其物理位置无关。 这意味着基本上所有三个级别可以在一台计算机上彼此安装,或者每个级别可以安装在不同的计算机或服务器上。

ABAP程序驻留在SAP数据库中。 它们在作为SAP内核一部分的运行时系统的控制下执行。 运行时系统处理所有ABAP语句,控制流逻辑和响应用户事件。

因此,与C ++和Java不同,ABAP程序不存储在单独的外部文件中。 在数据库内部,ABAP代码以两种形式存在 -

  • 可以使用ABAP工作台工具查看和编辑的代码。

  • 生成的代码,它是一个二进制表示。 如果你熟悉Java,这个生成的代码有点类似于Java字节码。

运行时系统可以被认为是一个虚拟机,就像Java虚拟机一样。 ABAP运行时系统的一个关键组件是将数据库独立语句(Open SQL)转换为底层数据库(本机SQL)理解的语句的数据库接口。 SAP可以与各种各样的数据库一起工作,并且相同的ABAP程序可以在所有这些数据库上运行。

SAP ABAP - 环境

报告是熟悉一般ABAP原则和工具的良好起点。 ABAP报告用于许多领域。 在本章中,我们将看到写一个简单的ABAP报告是多么容易。

你好ABAP

让我们开始使用常见的“Hello World"示例。

每个ABAP语句以ABAP关键字开头,以句点结尾。 关键字必须至少由一个空格分隔。 无论是否为ABAP语句使用一行或多行。

您需要使用ABAP编辑器输入您的代码,ABAP编辑器是SAP NetWeaver应用服务器ABAP(也称为“AS ABAP")附带的ABAP工具的一部分。

“AS ABAP"是具有自己的数据库,ABAP运行时环境和ABAP开发工具(如ABAP编辑器)的应用程序服务器。 AS ABAP提供独立于硬件,操作系统和数据库的开发平台。

使用ABAP编辑器

步骤1 - 启动事务SE38以导航到ABAP编辑器(在下一章中讨论)。 让我们开始创建一个是许多ABAP对象之一的报表。

步骤2 - 在编辑器的初始屏幕上,在输入字段PROGRAM中指定报告的名称。 您可以指定名称为ZHELLO1。 前面的Z对于名称很重要。 Z确保您的报告驻留在客户命名空间中。

客户命名空间包括所有具有前缀Y或Z的对象。当客户或合作伙伴创建对象(如报告)以将这些对象与SAP的对象区分开并防止与对象的名称冲突时,始终使用它。

步骤3 - 您可以用小写字母键入报告名称,但编辑器会将其更改为大写。 所以ABAP对象的名称是\'不区分大小写。

步骤4 - 指定报告的名称后,单击CREATE按钮。 将弹出一个弹出窗口ABAP:PROGRAM ATTRIBUTES,您将提供有关您的报告的更多信息。

步骤5 - 选择“可执行程序"作为报告类型,输入标题“我的第一个ABAP报告",然后选择保存以继续。 接下来将弹出CREATE OBJECT DIRECTORY ENTRY窗口。 选择按钮LOCAL OBJECT,弹出框将关闭。

您可以通过输入REPORT语句下面的WRITE语句来完成第一个报表,以便完整的报表只包含以下两行:

REPORT ZHELLO1. 
WRITE 'Hello World'.

启动报告

我们可以使用键盘(Ctrl + S)或保存图标(命令字段旁边的右侧)来保存报告。 ABAP开发在AS ABAP中进行。

启动报告就像保存报告一样简单。 单击激活按钮(开始图标旁边的左侧),然后使用图标DIRECT PROCESSING或F8功能键启动报告。 还显示标题“My First ABAP Report"以及输出“Hello World"。 这里是输出 -

My First ABAP Report 
Hello World 

只要您不激活新报告或激活对现有报告的更改,就不会与其用户相关。 这在中央开发环境中非常重要,您可以在其中开发其他开发人员在其项目中使用的对象。

查看现有代码

如果查看字段程序并双击值ZHELLO1,ABAP编辑器将显示报告的代码。 这称为前向导航。 双击对象的名称在适当的工具中打开该对象。

SAP ABAP - 屏幕导航

为了理解SAP ABAP,您需要具有登录,ABAP编辑器,注销等屏幕的基本知识。 本章重点介绍屏幕导航和标准工具栏功能。

登录屏幕

登录到SAP服务器后,SAP登录屏幕将提示输入用户ID和密码。 您需要提供有效的用户ID和密码,然后按Enter键(用户ID和密码由系统管理员提供)。 以下是登录屏幕。

SAP Login Screen

工具栏图标

以下是SAP屏幕工具栏。

SAP Screen Toolbar

菜单栏 - 菜单栏是对话框窗口的顶行。

标准工具栏 - 此工具栏中提供了大多数标准功能,如页首,页尾,上一页,下一页和保存。

标题栏 - 标题栏显示您当前所在的应用程序/业务流程的名称。

应用程序工具栏 - 此处提供了特定于应用程序的菜单选项。

命令字段 - 我们可以启动应用程序,而无需浏览菜单事务,一些逻辑代码分配给业务流程。 在命令字段中输入事务代码以直接启动应用程序。

ABAP编辑器

您可以只启动事务SE38(在命令字段中输入SE38)以导航到ABAP编辑器。

ABAP Editor

标准键和图标

退出键用于退出程序/模块或注销。 它们还用于返回到最后访问的屏幕。

以下是SAP中使用的标准退出键,如图所示。

Standard Keys Icons

以下是检查,激活和处理报告的选项。

Activating and Processing Reports

注销

完成工作后,从SAP系统退出ABAP编辑器或/和注销始终是一个很好的做法。

ABAP Editor Logoff

SAP ABAP - 基本语法

语句

ABAP源程序由注释和ABAP语句组成。 ABAP中的每个语句都以关键字开头,以句点结尾,ABAP不区分大小写。

程序中的第一个非注释行以单词REPORT开头。 报告将始终是创建的任何可执行程序的第一行。 该语句后面是以前创建的程序名称。 然后用一个满程终止该行。

语法是 -

REPORT [Program_Name]. 
 
[Statements…]. 

这允许语句根据需要在编辑器中占用尽可能多的行。 例如,REPORT可能看起来像这样 -

REPORT Z_Test123_01. 

语句包括命令和任何以句点结尾的变量和选项。 只要句子出现在语句的结尾,就不会出现问题。 正是这个时期,标志着声明的完成。

让我们编写代码。

在REPORT语句下面的行,只需键入以下语句:写\'ABAP教程\'。

REPORT Z_Test123_01.

Write 'This is ABAP Tutorial'. 

撰写语句时需要考虑的四件事: -

  • 写语句将引号中的任何内容写入输出窗口。

  • ABAP编辑器将所有文本转换为大写,除了由单引号包围的文本字符串。

  • 与一些较旧的编程语言不同,ABAP不关心语句在一行上开始的位置。 您可以利用这一点,并通过使用缩进指示代码块来提高程序的可读性。

  • ABAP对语句的布局没有限制。 也就是说,可以在单个行上放置多个语句,或者单个语句可以跨多个行扩展。

冒号表示法

如果每个语句的开头是相同的,则连续语句可以链接在一起。 这是使用冒号(:)运算符和逗号,用于终止单个语句,就像句点结束正常语句。

下面是一个程序的例子,可以保存一些关键抚摸 -

WRITE 'Hello'. 
WRITE 'ABAP'. 
WRITE 'World'. 

使用冒号表示法,可以这样重写 -

WRITE: 'Hello', 
       'ABAP', 
       'World'.

像任何其他ABAP语句,布局没有关系。 这是一个同样正确的声明 -

WRITE: 'Hello', 'ABAP', 'World'.

注释

内联注释可以通过以下两种方法之一在程序中的任何位置声明:

  • 通过在行的第一个位置放置星号(*)来指示全行注释,在这种情况下,整个行被系统认为是注释。 注释不需要以句点终止,因为它们可能不会跨越多个行延伸 -

* This is the comment line
  • 部分行注释通过在语句之后输入双引号(“)来表示,双引号后面的所有文本都被系统视为注释。您无需在一段时间内终止部分行注释,因为它们不能跨越更多 比一条线 -

WRITE 'Hello'. "Here is the partial comment

注意 - 注释代码未由ABAP编辑器大写。

抑制空白

NO-ZERO命令在DATA语句之后。 它抑制包含空格的数字字段的所有前导零。 输出通常更容易让用户阅读。

例子

REPORT Z_Test123_01. 

DATA: W_NUR(10) TYPE N.
      MOVE 50 TO W_NUR.
      WRITE W_NUR NO-ZERO.

上面的代码产生以下输出 -

50

注意 - 没有NO-ZERO命令,输出为:0000000050

空白线

SKIP命令有助于在页面上插入空行。

例子

消息命令如下 -

WRITE 'This is the 1st line'. 
SKIP. 
WRITE 'This is the 2nd line'. 

上述消息命令产生以下输出 -

This is the 1st line 
This is the 2nd line

我们可以使用SKIP命令插入多个空白行。

SKIP number_of_lines. 

输出将是由线数定义的几个空白行。 SKIP命令还可以将光标定位在页面上所需的行上。

SKIP TO LINE line_number. 

此命令用于在页面上上下动态移动光标。 通常,在此命令后发出WRITE语句,将输出放在所需的行上。

插入线

ULINE命令自动在输出插入一条水平线。 也可以控制线的位置和长度。 语法很简单 -

ULINE.

例子

消息命令如下 -

WRITE 'This is Underlined'.
ULINE.

上面的代码产生以下输出 -

This is Underlined (and a horizontal line below this).

消息

MESSAGE命令显示由程序开始处REPORT语句中指定的消息ID定义的消息。 消息ID是一个2字符代码,用于定义在使用MESSAGE命令时程序将访问的1000个消息的集合。

消息编号从000到999.与每个数字相关联的消息文本最多为80个字符。 调用消息号时,将显示相应的文本。

以下是用于Message命令的字符 -

信息 类型 后果
E Error 消息出现,应用程序在当前点暂停。 如果程序在后台模式下运行,则作业将被取消,并且消息将记录在作业日志中。
W Warning 将出现该消息,用户必须按Enter键才能继续应用程序。 在后台模式下,消息将记录在作业日志中。
I Information 将打开一个弹出窗口,其中包含消息文本,用户必须按Enter键才能继续。 在后台模式下,消息将记录在作业日志中。
A Abend 此消息类将取消用户当前正在使用的事务。
S Success 这会在屏幕底部提供一条信息性消息。 显示的信息是正性的,它只是为用户反馈。 该消息不以任何方式阻碍程序。
X Abort 此消息中止程序并生成ABAP短转储。

错误消息通常用于阻止用户做不应该做的事情。 警告消息通常用于提醒用户他们的行动的后果。 信息消息给用户有用的信息。

例子

当我们为消息创建消息时,ID AB,MESSAGE命令 - MESSAGE E011给出以下输出 -

EAB011 This report does not support sub-number summarization.

SAP ABAP - 数据类型

当在ABAP中编程时,我们需要使用各种变量来存储各种信息。 变量只是保留值的存储位置。 这意味着,当您创建一个变量,你在内存中保留一些空间。 您可能希望存储各种数据类型的信息,如字符,整数,浮点等。基于变量的数据类型,操作系统分配内存并决定在保留内存中可以存储的内容。

基本数据类型

ABAP为程序员提供了丰富的固定长度和可变长度数据类型。 下表列出了ABAP基本数据类型 -

类型 关键词
字节字段 X
文本域 C
Integer I
浮点 F
打包数量 P
文本字符串 STRING

一些字段和数字可以使用一个或多个名称来修改,如下所示 -

  • byte
  • numeric
  • character-like

下表显示数据类型,将值存储在内存中需要多少内存,以及可以存储在此类变量中的最小值和最大值。

类型 典型长度 典型范围
X 1字节 任何字节值(00到FF)
C 1个字符 1〜65535
N(数字文本字段) 1个字符 1〜65535
D(类似字符的日期) 8个字符 8个字符
T(字符型时间) 6个字符 6个字符
I 4字节 -2147483648至2147483647
F 8字节 2.2250738585072014E-308至1.7976931348623157E + 308正或负
P 8字节 [-10 ^(2len -1)+1]到[+ 10 ^(2len -1)1](其中len =固定长度)
STRING Variable 任何字母数字字符
XSTRING(字节字符串) Variable 任何字节值(00到FF)

例子

REPORT YR_SEP_12. 
DATA text_line TYPE C LENGTH 40. 
text_line = 'A Chapter on Data Types'. 
Write text_line. 

DATA text_string TYPE STRING. 
text_string = 'A Program in ABAP'. 
Write / text_string. 

DATA d_date TYPE D. 
d_date = SY-DATUM. 
Write / d_date.

在此示例中,我们有一个具有预定义长度40的C类型的字符串。STRING是可用于任何长度可变的字符串(文本字符串)的数据类型。 类型STRING数据对象通常应用于固定长度不重要的字符内容。

上面的代码产生以下输出 -

A Chapter on Data Types 
A Program in ABAP 
12092015 

DATE类型用于存储日期信息,并且可以存储八位数字,如上所示。

复杂和参考类型

复杂类型分为结构类型表类型 在结构类型中,基本类型和结构(即,嵌入在结构中的结构)被分组在一起。 你可以只考虑基本类型的分组。 但是你必须意识到结构的嵌套的可用性。

当基本类型被分组在一起时,数据项可以作为分组数据项被访问或者可以访问各个基本类型数据项(结构字段)。 表类型在其他编程语言中更好地称为数组。 数组可以是简单数组或结构数组。 在ABAP中,数组被称为内部表,并且与其他编程语言相比,它们可以以许多方式被声明和操作。 下表显示了表示内部表的参数。

S.No。 参数& 描述
1

线或行类型

内部表的行可以是基本类型,复杂类型或引用类型。

2

将字段或一组字段指定为标识表行的内部表的键。 键包含基本类型的字段。

3

存取方法

描述ABAP程序如何访问单个表条目。

引用类型用于引用类,接口和运行时数据项的实例。 ABAP OOP运行时类型服务(RTTS)允许在运行时声明数据项。

SAP ABAP - 变量

变量是用于在程序的分配的存储区域中存储值的命名数据对象。 顾名思义,用户可以在ABAP语句的帮助下更改变量的内容。 ABAP中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局; 可以存储在该存储器内的值的范围; 以及可以应用于该变量的一组操作。

您必须先声明所有变量,然后才能使用它们。 变量声明的基本形式是 -

DATA <f> TYPE <type> VALUE <val>. 

这里< f> 指定变量的名称。 变量的名称最多可包含30个字符。 < type> 指定变量的类型。 具有完全指定的技术属性的任何数据类型被称为< type&gt ;. < val> 指定< f>的初始值。 变量。 在定义基本固定长度变量的情况下,DATA语句会自动使用类型特定的初始值填充变量的值。 < val>的其他可能值 可以是文字,常量或显式子句,例如Is INITIAL。

以下是变量声明的有效示例。

DATA d1(2) TYPE C.  
DATA d2 LIKE d1.  
DATA minimum_value TYPE I VALUE 10. 

在上面的代码片段中,d1是C类型的变量,d2是d1类型的变量,minimum_value是ABAP整数类型的变量。

本章将解释ABAP中可用的各种变量类型。 ABAP中有三种变量 -

  • Static Variables
  • Reference Variables
  • System Variables

静态变量

  • 静态变量在子程序,函数模块和静态方法中声明。

  • 生命周期与声明的上下文相关联。

  • 使用\'CLASS-DATA\'语句,可以在类中声明变量。

  • “PARAMETERS"语句可用于声明链接到选择屏幕上的输入字段的基本数据对象。

  • 您还可以使用“SELECT-OPTIONS"语句声明在选择屏幕上链接到输入字段的内部表。

以下是命名变量时使用的约定 -

  • 您不能使用特殊字符(例如“t"和“,")来命名变量。

  • 无法更改预定义数据对象的名称。

  • 变量的名称不能与任何ABAP关键字或子句相同。

  • 变量的名称必须传达变量的含义,而不需要进一步的评论。

  • 连字符被保留以表示结构的组件。 因此,你应该避免在变量名中使用连字符。

  • 下划线字符可用于分隔复合词。

这个程序显示如何使用PARAMETERS语句声明一个变量 -

REPORT ZTest123_01. 
PARAMETERS: NAME(10) TYPE C, 
CLASS TYPE I, 
SCORE TYPE P DECIMALS 2, 
CONNECT TYPE MARA-MATNR. 

这里,NAME表示10个字符的参数,CLASS表示整数类型的参数,默认大小(以字节为单位),SCORE表示具有最多两个小数位的值的打包类型参数,CONNECT是指ABAP字典的MARA-MATNF类型

上面的代码产生以下输出 -

ABAP Dictionary

参考变量

声明引用变量的语法是 -

DATA <ref> TYPE REF TO <type> VALUE IS INITIAL. 
  • REF TO附加声明一个引用变量ref。

  • REF TO之后的规范指定了引用变量的静态类型。

  • 静态类型限制< ref>的对象集合。 可以参考。

  • 引用变量的动态类型是它当前引用的数据类型或类。

  • 静态类型总是更加通用或与动态类型相同。

  • TYPE添加用于创建绑定引用类型和起始值,并且只能在VALUE添加后指定IS INITIAL。

例子

CLASS C1 DEFINITION. 
PUBLIC SECTION. 
DATA Bl TYPE I VALUE 1. 
ENDCLASS. DATA: Oref TYPE REF TO C1 , 
Dref1 LIKE REF TO Oref, 
Dref2 TYPE REF TO I . 
CREATE OBJECT Oref. 
GET REFERENCE OF Oref INTO Dref1. 
CREATE DATA Dref2. 
Dref2→* = Dref1→*→Bl.
  • 在上面的代码片段中,声明了对象引用Oref和两个数据引用变量Dref1和Dref2。

  • 这两个数据引用变量都是完全类型化的,可以使用取消引用运算符→*在操作数位置取消引用。

系统变量

  • ABAP系统变量可从所有ABAP程序访问。

  • 这些字段实际上由运行时环境填充。

  • 这些字段中的值指示系统在任何给定时间点的状态。

  • 您可以在SAP中的SYST表中找到系统变量的完整列表。

  • 可以使用“SYST-"或“SY-"访问SYST结构的各个字段。

例子

REPORT Z_Test123_01. 

WRITE:/'SY-ABCDE', SY-ABCDE,       
      /'SY-DATUM', SY-DATUM, 
      /'SY-DBSYS', SY-DBSYS, 
      /'SY-HOST ', SY-HOST, 
      /'SY-LANGU', SY-LANGU,
      /'SY-MANDT', SY-MANDT,
      /'SY-OPSYS', SY-OPSYS,
      /'SY-SAPRL', SY-SAPRL,
      /'SY-SYSID', SY-SYSID,
      /'SY-TCODE', SY-TCODE,
      /'SY-UNAME', SY-UNAME,
      /'SY-UZEIT', SY-UZEIT.

上面的代码产生以下输出 -

SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ  
SY-DATUM 12.09.2015 
SY-DBSYS ORACLE                   
SY-HOST sapserver 
SY-LANGU EN 
SY-MANDT 800 
SY-OPSYS Windows NT 
SY-SAPRL 700 
SY-SYSID DMO 
SY-TCODE SE38 
SY-UNAME SAPUSER 
SY-UZEIT 14:25:48

SAP ABAP - 常数&amp; 文字

文字是您在程序的源代码中创建的未命名数据对象。 他们完全由他们的价值定义。 您不能更改文字的值。 常量是通过使用声明性语句静态创建的命名数据对象。 通过为程序的存储区域中存储的值分配一个常量来声明该常量。 分配给常数的值在程序执行期间不能更改。 这些固定值也可以被视为文字。 有两种类型的文字 - 数字和字符。

数字字面量

数字文字是可以有前缀符号的数字序列。 在数字文字中,没有十进制分隔符,也没有带尾数和指数的符号。

以下是一些数字文字的例子 -

183. 
-97. 
+326.

字符文字

字符文字是用单引号括起来的ABAP程序的源代码中的字母数字字符序列。 用引号括起来的字符文字具有预定义的ABAP类型C,并被描述为文本字段文字。 包含在“后引号"中的文字具有ABAP类型STRING,并且被描述为字符串文字。 字段长度由字符数定义。

注意 - 在文本字段文字中,将忽略尾随空白,但在字符串文字中将会考虑它们。

以下是字符文字的一些示例。

文本字段字面值

REPORT YR_SEP_12. 
Write 'Tutorials Point'. 
Write / 'ABAP Tutorial'.  

字符串字面值

REPORT YR_SEP_12. 
Write `Tutorials Point `. 
Write / `ABAP Tutorial `. 

在上述两种情况下的输出相同 -

Tutorials Point  
ABAP Tutorial

注意 - 当我们尝试更改常量的值时,可能会发生语法或运行时错误。 在类或接口的声明部分中声明的常量属于该类或接口的静态属性。

CONSTANTS声明

我们可以在CONSTANTS语句的帮助下声明命名的数据对象。

以下是语法 -

CONSTANTS <f> TYPE <type> VALUE <val>.

CONSTANTS语句类似于DATA语句。

< f> 指定常量的名称。 TYPE< type> 表示常数,其命名为< f&gt ;,其继承与现有数据类型< type>相同的技术属性。 VALUE< val> 为声明的常量名< f>赋值一个初始值。

注意 - 我们应该使用CONSTANTS语句中的VALUE子句。 子句“VALUE"用于在声明期间为常量赋予初始值。

我们有3种类型的常数,如基本,复杂和参考常数。 以下语句显示如何使用CONSTANTS语句定义常量 -

REPORT YR_SEP_12. 
CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'. 
Write: / 'The value of PQR is:', PQR.

输出为 -

The value of PQR is: 1.2356

这里它涉及基本数据类型并且被称为基本常数。

下面是复常数的示例 -

BEGIN OF EMPLOYEE,  
Name(25) TYPE C VALUE 'Management Team',  
Organization(40) TYPE C VALUE 'Tutorials Point Ltd',  
Place(10) TYPE C VALUE 'India',  
END OF EMPLOYEE.

在上面的代码片段中,EMPLOYEE是一个由Name,Organization和Place字段组成的复杂常量。

以下语句声明一个常量引用 -

CONSTANTS null_pointer TYPE REF TO object VALUE IS INITIAL.

我们可以在比较中使用常量引用,或者我们可以将其传递给过程。

SAP ABAP - 操作员

ABAP提供了一组丰富的运算符来操纵变量。 所有ABAP运营商分为四类 -

  • Arithmetic Operators
  • Comparison Operators
  • Bitwise Operators
  • Character String Operators

算术运算符

算术运算符在数学表达式中使用的方式与在代数中使用的方式相同。 以下列表描述了算术运算符。 假设整数变量A保持20并且变量B保持40。

S.No。 算术运算符 描述
1

&amp; plus; (添加)

在运算符的两侧添加值。 示例:A&amp; plus; B将给予60。

2

- (减法)

从左手操作数中减去右手操作数。 示例:A - B将给出-20。

3

*(乘法)

将运算符两侧的值相乘。 示例:A * B将给出800。

4

/(部门)

用右手操作数除左手操作数。 示例:B / A将给出2。

5

MOD(Modulus)

用右手操作数除左手操作数,并返回余数。 示例:B MOD A将给出0。

例子

REPORT YS_SEP_08. 
DATA: A TYPE I VALUE 150, 
B TYPE I VALUE 50, 
Result TYPE I. 
Result =  A / B. 
WRITE / Result.

上面的代码产生以下输出 -

3

比较运算符

让我们讨论不同操作数的各种类型的比较运算符。

S.No。 比较运算符&amp; 描述
1

=(相等测试)。 替代形式是EQ。

检查两个操作数的值是否相等,如果是,则条件为真。 示例(A = B)不为真。

2

<> (不等式检验)。 替代形式是NE。

检查两个操作数的值是否相等。 如果值不相等,则条件为真。 示例(A<> B)为真。

3

> (大于测试)。 替代形式是GT。

检查左操作数的值是否大于右操作数的值。 如果是,则条件变为true。 示例(A> B)不是真的。

4

< (小于测试)。 替代形式是LT。

检查左操作数的值是否小于右操作数的值。 如果是,则条件变为true。 示例(A

5

> =(大于或等于)替代形式为GE。

检查左操作数的值是否大于或等于右操作数的值。 如果是,则条件变为true。 示例(A> = B)不是真的。

6

< =(小于或等于测试)。 替代形式是LE。

检查左操作数的值是否小于或等于右操作数的值。 如果是,则条件变为true。 示例(A

7

a1 BETWEEN a2 AND a3(间隔测试)

检查a1是否在a2和a3之间(包括)。 如果是,则条件变为真。 示例(A BETWEEN B和C)为真。

8

IS INITIAL

如果变量的内容没有改变,并且它已被自动赋予其初始值,则条件为真。 示例(A IS INITIAL)不为真

9

不是初始

如果变量的内容已更改,则条件为真。 示例(A IS NOT INITIAL)为真。

注意 - 如果变量的数据类型或长度不匹配,则执行自动转换。 在比较不同数据类型的两个值时,对一个或两个值执行自动类型调整。 转换类型由数据类型和数据类型的首选顺序决定。

以下是喜好的顺序 -

  • 如果一个字段是类型I,则另一个字段转换为类型I.

  • 如果一个字段是P类型,则另一个字段转换为类型P.

  • 如果一个字段是类型D,则另一个字段转换为类型D.但是C和N类型不转换,它们直接比较。 类似于类型T的情况。

  • 如果一个字段是类型N,另一个是类型C或X,则两个字段都转换为类型P.

  • 如果一个字段是类型C,另一个是类型X,则X类型转换为类型C.

实施例1

REPORT YS_SEP_08. 

DATA: A TYPE I VALUE 115,
      B TYPE I VALUE 119.
      IF A LT B.
      WRITE: / 'A is less than B'.
      ENDIF

上面的代码产生以下输出 -

A is less than B 

实施例2

REPORT YS_SEP_08. 

DATA: A TYPE I.
      IF A IS INITIAL.
      WRITE: / 'A is assigned'.
      ENDIF.

上面的代码产生以下输出 -

A is assigned.

按位运算符

ABAP还提供了一系列可以用于构建布尔代数表达式的逐位逻辑运算符。 位运算符可以使用括号等组合在复杂表达式中。

S.No。 按位运算符 描述
1

BIT-NOT

一元运算符,将十六进制数中的所有位翻转为相反的值。 例如,将此运算符应用于具有位级值10101010(例如“AA")的十六进制数将给出01010101。

2

BIT-AND

此二进制运算符使用布尔AND运算符逐位比较每个字段。

3

BIT-XOR

二进制运算符,使用布尔XOR(异或)运算符逐位比较每个字段。

4

BIT-OR

二进制运算符,使用布尔OR运算符逐位比较每个字段。

例如,以下是真值表,其示出了当对包含在字段A和字段B中的两个比特值应用布尔AND,OR或XOR运算符时生成的值。

字段A 字段B 要么 XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

字符串运算符

以下是字符串运算符的列表 -

S.No。 字符串运算符&amp; 描述
1

CO(仅包含)

检查A是否仅由B中的字符组成。

2

CN(不包含)

检查A是否包含不在B中的字符。

3

CA(包含任何)

检查A是否至少包含一个字符B.

4

NA(不含任何)

检查A是否不包含任何字符B.

5

CS(包含字符串)

检查A是否包含字符串B.

6

NS(不包含字符串)

检查A是否不包含字符串B.

7

CP(包含模式)

它检查A是否包含B中的模式。

8

NP(不包含模式)

它检查A是否不包含B中的模式。

例子

REPORT YS_SEP_08. 
DATA: P(10) TYPE C VALUE 'APPLE',
      Q(10) TYPE C VALUE 'CHAIR'.
      IF P CA Q.
	
      WRITE: / 'P contains at least one character of Q'.
      ENDIF.

上面的代码产生以下输出 -

P contains at least one character of Q.

SAP ABAP - 循环控制

可能有一种情况,当你需要执行一段代码几次。 一般来说,语句是按顺序执行的:函数中的第一个语句首先执行,然后是第二个语句,依此类推。

编程语言提供允许更复杂的执行路径的各种控制结构。 循环语句允许我们多次执行一个语句或一组语句,以下是大多数编程语言中的循环语句的一般形式。

Loop Statement

ABAP编程语言提供以下类型的循环来处理循环需求。

S.No。 循环类型&amp; 描述
1 WHILE loop

当给定条件为真时,重复一个语句或一组语句。 它在执行循环体之前测试条件。

2 Do loop

DO语句对于将特定任务重复特定次数很有用。

3 Nested loop

您可以在任何另一个WHILE或DO循环中使用一个或多个循环。

循环控制语句

循环控制语句从其正常序列改变执行。 ABAP包括允许循环提前结束的控制语句。 它支持以下控制语句。

S.No。 控制语句&amp; 描述
1 CONTINUE

导致循环跳过其身体的剩余部分,并开始下一个循环传递。

2 CHECK

如果条件为假,则在CHECK之后的剩余语句被忽略,并且系统开始下一循环通过。

3 EXIT

完全终止循环,并将执行转移到循环后立即执行的语句。

SAP ABAP - 决策

决策结构具有要由程序评估或测试的一个或多个条件,以及如果条件被确定为真则要执行的一个或多个语句,以及可选地,如果条件 被确定为假。

以下是大多数编程语言中典型的决策结构的一般形式 -

Decision Making

ABAP编程语言提供以下类型的决策语句。

S.No。 声明&amp; 描述
1 IF Statement

IF语句由逻辑表达式后跟一个或多个语句组成。

2 IF.. Else Statement

IF语句后面可以是一个可选的ELSE语句,当表达式为false时执行。

3 Nested IF Statement

您可以在另一个IF或ELSEIF语句中使用一个IF或ELSEIF语句。

4 CASE Control Statement

当我们需要比较两个或多个字段或变量时,使用CASE语句。

SAP ABAP - 字符串

在ABAP编程中广泛使用的字符串是一系列字符。

我们使用数据类型C变量保存字母数字字符,最少为1个字符,最多为65,535个字符。 默认情况下,这些向左对齐。

创建字符串

以下声明和初始化创建一个由“Hello"字组成的字符串。 字符串的大小正好是单词“Hello"中的字符数。

Data my_Char(5) VALUE 'Hello'.

以下程序是创建字符串的示例。

REPORT YT_SEP_15. 
DATA my_Char(5) VALUE 'Hello'. 
Write my_Char.

上面的代码产生以下输出 -

Hello

字符串长度

为了找到字符串的长度,我们可以使用 STRLEN语句 STRLEN()函数返回字符串中包含的字符数。

例子

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials',
      length_1 TYPE I. 
	
length_1 = STRLEN( title_1 ). 
Write: / 'The Length of the Title is:', length_1.

上面的代码产生以下输出 -

The Length of the Title is: 9 

ABAP支持处理字符串的各种语句。

S.No。 声明和; 目的
1

CONCATENATE

两个字符串连接形成第三个字符串。

2

CONDENSE

此语句删除空格字符。

3

STRLEN

用于查找字段的长度。

4

REPLACE

用于以字符进行替换。

5

搜索

在字符串中运行搜索。

6

SHIFT

用于向左或向右移动字符串的内容。

7

SPLIT

用于将字段的内容拆分为两个或多个字段。

下面的例子使用了上面提到的一些语句 -

例子

REPORT YT_SEP_15. 
DATA: title_1(10) VALUE 'Tutorials', 
      title_2(10) VALUE 'Point',
      spaced_title(30) VALUE 'Tutorials  Point  Limited',
      sep,
      dest1(30),
      dest2(30).
	
CONCATENATE title_1 title_2 INTO dest1. 
Write: / 'Concatenation:', dest1. 

CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep. 
Write: / 'Concatenation with Space:', dest2. 

CONDENSE spaced_title.
Write: / 'Condense with Gaps:', spaced_title. 

CONDENSE spaced_title NO-GAPS. 
Write: / 'Condense with No Gaps:', spaced_title.

上面的代码产生以下输出 -

Concatenation: TutorialsPoint 
Concatenation with Space: Tutorials Point 
Condense with Gaps: Tutorials Point Limited 
Condense with No Gaps: TutorialsPointLimited

注意 -

  • 在Concatenation的情况下,\'sep\'在字段之间插入一个空格。

  • CONDENSE语句删除字段之间的空格,但只留下1个字符的空格。

  • \'NO-GAPS\'是CONDENSE语句的可选添加,删除所有空格。

SAP ABAP - 日期&amp; 时间

ABAP隐式引用了公历日历,在世界大部分地区有效。 我们可以将输出转换为特定国家/地区的日历。 日期是指定到关于日历的精确日,周或月的时间。 时间被指定为相对于一天的精确秒或分钟。 ABAP总是以24小时格式节省时间。 输出可以具有特定于国家的格式。 日期和时间通常被解释为在当前时区有效的本地日期。

ABAP提供了两种内置类型来处理日期和时间 -

  • D data type
  • T data type

以下是基本格式 -

DATA: date TYPE D, 
      time TYPE T.  
	
DATA: year TYPE I, 
month TYPE I,  
day TYPE I, 
hour TYPE I,  
minute TYPE I, 
second TYPE I.

这两种类型都是分别具有YYYYMMDD和HHMMSS格式的固定长度字符类型。

时间戳

除了这些内置类型,其他两种类型 TIMESTAMP TIMESTAMPL 在许多标准应用程序表中用于存储UTC格式的时间戳。 下表显示了ABAP中可用的基本日期和时间类型。

S.No。 数据类型&amp; 描述
1

D

内置的固定长度日期类型,格式为YYYYMMDD。 例如,值20100913表示2010年9月13日的日期。

2

T

内置固定长度时间类型,格式为HH MM SS。 例如,值102305表示时间10:23:05 AM。

3

TIMESTAMP (类型P - 长度8无小数)

此类型用于表示YYYYMMDDhhmmss表单中的短时间戳。 例如,值20100913102305表示2010年9月13日上午10:23:05的日期。

4

TIMESTAMPL (类型P - 长度11小数7)

TIMESTAMPL表示YYYYMMDDhhmmss,mmmuuun表单中的长时间戳。 这里,附加数字“mmmuuun"表示秒的分数。

当前日期和时间

以下代码片段检索当前系统日期和时间。

REPORT YR_SEP_15. 
DATA: date_1 TYPE D. 

date_1 = SY-DATUM. 
Write: / 'Present Date is:', date_1 DD/MM/YYYY. 

date_1 = date_1 + 06. 
Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.

上面的代码产生以下输出 -

Present Date is: 21.09.2015 
Date after 6 Days is: 27.09.2015

变量date_1分配有当前系统日期SY-DATUM的值。 接下来,我们将日期值增加6.对于ABAP中的日期计算,这意味着我们将日期对象的日期组件增加6天。 ABAP运行时环境足够聪明,可以在每月结束时翻转日期值。

时间计算与日期计算类似。 以下代码使用基本时间算法将当前系统时间增加75秒。

REPORT YR_SEP_15. 
DATA: time_1 TYPE T. 
      time_1 = SY-UZEIT. 

Write /(60) time_1 USING EDIT MASK 
'Now the Time is: __:__:__'. 
time_1 = time_1 + 75. 

Write /(60) time_1 USING EDIT MASK 
'A Minute and a Quarter from Now, it is: __:__:__'.

上面的代码产生以下输出 -

Now the Time is 11:45:05 
A Minute and a Quarter from Now, it is: 11:46:20

使用时间戳

您可以使用 GET TIME STAMP 检索当前系统时间并将其存储在时间戳变量中,如以下代码所示。 GET TIME STAMP语句根据所使用的时间戳数据对象的类型以长指针或短指针格式存储时间戳。 时间戳值使用UTC标准进行编码。

REPORT YR_SEP_12. 
DATA: stamp_1 TYPE TIMESTAMP,
 
stamp_2 TYPE TIMESTAMPL. 
GET TIME STAMP FIELD stamp_1. 
Write: / 'The short time stamp is:', stamp_1 

TIME ZONE SY-ZONLO. 
GET TIME STAMP FIELD stamp_2. 
Write: / 'The long time stamp is:', stamp_2 
TIME ZONE SY-ZONLO.

上面的代码产生以下输出 -

The short time stamp is: 18.09.2015 11:19:40 
The long time stamp is: 18.09.2015 11:19:40,9370000

在上面的示例中,我们使用TIME ZONE添加WRITE语句显示时间戳。 此添加根据指定的时区的规则格式化时间戳的输出。 系统字段SY-ZONLO用于显示在用户首选项中配置的本地时区。

SAP ABAP - 格式化数据

ABAP提供各种类型的格式化选项以格式化程序的输出。 例如,您可以创建包含不同颜色或格式样式的各种项目的列表。

WRITE语句是用于在屏幕上显示数据的格式化语句。 WRITE语句有不同的格式选项。 WRITE语句的语法是 -

WRITE <format> <f> <options>.

在此语法中,< format> 表示输出格式规范,其可以是指示从新行开始的输出的显示的正斜杠(/)。 除了正斜杠之外,格式规范还包括列号和列长度。 例如,WRITE / 04(6)语句显示新行从第4列开始,列长度为6,而WRITE 20语句显示了第20列的当前行。参数< f> 表示数据变量或编号文本。

下表描述了用于格式化的各种子句 -

S.No。 条款及条件 描述
1

LEFT-JUSTIFIED

指定输出为左对齐。

2

CENTERED

表示输出居中。

3

RIGHT-JUSTIFIED

指定输出为右对齐。

4

UNDER< g>

输出直接在字段< g>下启动。

5

NO-GAP

指定字段< f>之后的空白 被拒绝。

6

使用编辑掩码

表示格式模板< m>的规范。 使用无编辑掩码:这指定禁用在ABAP字典中指定的格式模板。

7

NO-ZERO

如果字段只包含零,则它们将被空格替换。

以下是数字类型字段的格式设置选项 -

S.No。 条款及条件 描述
1

NO-SIGN

指定屏幕上不显示前导符号。

2

EXPONENT< e>

指定在类型F(浮点字段)中,指数在< e>中定义。

3

ROUND< r>

类型P字段(压缩数值数据类型)首先乘以10 **( - r),然后四舍五入为整数值。

4

CURRENCY< c>

表示格式化是根据货币< c> 值存储在TCURX数据库表中。

5

UNIT< u>

指定小数位数根据< u> 单位,如类型P的T006数据库表中指定。

6

DECIMALS< d>

指定数字的数目< d> 必须显示在小数点后面。

例如,下表显示了日期字段的不同格式设置选项 -

格式化选项 例子
DD/MM/YY 13/01/15
MM/DD/YY 01/13/15
DD/MM/YYYY 13/01/2015
MM/DD/YYYY 01/13/2015
DDMMYY 130115
MMDDYY 011315
YYMMDD 150113

这里,DD代表两个数字中的日期,MM代表两个数字中的月份,YY代表两个数字中的年份,YYYY代表一年中的四个数字。

让我们来看看一个实现上面一些格式化选项的ABAP代码的例子 -

REPORT ZTest123_01.
 
DATA: n(9) TYPE C VALUE 'Tutorials', 
m(5) TYPE C VALUE 'Point'. 

WRITE: n, m. 
WRITE: / n, 
/ m UNDER n. 

WRITE: / n NO-GAP, m. 
DATA time TYPE T VALUE '112538'. 

WRITE: / time, 
/(8) time Using EDIT MASK '__:__:__'.

上面的代码产生以下输出 -

Tutorials Point 
Tutorials  
Point 
TutorialsPoint 
112538 
11:25:38

SAP ABAP - 异常处理

异常是在程序执行期间出现的问题。 当异常发生时,程序的正常流程中断,程序应用程序异常终止,这是不推荐的,因此这些异常将被处理。

异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。 ABAP异常处理建立在三个关键字 - RAISE,TRY,CATCH和CLEANUP。 假设块将引发异常,则方法使用TRY和CATCH关键字的组合捕获异常。 TRY - CATCH块放置在可能生成异常的代码周围。 以下是使用TRY - CATCH的语法 -

TRY.      
Try Block <Code that raises an exception> 
  
CATCH  
Catch Block <exception handler M>  
. . . 
. . . 
. . . 
CATCH  
Catch Block <exception handler R>
   
CLEANUP. 
   Cleanup block <to restore consistent state>
 
ENDTRY.

RAISE - 提出异常,表示发生了一些异常情况。 通常,异常处理程序会尝试修复错误或找到替代解决方案。

TRY - TRY块包含要处理其异常的应用程序编码。 此语句块按顺序处理。 它可以包含进一步的控制结构和程序调用或其他ABAP程序。 它后面是一个或多个catch块。

CATCH - 程序在要处理问题的程序中的地方使用异常处理程序捕获异常。 CATCH关键字表示捕获异常。

CLEANUP - 每当在TRY块中发生异常,而TRY块未被同一TRY - ENDTRY结构的处理程序捕获时,将执行CLEANUP块的语句。 在CLEANUP子句中,系统可以将对象恢复到一致状态或释放外部资源。 也就是说,可以对TRY块的上下文执行清除工作。

提高例外

可以在方法中的任何点,函数模块,子例程等提出异常。 有两种方式可以引发异常:

  • ABAP运行时系统引发的异常。

    例如,Y = 1 / 0.这将导致类型CX_SY_ZERODIVIDE的运行时错误。

  • 程序员提出的异常。

    同时提升和创建异常对象。 使用第一个方案中已存在的异常对象来引发异常。 语法是:RAISE EXCEPTION exep。

捕捉异常

处理程序用于捕获异常。

让我们来看看一段代码片段 -

DATA: result TYPE P LENGTH 8 DECIMALS 2, 
exref TYPE REF TO CX_ROOT, 
msgtxt TYPE STRING. 
PARAMETERS: Num1 TYPE I, Num2 TYPE I. 
TRY. 
result = Num1 / Num2. 
CATCH CX_SY_ZERODIVIDE INTO exref. 
msgtxt = exref→GET_TEXT( ). 

CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref. 
msgtxt = exref→GET_TEXT( ).

在上面的代码片段中,我们试图将Num1除以Num2,得到一个float类型变量的结果。

可以生成两种类型的异常。

  • 数字转换错误。

  • 除以零异常。 处理程序捕获CX_SY_CONVERSION_NO_NUMBER异常以及CX_SY_ZERODIVIDE异常。 这里异常类的GET_TEXT()方法用于获取异常的描述。

异常的属性

这里是异常的五个属性和方法 -

S.No。 属性&amp; 描述
1

Textid

用于定义异常的不同文本,并且也影响方法get_text的结果。

2

上一页

此属性可以存储原始异常,允许您构建异常链。

3

get_text

这将根据异常的系统语言将文本表示作为字符串返回。

4

get_longtext

这会将异常的文本表示的长变体作为字符串返回。

5

get_source_position

给出引发异常的程序名和行号。

例子

REPORT ZExceptionsDemo. 
PARAMETERS Num_1 TYPE I. 

DATA res_1 TYPE P DECIMALS 2. 
DATA orf_1 TYPE REF TO CX_ROOT. 
DATA txt_1 TYPE STRING. 

start-of-selection. 
Write: / 'Square Root and Division with:', Num_1. 
write: /. 

TRY. 
IF ABS( Num_1 ) > 150. 
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE. 
ENDIF.
  
TRY. 
res_1 = SQRT( Num_1 ). 
Write: / 'Result of square root:', res_1. 
res_1 = 1 / Num_1. 

Write: / 'Result of division:', res_1. 
CATCH CX_SY_ZERODIVIDE INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
CLEANUP. 
CLEAR res_1. 
ENDTRY. 

CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ).

CATCH CX_ROOT INTO orf_1. 
txt_1 = orf_1→GET_TEXT( ). 
ENDTRY. 
IF NOT txt_1 IS INITIAL. 
Write / txt_1. 
ENDIF. 
Write: / 'Final Result is:', res_1.

在此示例中,如果数字大于150,则引发异常CX_DEMO_ABS_TOO_LARGE。 上面的代码为数字160生成以下输出。

Square Root and Division with: 160 
The absolute value of number is too high 
Final Result is:  0.00

SAP ABAP - 词典

正如你所知,SQL可以分为两个部分 -

  • DML (Data Manipulation Language)
  • DDL (Data Definition Language)

DML部分包括查询和更新命令,如SELECT,INSERT,UPDATE,DELETE等,ABAP程序处理SQL的DML部分。 DDL部分由诸如CREATE TABLE,CREATE INDEX,DROP TABLE,ALTER TABLE等命令组成,ABAP字典处理SQL的DDL部分。

ABAP Dictionary

ABAP字典可以被视为驻留在SAP数据库中的元数据(即关于数据的数据)以及由数据库维护的元数据。 词典用于创建和管理数据定义,以及创建表,数据元素,域,视图和类型。

ABAP词典中的基本类型

ABAP词典中的基本类型如下 -

  • 数据元素通过定义数据类型,长度和可能的小数位数来描述基本类型。

  • 结构和可以具有任何类型的组件。

  • 表类型描述了内部表的结构。

可以在ABAP程序中引用Dictionary环境中的各种对象。 词典被称为全局区域。 词典中的对象对所有ABAP程序都是全局的,ABAP程序中的数据可以通过引用这些Dictionary全局对象来声明。

DBO ABAP Dictionary

字典支持用户定义类型的定义,这些类型在ABAP程序中使用。 它们还定义数据库对象的结构,如表,视图和索引。 当对象被激活时,这些对象将在底层数据库的字典定义中自动创建。 词典还提供编辑工具,如搜索帮助和锁定工具,如锁定对象。

字典任务

ABAP字典实现以下 -

  • Enforces data integrity.
  • Manages data definitions without redundancy.
  • Integrates tightly with rest of the ABAP development workbench.

例子

任何复杂的用户定义类型都可以从词典中的3种基本类型构建。 客户数据存储在结构“客户"中,组件名称,地址和电话如下图所示。 名称也是一个具有组件,名字和姓氏的结构。 这两个组件都是基本的,因为它们的类型由数据元素定义。

Customer Data

组件的类型地址由组件定义,其组件也是结构,而电话组件由表类型定义,因为客户可以有多个电话号码。 类型用于ABAP程序,也用于定义功能模块的接口参数类型。

SAP ABAP - 域

用于在ABAP字典中定义数据的三个基本对象是域,数据元素和表。 域用于表字段的技术定义,例如字段类型和长度,数据元素用于语义定义(简短描述)。 数据元素描述了特定业务环境中的域的含义。 它主要包含字段帮助和屏幕中的字段标签。

域被分配给数据元素,数据元素又被分配给表字段或结构字段。 例如,将MATNR域(CHAR材料号)分配给诸如MATNR_N,MATNN和MATNR_D的数据元素,并且将这些分配给许多表域和结构域。

创建域

在创建新域之前,请检查任何现有域是否具有表字段中所需的相同技术规范。 如果是这样,我们应该使用现有的域。 让我们讨论创建域的过程。

步骤1 - 转到事务SE11。

步骤2 - 在ABAP字典的初始屏幕中选择域的单选按钮,然后输入域名称,如以下屏幕截图所示。 单击CREATE按钮。 您可以在客户名称空间下创建域,对象的名称始终以“Z"或“Y"开头。

Creating Domain

步骤3 - 在域的维护屏幕的短文本字段中输入说明。 在这种情况下,它是“客户域"。 注意 - 在输入此属性之前,不能输入任何其他属性。

步骤4 - 在“定义"选项卡的“格式"框中输入数据类型,字符数和小数位数。 按下输出长度上的键,它建议并显示输出长度。 如果覆盖建议的输出长度,则可能会在激活域时看到警告。 你可以填写Convers。 例程,符号和小写字段(如果需要)。 但这些都是可选属性。

步骤5 - 选择值范围标签。 如果域限制为仅具有固定值,请输入固定值或间隔。 如果系统必须在为引用此域的字段定义外键时将此表建议为检查表,那么定义值表。 但所有这些都是可选属性。

Dictionary Change Domain

步骤6 - 储存变更。 将显示“创建对象目录条目"弹出窗口,并要求提供包。 您可以输入您在其中工作的包名称。 如果您没有任何包,那么您可以在对象导航器中创建它,或者您可以使用本地对象按钮保存您的域。

步骤7 - 启用您的网域。 单击激活图标(火柴图标)或按CTRL + F3激活域。 将出现一个弹出窗口,其中列出了2个当前处于非活动状态的对象,如以下快照所示 -

Active Domain

步骤8 - 此时,将激活名为ZSEP_18的顶部条目“DOMA"。 由于突出显示,单击绿色勾号按钮。 此窗口消失,状态栏将显示消息“对象已激活"。

如果在激活域时出现错误消息或警告,则会自动显示激活日志。 激活日志显示有关激活流的信息。 您也可以使用实用程序(M)→激活日志调用激活日志。

SAP ABAP - 数据元素

数据元素描述ABAP数据字典中的各个字段。 它们是复杂类型的最小不可分割单元,它们用于定义表字段的类型,表的结构组件或行类型。 关于表字段的含义的信息以及关于编辑相应屏幕字段的信息可以被分配给数据元素。 此信息自动可用于引用数据元素的所有屏幕字段。 数据元素描述了基本类型或引用类型。

Data Elements

创建数据元素

在创建新的数据元素之前,您需要检查任何现有的数据元素是否具有表字段中所需的相同语义规范。 如果是,您可以使用现有的数据元素。 您可以使用预定义的类型,域或引用类型分配数据元素。

以下是创建数据元素的过程 -

步骤1 - 转到事务SE11。

步骤2 - 在ABAP字典的初始屏幕中选择数据类型的单选按钮,然后输入数据元素的名称,如下所示。

步骤3 - 点击CREATE按钮。 您可以在客户名称空间下创建数据元素,对象的名称始终以“Z"或“Y"开头。

Creating Data Elements

步骤4 - 检查显示有三个单选按钮的CREATE TYPE弹出窗口上的Data元素单选按钮。

Data Elements Radio Button

步骤5 - 点击绿色复选标记图标。 您将被导向到数据元素的维护屏幕。

步骤6 - 在数据元素维护屏幕的短文本字段中输入说明。 在这种情况下,它是“客户数据元素"。 注意 - 在输入此属性之前,不能输入任何其他属性。

Customer Data Element

步骤7 - 为数据元素分配类型。 您可以通过检查引用类型来检查基本类型或引用数据元素来创建基本数据元素。 您可以将数据元素分配给域或基本类型中的预定义类型,并使用引用类型的名称或引用类型中的预定义类型的引用。

步骤8 - 在字段标签选项卡中输入短文本,中等文本,长文本和标题的字段。 您可以按Enter键,并为这些标签自动生成长度。

Data Elements Fields

步骤9 - 保存更改。 将显示“创建对象目录条目"弹出窗口,并要求提供包。 您可以输入您在其中工作的包名称。 如果您没有任何包,那么您可以在对象导航器中创建它,或者您可以使用本地对象按钮保存您的数据元素。

步骤10 - 激活您的数据元素。 单击激活图标(火柴图标)或按CTRL + F3激活数据元素。 将出现一个弹出窗口,其中列出了2个当前处于非活动状态的对象,如以下屏幕截图所示。

Active Data Elements

步骤11 - 此时,将激活名为Z_CUST的标记为“DTEL"的顶部条目。 由于突出显示,单击绿色勾号按钮。 此窗口消失,状态栏将显示消息“对象已激活"。

如果在激活数据元素时发生错误消息或警告,则会自动显示激活日志。 激活日志显示有关激活流的信息。 您也可以使用实用程序(M)→激活日志调用激活日志。

SAP ABAP - 表

可以独立于ABAP字典中的数据库来定义表。 当在ABAP词典中激活表时,也在数据库中创建其字段的类似副本。 在ABAP字典中定义的表自动转换为与数据库兼容的格式,因为表的定义取决于SAP系统使用的数据库。

表可以包含一个或多个字段,每个字段都使用其数据类型和长度进行定义。 存储在表中的大量数据分布在表中定义的几个字段中。

表字段的类型

表由许多字段组成,每个字段包含许多元素。 下表列出了表字段的不同元素 -

S.No。 元素&amp; 描述
1

字段名称

这是给可以包含最多16个字符的字段赋予的名称。 字段名称可以由数字,字母和下划线组成。 它必须以字母开头。

2

键标记

确定字段是否属于关键字字段。

3

字段类型

为字段分配数据类型。

4

字段长度

可在字段中输入的字符数。

5

小数位数

定义小数点后允许的位数。 此元素仅用于数值数据类型。

6

短文本

描述相应字段的含义。

在ABAP字典中创建表

步骤1 - 转到事务SE11,选择“数据库表"单选按钮,然后输入要创建的表的名称。 在我们的例子中,我们输入了名称ZCUSTOMERS1。 单击创建按钮。 将显示字典:维护表屏幕。 此处默认选择“交货和维护"选项卡。

步骤2 - 在简短说明字段中输入说明性短文。

步骤3 - 点击交货类别字段旁边的搜索帮助图标。 选择“A [应用程序表(主数据和事务数据)]"选项。

步骤4 - 从“数据浏览器/表视图维护"下拉菜单中选择“允许显示/维护"选项。 将显示字典:维护表屏幕。

Maintenance Table

步骤5 - 选择字段选项卡。 将显示包含与“字段"选项相关的选项的屏幕。

步骤6 - 在字段列中输入表字段的名称。 字段名称可以包含字母,数字和下划线,但它必须始终以字母开头,且长度不能超过16个字符。

要创建的字段还必须具有数据元素,因为它们从定义的数据元素获取属性,如数据类型,长度,小数位数和短文本。

步骤7 - 如果您希望该字段是表键的一部分,请选择键列。 让我们创建诸如CLIENT,CUSTOMER,NAME,TITLE和DOB等字段。

步骤8 - 第一个字段是重要的字段,它标识与记录相关联的客户端。 输入\'Client\'作为字段,\'MANDT\'作为数据元素。 系统自动填写数据类型,长度,小数和简短描述。 通过选中“键"框,将“客户端"字段设置为关键字段。

步骤9 - 下一个字段为“客户"。 选中该复选框使其成为关键字段,并输入新的数据元素\'ZCUSTNUM\'。 单击保存按钮。

步骤10 - 由于数据元素“ZCUSTNUM"尚不存在,因此必须创建。 双击新的数据元素,将出现“创建数据元素"窗口。 对此回答“是",并显示“维护数据元素"窗口。

步骤11 - 在简短说明区域中输入“客户编号"。 应为新的Data元素定义名为“Domain"的基本数据类型。 所以输入\'ZCUSTD1\',双击它并同意保存所做的更改。 选择“是"创建域,并在“简短描述"框中键入域的描述。

Elementary Data

“定义"选项卡将自动打开。 第一个字段是“数据类型"。

步骤12 - 点击框内,从下拉菜单中选择“NUMC"类型。 在“编号"中输入数字8。 字符(最多8个字符),并在“小数位数"区域中输入0。 必须选择输出长度为8,然后按Enter键。 “NUMC"字段的描述必须重新出现,确认这是一个有效的条目。

步骤13 - 点击保存按钮并激活对象。

步骤14 - 按F3返回“维护/更改数据元素"屏幕。 创建四个字段标签,如下面的快照所示。 之后,保存并激活元素。

Change Data Element

步骤15 - 按返回按钮返回表维护屏幕。 客户列具有正确的数据类型,长度,小数和简短描述。 这表示成功创建了一个Data元素以及所使用的域。

Change Table

同样,我们需要创建三个附加字段,如NAME,TITLE和DOB。

步骤16 - 从工具栏中选择“技术设置"。 为“数据类"选择APPL0,为“大小"类别字段选择第一个大小类别0。 在缓冲选项的情况下,必须选择“不允许缓冲"。

步骤17 - 点击保存。 回到表格并激活它。 出现以下屏幕。

Active Table

表\'ZCUSTOMERS1\'被激活。

SAP ABAP - 结构

结构是由存储器中一个接一个存储的任何数据类型的组件组成的数据对象。

Structure

结构对于绘制屏幕字段以及操作具有由离散数量的字段定义的一致格式的数据是有用的。

结构在运行时可能只有一个记录,但是一个表可以有很多记录。

创建结构

步骤1 - 转到事务SE11。

步骤2 - 点击屏幕上的“数据类型"选项。 输入名称“ZSTR_CUSTOMER1",然后点击创建按钮。

步骤3 - 在下一个屏幕中选择“结构"选项,然后按Enter键。 您可以看到\'维护/更改结构\'向导。

步骤4 - 输入简短说明,如以下快照中所示。

Structure Description

步骤5 - 输入组件(字段名称)和组件类型(数据元素)。

注意:此处组件名称以Z开头,按照SAP建议。 让我们使用我们已经在数据库表中创建的数据元素。

步骤6 - 提供所有组件和组件类型后,需要保存,检查和激活。

将显示以下屏幕 -

Active Structure

步骤7 - 由于此“ZSTR_CUSTOMER1"突出显示,请点击绿色勾号按钮。 此窗口消失,状态栏将显示消息“活动"。

现在激活结构,如以下快照中所示 -

ZSTR Structure1

SAP ABAP - 视图

视图的行为就像数据库表。 但它不会占用存储空间。 视图的行为类似于虚拟表 - 一个没有任何物理存在的表。 通过组合包含关于应用对象的信息的一个或多个表的数据来创建视图。 使用视图,可以表示表中包含的数据的子集,也可以将多个表连接到单个虚拟表中。

与应用程序对象相关的数据通过使用数据库视图分布在多个表中。 它们使用内部连接条件来连接不同表的数据。 维护视图用于显示和修改存储在应用程序对象中的数据。 每个维护视图都具有与其关联的维护状态。

我们使用投影视图来屏蔽不需要的字段,并只显示表中的相关字段。 必须在单个透明表上定义投影视图。 投影视图只包含一个表。 我们不能为投影视图定义选择条件。

创建视图

步骤1 - 在ABAP字典的初始屏幕上选择查看单选按钮。 输入要创建的视图的名称,然后单击创建按钮。 我们输入了视图的名称为ZVIEW_TEST。

步骤2 - 选择投影视图单选按钮,同时选择视图类型,然后点击复制按钮。 将显示“字典:更改视图"屏幕。

步骤3 - 在简短描述字段中输入简短描述,并在基准表字段中使用的表名称,如下面的快照所示。

Creating View

步骤4 - 点击“表格字段"按钮,在投影视图中包含CUSTOMERS表格的字段。

步骤5 - 显示表ZCUSTOMERS1屏幕中的字段选择。 选择要包括在投影视图中的字段,如以下快照中所示。

Field Table ZCUSTOMERS

步骤6 - 点击复制按钮后,投影视图的所有选定字段将显示在“词典:更改视图"屏幕上。

Change View

步骤7 - 选择维护状态选项卡以定义访问方法。 从“数据浏览器/表视图维护"的下拉菜单中选择只读单选按钮和“显示/维护允许的限制"选项。

步骤8 - 保存并激活。 在“字典:更改视图"屏幕中,选择实用程序(M)> 显示ZVIEW_TEST选择屏幕的内容。

步骤9 - 点击执行图标。 投影视图的输出如下图所示。

Zview Table

表CUSTOMERS 1由5个字段组成。 这里显示的字段为3(客户,客户编号和名称),有4个条目。 客户编号从100001到100004,具有适当的名称。

SAP ABAP - 搜索帮助

搜索帮助,ABAP字典的另一个存储库对象,用于以列表的形式显示字段的所有可能值。 此列表也称为命中列表 您可以选择要从此命中列表的字段中输入的值,而不是手动输入值,这是冗长乏味和容易出错的。

创建搜索帮助

步骤1 - 转到事务SE11。 选择搜索帮助的单选按钮。 输入要创建的搜索帮助的名称。 让我们输入名称ZSRCH1。 单击创建按钮。

步骤2 - 系统将提示您创建搜索帮助类型。 选择基本搜索帮助,它是默认值。 将显示如下屏幕截图所示的创建基本搜索帮助的屏幕。

第3步 - 在选择方法中,我们需要指明我们的数据源是表还是视图。 在我们的情况下,它恰好是一张表。 表是ZCUSTOMERS1。 它是从选择列表中选择的。

步骤4 - 输入选择方法后,下一个字段为对话框类型。 这将控制限制性对话框的外观。 有一个包含三个选项的下拉列表。 让我们选择“立即显示值"选项。

Search Help Demo

步骤5 - 下一步是参数区域。 对于每个搜索帮助参数或字段,必须根据要求输入这些列字段。

  • 搜索帮助参数 - 这是来自数据源的字段。 表中的字段列在选择列表中。 将输入参与搜索帮助的字段,每行中有一个字段。 让我们包括两个字段CUSTOMER和NAME。 在其余列中指示这两个字段如何参与。

Search Help Parameter
  • 导入 - 此字段是一个复选框,用于指示搜索帮助参数是否是导入参数。 导出或导入是参考搜索帮助。

  • 导出 - 此字段是一个复选框,用于指示搜索帮助参数是否为导出参数。 导出将字段值从选择列表传输到屏幕字段。

  • LPos - 其值控制选择列表中搜索帮助参数或字段的物理位置。 如果输入值1,则字段将显示在选择列表中的第一个位置,以此类推。

  • SPos - 它控制限制性对话框中的搜索帮助参数或字段的物理位置。 如果输入值1,该字段将显示在限制对话框的第一个位置,依此类推。

  • 数据元素 - 默认情况下,每个搜索帮助参数或字段都分配有在数据源(表或视图)中分配给它的数据元素。 此数据元素名称显示在显示模式中。

步骤6 - 执行一致性检查并激活搜索帮助。 按F8执行。 将出现“测试搜索帮助ZSRCH1"屏幕,如以下屏幕截图所示。

Test Search Help

步骤7 - 让我们在CUSTOMER的“Ready for inp"屏幕字段中输入数字100004。 按Enter键。

Restrict Value Change

将显示客户编号100004和名称“STEPHEN"。

SAP ABAP - 锁定对象

锁定对象是由ABAP字典提供的功能,用于通过多个程序同步对相同数据的访问。 在特定程序的帮助下访问数据记录。 锁定对象在SAP中使用,以避免在数据库中插入或更改数据时出现不一致。 要锁定其数据记录的表必须在锁定对象中与其关键字段一起定义。

锁定机构

以下是使用锁定机制完成的两个主要功能 -

  • 程序可以与其它程序关于它正在读取或改变的数据记录进行通信。

  • 程序可以防止自己读取刚刚被另一个程序改变的数据。

锁定请求首先由程序生成。 然后,此请求转到Enqueue服务器,并在锁表中创建锁。 Enqueue服务器设置锁定,并且程序最终准备好访问数据。

Lock Request

创建锁定对象

步骤1 - 转到事务SE11。 将打开以下屏幕。

Creating Lock Objects

步骤2 - 点击“锁定对象"单选按钮。 输入以E开头的锁定对象的名称,然后单击创建按钮。 这里我们使用EZLOCK12。

步骤3 - 输入简短说明字段,然后单击表选项卡。

步骤4 - 在名称字段中输入表名称,并选择锁定模式为写锁定。

步骤5 - 点击锁定参数选项卡,将出现以下屏幕。

Lock Parameter Tab

步骤6 - 储存并启用。 自动生成2个功能模块。 要检查功能模块,我们可以使用转到→锁定模块。

步骤7 - 点击锁定模块,将打开以下屏幕。

Lock Function Modules

已成功创建锁定对象。

锁对象中包含的表的键字段称为锁参数,它们用作函数模块中的输入参数。 这些参数用于设置和删除由锁定对象定义生成的锁定。

SAP ABAP - 模块化

这是一个良好的做法,保持您的程序是自包含和尽可能容易阅读。 只需尝试将大型和复杂的任务分成更小和更简单的任务,将每个任务放置在其单独的模块中,开发人员可以集中精力,而不会分心。

在SAP ABAP环境中,模块化涉及将程序组织成模块化单元,也称为逻辑块 它减少了冗余并提高了程序可读性,即使是在创建它以及随后在维护周期中。 模块化还使得相同代码的可重用性。 ABAP已经使得开发人员需要模块化,即相对更多地组织程序,而不是具有相对更内置的模块化特征的基于OOPS的语言。 一旦小的,模块化的代码段完成,调试等等,它随后不必被返回,并且开发人员可以继续前进并专注于其他问题。

ABAP程序由称为模块化处理块的处理块组成。 他们是 -

  • 从程序外部和从ABAP运行时环境(即,事件块和对话模块)调用的处理块。

  • 处理从ABAP程序调用的块。

除了使用处理块的模块化之外,源代码模块用于通过宏和包括程序对源代码进行模块化。

源代码级别的模块化 -

  • Local Macros
  • Global Include programs

通过从ABAP程序调用的处理块进行模块化 -

  • Subroutines
  • Function modules

模块化源代码意味着在模块中放置一个ABAP语句序列。 模块化源代码可以根据用户的需求在程序中调用。 源代码模块增强了ABAP程序的可读性和可理解性。 创建单个源代码模块还防止了人们不断重复写入相同的语句,这反过来使得代码对于第一次通过它的人来说更容易理解。

SAP ABAP - 子程序

子程序是一个可重用的代码段。 它是程序中的模块化单元,其中函数以源代码的形式封装。 您将程序的一部分分页到子程序,以更好地概述主程序,并使用相应的语句序列多次,如下图所示。

Subroutine Reusable Section

我们有具有3个不同源代码块的程序X。 每个块具有相同的ABAP语句。 基本上,它们是相同的代码块。 为了使这个代码更容易维护,我们可以将代码封装到一个子程序中。 我们可以在我们的程序中多次调用这个子程序。 可以使用Form和EndForm语句定义子例程。

以下是子程序定义的一般语法。

FORM <subroutine_name>.
  
<statements> 
  
ENDFORM.

我们可以通过使用PERFORM语句调用子例程。 控制跳转到子例程< subroutine_name>中的第一可执行语句。 当遇到ENDFORM时,控制跳回到PERFORM语句之后的语句。

例子

步骤1 - 转到事务SE80。 打开现有程序,然后右键单击程序。 在这种情况下,它是\'ZSUBTEST\'。

步骤2 - 选择创建,然后选择子例程。 在字段中写入子程序名称,然后单击继续按钮。 子例程名称为“Sub_Display",如以下屏幕截图所示。

Create Subroutine

步骤3 - 在FORM和ENDFORM语句块中编写代码。 已成功创建子程序。

我们需要包括PERFORM语句来调用子程序。 让我们来看看代码 -

REPORT ZSUBTEST. 
PERFORM Sub_Display.

* Form Sub_Display 
* -->  p1 text 
* <--  p2 text 
 
FORM Sub_Display. 
Write: 'This is Subroutine'. 
Write: / 'Subroutine created successfully'. 
ENDFORM.                    " Sub_Display

步骤4 - 保存,激活并执行程序。 上面的代码产生以下输出 -

Subroutine Test:
   
This is Subroutine
  
Subroutine created successfully

因此,使用子程序使您的程序更加面向功能。 它将程序的任务分成子功能,使每个子程序负责一个子功能。 您的程序变得更容易维护,因为对函数的更改通常只需在子例程中实现。

SAP ABAP - 宏

如果我们想在程序中多次重复使用同一组语句,我们需要将它们包含在宏中。 例如,宏可用于长计算或用于编写复杂的WRITE语句。 我们只能在定义它的程序中使用宏。 宏定义应在程序中使用宏之前发生。

宏是基于占位符设计的。 占位符的工作方式类似于C语言中的指针。 您可以在DEFINE ... END-OF-DEFINITION语句中定义一个宏。

以下是宏定义的基本语法:

DEFINE <macro_name>. <statements> 
END-OF-DEFINITION. 
   ...... 
  
   <macro_name> [<param1> <param2>....].

在调用它之前必须首先定义一个宏。 < param1> ...。 替换包含在宏定义中的ABAP语句中的占位符&amp; 1 ...。

宏定义中占位符的最大数量为9。 也就是说,当执行程序时,SAP系统通过适当的语句替换宏,并且占位符&amp; 1,&amp; 2,...&amp; 9被参数param1,param2,... param9替换。 我们可以在另一个宏中调用宏,但不能调用同一个宏。

例子

转到事务SE38。 创建一个新程序ZMACRO_TEST以及短文本字段中的描述,以及类型和状态等适当属性,如以下屏幕截图所示 -

New Program ZMACRO

下面是代码 -

REPORT ZMACRO_TEST. 
DEFINE mac_test. 
WRITE: 'This is Macro &1'. 
END-OF-DEFINITION. 

PARAMETERS: s1 type C as checkbox. 
PARAMETERS: s2 type C as checkbox. 
PARAMETERS: s3 type C as checkbox default 'X'. 

START-OF-SELECTION. 
IF s1 = 'X'. 
   mac_test 1. ENDIF. 
IF s2 = 'X'. 
   mac_test 2. 
ENDIF.
 
IF s3 = 'X'. 
   mac_test 3. 
ENDIF.

我们有3个复选框。 在执行程序时,让我们选择S2复选框。

Macro Program Checkbox

上面的代码产生以下输出 -

A Macro Program 
 
This is Macro 2

如果选中所有复选框,代码将生成以下输出 -

A Macro Program 
 
This is Macro 1 This is Macro 2 This is Macro 3

SAP ABAP - 功能模块

功能模块构成SAP系统的主要部分,因为多年来SAP使用功能模块模块化代码,允许代码自身,开发人员以及客户的代码重用。

功能模块是包含一组具有导入和导出参数的可重用语句的子程序。 与包含程序不同,功能模块可以独立执行。 SAP系统包含几个可从任何ABAP程序调用的预定义功能模块。 该功能组用作一种逻辑上属于一起的多个功能模块的容器。 例如,人力资源工资系统的功能模块将被放在一起成为一个功能组。

要了解如何创建功能模块,必须探索函数构建器。 您可以找到事务代码为SE37的函数构建器。 只需用通配符键入功能模块名称的一部分,以演示可以搜索功能模块的方式。 键入* amount *,然后按F4键。

Create Function Module

搜索结果将显示在新窗口中。 功能模块显示在具有蓝色背景的行中,其功能组以粉红色的行显示。 您可以使用对象导航器屏幕(事务SE80)进一步查看功能组ISOC。 您可以看到功能模块列表以及功能组中保存的其他对象。 让我们考虑函数模块SPELL_AMOUNT。 此功能模块将数字转换为字。

创建新程序

步骤1 - 转到事务SE38并创建一个名为Z_SPELLAMOUNT的新程序。

步骤2 - 输入一些代码,以便可以设置一个参数,其中可以输入值并将其传递到功能模块。 文本元素text-001在这里显示为“输入值"。

步骤3 - 要为此编写代码,请使用CTRL + F6。 之后,将出现一个窗口,其中“CALL FUNCTION"是列表中的第一个选项。 在文本框中输入“spell_amount",然后点击继续按钮。

Spell Amount Program

步骤4 - 自动生成一些代码。 但是我们需要增强IF语句以包含一个代码,以向屏幕写入一条消息,说“函数模块返回一个值:sy-subrc",并添加ELSE语句,以便在函数 模块成功,这里,必须设置一个新的变量来保存从函数模块返回的值,让我们称之为\'result\'。

下面是代码 -

REPORT Z_SPELLAMOUNT. 
data result like SPELL. 

selection-screen begin of line. 
selection-screen comment 1(15) text-001. 

parameter num_1 Type I. 
selection-screen end of line. 
CALL FUNCTION 'SPELL_AMOUNT' 
EXPORTING 
AMOUNT = num_1 
IMPORTING 
IN_WORDS = result. 

IF SY-SUBRC <> 0. 
   Write: 'Value returned is:', SY-SUBRC. 
else. 
   Write: 'Amount in words is:', result-word. 
ENDIF.

步骤5 - 函数模块返回的变量称为IN_WORDS。 在程序中设置相应的变量名为\'result\'。 通过使用LIKE语句来引用称为SPELL的结构来定义IN_WORDS。

步骤6 - 保存,激活并执行程序。 输入如以下屏幕截图所示的值,然后按F8。

Spelling Amount

上面的代码产生以下输出 -

Spelling the Amount 
Amount in words is: 
FIVE THOUSAND SIX HUNDRED EIGHTY

SAP ABAP - 包括程序

包含程序是用于模块化源代码的全局存储库对象。 它们允许您在不同的程序中使用相同的源代码。 包含程序还允许您以有序的方式管理复杂的程序。 为了在另一个程序中使用include程序,我们使用以下语法 -

INCLUDE <program_name>.

INCLUDE语句具有与复制包含程序< program_name>的源代码相同的效果。 进入另一个程序。 由于包括程序不能独立运行,它必须内置到其他程序中。 您也可以嵌套包含程序。

下面是几个限制,同时编写包含程序的代码 -

  • Include programs can't call themselves.
  • Include programs must contain complete statements.

以下是创建和使用Include程序的步骤 -

步骤1 - 创建要包含在ABAP编辑器中的程序(Z_TOBEINCLUDED)。 要包括在ABAP编辑器中的代码是 -

PROGRAM Z_TOBEINCLUDED.  
Write: / 'This program is started by:', SY-UNAME,
       / 'The Date is:', SY-DATUM,
       / 'Time is', SY-UZEIT.

步骤2 - 将程序的类型设置为INCLUDE程序,如以下屏幕截图所示。

Include Programs

步骤3 - 点击“保存"按钮,将程序保存在名为ZINCL_PCKG的包中。

步骤4 - 创建另一个程序,其中必须使用程序Z_TOBEINCLUDED。 这里我们创建了另一个名为Z_INCLUDINGTEST的程序,并将该程序的类型指定为可执行程序。

第5步 - Z_INCLUDINGTEST程序的编码包括Z_TOBEINCLUDED程序,在INCLUDE语句的帮助下,如下面的代码所示。

REPORT Z_INCLUDINGTEST.  
INCLUDE Z_TOBEINCLUDED. 

步骤6 - 保存,激活并执行程序。

上面的代码产生以下输出 -

This program is started by: SAPUSER 
The Date is: 06.10.2015 
Time is 13:25:11

SAP ABAP - 打开SQL概述

打开SQL指示允许直接访问当前AS ABAP的中央数据库中的数据的ABAP语句的子集。 打开SQL语句映射所有数据库系统支持的ABAP中的SQL的数据操作语言功能。

Open SQL的语句在数据库接口的Open SQL接口中转换为特定于数据库的SQL。 然后将它们传送到数据库系统并执行。 打开的SQL语句可用于访问在ABAP字典中声明的数据库表。 缺省情况下访问AS ABAP的中央数据库,并且可以通过辅助数据库连接访问其他数据库。

每当在ABAP程序中使用这些语句中的任何一个时,重要的是检查所执行的动作是否已成功。 如果尝试将记录插入到数据库表中,并且没有正确插入,则知道这一点非常重要,以便可以在程序中采取适当的操作。 这可以使用已经使用的系统字段来完成,即SY-SUBRC。 当成功执行语句时,SY-SUBRC字段将包含值0,因此可以检查该值,如果出现该程序,可以继续程序。

DATA语句用于声明一个工作区。 让我们给这个名字“wa_customers1"。 而不是为此声明一个数据类型,可以声明组成表的几个字段。 最简单的方法是使用LIKE语句。

INSERT语句

wa_customers1工作区在这里被声明为像ZCUSTOMERS1表,采取相同的结构而不成为表本身。 此工作区只能存储一条记录。 一旦它被声明,INSERT语句可以用于将工作区和它保存的记录插入到表中。 这里的代码将读作\'INSERT ZCUSTOMERS1 FROM wa_customers1\'。

工作区域必须填充一些数据。 使用ZCUSTOMERS1表中的字段名称。 这可以通过向前导航,双击代码中的表名或通过打开新会话并使用事务SE11来完成。 然后可以将表的字段复制并粘贴到ABAP编辑器中。

以下是代码段 -

DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100006'. 
wa_customers1-name = 'DAVE'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19931017'. 
INSERT ZCUSTOMERS1 FROM wa_customers1.

然后可以使用CHECK语句如下。 这意味着如果记录被正确插入,系统会说明这一点。 如果不是,则将显示不等于零的SY-SUBRC代码。 以下是代码段 -

IF SY-SUBRC = 0. 
   WRITE 'Record Inserted Successfully'.  
ELSE. 
   WRITE: 'The return code is ', SY-SUBRC. 
ENDIF.

检查程序,保存,激活代码,然后测试它。 输出窗口应显示为“已成功插入记录"。

CLEAR语句

CLEAR语句允许清除字段或变量,以便在其位置插入新数据,从而允许重新使用。 CLEAR语句通常用于程序中,它允许现有字段多次使用。

在前面的代码片段中,工作区结构已填充数据以创建要插入到ZCUSTOMERS1表中的新记录,然后执行验证检查。 如果我们要插入一个新记录,必须使用CLEAR语句,以便它可以再次用新数据填充。

UPDATE语句

如果要同时更新表中的一个或多个现有记录,请使用UPDATE语句。 与INSERT语句类似,声明一个工作区,用新数据填充,然后在执行程序时将其放入记录中。 以前使用INSERT语句创建的记录将在此处更新。 只需编辑存储在NAME和TITLE字段中的文本即可。 然后在一个新行上,使用与INSERT语句相同的结构,这次使用UPDATE语句如下面的代码片段所示 -

DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100006'. 
wa_customers1-name = 'RICHARD'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19931017'. 
UPDATE ZCUSTOMERS1 FROM wa_customers1.

随着UPDATE语句被执行,您可以在ABAP字典中查看数据浏览器,以查看该记录已成功更新。

MODIFY语句

MODIFY语句可以被视为INSERT和UPDATE语句的组合。 它可用于插入新记录或修改现有记录。 在从输入到工作区域的数据中修改记录时,它遵循与前两个语句相似的语法。

执行此语句时,将对照表中的键字段进行检查。 如果具有这些键字段值的记录已存在,则将更新该记录。 如果没有,则将创建新记录。

以下是用于创建新记录的代码段 -

CLEAR wa_customers1.
 
DATA wa_customers1 LIKE ZCUSTOMERS1. 
wa_customers1-customer = '100007'. 
wa_customers1-name = 'RALPH'. 
wa_customers1-title = 'MR'. 
wa_customers1-dob = '19910921'. 
MODIFY ZCUSTOMERS1 FROM wa_customers1.

在本示例中,使用CLEAR语句,以便可以将新条目放入工作区,然后添加客户(编号)100007。 由于这是一个新的唯一键字段值,因此将插入一个新记录,并执行另一个验证检查。

执行此操作并在数据浏览器中查看数据时,将为客户编号100007(RALPH)创建一个新记录。

上面的代码产生以下输出(表内容) -

SQL Statement

SAP ABAP - 本机SQL概述

术语“本地SQL"是指可以静态传输到数据库接口的本机SQL接口的所有语句。 本地SQL语句不属于ABAP的语言范围,不遵循ABAP语法。 ABAP仅包含用于隔离其中可以列出Native SQL语句的程序段的语句。

Native SQL Statement

在本机SQL中,主要可以使用特定于数据库的SQL语句。 这些将从本地SQL接口不变地传输到数据库系统并执行。 可以使用相关数据库的完整SQL语言范围,并且所寻址的数据库表不必在ABAP字典中声明。 还有一小组SAP特定的本地SQL语句,由本地SQL接口以特定方式处理。

要使用本地SQL语句,必须在其前面加上EXEC SQL语句,并以ENDEXEC语句结束。

以下是语法 -

EXEC SQL PERFORMING <form>.  
   <Native SQL statement> 
ENDEXEC.

这些语句定义ABAP程序中可以列出一个或多个Native SQL语句的区域。 输入的语句将传递到Native SQL界面,然后按如下所示进行处理:

  • 对于所寻址的数据库系统的程序接口有效的所有SQL语句都可以在EXEC和ENDEXEC之间列出,特别是DDL(数据定义语言)语句。

  • 这些SQL语句从Native SQL接口传递到数据库系统基本不变。 语法规则由数据库系统指定,特别是数据库对象的区分大小写规则。

  • 如果语法允许单个语句之间的分隔符,则可以在EXEC和ENDEXEC之间包括许多本地SQL语句。

  • 可以在EXEC和ENDEXEC之间指定SAP特定的本地SQL语言元素。 这些语句不会直接从Native SQL接口传递到数据库,但会适当地进行转换。

例子

SPFLI是用于存储航班时刻表信息的标准SAP表。 这在R / 3 SAP系统中可用,具体取决于版本和发布级别。 在将表名称SPFLI输入到相关SAP事务(如SE11或SE80)中时,可以查看此信息。 您还可以使用这两个事务查看此数据库表中包含的数据。

REPORT ZDEMONATIVE_SQL. 
DATA: BEGIN OF wa,  
      connid  TYPE SPFLI-connid,
      cityfrom TYPE SPFLI-cityfrom,
      cityto  TYPE SPFLI-cityto,  
      END OF wa. 
	
DATA c1 TYPE SPFLI-carrid VALUE 'LH'. 
EXEC SQL PERFORMING loop_output.
   SELECT connid, cityfrom, cityto  
   INTO :wa  
   FROM SPFLI  
   WHERE carrid = :c1 
ENDEXEC. 

FORM loop_output.  
   WRITE: / wa-connid, wa-cityfrom, wa-cityto. 
ENDFORM.

上面的代码产生以下输出 -

0400  FRANKFURT  NEW YORK 
2402  FRANKFURT  BERLIN 
0402  FRANKFURT  NEW YORK

SAP ABAP - 内部表

内部表实际上是一个临时表,它包含正在执行的ABAP程序的记录。 内部表仅在SAP程序的运行时期间存在。 它们用于通过使用ABAP语言处理大量数据。 当您需要从数据库表中检索数据时,我们需要在ABAP程序中声明一个内部表。

内部表中的数据存储在行和列中。 每一行称为,每一列称为字段 在内部表中,所有记录具有相同的结构和键。 使用索引或键访问内部表的各个记录。 由于内部表存在直到正在执行相关联的程序,因此当程序的执行终止时,内部表的记录被丢弃。 因此,内部表可以用作临时存储区或临时缓冲区,其中可以根据需要修改数据。 这些表只在运行时而不是在声明时占用内存。

内部表仅在程序运行时存在,因此在编写代码时,内部表必须以程序可以使用的方式进行结构化。 你会发现内部表的操作方式与结构相同。 主要区别是结构只有一行,而内部表可以有所需的行。

内部表可以由多个字段组成,对应于表的列,正如在ABAP字典中一样,使用多个字段创建表。 关键字段也可以与内部表一起使用,在创建这些内部表时,它们提供稍微更大的灵活性。 使用内部表,可以指定非唯一键,允许存储任意数量的非唯一记录,如果需要,可以存储重复记录。

内部表的大小或其包含的行数不是固定的。 内部表的大小根据与内部表相关联的程序的要求而改变。 但是建议保持内部表尽可能小。 这是为了避免系统运行缓慢,因为它努力处理大量的数据。

内部表用于许多目的 -

  • 它们可用于保存以后可在程序中使用的计算结果。

  • 内部表还可以保存记录和数据,以便可以快速访问,而不必从数据库表访问此数据。

  • 他们是非常多才多艺。 它们可以使用任何数量的其他定义的结构来定义。

例子

假设用户想要从一个或多个大表中创建各种客户的联系号码的列表。 用户首先创建一个内部表,从客户表中选择相关数据,然后将数据放在内部表中。 其他用户可以直接访问和使用此内部表来检索所需的信息,而不是编写数据库查询以在程序的运行时执行每个操作。

SAP ABAP - 创建内部表

DATA语句用于声明一个内部表。 程序必须告知表的开始和结束位置。 所以使用BEGIN OF语句,然后声明表名。 之后,使用OCCURS添加,后跟一个数字,这里为0. OCCURS告诉SAP正在创建一个内部表,0表示它最初不包含任何记录。 它将随着它填充数据而扩展。

以下是语法 -

DATA: BEGIN OF <internal_tab> Occurs 0,

让我们在一个新行上创建字段。 例如,创建声明为LIKE ZCUSTOMERS1-name的\'name\'。 创建另一个名为“dob"的字段,LIKE ZCUSTOMERS1-dob。 最初给内部表中的字段名称与其他地方创建的其他字段相同的名称很有用。 最后,使用“END OF< internal_tab&gt ;."声明内部表的结尾,如下面的代码所示 -

DATA: BEGIN OF itab01 Occurs 0,
   name LIKE ZCUSTOMERS1-name,
   dob LIKE ZCUSTOMERS1-dob, 
END OF itab01.

这里\'itab01\'是在SAP中创建临时表时常用的缩写。 OCCURS子句用于通过声明表的字段来定义内部表的主体。 当使用OCCURS子句时,如果需要,您可以指定数字常量\'n\'以确定其他默认内存。 OCCUR 0子句使用的内存的默认大小为8 KB。 现在创建内部表的结构,并且可以写入代码以用记录填充它。

可以使用或不使用标题行创建内部表。 要创建带有标题行的内部表,请在内部表定义中的OCCURS子句之前使用OCCURS子句之前的BEGIN OF子句或WITH HEADER LINE子句。 要创建没有标题行的内部表,请使用不带BEGIN OF子句的OCCURS子句。

您还可以使用TYPES语句创建内部表作为本地数据类型(仅在当前程序的上下文中使用的数据类型)。 此语句使用TYPE或LIKE子句来引用现有表。

创建内部表作为本地数据类型的语法是 -

TYPES <internal_tab> TYPE|LIKE <internal_tab_type> OF 
   <line_type_itab> WITH <key> INITIAL SIZE <size_number>.

这里,< internal_tab_type> 指定内部表的表类型< internal_tab> 和< line_type_itab> 指定内部表的行的类型。 在TYPES语句中,可以使用TYPE子句将内部表的行类型指定为数据类型,并使用LIKE子句将行类型指定为数据对象。 为内部表指定键是可选的,如果用户未指定键,SAP系统将使用任意键定义表类型。

INITIAL SIZE< size_number> 通过向其分配初始量的内存来创建内部表对象。 在上述语法中,INITIAL SIZE子句为size_number表行保留一个内存空间。 每当声明内部表对象时,表的大小不属于表的数据类型。

注意 - 首次填充内部表时消耗的内存大大减少。

例子

步骤1 - 执行SE38交易代码,开启ABAP编辑器。 显示ABAP编辑器的初始屏幕。

步骤2 - 在初始屏幕中,输入程序的名称,选择源代码单选按钮,然后单击创建按钮以创建新程序。

步骤3 - 在“ABAP:程序属性"对话框中,在标题字段中输入程序的简短描述,从属性中的类型下拉菜单中选择\'可执行程序\'选项 组框。 单击保存按钮。

步骤4 - 在ABAP编辑器中编写以下代码。

REPORT ZINTERNAL_DEMO. 
TYPES: BEGIN OF CustomerLine, 
Cust_ID TYPE C, 
Cust_Name(20) TYPE C, 
END OF CustomerLine. 
 
TYPES mytable TYPE SORTED TABLE OF CustomerLine  
WITH UNIQUE KEY Cust_ID. 
WRITE:/'The mytable is an Internal Table'. 

步骤5 - 保存,激活并照常执行程序。

在本示例中,mytable是一个内部表,并且在Cust_ID字段上定义了唯一键。

上面的代码产生以下输出 -

The mytable is an Internal Table.

SAP ABAP - 填充内部表

在内部表中,填充包括选择,插入和追加等功能。 本章重点介绍INSERT和APPEND语句。

INSERT语句

INSERT语句用于将单个行或一组行插入内部表。

以下是将一行添加到内部表的语法:

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

在此语法中,INSERT语句在internal_tab内部表中插入一行。 可以通过在internal_tab参数之前使用work_area_itab INTO表达式插入新行。 当使用work_area_itab INTO表达式时,新行从work_area_itab工作区获取,并插入到internal_tab表中。 但是,当不使用work_area_itab INTO表达式插入行时,该行从internal_tab表的标题行中获取。

当通过使用INDEX子句将新行插入内部表中时,插入行之后的行的索引号增加1.如果内部表包含< index_num> - 1行,新行添加在表的末尾。 当SAP系统成功地将行添加到内部表时,SY-SUBRC变量设置为0。

例子

以下是使用insert语句的示例程序。

REPORT  ZCUSLIST1. 
DATA: BEGIN OF itable1 OCCURS 4,
      F1 LIKE SY-INDEX,
      END OF itable1.
	
   DO 4 TIMES.
      itable1-F1 = sy-index.
      APPEND itable1.
   ENDDO.
	
itable1-F1 = -96.  
INSERT itable1 INDEX 2.  

LOOP AT itable1.
   Write / itable1-F1.  
ENDLOOP.  

LOOP AT itable1 Where F1 ≥ 3.
   itable1-F1 = -78.
   INSERT itable1.
ENDLOOP.

Skip.
LOOP AT itable1.
   Write / itable1-F1.
ENDLOOP.

上面的代码产生以下输出 -


		1 
96- 
		2 
		3 
 4  
		1 
96- 
		2 
78- 
 3 
78- 
 4 

在上面的例子中,DO循环将包含数字1到4的4行附加到它。 标题行组件itable1-F1已分配值-96。 Insert语句将标题行作为新行插入到第3行之前的主体中。现有行3在插入后变为第4行。 LOOP AT语句从内部表中检索F1值大于或等于3的那些行。在每一行之前,Insert语句从它的标题行插入一个新行。 在插入之前,F1组件已经改变为包含-78。

执行每个insert语句后,系统将重新编制所插入的行下面的所有行。 当在大型内部表的顶部附近插入行时,会引入开销。 如果需要将一个行插入到一个大型内部表中,请准备另一个包含要插入的行的表,并改为使用插入行。

当在itable1的循环内部在itable1中插入一个新行时,它不会立即影响内部表。 它实际上在下一个循环传递中生效。 当在当前行之后插入一行时,该表在ENDLOOP处重新索引。 系统递增,下一个循环处理syxix指向的行。 例如,如果您在第二个循环遍历中,并且在第3行之前插入记录。当执行endloop时,新行将变为第3行,旧行3将成为第4行,依此类推。 Sy-tabix增加1,下一个循环遍历处理新插入的记录。

APPEND声明

APPEND语句用于向现有内部表添加单个行或行。 此语句从工作区复制单个行,并将其插入内部表中的最后一个现有行之后。 工作区可以是标题行或与内部表的行具有相同结构的任何其他字段字符串。 以下是APPEND语句的语法,用于在内部表中附加单个行 -

APPEND <record_for_itab> TO <internal_tab>.

在此语法中,< record_for_itab> 表达式可以由< work_area_itab> 工作区,可以转换为行类型或INITIAL LINE子句。 如果用户使用< work_area_itab> 工作区域时,SAP系统向< internal_tab> 内部表,并用工作区的内容填充它。 INITIAL LINE子句附加一个空行,其中包含表结构的每个字段的初始值。 在每个APPEND语句之后,SY-TABIX变量包含附加行的索引号。

使用非唯一键将行附加到标准和排序表中,无论表中是否存在具有相同键的行。 换句话说,可能发生重复条目。 但是,如果用户尝试使用唯一键向排序表中添加重复条目,或者用户通过向其添加行来违反排序表的排序顺序,则会发生运行时错误。

例子

REPORT  ZCUSLIST1. 
DATA: BEGIN OF linv Occurs 0,
      Name(20) TYPE C,
      ID_Number TYPE I,
END OF linv. 

DATA table1 LIKE TABLE OF linv. 
linv-Name = 'Melissa'. 
linv-ID_Number = 105467. 
APPEND linv TO table1. 
LOOP AT table1 INTO linv. 

Write: / linv-name, linv-ID_Number. 
ENDLOOP.

上面的代码产生以下输出 -

Melissa		105467 

SAP ABAP - 复制内部表

当我们从带有标题行的内部表中读取记录时,该记录将从表本身移动到标题行。 这是我们的程序工作的标题行。 这同样适用于创建新记录。 它是您使用的标题行,从中将新记录发送到表体本身。

要复制记录,我们可以使用SELECT语句从表中选择所有记录,然后使用MOVE语句将记录从原始表移动到新的内部表中到名称对应的字段。

以下是MOVE语句的语法:

MOVE <table_field> TO <internal_tab_field>.

例子

REPORT  ZCUSLIST1. 
TABLES: ZCUSTOMERS1. 
DATA: BEGIN OF itab01 Occurs 0,
      name LIKE ZCUSTOMERS1-name,
      dob LIKE ZCUSTOMERS1-dob, 
END OF itab01. 

Select * FROM ZCUSTOMERS1. 
MOVE ZCUSTOMERS1-name TO itab01-name. 
MOVE ZCUSTOMERS1-dob TO itab01-dob. 
ENDSELECT.
 
Write: / itab01-name, itab01-dob.

上面的代码产生以下输出 -

MARGARET  		02.11.1994 

选择循环每次填充一个字段,使用MOVE语句将数据从一个表的字段移动到另一个表的字段。 在上面的示例中,使用MOVE语句将ZCUSTOMERS1表的内容移动到内部表中的相应字段。 你可以只用一行代码来完成这个动作。 您可以使用MOVECORRESPONDING语句。

以下是MOVE-CORRESPONDING语句的语法 -

MOVE-CORRESPONDING <table_name> TO <internal_tab>. 

它告诉系统将数据从CUSTOMERS的字段移动到itab01中的相应字段。

例子

REPORT  ZCUSTOMERLIST. 
TABLES: ZCUSTOMERS1. 
DATA: Begin of itab01 occurs 0,
      customer LIKE ZCUSTOMERS1-customer,
      name LIKE ZCUSTOMERS1-name,
      title LIKE ZCUSTOMERS1-title,
      dob LIKE ZCUSTOMERS1-dob, 
END OF itab01. 

SELECT * from ZCUSTOMERS1. 
MOVE-Corresponding ZCUSTOMERS1 TO itab01. 
APPEND itab01. 
ENDSELECT. 
LOOP AT itab01. 
Write: / itab01-name, itab01-dob. 
ENDLOOP. 

上面的代码产生以下输出 -

MARK           21.05.1981 
JAMES          14.08.1977 
AURIELE        19.06.1990 
STEPHEN        22.07.1985 
MARGARET       02.11.1994 

这是由于两者都具有匹配的字段名称的事实。 使用此语句时,需要确保两个字段都具有匹配的数据类型和长度。 它已经在这里用LIKE语句以前完成。

SAP ABAP - 读取内部表

我们可以使用READ TABLE语句的以下语法读取表的行:

READ TABLE <internal_table> FROM <work_area_itab>.

在此语法中,< work_area_itab> 表达式表示与< internal_table>的线类型兼容的工作区域。 表。 我们可以通过使用WITH KEY子句在READ语句中指定搜索键,而不是表键,如下面的语法所示 -

READ TABLE <internal_table> WITH KEY = <internal_tab_field>.

这里,内部表的整行用作搜索键 将表的整行的内容与< internal_tab_field>的内容进行比较。 领域。 如果< internal_tab_field> 字段与表的行类型不兼容,则这些值将根据表的行类型进行转换。 搜索键允许在内部表中查找没有结构化行类型的条目,即行是单个字段还是内部表类型。

READ语句的以下语法用于通过使用COMPARING子句指定工作区或字段符号 -

READ TABLE <internal_table> <key> INTO <work_area_itab>
   [COMPARING <F1> <F2>...<Fn>].

当使用COMPARING子句时,指定的表字段< F1>,< F2> ...< Fn& 在运输之前与工作区域的相应区域进行比较。 如果指定了ALL FIELDS子句,SAP系统将比较所有组件。 当SAP系统根据密钥找到条目时,SY-SUBRC变量的值设置为0.此外,如果比较的内容为SY-SUBRC变量的值,则将SY-SUBRC变量的值设置为2或4 字段不同或SAP系统找不到条目。 但是,无论查找结果如何,SAP系统都会将条目复制到目标工作区中。

例子

REPORT  ZREAD_DEMO. 
*/Creating an internal table 
DATA: BEGIN OF Record1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Record1. 

DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP. 
DO 6 Times.
Record1-ColP = SY-INDEX. 
Record1-ColQ = SY-INDEX + 5. 
INSERT Record1 INTO TABLE mytable. 
ENDDO. 

Record1-ColP = 4. 
Record1-ColQ = 12. 
READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ. 

WRITE: 'SY-SUBRC =', SY-SUBRC. 
SKIP. 
WRITE: / Record1-ColP, Record1-ColQ.

上面的代码产生以下输出 -

SY-SUBRC =    2 

4         9

在上面的示例中,mytable是散列表类型的内部表,其中Record1作为工作区,ColP作为唯一键。 最初,mytable填充了六行,其中ColP字段包含SY-INDEX变量的值,ColQ字段包含(SY-INDEX + 5)值。

Record1工作区分别填充4和12作为ColP和ColQ字段的值。 在使用COMPARING子句将ColP键字段的值与Record1工作区中的值进行比较之后,READ语句读取表的行,然后复制工作区中读取行的内容。 SY-SUBRC变量的值显示为2,因为当ColP字段中的值为4时,ColQ中的值不是12,而是9。

SAP ABAP - 删除内部表

DELETE语句用于从内部表中删除一个或多个记录。 通过指定表键或条件或通过查找重复条目来删除内部表的记录。 如果内部表具有非唯一键并且包含重复条目,则将删除表中的第一个条目。

以下是使用DELETE语句从内部表中删除记录或行的语法 -

DELETE TABLE <internal_table> FROM <work_area_itab>.

在上述语法中,< work_area_itab> 表达式是一个工作区,它应该与< internal_table>的类型兼容。 内部表。 基于可以从工作区组件获取的默认密钥来执行删除操作。

您还可以通过使用以下语法在DELETE TABLE语句中显式指定表键:

DELETE TABLE <internal_table> WITH TABLE KEY <K1> = <F1>………… <Kn> = <Fn>.

在该语法中,< F1>,< F2> ...< Fn> 是内部表格的字段,并且< K1>,< K2> ...< Kn> 是表的关键字段。 DELETE语句用于删除< internal_table>的记录或行。 基于表达式< K1> =< F1>,< K2> =< F2> ...< Kn> =< Fn&gt ;.

注意 - 如果< F1>,< F2> ...< Fn& 字段与< K1>,< K2> ...& 键字段,则SAP系统自动将它们转换为兼容格式。

例子

REPORT  ZDELETE_DEMO. 
DATA: BEGIN OF Line1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Line1. 
DATA mytable LIKE HASHED TABLE OF Line1  
WITH UNIQUE KEY ColP. 
DO 8 TIMES. 

Line1-ColP = SY-INDEX. 
Line1-ColQ = SY-INDEX + 4. 
INSERT Line1 INTO TABLE mytable. 
ENDDO. 

Line1-ColP = 1. 
DELETE TABLE mytable: FROM Line1, 
WITH TABLE KEY ColP = 3.
LOOP AT mytable INTO Line1. 

WRITE: / Line1-ColP, Line1-ColQ. 
ENDLOOP.

上面的代码产生以下输出 -

2         6 
4         8 
5         9 
6         10 
7         11 
8         12

在这个例子中,mytable有两个字段,ColP和ColQ。 最初,mytable填充有八行,其中ColP包含值1,2,3,4,5,6,7和8.ColQ包含值5,6,7,8,9,10,11和12。 12,因为ColP值每次都增加4。

DELETE语句用于从mytable中删除colP键字段的值为1或3的行。删除后,mytable的ColP字段包含值2,4,5,6,7和8,如图所示 在输出。 ColQ字段包含值6,8,9,10,11和12。

SAP ABAP - 对象定向

对象定向简化了软件设计,使其更易于理解,维护和重用。 面向对象编程(OOP)表示在编写软件时的不同思维方式。 OOP的美丽在于它的简单性。 OOP的表达能力使得更容易按时交付高质量的软件组件。

由于解决方案是根据现实世界的对象设计的,因此程序员和业务分析师就使用通用域语言的设计交换想法和信息变得更加容易。 这些沟通的改进有助于揭示隐藏的要求,识别风险,提高正在开发的软件的质量。 面向对象的方法集中于表示现实世界的抽象或具体事物的对象。 这些对象由它们的内部结构和它们的属性(数据)表示的字符和属性来定义。 这些对象的行为由方法(即功能)描述。

让我们比较过程和面向对象的编程 -

特征 程序导向法 面向对象方法
Emphasis 重点是任务。 重点是做那些任务的事情。
Modularization 程序可以分为称为函数的更小的程序。 程序被组织成类和对象,并且功能被嵌入到类的方法中。
数据安全 大多数函数共享全局数据。 数据可以被隐藏,并且不能被外部源访问。
Extensibility 修改和扩展现有功能更加耗时。 新的数据和功能可以根据需要轻松添加。

ABAP最初被开发为一种过程语言(类似于早期的过程式编程语言,如COBOL)。 但是ABAP现在已经适应了面向对象范例的原理与引入ABAP对象。 ABAP中面向对象的概念(如类,对象,继承和多态)与其他现代面向对象语言(如Java或C ++)基本相同。

随着对象定向开始形成,每个类都承担特定的角色分配。 这种分工有助于简化整体编程模型,允许每个类专门解决特定的问题。 这样的类具有高的内聚性,并且每个类的操作以一些直观的方式密切相关。

面向对象的主要特点是 -

  • Effective programming structure.
  • Real-world entities can be modeled very well.
  • Stress on data security and access.
  • Minimizes code redundancy.
  • Data abstraction and encapsulation.

SAP ABAP - 对象

对象是一种特殊类型的变量,具有不同的特征和行为。 对象的特性或属性用于描述对象的状态,并且行为或方法表示对象执行的动作。

对象是类的模式或实例。 它表示真实世界的实体,例如人或编程实体,如变量和常量。 例如,帐户和学生是真实世界实体的例子。 但是计算机的硬件和软件组件是编程实体的示例。

一个对象有以下三个主要特点 -

  • Has a state.
  • Has a unique identity.
  • May or may not display the behavior.

对象的状态可以被描述为一组属性及其值。 例如,银行帐户具有一组属性,例如帐号,名称,帐户类型,余额和所有这些属性的值。 对象的行为是指在一段时间内在其属性中发生的更改。

每个对象具有唯一的标识,可以用于将其与其他对象区分开。 两个对象可以表现出相同的行为,并且它们可以具有或不具有相同的状态,但是它们从不具有相同的身份。 两个人可能具有相同的姓名,年龄和性别,但他们不相同。 类似地,对象的身份在其整个生命周期中永远不会改变。

对象可以通过发送消息来相互交互。 对象包含用于操作数据的数据和代码。 对象也可以在类的帮助下用作用户定义的数据类型。 对象也称为类型类的变量。 定义类后,可以创建属于该类的任意数量的对象。 每个对象都与创建它的类型类的数据相关联。

创建对象

对象创建通常包括以下步骤 -

  • 引用类创建引用变量。 其语法是 -

DATA: <object_name> TYPE REF TO <class_name>.
  • 从引用变量创建对象。 其语法是 -

CREATE Object: <object_name>.

例子

REPORT ZDEMO_OBJECT. 
CLASS Class1 Definition. 
Public Section. 
DATA: text1(45) VALUE 'ABAP Objects.'. 
METHODS: Display1. 
ENDCLASS. 

CLASS Class1 Implementation. 
METHOD Display1. 
Write:/ 'This is the Display method.'. 
ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
DATA: Class1 TYPE REF TO Class1. 
CREATE Object: Class1. 
Write:/ Class1->text1. 
CALL METHOD: Class1->Display1.

上面的代码产生以下输出 -

ABAP Objects. 
This is the Display method.

SAP ABAP - 类

类用于指定对象的形式,它将数据表示和将该数据操作为一个整齐包的方法组合。 类中的数据和函数称为的成员。

类定义和实现

定义类时,可以为数据类型定义蓝图。 这实际上不定义任何数据,但它定义了类名称的意义,类的对象将包括什么,以及可以对这样的对象执行什么操作。 也就是说,它定义对象的抽象特性,例如属性,字段和属性。

以下语法显示如何定义类 -

CLASS <class_name> DEFINITION. 
.......... 
.......... 
ENDCLASS.

类定义从关键字CLASS开始,后面跟着类名DEFINITION和类主体。 类的定义可以包含类的各种组件,如属性,方法和事件。 当我们在类声明中声明一个方法时,方法实现必须包含在类实现中。 以下语法显示如何实现类 -

CLASS <class_name> IMPLEMENTATION. 
........... 
.......... 
ENDCLASS.

注意 - 类的实现包含其所有方法的实现。 在ABAP对象中,类的结构包含诸如属性,方法,事件,类型和常量等组件。

属性

属性是可以具有任何数据类型(如C,I,F和N)的类的数据字段。它们在类声明中声明。 这些属性可以分为两类:实例和静态属性。 实例属性定义对象的实例特定状态。 不同对象的状态不同。 使用DATA语句声明实例属性。

静态属性定义由类的所有实例共享的类的公共状态。 也就是说,如果您更改类的一个对象中的静态属性,该更改对该类的所有其他对象也是可见的。 使用CLASS-DATA语句声明静态属性。

方法

方法是表示类中的对象的行为的函数或过程。 类的方法可以访问类的任何属性。 方法的定义也可以包含参数,以便在调用方法时可以向这些参数提供值。 方法的定义在类声明中声明,并在类的实现部分实现。 METHOD和ENDMETHOD语句用于定义方法的实现部分。 以下语法显示如何实现一种方法 -

METHOD <m_name>. 
.......... 
.......... 
ENDMETHOD.

在该语法中,< m_name> 表示方法的名称。 注意 - 您可以使用CALL METHOD语句调用方法。

访问属性和方法

类组件可以在控制如何访问这些组件的公共,私有或受保护的可见性部分中定义。 私有可见性部分用于拒绝从类外部访问组件。 这样的组件只能从类内部访问,例如方法。

在公共可见性部分中定义的组件可以从任何上下文访问。 默认情况下,类的所有成员都是私有的。 实际上,我们在私有节中定义数据,在公共节中定义相关方法,以便可以从类外面调用它们,如下面的程序所示。

  • 在类中的Public部分中声明的属性和方法可以由该类和程序的任何其他类,子类访问。

  • 当属性和方法在类的Protected部分中声明时,那些类和子类(派生类)只能访问它们。

  • 当在类的Private部分中声明属性和方法时,这些属性和方法只能由该类访问,而不能由任何其他类访问。

例子

Report ZAccess1. 
CLASS class1 Definition.
   PUBLIC Section.
      Data: text1 Type char25 Value 'Public Data'.
      Methods meth1.
		
   PROTECTED Section.
      Data: text2 Type char25 Value 'Protected Data'.
		
   PRIVATE Section.     
      Data: text3 Type char25 Value 'Private Data'. 
ENDCLASS.
 
CLASS class1 Implementation.   
   Method meth1.     
      Write: / 'Public Method:',   
             / text1,
             / text2,
             / text3.
      Skip.
   EndMethod.
ENDCLASS. 

Start-Of-Selection.   
   Data: Objectx Type Ref To class1.
   Create Object: Objectx.
   CALL Method: Objectx→meth1.
   Write: / Objectx→text1.

上面的代码产生以下输出 -

Public Method: 
Public Data 
Protected Data 
Private Data
  
Public Data

静态属性

静态属性用语句CLASS-DATA声明。 所有对象或实例都可以使用类的静态属性。 静态属性直接在类名的帮助下访问,像class_name⇒name_1=\'Some Text\'。

例子

下面是一个程序,我们要打印一个文本行4到8次。 我们定义一个类class1,在公共部分我们声明CLASS-DATA(静态属性)和一个方法。 在实现类和方法之后,我们直接访问Start-Of-Selection事件中的static属性。 然后我们只创建类的实例并调用该方法。

Report ZStatic1. 
CLASS class1 Definition.   
   PUBLIC Section.
      CLASS-DATA: name1 Type char45,
                  data1 Type I.
   Methods: meth1. 
ENDCLASS. 

CLASS class1 Implementation.   
   Method meth1.
      Do 4 Times.
         data1 = 1 + data1.
         Write: / data1, name1.
      EndDo.
      Skip.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
   class1⇒name1 = 'ABAP Object Oriented Programming'.
   class1⇒data1 = 0.
   Data: Object1 Type Ref To class1,
         Object2 Type Ref To class1.
			
   Create Object: Object1, Object2.
   CALL Method: Object1→meth1, 
                Object2→meth1.

上面的代码产生以下输出 -

Static Attributes

构造函数

构造函数是在创建对象或访问类的组件时自动调用的特殊方法。 每当一个对象被创建时,构造器被触发,但是我们需要调用一个方法来触发一般方法。 在下面的例子中,我们声明了两个公共方法method1和constructor。 这两种方法都有不同的操作。 在创建类的对象时,构造函数方法触发其操作。

例子

Report ZConstructor1. 
CLASS class1 Definition.
   PUBLIC Section.
      Methods: method1, constructor.
ENDCLASS. 

CLASS class1 Implementation.
   Method method1.
      Write: / 'This is Method1'.
   EndMethod.
	
   Method constructor.
      Write: / 'Constructor Triggered'.
   EndMethod. 
ENDCLASS. 

Start-Of-Selection.
   Data Object1 Type Ref To class1.
   Create Object Object1.

上面的代码产生以下输出 -

Constructor Triggered

ME操作员

当你在类的public节中声明任何类型的变量时,你可以在任何其他实现中使用它。 变量可以在public section中用初始值声明。 我们可以在一个具有不同值的方法中再次声明该变量。 当我们在方法中写入变量时,系统将打印更改的值。 要反映变量的先前值,我们必须使用“ME"运算符。

在这个程序中,我们声明了一个公共变量text1,并用一个值初始化。 我们已经再次声明相同的变量,但是用不同的值实例化。 在该方法中,我们使用“ME"运算符写该变量以获取先前启动的值。 我们通过直接声明获得更改的值。

例子

Report ZMEOperator1. 
CLASS class1 Definition.
   PUBLIC Section. 
	
Data text1 Type char25 Value 'This is CLASS Attribute'.
   Methods method1. 
ENDCLASS. 

CLASS class1 Implementation.
   Method method1. 
	
Data text1 Type char25 Value 'This is METHOD Attribute'.
   Write: / ME→text1,
          / text1.
   ENDMethod.
ENDCLASS. 

Start-Of-Selection.
   Data objectx Type Ref To class1.
   Create Object objectx.
   CALL Method objectx→method1.

上面的代码产生以下输出 -

This is CLASS Attribute 
This is METHOD Attribute

SAP ABAP - 继承

面向对象编程中最重要的概念之一是继承。 继承允许我们根据另一个类定义一个类,这使得创建和维护应用程序变得更容易。 这也提供了重用代码功能和快速实现时间的机会。

当创建类时,程序员可以指定新类应该继承现有类的成员,而不是写入完全新的数据成员和方法。 此现有类称为基类超类,新类称为派生类子类

  • 一个类的对象可以获取另一个类的属性。

  • 派生类继承超类的数据和方法。 但是,他们可以覆盖方法,并添加新的方法。

  • 继承的主要优点是可重用性。

除了类定义语句之外,还使用“INHERITING FROM"指定继承关系。

以下是语法 -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

例子

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

上面的代码产生以下输出 -

This is public data 
Method in child class 
This is public data

访问控制和继承

派生类可以访问其基类的所有非私有成员。 因此,应该不能被子类的成员函数访问的超类成员应该在超类中被声明为私有的。 我们可以根据谁可以通过以下方式访问它们来总结不同的访问类型 -

访问 上市 保护 私人的
同班 Yes Yes Yes
派生类 Yes Yes No
外面 Yes No No

当从一个超类派生一个类时,它可以通过公共,保护或私有继承继承。 继承的类型由访问说明符指定,如上所述。 我们几乎不使用保护或私有继承,但公共继承是常用的。 在使用不同类型的继承时应用以下规则。

  • 公共继承 - 从公共超类派生类时,超类的公共成员将成为子类的公共成员,超类的受保护成员将成为子类的受保护成员。 超类的私有成员永远不能直接从子类访问,但可以通过调用public和受保护的超类的成员来访问。

  • 受保护的继承 - 从受保护的超类派生时,超类的公共和受保护成员将成为子类的受保护成员。

  • 私有继承 - 从私有超类派生时,超类的公共和受保护成员将成为子类的私有成员。

子类中的重定义方法

超类的方法可以在子类中重新实现。 重新定义方法的几个规则 -

  • 继承方法的重定义语句必须与原始方法的定义在同一节中。

  • 如果重新定义一个方法,则不需要在子类中再次输入其接口,而只需要输入方法的名称。

  • 在重定义的方法中,可以使用超级引用访问直接超类的组件。

  • 伪引用超级只能在重定义的方法中使用。

例子

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

执行F8后,如果我们输入值9和10,上面的代码产生以下输出 -

Re-implemented os Sub Class
Redefinition Demo 
29

SAP ABAP - 多态性

术语多态性字面意思是“多种形式"。 从面向对象的角度来看,多态性与继承一起工作,使得继承树中的各种类型可以互换使用。 也就是说,当存在类的层次结构并且它们通过继承相关时,发生多态性。 ABAP多态意味着对方法的调用将导致根据调用该方法的对象的类型执行不同的方法。

以下程序包含一个抽象类\'class_prgm\',2个子类(class_procedural和class_OO)和一个测试驱动程序类\'class_type_approach\'。 在这个实现中,类方法“开始"允许我们显示编程的类型及其方法。 如果仔细观察方法“start"的签名,您将观察到它接收到类型为class_prgm的导入参数。 但是,在Start-Of-Selection事件中,此方法在运行时已调用类型为class_procedural和class_OO的对象。

例子

Report ZPolymorphism1. 
CLASS class_prgm Definition Abstract. 
PUBLIC Section. 
Methods: prgm_type Abstract, 
approach1 Abstract. 
ENDCLASS. 

CLASS class_procedural Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_procedural Implementation. 
Method prgm_type. 
Write: 'Procedural programming'. 

EndMethod. Method approach1. 
Write: 'top-down approach'. 

EndMethod. ENDCLASS. 
CLASS class_OO Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_OO Implementation. 
Method prgm_type. 
Write: 'Object oriented programming'. 
EndMethod. 

Method approach1. 
Write: 'bottom-up approach'.
EndMethod. 
ENDCLASS. 

CLASS class_type_approach Definition. 
PUBLIC Section. 
CLASS-METHODS: 
start Importing class1_prgm 
Type Ref To class_prgm. 
ENDCLASS. 

CLASS class_type_approach IMPLEMENTATION. 
Method start. 
CALL Method class1_prgm→prgm_type. 
Write: 'follows'. 

CALL Method class1_prgm→approach1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data: class_1 Type Ref To class_procedural, 
class_2 Type Ref To class_OO. 

Create Object class_1. 
Create Object class_2. 
CALL Method class_type_approach⇒start 
Exporting 

class1_prgm = class_1. 
New-Line. 
CALL Method class_type_approach⇒start 
Exporting 
class1_prgm = class_2.  

上面的代码产生以下输出 -

Procedural programming follows top-down approach  
Object oriented programming follows bottom-up approach

ABAP运行时环境在导入参数class1_prgm的分配期间执行隐式精简转换。 此功能有助于“启动"方法的一般实现。 与对象引用变量相关联的动态类型信息允许ABAP运行时环境动态地将方法调用与由对象引用变量指向的对象中定义的实现绑定。 例如,\'class_type_approach\'类中的\'start\'方法的导入参数\'class1_prgm\'指的是一个永远不能被实例化的抽象类型。

每当使用具体子类实现(如class_procedural或class_OO)调用该方法时,class1_prgm引用参数的动态类型将绑定到这些具体类型之一。 因此,对方法\'prgm_type\'和\'approach1\'的调用是指class_procedural或class_OO子类中提供的实现,而不是class\'class_prgm\'中提供的未定义的抽象实现。

SAP ABAP - 封装

封装是一种面向对象编程(OOP)概念,将数据和函数绑定在一起,操作数据,并保持两者免受外部干扰和误用。 数据封装导致了数据隐藏的重要OOP概念。 封装是捆绑数据和使用它们的函数的机制,数据抽象是一种仅暴露接口并向用户隐藏实现细节的机制。

ABAP通过创建称为类的用户定义类型支持封装和数据隐藏的属性。 如前所述,类可以包含私有,受保护和公共成员。 默认情况下,类中定义的所有项目都是私有的。

接口封装

封装实际上意味着一个属性和方法可以在不同的类中修改。 因此,数据和方法可以具有不同的形式和逻辑,可以隐藏以分离类。

让我们考虑通过接口封装。 当我们需要在不同的类中创建具有不同功能的一个方法时,使用接口。 这里方法的名称不需要改变。 相同的方法必须在不同的类实现中实现。

例子

以下程序包含一个接口inter_1。 我们已经声明了属性和方法method1。 我们还定义了两个类,如Class1和Class2。 因此,我们必须在两个类实现中实现方法“method1"。 我们在不同的类中实现了不同的方法\'method1\'。 在start-ofselection中,我们为两个类创建了两个对象Object1和Object2。 然后,我们通过不同的对象调用该方法来获得在单独的类中声明的函数。

Report ZEncap1. 
Interface inter_1.
   Data text1 Type char35.
   Methods method1.
EndInterface.

CLASS Class1 Definition.
   PUBLIC Section.
      Interfaces inter_1.
ENDCLASS. 

CLASS Class2 Definition.
   PUBLIC Section.
      Interfaces inter_1. 
ENDCLASS.

CLASS Class1 Implementation.
   Method inter_1~method1.
      inter_1~text1 = 'Class 1 Interface method'.
      Write / inter_1~text1.
   EndMethod. 
ENDCLASS.
 
CLASS Class2 Implementation.
   Method inter_1~method1.
      inter_1~text1 = 'Class 2 Interface method'.
      Write / inter_1~text1.
   EndMethod. 
ENDCLASS.
 
Start-Of-Selection.
   Data: Object1 Type Ref To Class1,
      Object2 Type Ref To Class2.
		
   Create Object: Object1, Object2.
   CALL Method: Object1→inter_1~method1,
                Object2→inter_1~method1. 

上面的代码产生以下输出 -

Class 1 Interface method 
Class 2 Interface method

封装的类对外界没有很多依赖。 此外,他们与外部客户端的交互通过稳定的公共接口进行控制。 也就是说,封装类及其客户端松散耦合。 在大多数情况下,具有定义良好的接口的类可以插入到另一个上下文中。 当设计正确时,封装类成为可重用的软件资产。

设计战略

我们大多数人通过痛苦的经验学习,使类成员默认为私有,除非我们真的需要暴露它们。 这只是很好的封装。 这种智慧最常用于数据成员,并且同样适用于所有成员。

SAP ABAP - 接口

类似于ABAP中的类,接口充当对象的数据类型。 接口的组件与类的组件相同。 与类的声明不同,接口的声明不包括可见性部分。 这是因为在接口声明中定义的组件总是集成在类的public visibility部分。

当两个类似的类具有相同名称的方法但功能彼此不同时,使用接口。 接口可能看起来类似于类,但是接口中定义的函数在类中实现以扩展该类的范围。 接口以及继承特性为多态性提供了基础。 这是因为在接口中定义的方法在不同类中的行为可能不同。

以下是创建接口的一般格式 -

INTERFACE <intf_name>. 
DATA..... 
CLASS-DATA..... 
METHODS..... 
CLASS-METHODS..... 
ENDINTERFACE.

在此语法中,< intf_name> 表示接口的名称。 DATA和CLASSDATA语句可以分别用于定义接口的实例和静态属性。 METHODS和CLASS-METHODS语句可以分别用于定义接口的实例和静态方法。 由于接口的定义不包括实现类,因此没有必要在接口的声明中添加DEFINITION子句。

注意 - 接口的所有方法都是抽象的。 它们是完全声明的,包括它们的参数接口,但是没有在接口中实现。 所有想要使用接口的类都必须实现接口的所有方法。 否则,该类将成为抽象类。

我们在类的实现部分使用以下语法 -

INTERFACE <intf_name>. 

在此语法中,< intf_name> 表示接口的名称。 请注意,此语法必须在类的public部分中使用。

以下语法用于实现类中实现接口的方法 -

METHOD <intf_name~method_m>. 
<statements>. 
ENDMETHOD.

在该语法中,< intf_name〜method_m> 表示< intf_name>的方法的完全声明的名称。 接口。

例子

Report ZINTERFACE1. 
INTERFACE my_interface1. 
Methods msg. 
ENDINTERFACE. 

CLASS num_counter Definition. 
PUBLIC Section. 
INTERFACES my_interface1. 
Methods add_number. 
PRIVATE Section. 
Data num Type I. 
ENDCLASS. 

CLASS num_counter Implementation. 
Method my_interface1~msg. 
Write: / 'The number is', num. 
EndMethod. 

Method add_number. 
ADD 7 TO num. 
EndMethod. 
ENDCLASS. 

CLASS drive1 Definition. 
PUBLIC Section. 
INTERFACES my_interface1. 
Methods speed1.
PRIVATE Section.
Data wheel1 Type I. 
ENDCLASS. 

CLASS drive1 Implementation.
Method my_interface1~msg.
Write: / 'Total number of wheels is', wheel1. 
EndMethod. 

Method speed1. 
Add 4 To wheel1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data object1 Type Ref To num_counter. 
Create Object object1. 

CALL Method object1→add_number.
CALL Method object1→my_interface1~msg.

Data object2 Type Ref To drive1. 
Create Object object2.
 
CALL Method object2→speed1. 
CALL Method object2→my_interface1~msg. 

上面的代码产生以下输出 -

The number is 7 
Total number of wheels is 4

在上面的示例中,my_interface1是包含\'msg\'方法的接口的名称。 接下来,定义和实现两个类,num_counter和drive1。 这两个类实现了\'msg\'方法,以及定义它们各自实例的行为的特定方法,例如add_number和speed1方法。

注意 - add_number和speed1方法特定于各个类。

SAP ABAP - 对象事件

事件是在类中定义的一组结果,用于触发其他类中的事件处理程序。 当事件被触发时,我们可以调用任何数量的事件处理程序方法。 触发器及其处理程序方法之间的链接实际上是在运行时动态决定的。

在正常的方法调用中,调用程序确定对象或类的哪个方法需要被调用。 由于固定处理程序方法未针对每个事件注册,因此在事件处理的情况下,处理程序方法确定需要触发的事件。

类的事件可以通过使用RAISE EVENT语句触发同一类的事件处理程序方法。 对于事件,可以通过使用FOR EVENT子句在相同或不同的类中定义事件处理程序方法,如以下语法中所示 -

FOR EVENT <event_name> OF <class_name>.

类似于类的方法,事件可以有参数接口,但它只有输出参数。 输出参数通过RAISE EVENT语句传递到事件处理程序方法,RAISE EVENT语句接收它们作为输入参数。 事件通过使用SET HANDLER语句在程序中动态链接到其处理程序方法。

当触发事件时,应该在所有处理类中执行适当的事件处理程序方法。

例子

REPORT ZEVENT1. 
CLASS CL_main DEFINITION. 
PUBLIC SECTION. 
DATA: num1 TYPE I. 
METHODS: PRO IMPORTING num2 TYPE I. 
EVENTS: CUTOFF. 
ENDCLASS. 

CLASS CL_eventhandler DEFINITION. 
PUBLIC SECTION. 
METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main. 
ENDCLASS. 

START-OF-SELECTION. 
DATA: main1 TYPE REF TO CL_main. 
DATA: eventhandler1 TYPE REF TO CL_eventhandler. 

CREATE OBJECT main1. 
CREATE OBJECT eventhandler1. 

SET HANDLER eventhandler1→handling_CUTOFF FOR main1. 
main1→PRO( 4 ).
CLASS CL_main IMPLEMENTATION.
METHOD PRO.
num1 = num2.
IF num2 ≥ 2. 
RAISE EVENT CUTOFF.
ENDIF. 
ENDMETHOD.
ENDCLASS.

CLASS CL_eventhandler IMPLEMENTATION.
METHOD handling_CUTOFF.
WRITE: 'Handling the CutOff'. 
WRITE: / 'Event has been processed'. 
ENDMETHOD. ENDCLASS.

上面的代码产生以下输出 -

Handling the CutOff 
Event has been processed

SAP ABAP - 报表编程

报告是以组织结构呈现数据。 许多数据库管理系统包括一个报告写入器,使您能够设计和生成报告。 SAP应用程序支持报告创建。

使用循环内的WRITE语句中的输出数据创建经典报告。 它们不包含任何子报告。 SAP还提供了一些标准报告,例如用于在客户端之间复制表的RSCLTCOP和用于显示实例参数的RSPARAM。

这些报告只包含一个屏幕作为输出。 我们可以使用各种事件,如INITIALIZATON&amp; TOP-OF-PAGE来创建经典报告,每个事件在创建经典报告时都有自己的重要性。 这些事件中的每一个都与特定的用户操作相关联,并且只有在用户执行该操作时才会触发。

以下是描述事件和描述的表 -

S.No。 事件&amp; 描述
1

INITIALIZATON

在显示选择画面之前触发。

2

在SELECTION-SCREEN

在选择屏幕上处理用户输入后触发。 此事件在执行程序之前验证用户输入。 在处理用户输入之后,选择屏幕保持在活动模式。

3

开始选择

仅在选择屏幕的处理结束后触发; 即当用户点击选择屏幕上的执行图标时。

4

END-OF-SELECTION

在执行START-OF-SELECTION事件中的最后一条语句之后触发。

5

首页

由第一条WRITE语句触发以在新页面上显示数据。

6

结束页

触发以在报表的页面末尾显示文本。 请注意,此事件是创建报告时的最后一个事件,应与REPORT语句的LINE-COUNT子句结合使用。

例子

让我们创建一个经典报告。 我们将通过在ABAP编辑器中使用一系列语句来显示存储在标准数据库MARA(包含一般材料数据)中的信息。

REPORT ZREPORT2 
LINE-SIZE 75 
LINE-COUNT 30(3) 
NO STANDARD PAGE HEADING. 
Tables: MARA. 
TYPES: Begin of itab, 

MATNR TYPE MARA-MATNR, 
MBRSH TYPE MARA-MBRSH, 
MEINS TYPE MARA-MEINS, 
MTART TYPE MARA-MTART, 

End of itab. 

DATA: wa_ma TYPE itab,
      it_ma TYPE STANDARD TABLE OF itab.
		
SELECT-OPTIONS: MATS FOR MARA-MATNR OBLIGATORY. 
INITIALIZATION. 
MATS-LOW = '1'. 
MATS-HIGH = '500'. 

APPEND MATS. 
AT SELECTION-SCREEN. .
IF MATS-LOW = ' '. 
MESSAGE I000(ZKMESSAGE). 
ELSEIF MATS-HIGH = ' '. 
MESSAGE I001(ZKMESSAGE). 
ENDIF. 

TOP-OF-PAGE. 
WRITE:/ 'CLASSICAL REPORT CONTAINING GENERAL MATERIAL DATA  
FROM THE TABLE MARA' COLOR 7. 
ULINE. 
WRITE:/ 'MATERIAL' COLOR 1, 

24 'INDUSTRY' COLOR 2, 
38 'UNITS' COLOR 3, 
53 'MATERIAL TYPE' COLOR 4. 
ULINE. 
END-OF-PAGE. 

START-OF-SELECTION. 
SELECT MATNR MBRSH MEINS MTART FROM MARA  
INTO TABLE it_ma WHERE MATNR IN MATS. 
LOOP AT it_ma into wa_ma. 
WRITE:/  wa_ma-MATNR, 

25 wa_ma-MBRSH, 
40 wa_ma-MEINS, 
55 wa_ma-MTART. 
ENDLOOP. 
END-OF-SELECTION. 

ULINE. 
WRITE:/ 'CLASSICAL REPORT HAS BEEN CREATED' COLOR 7.
ULINE. 
SKIP. 

上述代码产生以下输出,包含标准表中的一般材料数据MARA -

Report Programming

SAP ABAP - 对话框编程

对话框编程处理多个对象的开发。 所有这些对象被分层链接到主程序,并且它们按顺序执行。 对话程序开发利用ABAP工作台中的工具。 这些是在标准SAP应用程序开发中使用的相同工具。

这里是对话程序的主要组件 -

  • Screens
  • Module pools
  • Subroutines
  • Menus
  • Transactions

工具集

Toolset

对话框程序应该由对象浏览器(事务:SE80)开发,以便所有对象都被链接到主程序,而不必显式地指向每个对象。 高级导航技术增强了从一个对象移动到另一个对象的过程。

屏幕由屏幕属性,屏幕布局,字段和流逻辑组成。 模块池由模块化语法组成,放在里面包含对话程序的程序。 这些模块可以由流逻辑调用,由对话处理器处理。

创建新对话框程序

步骤1 - 在事务SE80中,从下拉列表中选择“程序",并为自定义SAP程序输入Z名称为“ZSCREENEX"。

步骤2 - 按Enter键,选择“使用TOP INCL",然后点击“是"按钮。

Creating a New Dialog Program

步骤3 - 输入您的热门包含名称为“ZSCRTOP",然后点击绿色刻度线。

步骤4 - 在属性屏幕中,只需输入标题,然后点击保存按钮。

将屏幕添加到对话框程序

步骤1 - 要向程序添加屏幕,请右键单击程序名称,然后选择选项创建→屏幕。

步骤2 - 输入屏幕号码为“0211",然后点击绿色刻度线。

Add Screen to Dialog

步骤3 - 在下一个屏幕中,输入简短标题,设置为正常屏幕类型,然后单击顶部应用程序工具栏上的保存按钮。

屏幕布局和添加\'Hello World\'文本

步骤1 - 点击应用程序工具栏中的布局按钮,出现Screen Painter窗口。

步骤2 - 添加文本字段并输入一些文本,例如“Hello World"。

Add Hello World

步骤3 - 保存并激活屏幕。

创建事务

步骤1 - 要为您的程序创建事务代码,只需右键单击程序名称,然后选择选项创建→事务并输入事务代码为“ZTRANEX"。

Creating Transaction

步骤2 - 输入刚创建的交易文本,程序和屏幕(ZSCREENEX&amp; 0211),然后在“GUI支持"部分勾选“SAPGUI for Windows"复选框。

执行程序

保存并激活一切。 您可以执行程序。 程序执行时,您输入的文本将显示在屏幕上,如以下屏幕截图所示。

Executing the Program

SAP ABAP - 智能表单

SAP Smart Forms工具可用于打印和发送文档。 此工具在开发用于Internet的表单,PDF文件,电子邮件和文档中非常有用。 该工具提供了一个接口来构建和维护表单的布局和逻辑。 SAP还为业务流程(如客户关系管理(CRM),销售和分销(SD),财务会计(FI)和人力资源(HR))提供一系列表格。

该工具允许您使用简单的图形工具而不是使用任何编程工具来修改表单。 这意味着没有编程知识的用户可以毫不费力地为这些表单配置业务流程的数据。

在智能表单中,从静态和动态表中检索数据。 表标题和小计由触发事件指定,然后数据在最终输出之前排序。 智能表单允许您包含可以作为表单的一部分或作为背景显示的图形。 如果需要,还可以在进行表单打印输出时抑制背景图形。

SAP系统中可用的标准智能表单的一些示例如下 -

  • SF_EXAMPLE_01表示具有用于客户的航班预订的表输出的发票。

  • SF_EXAMPLE_02表示类似于SF_EXAMPLE_01的发票,但带有小计。

  • SF_EXAMPLE_03指定类似于SF_EXAMPLE_02的发票,但可以在应用程序中选择多个客户的发票。

创建表单

让我们使用SAP Smart Forms工具创建表单。 您还将学习如何在智能表单中添加节点并在本教程中测试表单。 这里我们开始创建SF_EXAMPLE_01表单的副本。 SF_EXAMPLE_01表单是SAP系统中可用的标准智能表单。

步骤1 - Smart Form Builder是用于构建智能表单的主要界面。 它在SAP Smart Forms的初始屏幕上可用。 我们需要在“命令"字段中键入“SMARTFORMS"事务代码,以打开SAP Smart Forms的初始屏幕。 在此屏幕中,在表单字段中输入表单名称SF_EXAMPLE_01。

步骤2 - 选择智能表单→复制或单击复制图标以打开复制表单或文本对话框。

步骤3 - 在“目标对象"字段中,输入新表单的名称。 名称必须以Y或Z字母开头。 在这种情况下,表单的名称为“ZSMM1"。

SAP Smart Form

步骤4 - 单击继续图标或在复制窗体或文本对话框中按ENTER键,以便创建ZSMM1表单作为预定义表单SF_EXAMPLE_01的副本。

步骤5 - 点击保存图标。 表单的名称显示在SAP Smart Forms初始屏幕上的表单字段中。

步骤6 - 点击SAP Smart Forms初始屏幕上的创建按钮。 ZSMM1表单显示在表单构建器中。

步骤7 - 使用MAIN窗口创建第一个草稿页。 新窗体的所有组件都基于SF_EXAMPLE_01预定义的形式。 您可以单击导航菜单中的某个节点来查看其内容。

 SAP Form Builder

在表单中创建文本节点

步骤1 - 在SAP表单构建器屏幕的更改模式下打开表单,右键单击第一页节点中的主窗口选项,然后从上下文菜单中选择创建→文本。

步骤2 - 将文本字段中的文本修改为“My_Text",将“含义"字段中的文本修改为“Text_Demo"。 在窗体构造器中心框架的文本编辑框中输入文本“Hello TutorialPoint .....",如以下快照所示 -

Create Text Node

步骤3 - 点击保存按钮保存节点。

步骤4 - 通过分别单击激活和测试图标激活和测试节点。 显示Function Builder的初始屏幕。

步骤5 - 通过单击激活和执行图标激活和测试功能模块。 功能模块的参数显示在Function Builder的初始屏幕中。

步骤6 - 通过单击执行图标执行功能模块。 将出现打印对话框。

步骤7 - 将输出设备指定为“LP01",然后单击打印预览按钮。

以上步骤将产生以下输出 -

Print Preview

SAP ABAP - SAPscripts

SAP系统的SAPscript工具可用于构建和管理业务表单,例如发票和采购订单。 SAPscript工具提供了许多模板,可以在很大程度上简化业务表单的设计。

SAP系统附带与SAP标准客户端(通常作为客户端000)一起交付的标准SAPscript表单。 以下是随客户端000提交的标准SAPscript表单的几个示例 -

S.No。 表格名称&amp; 描述
1

RVORDER01

销售订单确认表

2

RVDELNOTE

打包清单

3

RVINVOICE01

发票

4

MEDRUCK

采购订单

5

F110_PRENUM_CHCK

Prenumbered检查

SAPscript表单的结构由两个主要组件组成 -

内容 - 可以是文字(业务数据)或图形(公司徽标)。

布局 - 这是由一组窗口定义的,其中显示表单内容。

SAPscript - 表单绘制工具

Form Painter工具提供SAPscript表单的图形布局以及操作表单的各种功能。 在下面的示例中,我们将从标准SAPscript表单RVINVOICE01复制其布局结构之后创建发票表单,并通过访问表单绘制工具显示其布局。

步骤1 - 打开表单绘制器。 您可以通过导航SAP菜单或使用SE71事务代码来请求屏幕。

步骤2 - 在表单画家请求屏幕中,分别在表单和语言字段中输入SAPscript表单的名称和语言。 让我们在这些字段中分别输入\'RVINVOICE01\'和\'EN\'。

Form Painter Request

步骤3 - 在子对象组框中选择页面布局单选按钮。

步骤4 - 选择实用程序→从客户端复制以创建RVINVOICE01表单的副本。 将显示“复制客户端之间的表单"屏幕。

步骤5 - 在“在客户端之间复制表单"屏幕中,在表单名称字段中输入表单的原始名称“RVINVOICE01",源中的源客户端的编号“000" 客户端字段,目标表单的名称为“ZINV_01"。 确保其他设置保持不变。

Copy Form Between Client

步骤6 - 接下来,点击“在客户端之间复制表单"屏幕中的执行图标。 将显示“创建对象目录条目"对话框。 单击保存图标。

ZINV_01表单从RVINVOICE01表单中复制并显示在“复制客户端之间的表单"屏幕中,如下面的快照所示 -

Copy Form Between Client

步骤7 - 点击后退图标两次,返回到表单画笔:请求屏幕,其中包含复制的表格ZINV_01的名称。

步骤8 - 单击显示按钮后,将出现“窗体ZINV_01:第FIRST页布局"窗口和“窗体:更改页面布局:ZINV_01"屏幕,如以下屏幕截图所示。

Page Layout

步骤9 - “窗体ZINV_01:页面FIRST布局"窗口显示窗体的初始布局。 窗体的布局包含五个窗口:HEADER,ADDRESS,INFO,INFO1和MAIN。 这些窗口的描述可以在PC编辑器中访问。

例如,只需选择MAIN窗口并单击“窗体:更改页面布局:ZINV_01"屏幕中的文本图标,即可查看所有边距值,如以下屏幕截图所示 -

Change Page Layout

SAP ABAP - 客户退出

客户出口可以被视为SAP标准程序的钩子。 我们不需要访问密钥来编写代码,并且不需要修改SAP标准程序。 这些退出没有任何功能,它们是空的。 可以添加业务逻辑以满足各种客户端要求。 但是,客户退出不适用于所有程序。

客户退出标准交易

以下是针对标准交易查找客户退出的步骤。 让我们确定在MM01(材料主创建)中可用的客户退出。

Material Master Creation

步骤1 - 转到事务MM01,并通过进入菜单栏→系统→状态来识别MM01的程序名称,如上面的截图所示。

步骤2 - 从弹出式萤幕取得程式名称。 程序名称为“SAPLMGMM"。

步骤3 - 转到事务SE38,输入程序名称,然后单击显示。

步骤4 - 导航到转到→属性,找到此程序名称的包。

Function Pool

包名称为\'MGA\'。

步骤5 - 转到通常用于标识客户退出的事务代码SMOD。 导航到实用程序→查找(或),您可以直接按Ctrl + amp; F上的事务代码SMOD。

步骤6 - 进入“查找退出"屏幕后,输入我们之前获得的程序包名称,然后按F8(执行)按钮。

Find Exits

以上步骤将生成以下输出以及材料主数据创建中可用的退出列表。

Find Exit

SAP ABAP - 用户退出

如果标准SAP提取器不提供期望的数据或所需的功能,例如在授权或时间检查中,则在提取中使用用户出口。 用户出口通常用于销售和分销(SD)模块。 SAP在销售,运输,运输和计费领域提供了许多退出。 用户出口旨在在标准SAP无法满足所有要求时进行一些更改。

要能够访问每个销售区域中可用的退出,请使用此路径转到IMG:IMG→销售和分销→系统修改→用户退出。 将详细解释SD区域中每个出口的文档。

例如,如果要在销售凭证处理(合同,报价或销售订单)中查找用户退出,请按照上述路径继续展开销售中的用户退出→用户退出。 单击图标文档以查看销售凭证处理中提供的所有用户退出。

S.No。 用户退出&amp; 描述
1

USEREXIT_FIELD_MODIFICATION

用于修改屏幕属性。

2

USEREXIT_SAVE_DOCUMENT

有助于在用户点击保存时执行操作。

3

USEREXIT_SAVE_DOCUMENT_PREPARE

非常有用的是检查输入字段,在字段中输入任何值或向用户显示弹出式窗口并确认文档。

4

USEREXIT_MOVE_FIELD_TO_VBAK

将用户标题更改移动到标题工作区时使用。

5

USEREXIT_MOVE_FIELD_TO_VBAP

将用户项目更改移动到SAP项目工作区时使用。

用户出口的功能与客户退出功能相同,但它们仅适用于SD模块。 退出实现为对函数模块的调用。 用户退出是对SAP标准程序的修改。

例子

REPORT ZUSEREXIT1. 
TABLES:   
   TSTC, TSTCT,
   TADIR, TRDIR, TFDIR, ENLFDIR,
   MODSAPT, MODACT. 
	
DATA:   
   JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE,
   field1(30),
   v_devclass LIKE TADIR-devclass. 
	
PARAMETERS:
   P_TCODE LIKE TSTC-tcode OBLIGATORY. 
	
SELECT SINGLE *
   FROM TSTC
   WHERE tcode EQ P_TCODE. 
	
IF SY-SUBRC EQ 0.
   SELECT SINGLE *
   FROM TADIR
	
   WHERE pgmid = 'R3TR' AND 
         object = 'PROG' AND
         obj_name = TSTC-pgmna.
		
   MOVE TADIR-devclass TO v_devclass.
	
   IF SY-SUBRC NE 0.
   SELECT SINGLE * 
      FROM TRDIR
      WHERE name = TSTC-pgmna.
		
   IF TRDIR-subc EQ 'F'.
      SELECT SINGLE *
         FROM TFDIR
         WHERE pname = TSTC-pgmna.
			
      SELECT SINGLE *
         FROM ENLFDIR 
         WHERE funcname = TFDIR-funcname.
			
      SELECT SINGLE * 
         FROM TADIR
         WHERE pgmid = 'R3TR' AND
               object = 'FUGR' AND 
               obj_name EQ ENLFDIR-area.
         MOVE TADIR-devclass TO v_devclass.
      ENDIF.
   ENDIF.
	
   SELECT *
      FROM TADIR
      INTO TABLE JTAB
		
      WHERE pgmid = 'R3TR' AND
            object = 'SMOD' AND
            devclass = v_devclass.
			
   SELECT SINGLE *
      FROM TSTCT
      WHERE sprsl EQ SY-LANGU AND
            tcode EQ P_TCODE.
			
   FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
   WRITE:/(19) 'Transaction Code - ', 
      20(20) P_TCODE,
      45(50) TSTCT-ttext.
   SKIP.
	
   IF NOT JTAB[] IS INITIAL.
      WRITE:/(95) SY-ULINE.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
		
      WRITE:/1 SY-VLINE, 
            2 'Exit Name',
            21 SY-VLINE , 
            22 'Description',
            95 SY-VLINE.
			
      WRITE:/(95) SY-ULINE.
      LOOP AT JTAB.
         SELECT SINGLE * FROM MODSAPT
         WHERE sprsl = SY-LANGU AND
               name = JTAB-obj_name.
				
         FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
         WRITE:/1 SY-VLINE,
               2 JTAB-obj_name HOTSPOT ON,
               21 SY-VLINE ,
               22 MODSAPT-modtext,
               95 SY-VLINE.
      ENDLOOP.
		
      WRITE:/(95) SY-ULINE.
      DESCRIBE TABLE JTAB.
      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ 'No of Exits:' , SY-TFILL.
		
   ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(95) 'User Exit doesn’t exist'.
   ENDIF. 
ELSE.

   FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
   WRITE:/(95) 'Transaction Code Does Not Exist'. 
ENDIF.
 
AT LINE-SELECTION.
   GET CURSOR FIELD field1.
   CHECK field1(4) EQ 'JTAB'.
   SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
   CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN. 

处理时,输入事务代码“ME01",然后按F8(执行)按钮。 上面的代码产生以下输出 -

Transaction Code ‘ME01

SAP ABAP - 业务插件

在一些情况下,需要在软件应用中预定义特殊功能以增强各种应用的功能。 有许多Microsoft Excel加载项来提高MS Excel的功能。 类似地,SAP通过提供称为BADI的业务加载项来实现一些预定义的功能。

BADI是一种增强技术,有助于SAP程序员,用户或特定行业向SAP系统中的现有程序添加一些附加代码。 我们可以使用标准或定制的逻辑来改进SAP系统。 BADI必须首先被定义,然后实现以增强SAP应用程序。 在定义BADI时,将创建一个接口。 BADI由该接口实现,接口又由一个或多个适配器类实现。

BADI技术与其他增强技术在两个方面不同 -

  • Enhancement technique can be implemented only once.
  • This enhancement technique can be used by many customers simultaneously.
Enhancement Technique

您还可以创建过滤器BADI,这意味着BADI是基于过滤的数据定义的,这是增强技术不可能实现的。 在SAP版本7.0中重新定义了BADI的概念,具有以下目标 -

  • 通过在ABAP语言中添加两个新元素(即“GET BADI"和“CALL BADI")来增强SAP系统中的标准应用程序。

  • 提供更多灵活性功能,如上下文和过滤器,用于增强SAP系统中的标准应用程序。

创建BADI时,它包含一个界面和其他附加组件,例如用于菜单增强和屏幕增强的功能代码。 BADI创建允许客户在标准SAP应用程序中包含自己的增强功能。 增强,接口和生成的类位于适当的应用程序开发命名空间中。

因此,BADI可以被认为是一种增强技术,它使用ABAP对象在SAP组件中创建“预定义点"。 然后,这些预定义点由单个行业解决方案,国家/地区变体,合作伙伴和客户实施,以满足其特定要求。 SAP实际上引入了版本4.6A的BADI增强技术,该技术在版本7.0中再次实现。

SAP ABAP - Web Dynpro

用于ABAP的Web Dynpro(WD)是SAP AG开发的SAP标准用户界面技术。 它可用于在使用SAP开发工具和概念的SAP ABAP环境中开发基于Web的应用程序。 它提供了一个前端Web用户界面,用于直接连接到后端SAP R / 3系统,以访问用于报告的数据和功能。

用于ABAP的Web Dynpro由运行时环境和具有集成在ABAP工作台(事务:SE80)中的特定开发工具的图形开发环境组成。

Web Dynpro的架构

下图显示了Web Dynpro的整体架构 -

Web Dynpro

以下是几点要记住的Web Dynpro -

  • Web Dynpro是用于用户界面的SAP NetWeaver编程模型。

  • 所有Web Dynpro应用程序都按照模型视图控制器(MVC)编程模型进行构造。

  • 模型定义了到主系统的接口,Web Dynpro应用程序可以访问系统数据。

  • 视图负责在Web浏览器中显示数据。

  • 控制器位于视图和模型之间。 控制器格式化要在视图中显示的模型数据。 它处理用户创建的用户条目并将其返回到模型。

优点

Web Dynpro为应用程序开发人员提供以下优势 -

  • 使用图形工具显着减少了实施工作。

  • 通过使用组件重用和更好的可维护性。

  • 使用Web Dynpro工具可以轻松更改布局和导航。

  • 支持用户界面辅助功能。

  • 完全集成在ABAP开发环境中。

Web Dynpro组件和窗口

组件是Web Dynpro应用程序项目的全局单位。 创建Web Dynpro组件是开发新的Web Dynpro应用程序的初始步骤。 创建组件后,它将作为Web Dynpro对象列表中的节点。 您可以在组件中创建任意数量的组件视图,并将其组装到任意数量的相应Web Dynpro窗口中。

每个Web Dynpro组件中至少包含一个Web Dynpro窗口。 Web Dynpro窗口嵌入在前端Web应用程序中显示的所有视图。 该窗口在ABAP工作台的窗口编辑器中处理。

注意

  • 组件视图显示应用程序的所有管理详细信息,包括描述,创建它的人员的名称,创建日期和分配的开发包。

  • Web Dynpro应用程序是ABAP工作台对象列表中的独立对象。 窗口和应用程序之间的交互是由给定窗口的接口视图创建的。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号