SAP ABAP学习笔记

时间:2024-03-18 20:27:26

ABAP/4  简介

ABAP/4 包括
- 带有各种类型和结构的声明数据的声明元素
- 数据制作的操作元素
- 控制程序流的控制元素
- 反应外部事件的事件元素
_ ABAP/4 支持多种语言。文本摘要(例如,标题、页眉和其他文本)将根据程序代码分别存储。您
可以随时在不改变程序代码的情况下更改、转换和维护这些文本摘要。
_ ABAP/4 支持商业数据类型和操作。您可以用特殊日期和时间字段进行计算。系统会自动执行必需
的类型转换。
_ ABAP/4 提供一系列功能处理字符串。
_ ABAP/4 包含一个叫 Open SQL 的 SQL 子集。用 Open SQL,您可以读取和访问数据库表,与所
用的数据库系统无关。
_ ABAP/4 允许您定义和处理内部表,该表只在运行程序时存在。内部表使其更容易处理数据表,并
帮助使用程序中的复杂数据结构。
_ ABAP/4 允许您定义和调用子程序。也可以调用其他程序的子程序。参数能够以各种方式从子程序
传递或传递到子程序。
_ ABAP/4 包含一种特殊子程序,叫做功能模块。您可以在*库中创建和维护功能模块。在调用程

序和子程序之间功能模块有一个明确定义的数据接口。它们能够以调用程序的独立模式进行分别
测试。
这里有两种主要的 ABAP/4 程序类型:
_ 报表程序
报表程序用于分析数据库表中的数据。这种分析的结果可以显示在屏幕上或发送到打印机上。逻
辑数据库支持报表程序。逻辑数据库是特殊的 ABAP/4 程序,使开发者不必编码所有的数据库访
问。关于报表程序的详细信息,参见《ABAP/4 用户指南》的第二部分。
_ 对话程序
将对话程序组织为包含对话模块的模块池。每个动态程序(由一个屏幕及其流逻辑组成的“动态
程序”)都基于一个 ABAP/4 对话程序。流逻辑包含对 ABAP/4 对话模块的调用。关于对话程序
的详细信息,参见《ABAP/4 用户指南》的第三部分。

SAP ABAP 回路控制

Nested loop

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

CONTINUE语句忽略当前语句块中的所有语句,并继续下一个循环遍历。

SAP ABAP 异常处理

ABAP异常处理建立在三个关键字 - RAISE,TRY,CATCH和CLEANUP

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词典中的基本类型

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

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

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

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

SAP ABAP 域

用于在ABAP字典中定义数据的三个基本对象是域,数据元素和表。 域用于表字段的技术定义,例如字段类型和长度,数据元素用于语义定义(简短描述)。 

创建域的事务SE11,您可以在客户名称空间下创建域,对象的名称始终以“Z"或“Y"开头

SAP ABAP 数据元素

SAP ABAP 表

SAP ABAP 结构

SAP ABAP 视图

SAP ABAP 搜索帮助

SAP ABAP 锁定对象

SAP ABAP 模块化

在SAP ABAP环境中,模块化涉及将程序组织成模块化单元,也称为logical blocks

SAP ABAP 子程序

子程序是一个可重用的代码段。 它是程序中的模块化单元,其中函数以源代码的形式封装

 可以使用Form和EndForm语句定义子例程。

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

FORM <subroutine_name>.
  
<statements> 
  
ENDFORM.

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

事务SE80

 

SAP ABAP 宏

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

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

 

704/5000在调用它之前必须首先定义一个宏。 ...。 替换宏定义中包含的ABAP语句中的占位符和1 ...。

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

 

SAP ABAP 功能模块

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

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

 

创建新程序

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

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

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

SAP ABAP学习笔记

步骤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。

SAP ABAP学习笔记

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

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

SAP ABAP Include程序

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

INCLUDE <program_name>.

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

创建一个include程序,不需要在开头写program,自己写逻辑即可

SAP ABAP 打开SQL概述

SAP ABAP 本地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 内部表

内部表用于许多目的:

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

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

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

SAP ABAP 创建内部表

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

以下是语法

DATA: BEGIN OF <internal_tab> Occurs 0,

可以使用或不使用标题行创建内部表。 要创建带有标题行的内部表,请在内部表定义中的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.方法调用参数输入注意,

length_1 = STRLEN( title_1 )."参数连接括号的地方需要空格

2.每个语句都是以点结尾

3.定义参数都是DATA开头

4.可执行的程序都是REPORT开头

5.添加断点是必须先**程序(注意)