ABAP学习笔记
开发命名规则

常用Tcode
| 事务代码 | 功能 | 
|---|---|
| se11 | 数据字典管理 | 
| se16 | 查看表数据 | 
| sm30 | 查看数据,需要表维护生成器 | 
| sm12 | 选择锁定条目 | 
| se37 | 函数构造器 | 
| mm03 | 显示物料 | 
| zmaterial | 物料主数据清单 | 
| se91 | 消息维护 | 
| se93 | 创建事务码 | 
| se41 | 创建GUI状态 | 
数据类型
预定义数据类型

自定义数据类型
使用关键字types定义,如下定义了名称为gty_out的数据类型
TYPES: BEGIN OF gty_out,
         light    TYPE icon_d, " 警示灯
         werks    LIKE zmmt0036a-werks, " 工厂代码
         matnr    LIKE zmmt0036a-matnr, " 物料编码
       END OF gty_out.
变量
变量定义
语法如下:类型声明使用关键字like或者type

TYPE 和 LIKE的区别
- like后跟的该程序中已有的变量,表示定义一个和该变量相同类型的变量,type跟的是数据类型
 
变量命名规范
*G: GLOBAL  L:LOCAL   V: VARIABLE    W: WORKAREA     S:SPACE
*T: TABLE     TY: TYPE       C: CONSTANT
*全局变量 GV_
*临时变量 LV_
*全局工作区 GW_
*临时工作区 LW_
*全局内表   GT_
*临时内表   LT_
*程序定义类型 TY_
*全局内表   GT_
*临时内表   LT_
*程序定义类型 TY_
*全局常量   GC_
*临时常量   LC_
常用系统变量

变量赋值

data:f1 type c,
	f2 type c.
f1 = '法外狂徒张三'.
f2 = f1.
* 或者
move f1 to f2.
* 或者
write f1 to f2.
*偏移量取值
f2 = f1+1(2)"f2的值为 外狂
常量定义
使用关键字CONSTANTS
constants pi p decimals 5 value '3.14159'.
write 关键字

skip 产生空白行
变量运算符
类型转换

算数运算
算数运算符号
| 符号 | 作用 | 
|---|---|
| * | 乘 | 
| / | 除(整数除法) | 
| + | 加 | 
| - | 减 | 
| DIV | 整数除法 | 
| MOD | 余数除法 | 
ABAP预定义函数

字符串处理
- 字符串移位操作
 
*左移三位
data LV_STRING1 TYPE String value 'abcdefg'.
shift LV_STRING1 BY 3 PLACES LEFT.
- 字符串替换
 
DATA: lv_string2 TYPE string VALUE 'abcdefg',
      lv_string3 TYPE string VALUE 'a',
      lv_string4 TYPE string VALUE 'c'.
*用string_4替换lv_String2中lv_String3
REPLACE lv_string3 WITH lv_string4 INTO lv_string2.
- 字符串大小写转换
 
TRANSLATE LV_STRING2 TO UPPER CASE/ TO LOWER CASE.			
- 字符串比较
 
要比较字符 串(类型 C)和数字 文本(类型 N),可以 在逻辑表达 式中使用下 列运算符。
- 
CO 仅包含
 - 
CN 不仅包含
 - 
CA 包含任何
 - 
NA 不包含任何
 - 
CS 包含字符串
 - 
NS 不包含字符串
 - 
CP 包含模式
 - 
NP 不包含模式
 
因为除类型 N 和 C 外,系统不 能执行任何 其它类型转 换,所以, 在进行包含 这些运算之 一的比较时 ,操作数应 该是类型 N 或 C。 运算符的功 能如下:
CO (仅包含)
如果 
CN (不仅包含 )
如果 
CA (包含任何 )
如果 
NA (不包含任 何)
如果 
CS (包含字符 串)
如果 
NS (不包含字 符串)
如果 
CP (包含模式 )
如果 
- * 用于任何字 符串
 - + 用于任何单 个字符
 
忽略尾部空 格且比较不 区分大小写 。如果比较 结果为真, 系统字段 SY-FDPOS 包含 
- 大小写字 符
 - 通配符 ""(输 入 #)
 - 通配符 "+" (输入 #+)
 - 换码符号 本身 (输入 ##)
 - 字符串结 尾的空格 (输入 #___)
 
NP (不包含模 式)
如果 
DATA: F1(5) TYPE C VALUE <f1>,
          F2(5) TYPE C VALUE <f2>.
IF F1 <operator> F2.
   WRITE: /  'Comparison true, SY-FDPOS=', SY-FDPOS.
ELSE.
   WRITE: /  'Comparison false, SY-FDPOS=', SY-FDPOS.
ENDIF.
下表列出该 程序的执行 结果,取决 于所用的运 算符和 F1 / F2 字段。
'BD ' CO 'ABCD ' 真 5
'BD ' CO 'ABCDE' 假 2
'ABC12' CN 'ABCD ' 真 3
'ABABC' CN 'ABCD ' 假 5
'ABcde' CA 'Bd ' 真 1
'ABcde' CA 'bD ' 假 5
'ABAB ' NA 'AB ' 假 0
'ababa' NA 'AB ' 真 5
'ABcde' CS 'bC ' 真 1
'ABcde' CS 'ce ' 假 5
'ABcde' NS 'bC ' 假 1
'ABcde' NS 'ce ' 真 5
'ABcde' CP 'b' 真 1
'ABcde' CP '#b' 假 5
'ABcde' NP 'b' 假 1
'ABcde' NP '#b' 真 5
Message
常用的消息最好创建一个消息类,避免在程序中直接使用文本输出消息
通过事务代码se91创建消息类,一般这个消息类是分模块构建的,比如SD模块就创建一个名为ZSD模块的消息类
程序中调用消息类
message e005(ymess)."e表示消息类型为error  005表示ymess消息类的005编号对应的消息
message e005(ymess) display like 'I'."以信息格式显示错误信息
除了上面这种调用方式,还可以在程序开始指定消息类,这样就不需要在调用消息时指定消息类
REPORT YMMR0001 MESSAGE-ID zmm."指定该程序要使用的消息类
MESSAGE s051.
消息类型:

内表
内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放。
内表一共有三种类型
standard 标准表
sorted 排序表
hashed 哈希表
标准表在增加或插入数据行时并不对数据行的地址进行重新排序存储。
排序表在增加和插入数据行时要对数据存储的地址进行重新排列。
哈希表只能通过关键字进行访问,在检索数据里与数据行数无关。
工作区:内表按照行进行访问,必须使用某个区域作为与表格互相传输的接口。
从内表中读取数据时,已定址的行内容覆盖工作区的内容。将数据写入内表时,必须首先在工作区中输入数据。
内表定义
自定义类型创建内表:

*定义内表
*方法一:
TYPES: BEGIN OF gty_out,  "定义结构类型
         light    TYPE icon_d, " 警示灯
         werks    LIKE zmmt0036a-werks, " 工厂代码
         matnr    LIKE zmmt0036a-matnr, " 物料编码
       END OF gty_out.
data gt_table type standard table of gty_out [with header line]. "定义带有同名工作区的内表,名称后加[] 表示明确使用内表
*方法二:
TYPES: BEGIN OF gty_out,  "定义结构类型
         light    TYPE icon_d, " 警示灯
         werks    LIKE zmmt0036a-werks, " 工厂代码
         matnr    LIKE zmmt0036a-matnr, " 物料编码
       END OF gty_out.
types : gty_t_out type gty_out occurs 1."定义表结构
data : gt_table type gty_t_out.
*方法三:使用data直接定义内表,这种方式会创建同名工作区
data: BEGIN OF gty_out occurs 0,  "初始容量为0
         light    TYPE icon_d, " 警示灯
         werks    LIKE zmmt0036a-werks, " 工厂代码
         matnr    LIKE zmmt0036a-matnr, " 物料编码
       END OF gty_out.   
内表数据处理
- 内表初始化
 
clear和refresh关键字
data: BEGIN OF gty_out occurs 0,  "初始容量为0
         light    TYPE icon_d, " 警示灯
         werks    LIKE zmmt0036a-werks, " 工厂代码
         matnr    LIKE zmmt0036a-matnr, " 物料编码
       END OF gty_out.  
*带工作区的内表
clear gty_table."清空工作区
clear gty_table[]"清空内表
refresh gty_table   "清空内表
- 
增加数据
单行插入
 

要将内表仅用于存储数据,出于性能方面的考虑,建议使用APPEND。
要计算数字字段之和或要确保内表中没有出现重复条目,请使用COLLECT语句。

注意☝️图片中提到的关键字段指的是对内表结构中所有的 C N D T类型进行比较,涉及到的所有字段全部相同时才会进行累加
要在内表现有行之前插入新行,请使用INSERT语句。
如果要操作的是排序表或者哈希表,那个就要使用insert关键字操作,这样会将该条数据插入到应该存在的位置
insert <wa> into table <itab>.  "注意是into table
 多行插入

要将内表行附加到另一个内表中,请使用APPEND语句。
要将内表行插入另一个内表中,请使用INSERT语句。
要将内表条目内容复制到另一个内表中,并且覆盖该目标表格,请使用MOVE语句。
append LINES OF it_table1  to it_table2. "把it_table1中的数据插入到it_table2中
append LINES OF it_table1  from 1 to 10  to it_table2. "把it_table1中的1到10行插入到it_table2中
- 修改数据
 
第一种方式更行当前行所有字段,第二种方式只更新指定字段

MODIFY it_table1 from wa_table INDEX 1."更行指定索引行的所有字段
MODIFY it_table1 from wa_table INDEX 2 TRANSPORTING name. "更新指定索引行的指定字段
MODIFY it_table1 from wa_table  TRANSPORTING name where name = 'zhangsan'.  "根据条件更新字段	
- 删除数据
 

DELETE it_table1 WHERE telephone = 111111111111.
DELETE TABLE it_table1 FROM wa_table.
DELETE it_table1 INDEX 1.
DELETE ADJACENT DUPLICATES FROM it_table1.
- 排序
 
SORT it_table1 by name telephone ASCENDING/DESCENDING.  "默认升序排序
- 读取内表数据
- READ:依据具体行数或字段值等条件读取某一内表的数据
 - LOOP:循环常用于实现内表数据的循环读取和操作
 
 
使用READ操作的表必须得HEADER LINE作为查找出的数据存储窗口
BINARY SEARCH可以提高内表数据查找的速度,但是使用前必须先对内表进行排序
适用于标准表读取
*READ语法:
read table it_table1 into wa.
read table it_table1 into wa with key k1 = v1 ...kn= vn [binary search]  "指定条件读取
read table it_table1 into wa index i."指定下标读取
*LOOP语法:
loop at it_table1 into wa from 1 to 10.  "读取内标的1-10行数据
write : / wa-name.
endloop.
loop at it_table into wa where name = '张三'.
write : / wa-name.
endloop.
*带工作区的内表
DATA: it_table3 TYPE STANDARD TABLE OF it_table with HEADER LINE.
it_table3-name = 'aa'.
it_table3-telephone = 123456789.
it_table3-age = 11.
append it_table3.
排序表/哈希表
data it_table type sorted table of stu with UNIQUE key name.
"下方的key必须是内表声明时指定的,并且要qu'a
read table it_table into wa with table  key name = 'zhangsan'.
分组遍历
*  分组循环 按照vkbur vkgrp分组,分别进行求和,退货订单金额先取负数再求和
  LOOP AT lt_table INTO DATA(wa_table) GROUP BY ( vkbur = wa_table-vkbur vkgrp = wa_table-vkgrp  ).
    CLEAR table.
    LOOP AT GROUP wa_table INTO DATA(group).
      IF group-auart = 'ZRE'.
        group-kzwi1sum = 0 - group-kzwi1sum.
      ENDIF.
      table-kzwi1sum = table-kzwi1sum + group-kzwi1sum.
    ENDLOOP.
    table-vkbur = wa_table-vkbur.
    table-vkgrp = wa_table-vkgrp.
    APPEND  table.
  ENDLOOP.
OpenSQL
查询语句

新增数据
从内表中批量插入数据
从工作区中插入单条数据

data fli_table type table of spfli with HEADER LINE.
select SINGLE * from  spfli INTO CORRESPONDING FIELDS OF fli_table  where connid = 4305 and carrid = 'AA'.
fli_table-connid = 4305.
INSERT  spfli from fli_table.
CHECK sy-subrc = 0.
write:/ '插入成功'.
删除数据
根据条件删除
删除整表数据
根据内表中的数据删除数据

更新数据(update)
根据条件更新
根据内表的数据更新
根据工作区的内容更新

MODIFY

FOR ALL ENTRIES IN
以内表中某字段的值为条件,在数据库表中取数

SQL优化

sql 查询函数
coalesce( name1,name2,name3,name3 )取参数中第一个不为空的值
选择屏幕
parameters


PARAMETERS filed1(5) type c DEFAULT 'aaaaa' OBLIGATORY.
SELECT-OPTIONS



根据上面的图片说明,我们可以通过select-options 替换掉parameter
select-options s_vbeln for vbak-vbeln no-extension no intervals
替换的原因:
如果我们直接使用parameters的话,某些字段并不要求必须输入,但是如果留空的话,由于parameters声明的元素在sql中是使用 = 筛选,那么空值就不会取到数据,此时就可以使用select-options 替换掉
复选框-单选
通过RADIOBUTTON GROUP控制
"默认char类型 长度为1 选中值为‘X’
PARAMETERS s_male RADIOBUTTON GROUP gp1.
PARAMETERS s_female RADIOBUTTON GROUP gp1.

复选框-多选
  PARAMETERS p_info AS CHECKBOX.
  PARAMETERS p_t_info AS CHECKBOX.

选择屏幕文本
上面可以看到,选择屏幕上的文本显示的是我们的变量名,这种方式并不友好,那么我们可以为其分配文本


选择屏幕分块
假设我们选择屏幕上的元素过多,那么使用起来相对不是很方便,这时我们可以对屏幕进行分块
使用selection-screen分块
- wirh frame 加上边框
 - title 块文本信息
 
REPORT ymmr0001 .
TABLES: vbak.
DATA: BEGIN OF student,
        name(10) TYPE c,
        age      TYPE i,
      END OF student.
DATA: BEGIN OF teacher,
  name(10) TYPE C,
  age      TYPE I,
END OF teacher.
"学生信息
SELECTION-SCREEN BEGIN OF BLOCK stu WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS s_name FOR student-name .
  PARAMETERS s_male RADIOBUTTON GROUP gp1.
  PARAMETERS s_female RADIOBUTTON GROUP gp1.
SELECTION-SCREEN END OF BLOCK stu.
"教师信息
SELECTION-SCREEN BEGIN OF BLOCK vb WITH FRAME TITLE TEXT-002.
  SELECT-OPTIONS s_t_name FOR teacher-name .
  SELECT-OPTIONS s_t_age FOR teacher-age .
SELECTION-SCREEN END OF BLOCK vb.
代码中用到的TEXT-001也是通过文本元素定义,其中TEXT是固定的,序号可以自己指定

效果图

选择屏幕分行
可以看到上面屏幕中性别元素比较简单,那么我们可以将其放到一行
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS s_male RADIOBUTTON GROUP gp1.
    PARAMETERS s_female RADIOBUTTON GROUP gp1.
  SELECTION-SCREEN END OF LINE.
这样的方式可以实现将性别两个元素放到一行,但是显示的却是这种效果

我们之前的文本信息没有显示,这时我们可以这么做
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS s_male RADIOBUTTON GROUP gp1.
    "for FIELD s_male 是表示这段文本是s_male的lable 信息 可加可不加  加了之后鼠标点击之后会发现这是一个统一元素
    SELECTION-SCREEN  COMMENT (5) TEXT-003 for FIELD s_male.  
    PARAMETERS s_female RADIOBUTTON GROUP gp1.
     SELECTION-SCREEN  COMMENT (5) TEXT-004 for FIELD s_female.
  SELECTION-SCREEN END OF LINE.
在后面使用selection-screen comment 为其指定文本,括号中的内容为文本的长度 建议这个长度大于实际文本的长度,否则元素之间紧挨在一起,不美观
效果

动态调整选择界面的元素
可能我们会有需求是根据复选框或者单选与否动态调整页面的元素
那么从上面的程序我们将选择屏幕做成了老师和学生两个部分,我们可以额外增加一个单选框,用来表明我们是需要查询学生的信息还是老师的信息,查询学生信息时老师相关的选择屏幕元素隐藏掉相反就隐藏学生相关的元素,那这时候我们分别为老师和学生相关的元素分配一个modif id ,用来控制元素的输出和隐藏
DATA: BEGIN OF student,
        name(10) TYPE c,
        age      TYPE i,
      END OF student.
DATA: BEGIN OF teacher,
        name(10) TYPE c,
        age      TYPE i,
      END OF teacher.
"学生选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK stu WITH FRAME TITLE TEXT-001.
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (6) TEXT-005 FOR FIELD s_name MODIF ID stu.
    SELECT-OPTIONS s_name FOR student-name  MODIF ID stu.
    SELECTION-SCREEN POSITION 60 .
    SELECTION-SCREEN COMMENT (10) text MODIF ID stu.
  SELECTION-SCREEN END OF LINE.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS s_male RADIOBUTTON GROUP gp1  MODIF ID stu .
    SELECTION-SCREEN  COMMENT (5) TEXT-003 FOR FIELD s_male  MODIF ID stu .
    PARAMETERS s_female RADIOBUTTON GROUP gp1  MODIF ID stu .
    SELECTION-SCREEN  COMMENT (5) TEXT-004 FOR FIELD s_female  MODIF ID stu .
  SELECTION-SCREEN END OF LINE.
  PARAMETERS p_info AS CHECKBOX MODIF ID stu.
SELECTION-SCREEN END OF BLOCK stu.
"老师选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK vb WITH FRAME TITLE TEXT-002  .
  SELECT-OPTIONS s_t_name FOR teacher-name MODIF ID tea .
  SELECT-OPTIONS s_t_age FOR teacher-age MODIF ID tea .
  PARAMETERS p_t_info AS CHECKBOX MODIF ID tea.
SELECTION-SCREEN END OF BLOCK vb.
SELECTION-SCREEN BEGIN OF BLOCK fuc WITH FRAME TITLE TEXT-006.
"user-command 没有实际意义,添加它的目的是我们每次切换时需要按回车健才可以触发AT SELECTION-SCREEN OUTPUT 事件,加上它之后只要单选框改动 就会自动触发AT SELECTION-SCREEN OUTPUT事件 不需要按回车 
  PARAMETERS p_stu RADIOBUTTON GROUP gp2 DEFAULT 'X' USER-COMMAND fuc.
  PARAMETERS p_tea RADIOBUTTON GROUP gp2 .
SELECTION-SCREEN END OF BLOCK fuc.
可以看到我们为老师和学生的每个选择元素都指定了 modif id 老师的为tea 学生的为stu ,程序会自动将这个值赋给屏幕元素的group1字段
AT SELECTION-SCREEN OUTPUT的代码就是这样,从这里可以看到,其实选择屏幕上的元素共同祖成了一个内表 我们只需要遍历他 并修改它的值即可
  LOOP AT SCREEN.
    IF p_stu = 'X'.
    "必须要大写
      IF screen-group1 = 'TEA'.
        screen-active = 0.
        screen-invisible = 0.
      ENDIF.
    ENDIF.
    IF p_stu = ''.
      IF screen-group1 = 'STU'.
        screen-active = 0.
        screen-invisible = 0.
      ENDIF.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
screen 的结构如下,各个字段的作用SAP并没有注释,可以自己上网查资料

function ALV
ALV开发基本流程

示例代码
*&---------------------------------------------------------------------*
*& Report YMMR0005
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ymmr0005.
TABLES:vbak,vbap.
*声明alv相关变量
TYPE-POOLS slis.
DATA: zlt_fildcat TYPE slis_t_fieldcat_alv WITH HEADER LINE, "定义内表和同名工作区
      zls_layout  TYPE slis_layout_alv. "alv格式控制结构体:layout
*定义内表
TYPES:BEGIN OF ty_alvshow,
        vbeln TYPE vbak-vbeln,
        erdat TYPE vbak-erdat,
        ernam TYPE vbak-ernam,
        kunnr TYPE vbak-kunnr,
        posnr TYPE vbap-posnr,
        matnr TYPE vbap-matnr,
        matkl TYPE vbap-matkl,
        zmeng TYPE vbap-zmeng,
        werks TYPE vbap-werks,
        lgort TYPE vbap-lgort,
      END OF ty_alvshow.
DATA: gt_table TYPE STANDARD TABLE OF ty_alvshow,
      wa_table TYPE ty_alvshow.
SELECT k~vbeln
      k~erdat
      k~ernam
      kunnr
      posnr
      matnr
      matkl
      zmeng
      werks
      lgort
      FROM vbak AS k  INNER JOIN vbap AS p ON k~vbeln = p~vbeln
      INTO CORRESPONDING FIELDS OF TABLE gt_table.
DEFINE append_fieldcat_filed.
  CLEAR zlt_fildcat.
   zlt_fildcat-fieldname    = &1.
      zlt_fildcat-tabname      = 'GT_ALV'.
      zlt_fildcat-reptext_ddic = &2.
      zlt_fildcat-seltext_l    = &2.
      zlt_fildcat-seltext_m    = &2.
      zlt_fildcat-seltext_s    = &2.
      zlt_fildcat-cfieldname   = &3.
      zlt_fildcat-ctabname     = &4.
      zlt_fildcat-no_out       = &5.
      zlt_fildcat-no_zero      = &6.
      zlt_fildcat-outputlen    = &7.
      zlt_fildcat-qfieldname   = &8.
      zlt_fildcat-just         = &9.
      zlt_fildcat-ddictxt      = 'L'.
      append zlt_fildcat.
end-of-DEFINITION.
REFRESH zlt_fildcat.
append_fieldcat_filed 'vbeln' '销售凭证' '' '' '' '' '' '' ''.
append_fieldcat_filed 'erdat' '销售日期' '' '' '' '' '' '' ''.
append_fieldcat_filed 'ernam' '销售人' '' '' '' '' '' '' ''.
append_fieldcat_filed 'kunnr' '售达方' '' '' '' '' '' '' ''.
append_fieldcat_filed 'posnr' '项目编码' '' '' '' '' '' '' ''.
append_fieldcat_filed 'matnr' '物料' '' '' '' '' '' '' ''.
append_fieldcat_filed 'matkl' '物料组' '' '' '' '' '' '' ''.
append_fieldcat_filed 'zmeng' '销售数量' '' '' '' '' '' '' ''.
append_fieldcat_filed 'werks' '单位' '' '' '' '' '' '' ''.
append_fieldcat_filed 'lgort' 'plant' '' '' '' '' '' '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    is_layout     = zls_layout
    it_fieldcat   = zlt_fildcat[]
  TABLES
    t_outtab      = gt_table[]
  EXCEPTIONS
    program_error = 1
    OTHERS        = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
复制GUI状态
事物代码 se41

事件
slis_ev_item_data_expand   type slis_formname value 'ITEM_DATA_EXPAND',
slis_ev_reprep_sel_modify  type slis_formname value 'REPREP_SEL_MODIFY',
slis_ev_caller_exit_at_start type slis_formname value 'CALLER_EXIT',
slis_ev_user_command       type slis_formname value 'USER_COMMAND',
slis_ev_top_of_page        type slis_formname value 'TOP_OF_PAGE',
slis_ev_data_changed       type slis_formname value 'DATA_CHANGED',
slis_ev_top_of_coverpage   type slis_formname value 'TOP_OF_COVERPAGE',
slis_ev_end_of_coverpage   type slis_formname value 'END_OF_COVERPAGE',
slis_ev_foreign_top_of_page type slis_formname
                                       value 'FOREIGN_TOP_OF_PAGE',
slis_ev_foreign_end_of_page type slis_formname
                                       value 'FOREIGN_END_OF_PAGE',
slis_ev_pf_status_set      type slis_formname value 'PF_STATUS_SET',
slis_ev_list_modify        type slis_formname value 'LIST_MODIFY',
slis_ev_top_of_list        type slis_formname value 'TOP_OF_LIST',
slis_ev_end_of_page        type slis_formname value 'END_OF_PAGE',
slis_ev_end_of_list        type slis_formname value 'END_OF_LIST',
slis_ev_after_line_output  type slis_formname value 'AFTER_LINE_OUTPUT',
slis_ev_before_line_output type slis_formname value
                                                   'BEFORE_LINE_OUTPUT',
slis_ev_subtotal_text      type slis_formname value 'SUBTOTAL_TEXT',
slis_ev_grouplevel_change  type slis_formname value 'GROUPLEVEL_CHANGE',
slis_ev_context_menu       type slis_formname value 'CONTEXT_MENU
复制GUI状态
se38查询程序SAPLKKBL。其附带的STANDARD_FULLSCREEN即标准GUI状态栏。
模块化编程
子例程三种参数传递
form form_name using f1."引用传递  
endform.
*等同于
form form_name changing f1."引用传递  
endform.
form form_name using value(f1)."值传递
endform.
form form_name changing value(f1)."值传递带返回值
endform.


                
            
        
浙公网安备 33010602011771号