ABAP学习(7):程序类型

ABAP子程序

ABAP子程序,相当于封装的一个方法,执行一段逻辑处理。

子程序内部定义变量只能子程序内部使用,全局变量可以直接使用。

语法:form <子程序名>

[using]

[changing]

[value ( 变量 )]

[changing value (变量)].

程序处理逻辑.

endform.

关键词:using、changing都是传递地址给子程序,using一般不允许子程序修改值,changing允许子程序修改值,如果子程序内修改using传递的参数值这个只是定义上的,程序并没有限定,会报出警告,不影响运行。

关键词:value只传递值,发现没啥用;

关键词:changing value 返回修改值;

注意:changing value 不能和changing同时存在,一般不使用,changing因为传递的地址,直接修改就会修改地址值,一般就使用changing就可以了。

调用子程序:

语法:perform <子程序名>

[using]

[changing]

[value ( 变量 )].

示例:

DATA: num1 type I value 49,

      num2 type I value 58.

DATA: sum type I.

测试1:

"子程序调用

PERFORM multi USING num1 num2.

"子过程定义

form  multi USING num1 num2.

  "局部变量

  Data : mul type I.

  "using传入参数,也可重新赋值,但程序会警告

  num1 = 10.

  mul = num1 * num2."可使用全局变量

  WRITE :/ num1,‘*‘,num2,‘=‘,mul.

ENDFORM.

测试2:

"子程序调用

PERFORM add01 using num1 num2 CHANGING sum.

WRITE :/ ‘主程序:‘, num1 ,num2, sum.

"子过程定义,使用using,changing传地址,一般using是不允许子程序改值。changing,允许子程序改值

form add01 CHANGING num1 num2 sum.

  WRITE :/ num1 ,num2, sum.

  "子程序赋值,主程序也跟着修改

  num1 = 10.

  num2 = 20.

  sum = num1 + num2.

  WRITE :/ num1 ,num2, sum.

ENDFORM.

测试3:

"子程序调用

PERFORM add02 using num1 sum num2.

WRITE :/ ‘主程序:‘, num1 ,num2, sum.

"子过程定义,value()只传值。

form add02 CHANGING num1 sum value(num2).

  WRITE :/‘前‘,num1, num2, sum.

  num2 = 40."这个赋值只在局部有效

  sum = num1 + num2.

  WRITE :/ ‘后‘,num1,num2,sum.

ENDFORM.

测试时发现:使用value(),子程序赋值,仍然会影响主程序值。调用传参顺序和定义子程序时顺序要一致,不然会出现错位现象,不是按照参数名传参赋值,而是根据位置。

测试4:

"子程序调用

PERFORM add03 using num1 num2 CHANGING sum.

WRITE :/ ‘主程序:‘, num1 ,num2, sum.

"子过程定义,返回changing value().

FORM add03 USING num1 num2 CHANGING VALUE(s).

  WRITE :/ num1,num2,sum.

  num1 = 20.

  num2 = 30.

  s = num1 + num2.

  WRITE :/ num1, num2, s.

ENDFORM.

测试时发现:使用changing value(),子程序赋值,仍然会影响主程序值。

ABAP宏定义

定义一段通用代码,使用&数字,表明传入参数,执行一段逻辑。这段代码可以在主程序中反复调用。

定义宏:

语法:define <程序名>

程序逻辑.

end-of-definition.

调用宏定义代码段:

语法:<程序名> <参数1> [<参数2>
………]

示例:

"宏定义

DATA: sum type I.

DATA: num1 type I value 10,

      num2 type I value 20.

"定义宏,两个数求和,并输出

DEFINE addNum.

  sum = &1 + &2.

  WRITE :/ &1,‘+‘, &2 ,‘=‘,sum.

end-OF-DEFINITION.

"调用宏定义代码

addNum num1 num2.

ABAP公共代码块

定义一段公共使用的代码,编译时直接嵌入到调用位置,主程序可以使用公共代码中定义的所有变量、子程序等。

定义公共代码块,选中包名,右键选择create,找include选择就行了。

如果包下有一个includes活页夹,直接选中includes右键create就行了。

在主程序调用,直接将z_test_include中的代码嵌入到主程序调用位置。

示例:

"调用includeProgram

INCLUDE z_test_include.

ABAP程序结构

1报表程序结构

Report <name>:宣告程序名称和报表格式;

语法:report <程序名>

[NO STANDARD PAGE HEADING]

[message-id <messageid>]

[line-count <数字>]

[line-size <数字>]

Message-id:指定使用的message

Line-count:指定报表显示列数

Line-siez:显示每页报表宽度

Include语句:宣告使用的公共代码块;

语法:Include <代码块>:包含其他公共代码块

Tables语句:声明程序中使用到的数据库表;

语法:Tables:<数据库表名>[,<数据库表名>].

Types,Data语句:定义变量类型和变量;

Selection screen、option、parameter定义屏幕显示内容;

语法:见屏幕显示;

Initialization语句:执行一些变量初始化;

  语法:Initiallization.

At selection-screen语句:选择屏幕运行时触发,主要对查询条件和权限进行校验。

语法:at selection-screen.

[on <parameters名>]:parameters输入时,按enter触发;

[on end of <select-option名>]:select-option,multi-option页面数据填写后,按确认触发;

[on value–request for <parameters名>]:f4帮助,点击输入框小方块,弹出备选值;

[on help-request for <parameters名>]:f1帮助,按f1执行;

[on radiobutton group <按钮组名>]:监听选择按钮组按钮触发事件,按enter键触发;

[on block <模块名>]:监听block触发事件;

[output]:屏幕每次输出时触发

Start-of-selection语句:开始执行程序主逻辑,比如读取数据,处理数据等,类似于java的main()方法;

语法:start-of-selection.

程序主逻辑.

End-of-selection语句:程序执行结束,调用的子程序可以定义在这模块后;

语法:end-of-selection.

子程序form.

Include代码块.

示例:

"宣告程序名,和报表参数

REPORT ZLUJIE_TEST_REPORT

NO STANDARD PAGE HEADING

MESSAGE-ID ym

LINE-COUNT 20

LINE-SIZE 20.

"include语句

"可以包含公共代码块

"tables语句,宣告使用的数据库表

TABLES:spfli.

"定义数据类型,数据变量

TYPES:BEGIN OF str_spfli,

   carrid LIKE spfli-carrid,

   connid LIKE spfli-connid,

   cityfrom LIKE spfli-cityfrom,

  END OF str_spfli.

DATA:t_spfli TYPE TABLE OF str_spfli.

DATA:wa_spfli LIKE LINE OF t_spfli.

DATA:t_spfli_all LIKE TABLE OF spfli.

"定义屏幕元素

"parameters

PARAMETERS:  p_carrid LIKE spfli-carrid.

"select option

SELECT-OPTIONS s_connid FOR spfli-connid NO-EXTENSION.

"selection-screen

SELECTION-SCREEN  BEGIN  OF  BLOCK  RADIO  WITH  FRAME TITLE text1 .

PARAMETER  p1  RADIOBUTTON  GROUP  GR1.

PARAMETER  p2 RADIOBUTTON  GROUP  GR1.

PARAMETER  p3 RADIOBUTTON  GROUP  GR1.

SELECTION-SCREEN  END  OF  BLOCK  RADIO.

"初始化

INITIALIZATION.

  text1 = ‘选择参数‘.

"选择屏幕运行时触发,检查参数

"当parameters输入后,enter触发

AT SELECTION-SCREEN ON p_carrid.

    MESSAGE s000 WITH p_carrid.

"select-option的multi-option界面输入后确认时触发

AT SELECTION-SCREEN ON END OF s_connid.

  MESSAGE s000 WITH s_connid.

"按f4触发,或者点击输入框最后的小方框

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_carrid.

  MESSAGE s000 WITH p_carrid ‘f4帮助‘.

"按f1触发

AT SELECTION-SCREEN ON HELP-REQUEST FOR p_carrid.

  MESSAGE s000 WITH p_carrid ‘f1帮助‘.

"屏幕按钮组变化监听

*AT SELECTION-SCREEN ON RADIOBUTTON GROUP gr1.

*  IF p1 = ‘X‘.

*    MESSAGE s000 with ‘p1‘.

*  ELSEIF p2 = ‘X‘.

*    MESSAGE s000 WITH ‘p2‘.

*  ELSE.

*    MESSAGE s000 WITH ‘p3‘.

*  ENDIF.

"屏幕模块监听

AT SELECTION-SCREEN ON BLOCK RADIO.

  IF p1 = ‘X‘.

    MESSAGE s000 with ‘p1‘.

  ELSEIF p2 = ‘X‘.

    MESSAGE s000 WITH ‘p2‘.

  ELSE.

    MESSAGE s000 WITH ‘p3‘.

  ENDIF.

"屏幕输出时触发,可以检查输入值,检查权限

AT SELECTION-SCREEN OUTPUT.

  MESSAGE s000 WITH ‘output screen‘.

"程序主逻辑开始

START-OF-SELECTION.

  WRITE:/ ‘hello world‘.

  MESSAGE s000 WITH ‘程序主逻辑‘.

"处理GUI-Status自定义的命令

AT USER-COMMAND.

"报表中按f2触发,或者双击

AT LINE-SELECTION.

"定义报表表头

TOP-OF-PAGE.

"打印完最后一页触发

END-OF-PAGE.

"报表程序结束,后面定义一下form或者include代码块

END-OF-SELECTION.

2module pool程序结构

Modul pool programs,模块池程序。主要使用screen作为主要操作对象,所有操作围绕屏幕PBO模块,PAI模块操作。

选择项目,项目活页夹上右键->create->Screen,

输入屏幕编号,例如100。

PBO Modules:屏幕输出前执行module模块池方法;

PAI Modules:用户和屏幕输入交互调用module方法;

Screens:我们创建的屏幕;

GUI Status:自定义的工具栏;

GUI Title:显示的标题;

可以看到我们创建的屏幕,点击0100,在右边设计界面可以添加我们的module逻辑代码。

点击Layout可以进入一个图形化界面,我们可以通过拖动组件方式设计我们的页面。

逻辑代码:

PROCESS BEFORE OUTPUT.模块下的module会在屏幕输出之前执行,一般设置屏幕标题,功能字段逻辑在这里。

PROCESS AFTER INPUT.模块下module会响应用户在屏幕上的操作。比如用户点击功能按钮等。

示例:

TABLES: sflight.

DATA : OK_CODE like sy-ucomm.

DATA : t_carrid like sflight-carrid.

DATA : t_connid LIKE sflight-connid.

DATA : t_price LIKE sflight-price.

*DATA : testTab like sflight OCCURS 10 WITH HEADER LINE,

*       testLine like sflight.

"调用屏幕显示

CALL SCREEN 100.

"屏幕输出前,设置工具栏和标题

MODULE STATUS_0100 OUTPUT.

 "设置GUI STATUS工具栏

  SET PF-STATUS ‘STS_100‘.

 "设置标题

  SET TITLEBAR ‘TEST‘.

ENDMODULE.

"用户退出

MODULE USER_EXIT_0100 INPUT.

    ok_code = sy-ucomm.

    CLEAR sy-ucomm.

    if ok_code = ‘BACK‘ or ok_code = ‘CANCEL‘ or ok_code = ‘EXIT‘.

       LEAVE PROGRAM.

    ENDIF.

ENDMODULE.

"用户点击执行

MODULE USER_COMMAND_0100 INPUT.

    ok_code = sy-ucomm.

    CLEAR sy-ucomm.

    case ok_code .

      when ‘EXC‘.

        select SINGLE connid price  into (t_connid,t_price)

          from sflight where carrid = t_carrid.

       if sy-subrc <> 0.

         t_connid = ‘00‘.

         t_price = ‘0.000‘.

       ENDIF.

    endcase.

ENDMODULE.

原文地址:https://www.cnblogs.com/tangToms/p/11824150.html

时间: 2024-11-05 18:42:39

ABAP学习(7):程序类型的相关文章

《iOS应用逆向工程》学习笔记(四)iOS程序类型

越狱iOS中最常见的程序有Application, Dynamic Library和Daemon三类. 1.Application 除了传统意义上的App外,越狱iOS平台上还有两种App形式的存在:WeeApp(依附于NotificationCenter的App)和PreferenceBundle(依附于Settings的App),常见于Cydia平台. 普通App的bundle中存放的是可执行程序和所需资源,而framework的bundle中存放的是动态链接库. 主要关注App中的三个部分

【C语言学习】存储类型

C语言中的存储类型主要有四种:auto.static.extern.register ★auto存储类型 默认的存储类型.在C语言中,如果忽略了变量的存储类型,那么编译器就会自动默认为auto型 ★register存储类型 寄存器变量.寄存器位于CPU,它的特点是:容量小.速度快.它一般用来暂存程序中使用频繁的变量.或者一些中间变量等,能提高程序的执行速度.此类别的变量会优先分配寄存器. ★static存储类型 static定义的变量都是静态变量,用于限制作用域,无论是全局变量还是局部变量都存储

跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:一、IIS下SSL环境搭建

缘起 1.从事互联网十来年了,一直想把自己的从事开发过程遇到的问题给写出来,分享给大家.可是可是这只是个种想法,想想之后就放下了,写出来的类文章是少之又少.古人说无志之人常立志,有志之人立长志.今天,就从学习小程序开始,记录在学习过程中的遇到点点滴滴,先做“无志之人常立志”吧. 强调的是,微信小程序开发,我也是从0到1的过程,肯定会有错误或遗漏,还望给指导指导,让我的学习知识更完善,再此先谢过了. 2.bitcms开源内容管理系统也发布了,运营对一个程序老猿来说,确实是个艰巨的任务.自己的想法很

C语言/C++编程新手入门基础学习中链接类型

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制).创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学C++能够持之以恒C++爱好群,如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组

我的游戏学习日志59———类型游戏策划(2.2)—益智游戏(2)

我的游戏学习日志59———类型游戏策划(2.2)—益智游戏(2) 2.益智游戏(PUZ)的设计要素 (2)游戏模式: 前提:通常对平台.内存.屏幕等要求很低,且规模小,操作简单,同时又有较高的耐玩性和游戏性. 特点:这是一种适应力级高的游戏种类. 设计模式: <1>单人解谜游戏:玩家与游戏程序进行交互,通过克服一关又一关的挑战来完成游戏. <2>多人对战游戏:玩家之间通过联机的方式进行竞争. <3>游戏机模式:运用小型数字化平台,比较合适时间短.步调快.关卡与关卡之间不

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

Swift编程语言学习1.5——类型别名、布尔值、元组

类型别名 类型别名(type aliases)就是给现有类型定义另一个名字.你可以使用typealias关键字来定义类型别名. 当你想要给现有类型起一个更有意义的名字时,类型别名非常有用.假设你正在处理特定长度的外部资源的数据: typealias AudioSample = UInt16 定义了一个类型别名之后,你可以在任何使用原始名的地方使用别名: var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound 现在是 0 本例中,A

C# in Depth Third Edition 学习笔记-- 值类型和引用

I. C#中值类型和引用类型 1. 类class 引用类型,结构struct值类型 2. 数组是引用类型,即使元素是值类型,int[]是引用类型 3. 枚举是值类型enum 4. 委托类型delegate是引用类型 5. 接口类型interface是引用类型,但可以由值类型实现. II. 值的表达式:表达式“2+3”的值就是5:而对于引用类型的表达式,它的值是一个引用,而不是该引用所指代的对象,如String.Empty的值不是一个空字符串,而是对空字符串的一个引用. III. 变量的值在它声明

x509.PrivateKey报“指定的提供程序类型无效”错误

坑死了,折腾了一天,在这里留个纪念. x509.PrivateKey报"指定的提供程序类型无效"错误. 网上搜一大堆,全都是误人子弟的东西,大致的意思是: 操作系统升级后证书中的私钥是以CngKey的方式存在, http://clrsecurity.codeplex.com 提供了RSACng的封装,使用如下: if (x509.HasCngKey()) var privateKey = x509.GetCngPrivateKey(); .net4.6 以后的版本提供了对x509的扩展

MySql学习之 bit类型的查询和删除

今天项目从SqlServer转移到了MySql,转移过程中发现了一些问题,以前没遇到过,在网上查了查,总算是解决了,但是问题的根源还弄明白,暂且记录下来: 首先有个tb_paymentmethod表,表中有几条数据如下: DAO层获取Model时这样: if (row["IsDefault"] != null && row["IsDefault"].ToString().Trim() != "") { model.IsDefaul