ABAP培训
2009-3
北京
ABAP概述
SAP最初开发ABAP/4语言仅为内部使用,为应用程序员提供优化的工作环境。经过不断的改进和修改以满足商业领域的需要。现在, ABAP/4 已成为SAP开发所有自己的应用程 序的基本工具。
ABAP/4 是第四代支持结构化程序设计的语言。它合并了所有通常的控制结构和模块化概念。同时,它还支持面向对象的程序设计方法,这就为ABAP的应用开发开拓了更广阔的空间。而且,它还可以实现和其他编程语言的合成,如VB,JAVA,C/C++等。
SAP 三层架构
Data Base Changes
Batch Processing
Central DB
User Interaction
Application Logic
(Stores all Data and Application Programs)
Reading Data
Base and
Updating
Buffer
Central
DB buffer
Central
DB buffer
Output Data to
User
Output Data to
User
Input Data
From User
传统SAP 三层架构
数据库层位于系统最底层,主要业务数据(包括用户主记录和事务数据等)通过关系数据库管理系统进行操作。同时,R/3系统中的程序和其他开发过程中的源数据(如系统数据类型等R/3仓库对象)也在此层进行存储和管理。
SAP应用程序在应用层中运行,这些应用程序(即ABAP程序,由SAP系统本身提供或开发人员进行开发)可以从数据库层提取数据进行处理或者将新数据进行存储。
表现层又被称为SAP GUI,包含系统和用户之间的接口,系统最终用户通过该层中显示给用户的屏幕来访问系统应用、输入新数据的屏幕,并接收程序的处理结果。
从三层架构可以清楚的看出ABAP开发是包含:数据字典管理、显示屏幕制作、数据访问、业务逻辑程序运算这几大部分的功能。
ABAP概述
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概述-作用
SAP各种报表的开发
Form打印的开发
批量处理业务数据
SAP增强开发
系统间接口的实现
……
目 录
入门基础介绍
Report的实现(包括ALV)
数据字典的设计与应用
SQL语句的应用
QUERY的使用
SMARTFORM表单打印
文件的上传下载(包括OLE)
模块化编程、代码规范
Batch Input批处理业务数据
接口技术与开发(XI、RFC、BAPI、IDOCs等)
DIALOG的设计开发
增强介绍与开发
代码效率分析和提高
培训内容和时间安排
培训内容
人天数
入门基础介绍
Report的实现过程(包括ALV应用)
数据字典的应用与设计
SQL语句的应用
QUERY的使用
SMARTFORM表单打印
1
文件的上传下载(包括OLE应用)
1
模块化编程、规范代码
Batch Input批处理业务数据
1
接口技术与开发(包括XI、RFC、BAPI、IDOCs等)
1
DIALOG的设计开发
1
增强的介绍与开发(包括User Exit,Enhancement、BADI等)
1
代码效率分析和提高
1
总结归纳、综合练习、答疑
1
合计天数
11
入门基础介绍-相关常用T-CODE
SE38 ABAP编辑器
SE11 数据字典
SE37 函数制作器
SE24 类别制作器
SE80 对象导航
SE84 信息系统
SE91 消息类
SE93 创建T-CODE
SE09 传输请求处理
入门基础介绍-开发工作台
入门基础介绍-开发类
开发类是系统管理人员用于对系统配置、创建程序、分配权限、建立系统对象等分类归集而使用的,目的是区分本次系统调整的编号或系统调整人员。
通过SE80可以创建开发类,创建程序时,如果是存成local object则不需指定开发类(本地开发类是$TMP);否则需要指定开发类和传输请求
方法1:SE80-软件包-写个新的-回车创建
方法2:SE80-EDIT OBJECT-下图
入门基础介绍-传输请求
传输请求:是被用来实现SAP各Client间的数据传输和不同版本迁移而使用的,通过SAP内部的传输控制程序和传输程序实现请求内容的传输。
使用SE09创建一个传输请求
入门基础介绍-传输请求
入门基础介绍-课堂练习
每个人创建一个开发类 (以Z开头,加自己的用户名)和 创建一个传输请求,以后的每个人自己开发的程序包在自己的开发类和传输请求中。
入门基础介绍-课堂练习实现过程
T-CODE se80
入门基础介绍-课堂练习实现过程
点击新建,出现下面的选项
入门基础介绍-课堂练习实现过程
点击新建后,出现要求开发类所包含的传输请求(可以新建传输请求,也可以把其包括在‘自己的请求’中)
入门基础介绍-课堂练习实现过程
点击新建后,创建自己的传输请求号
入门基础介绍-课堂练习实现过程
点击保存后,就随机产生了一个传输请求号,点击确认完成开发类的创建,同时把开发类也包括在刚创建的传输请求了。
page *
*
入门基础介绍-系统专用变数
具体查看系统数据库表:SYST
常用的系统变数有:
SY-SUBRC : 系统执行某指令后,表示執行成功与否的变数,’0’ 表示成功
SY-UNAME: 当前使用者登入SAP的USERNAME;
SY-DATUM: 当前系统日期;
SY-UZEIT: 当前系统时间;
SY-TCODE: 当前执行程式的Transaction code
SY-INDEX : 当前LOOP循环的次数
SY-TABIX: 当前处理的是internal table 的第几笔
SY-TMAXL: Internal table的总笔数
SY-SROWS: 屏幕总行数;
SY-SCOLS: 屏幕总例数;
SY-MANDT: CLIENT NUMBER
SY-VLINE: 竖线
SY-ULINE: 横线
入门基础介绍-创建一个简单的程序
进入SE38创建一个简单的REPORT的程序、并保存到传输请求中。
page *
*
入门基础介绍-程序语法及格式
语法元素
语句
关键字
注释
语法结构
语句结构
注释结构
连接相似语句
ABAP/4程序格式
page *
*
入门基础介绍-语法元素-语句
ABAP/4 程序包括单个ABAP/4语句。每条语句以关键字开头,以句号结束。
EX:
REPORT ZTEST01.
WRITE 'First Program'.
关键字是 REPORT 和 WRITE。
程序在屏幕上显示输出(称为列表)
page *
*
入门基础介绍-语法元素-关键字
关键字是语句的第一个词(四种关键字):
说明性关键字 (TYPES, DATA, TABLES )
事件关键字 (AT SELECTION SCREEN, START-OF-SELECTION, AT USER-COMMAND )
控制关键字 (IF, WHILE, CASE )
操作关键字 (WRITE, MOVE, ADD )
page *
*
入门基础介绍-语法元素-注释
注释是写在 ABAP/4 程序语句之间用来向读者解释其目的的文本摘要。
************************************************
* PROGRAM SAPMTZST *
* CREATED BY CARL BYTE, 06/27/1995 *
* LAST CHANGE BY RITA DIGIT, 10/01/1995 *
* PURPOSE: DEMONSTRATION *
************************************************
PROGRAM SAPMTEST. “This is comment
************************************************
* DECLARATION PART *
************************************************
page *
*
入门基础介绍-语法结构-语句结构
程序段
REPORT ZTEST01. WRITE 'This is a statement'.
也可以如下编写:
REPORT ZTEST01. WRITE 'This is a statement'.
或者如下:
REPORT ZTEST01. WRITE 'This is a statement'.
page *
*
入门基础介绍-连接相似语句
语句顺序:
Tables: spfli.
Select * from spfli.
WRITE SPFLI-CITYFROM. WRITE SPFLI-CITYTO. WRITE SPFLI-AIRPTO.
WRITE: SPFLI-CITYFROM, SPFLI-CITYTO, SPFLI-AIRPTO.
WRITE: SPFLI-CITYFROM, SPFLI-CITYTO, SPFLI-AIRPTO.
Endselect.
page *
*
入门基础介绍-数据输出到屏幕
Write 语句
在屏幕上定位Write输出
格式化选项
在屏幕上输出符号和图标
输出屏幕上的线和空行
将字段内容作为复选框输出
通过语句结构使用Write
使用F1功能查看Write语法
page *
*
入门基础介绍-屏幕上定位WRITE输出
WRITE [AT] [/][<pos>][(<len>)] <f>.
斜线‘/’ 表示新的一行
<pos> 是最长为三位数字的数字或变量,表示在屏幕上的位置
<len> 是最长为三位数字的数字或变量,表示输出长度
EX:
Write: /10(4) 'This is a Test'.
page *
*
入门基础介绍-格式化选项
选项
用途
LEFT-JUSTIFIED
输出左对齐
CENTERED
输出居中
RIFGHT-JUSTIFIED
输出右对齐
UNDER <g>
输出直接开始于字段<g>下
NO-GAP
忽略字段<f>后的空格
USING EDIT MASK <m>
指定格式模板<m>
NO-ZERO
如果字段仅包含零,则用空格代替它们。对类型C和N字段,将自动代替前导零。
选项
用途
NO-SIGN
不显示正负号
DECIMALS <d>
<d> 定义小数点后的数字位数
ROUND <r>
四舍五入至小数点后<r>位
CURRENCY <c>
按表格TCURX中的货币显示
WRITE .... <f> <选项>.
数据类 型的格式化选项
数字字段的格式化选项
page *
*
入门基础介绍-屏幕上输出符号和图标
语法
WRITE <symbol-name> AS SYMBOL.
WRITE <icon-name> AS ICON.
EX:
INCLUDE <SYMBOL>.
INCLUDE <ICON>.
WRITE: / 'Phone Symbol:', SYM_PHONE AS SYMBOL.
SKIP.
WRITE: / 'Alarm Icon: ', ICON_ALARM AS ICON.
INCLUDE <SYMBOL> 和INCLUDE <ICON>可用单个INCLUDE <LIST>来代替
page *
*
入门基础介绍-输出屏幕上的线和空行
以在输出屏幕上生成水平线:
语法
ULINE [AT [/][<pos>][(<len>)]].
它等同于
WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.
以在输出屏幕上生成垂直线:
语法
WRITE [AT [/][<pos>]] SY-VLINE.
或
WRITE [AT [/][<pos>]] '|'
空行
SKIP [<n>].该语句从当前行开始,在输出屏幕上生成<n>个空行。如果没有指定<n>的值,就输出一个空行 。
SKIP TO LINE <n>. 该语句允许将输出位置向上或向下移动
入门基础介绍-定义数据类型的输出格式
举例:DATA: P_TEMP TYPE P DECIMALS 2 VALUE ‘’.
数据类型
中文
定位
格式
C
字符(需要定义长度)
左对齐
‘M’
D
日期
左对齐
YYYYMMDD
F
浮点数
右对齐
I
整数
右对齐
100
N
数值组成的字符串
(需要定义长度)
左对齐
011, ‘203’
P
用于小数点数值
(需要定义长度,小数点位置)
右对齐
T
时间
左对齐
HH:MM:SS
X
16进制
(需要定义长度)
左对齐
1A03
P用于商业计算
F用于数学计算
page *
*
入门基础介绍-字段内容作为复选框输出
WRITE <f> AS CHECKBOX.
DATA: FLAG1 VALUE ' ', FLAG2 VALUE 'X', FLAG3(5) VALUE 'Xenon'.
WRITE: / 'Flag 1 ', FLAG1 AS CHECKBOX, / 'Flag 2 ', FLAG2 AS CHECKBOX, / 'Flag 3 ', FLAG3 AS CHECKBOX.
page *
*
入门基础介绍-通过语句结构使用WRITE
R/3 系统包含试验WRITE语句的所有选项和输出格式及将它们插入到程序中的有用工具。在ABAP/4-编辑器中选择“编辑->模式”
(EX:Write, Function Modules…)
page *
*
入门基础介绍-处理文本摘要
文本摘要— 概念
文本摘要包括在选择屏幕或ABAP/4程序的输出屏幕上出现的任何说明性文本
创建和更改文本摘要
标题和表头
选择文本
文本符号
WRITE ... TEXT-<idt> ...
入门基础介绍-Write的课堂练习
用write实现类似如下格式的内容
入门基础介绍-Write的课堂练习
练习结果的代码如下:
REPORT Z_YW_ABAPTEST .
WRITE:/0(10) 'REPORT:' ,10(20) sy-repid.
WRITE:/0(10) 'RUN DATE:' , 10(10) sy-datum , 30(10) 'RUN TIME:' , 40(10) sy-uzeit.
WRITE:/0(10) 'USER ID:' ,10(20) sy-uname.
ULINE /(300).
FORMAT COLOR 4.
WRITE:/0(14) 'Company Code:',14(10) 'zejia'.
WRITE:/0(14) 'Fisical Year:',14(4) '2009'.
ULINE /(300).
FORMAT COLOR 5.
WRITE:/0(10) 'field1',20(10) 'field2',40(10) 'field3',60(10) 'field4',80(10) 'field5'.
FORMAT COLOR OFF.
page *
*
入门基础介绍-将事务代码分配给程序
在“ABAP/4开发工作台”屏幕上选择“开发->其它工具->事务”
填入事务名称并选择“维护事务”屏幕上的“创建 ”
在下列对话屏幕上选择“报表事务”
在下列“创建报表事务”屏幕上填入所需条目“事务文本”和 “程序”
将事务代码保存在开发类和传输请求中
page *
*
入门基础介绍-处理数据
赋值
将值重置为默认值
数值运算
处理字符串
指定数据对象的偏移量
类型转换
page *
*
入门基础介绍-赋值(一)
MOVE语句,对应于赋值运算符(=)
MOVE <F1> TO <F2>. / <F2> = <F1>.
EX
DATA: F1(8) VALUE 'ABCDEFGH', F2(8).
DATA: O TYPE I VALUE 2, L TYPE I VALUE 4.
MOVE F1 TO F2. WRITE F2.
MOVE F1+O(L) TO F2. WRITE / F2.
MOVE F1 TO F2+O(L). WRITE / F2.
CLEAR F2.
MOVE F1 TO F2+O(L). WRITE / F2.
MOVE F1+O(L) TO F2+O(L). WRITE / F2.
该过程输出如下:
ABCDEFGH
CDEF
CDABCD
ABCD
CDEF
MOVE-CORRESPONDING <string1> TO <string2>.
page *
*
入门基础介绍-赋值(二)
WRITE TO 语句
DATA: NAME(10) VALUE 'SOURCE', SOURCE(10) VALUE 'Antony', TARGET(10).
... WRITE (NAME) TO TARGET. WRITE: TARGET.
则输出
Antony
page *
*
入门基础介绍-将值重置为默认值
可以用CLEAR语句重置任何数据对象值
EX:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
输出为:
10
0
page *
*
入门基础介绍-数值运算
运算
用数字表达式的格式
用关键字的语句
加法
<p> = <n> + <m>.
ADD <n> TO <m>.
减法
<p> = <m> - <n>.
SUBTRACT <n> FROM <m>.
乘法
<p> = <m> * <n>.
MULTIPLY <m> BY <n>.
除法
<p> = <m> / <n>.
DIVIDE <m> BY <n>.
整除
<p> = <m> DIV <n>.
-----
除法余数
<p> = <m> MOD <n>.
-----
求冥
<p> = <m> ** <n>.
-----
page *
*
入门基础介绍-处理字符串
按给定位置数移动字段串
要按给定位置数移动字段内容,使用SHIFT语句,用法如下:
语法
SHIFT <c> [BY <n> PLACES] [<mode>].
LEFT: 向左移动 <n> 位置,右边用 <n> 个空格填充(默认设置 )。
RIGHT: 向右移动 <n> 位置,左边用 <n> 个空格填充 。
CIRCULAR: 向左移动 <n> 位置,以便 左边 <n> 个字符出现在右边。
转换大/小写并替换字符
TRANSLATE <c> TO UPPER CASE.
TRANSLATE <c> TO LOWER CASE.
page *
*
入门基础介绍-搜索字符串(-)
<pattern> 搜索<pattern>(任何字符顺序)。忽略尾部空格。
.<pattern>.搜索<pattern>,但是不忽略尾部空格 。
*<pattern> 搜索以<pattern>结尾的词。
<pattern>* 搜索以<pattern>开始的词。
page *
*
入门基础介绍-搜索字符串(二)
EX:
DATA STRING(30) VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'. ULINE /1(26).
SEARCH STRING FOR 'X'. WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC', SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR 'itt'. WRITE: / 'itt', SY-SUBRC UNDER 'SY-SUBRC', SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR '.e .'. WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC', SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR '*e'. WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC', SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR 's*'. WRITE:/ 's*', SY-SUBRC UNDER 'SY-SUBRC', SY-FDPOS UNDER 'SY-FDPOS'.
page *
*
入门基础介绍-压缩字段
压缩字段内容
要删除字符字段中多余空格,使用CONDENSE语句,用法如下:
语法
CONDENSE <c> [NO-GAPS].
EX:
DATA: STRING(25) VALUE 'one two three four', LEN TYPE I.
CONDENSE STRING NO-GAPS.
page *
*
入门基础介绍-控制 ABAP/4 程序流
检查初始值
DATA FLAG VALUE 'X'.
IF FLAG IS INITIAL. WRITE / 'Flag is initial'.
ELSE. WRITE / 'Flag is not initial'.
ENDIF.
CLEAR FLAG.
IF FLAG IS INITIAL. WRITE / 'Flag is initial'. ELSE. WRITE / 'Flag is not initial'. ENDIF.
产生如下输出:
Flag is not initial
Flag is initial.
这里,DATA语句之后,字符串FLAG不包含初始值,因为用VALUE参数设
置为‘X’。执行CLEAR语句之后,将其重置为初始值。
page *
*
入门基础介绍-控制流(-)
使用 IF 的条件分支
语法
IF <condition1>. <statement block> ELSEIF <condition2>. <statement block> ..... ELSE. <statement block> ENDIF.
使用 CASE 的条件分支
CASE <f>. WHEN <F1>. <statement block> WHEN <F2>. <statement block> ...... WHEN OTHERS. <statement block> ENDCASE.
page *
*
入门基础介绍-控制流(二)
使用 DO 的无条件循环
DO.
WRITE SY-INDEX.
IF SY-INDEX = 3. EXIT. ENDIF.
ENDDO.
产生如下输 出:
1 2 3
使用 WHILE 的条件循环
如果只要条件为真,就不止一次执行语句,可以如下使用WHILE语句编程:
语法
WHILE <condition> [VARY <f> FROM <F1> NEXT <F2>]. <statement block>
ENDWHILE.
page *
*
入门基础介绍-定义内表的语法
1. DATA: BEGIN OF ITAB OCCURS 0,
CARR1 LIKE SPFLI-CARRID,
CONN1 LIKE SPFLI-CONNID,
END OF ITAB.
2. DATA: ITAB1 TYPE ITAB.
3. DATA: ITAB1 LIKE ITAB OCCURS 0
<WITH HEADER LINE>.
4. DATA: BEGIN OF STRUCTURE ITAB1 OCCURS 0.
INCLUDE STRUCTURE ITAB.
DATA: END OF STRUCTURE ITAB1.
5. TYPES:BEGIN OF S_TAB,
FIELD1(10),
FIELD2(10),
END OF S_TAB.
DATA:IT_TAB TYPE TABLE OF S_TAB WITH HEADER LINE.
page *
*
入门基础介绍-创建和处理内表(-)
ABAP/4的Internal Table如同其它语言的阵列結构, 在操作上可以有复制刪除,新增插入等功能.
使用 TYPE 叙述
TYPES <t> <type> OCCURS <n>
宣告一个阵列<t>, 形态为:<type>, 长度为<n>
Example:
TYPES A TYPE I OCCURS 10.
A是个10个元素的数值Internal Table
Example:
TYPES: BEGIN OF LINE,
COL1 TYPE I,
COL3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
宣告一个Internal Table ITAB, 总共有10个元素,其WORK AREA名称为LINE
page *
*
入门基础介绍-创建和处理内表(二)
使用 DATA 叙述
若使用DATA叙述来宣告Internal Table, 可分成要不要有HEADE LINE, HEADER LINE就是所谓的WORK AREA, 用在资料的存取上.
语法:
DATA <f> <type> OCCURS <n> [WITH HEADER LINE]
Example:
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
page *
*
入门基础介绍-创建和处理内表(三)
直接宣告,不使用WORK AREA
语法:
DATA: BEGIN OF <f> OCCURS <n>,
<component 宣告>
END OF <f>.
Example:
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
如此产生的Internal Table不会有Work Area, 即宣告时不会Reference
其它 Component宣告
page *
*
入门基础介绍-创建和处理内表(四)
Append Line
语法:
APPEND [<wa>] TO <itab>
Example: 使用 Work Area
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 2 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB. “新增至 Internal Table中
ENDDO.
LOOP AT ITAB INTO LINE. “ITAB 总共有兩个元素
WRITE: / LINE-COL1,LINE-COL2.
ENDLOOP.
执行結果为:
1 1
2 4
page *
*
入门基础介绍-创建和处理内表(五)
加入另一Internal Table的元素
语法:
APPEND LINES OF <itab1> [FROM <n1>] [TO <n2>] TO <itab2>
将<itab1>的元素加入至<itab2>中, 可选取自<n1>至<n2>的范围
Example:
APPEND LINES OF ITAB TO JTAB.
將ITAB所有元素加入JTAB中
page *
*
入门基础介绍-创建和处理内表(六)
Collect Line
在加入新元素时將有相同standard key(非数值栏位)的数值栏位汇总
语法: COLLECT [<wa> INTO] <itab>
Example:
DATA: BEGIN OF ITAB OCCURS 3,
COL1(3) TYPE C,
COL2 TYPE I,
END OF ITAB.
ITAB-COL1 = ‘ABC’. ITAB–COL2 = 10.
COLLECT ITAB.
ITAB-COL1 = ‘XYZ’. ITAB-COL2 = 20.
COLLECT ITAB.
ITAB-COL1 = ‘ABC’. ITAB-COL2 = 30.
COLLECT ITAB. “汇总COL2 至 COL1=ABC 的元素上
LOOP AT ITAB.
WRITE: / ITAB-COL1,ITAB-COL2.
ENDLOOP.
执行結果:
ABC 40
XYZ 20
page *
*
入门基础介绍-创建和处理内表(七)
Insert Line
插入元素在指定的Internal Table位置之前
语法:INSERT [<wa> INTO] [INITIAL LINE INTO] <itab> [INDEX <idx>] Example:
DATA: BEGIN OF LINE,
COL1 TYPE I, COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 3 TIMES.
LINE-COL1 = SY-INDEX * 10. LINE-COL2 = SY-INDEX * 20.
APPEND LINE TO ITAB.
ENDDO.
LINE-COL1=100. LINE-COL2=200.
INSERT LINE INTO ITAB INDEX 2. “插入在位置2之前
LOOP AT ITAB INTO LINE.
WRITE: / SY-TABIX,LINE-COL1,LINE-COL2. “SY-TABIX为Table位置
ENDLOOP.
执行結果:
1 10 20
2 100 200 “插入的元素
3 20 40
4 30 60
page *
*
入门基础介绍-创建和处理内表(八)
Internal Table元素资料的读取:
语法:
LOOP AT <itab> [INTO <wa>] [FROM <n1> TO <n2>] [WHERE <condition>]
<loop expression>
ENDLOOP.
根据设定的范围选取元素资料, 读完后自动移往下一笔
Example:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
仅读取 COL1 > 100 的元素
指定位置的读取:
READ TABLE <itab> [INTO <wa>] INDEX <idx>
page *
*
入门基础介绍-创建和处理内表(九)
Delete Lines
刪除Internal Table 的元素
语法: DELETE <itab> INDEX <idx>
Example:
DELETE ITAB INDEX 4。 “刪除第四个元素
加上刪除条件:
DELETE <itab> [FROM <n1> TO <n2>] [WHERE <condition>
Example:
DELETE ITAB FROM 3 TO 10. “ 刪除第3至第10个元素
page *
*
入门基础介绍-创建和处理内表(十)
Initial Table
1. REFRESH <itab>
使用在没有HEADER LINE的Internal Table中, 清除所有元素
Example: REFRESH ITAB.
2. CLEAR <itab>[ ]
使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
Example: CLEAR ITAB[ ].
3. FREE <itab>
释放(Release) Internal Table所占的记忆体空间, 用在REFRESH和CLEAR指令之后
Example: FREE ITAB.
入门基础介绍-访问单条记录
单条数据的出来
入门基础介绍-处理多条记录
多条数据的处理
入门基础介绍-采用LOOP读取内表内容
用LOOP循环来读取内表数据
入门基础介绍-使用INDEX来读内表
处理内表特定行的数据
page *
*
入门基础介绍-通过键读内表
page *
*
入门基础介绍-处理数据表格
SY-SUBRC: 传回 0 表成功执行指令, 4表未找到符合条件资料
SY-DBCNT: 正处理的资料笔数
语法:
SELECT <result> FROM <source> [INTO <target>] [WHERE <condition>]
[ GROUP BY <fields>] [ORDER BY <sort order>]
◆将读取的记录放在work area中,并且加入Internal table 中.
格式有:
... INTO <work area>
... INTO CORRESPONDING FIELDS OF <work area>
... INTO (f1, ..., fn) 变量组.
... INTO TABLE <internal table>
... INTO CORRESPONDING FIELDS OF TABLE <internal table>
... APPENDING TABLE <internal table>
... APPENDING CORRESPONDING FIELDS OF TABLE <internal table>
入门基础介绍-调试程序
断点的设置
入门基础介绍-调试程序
运行程序,进入断点
入门基础介绍-调试程序
设置静态断点
入门基础介绍-调试程序
入门基础介绍-巩固与提高
2个内表常见的处理方式,注意当用到binary search时一定要对所关联的字段排序.
sort it_tab1 by field1 field2.
sort it_tab2 by field1 field2.
loop at it_tab1.
read table it_tab2 with key field1 eq it_tab1-field1
field2 eq it_tab1-field2
binary search.
if sy-subrc = 0.
......
endif.
endloop.
入门基础介绍-巩固与提高
at new / at end of的应用
定义:
types:begin of s_tab,
field1(10),
field2(10),
end of s_tab.
data:it_tab type table of s_tab with header line,
wa_tab type s_tab.
wa_tab-field1 = '111'.
wa_tab-field2 = '1'.
append wa_tab to it_tab.
clear wa_tab.
wa_tab-field1 = '111'.
wa_tab-field2 = '2'.
append wa_tab to it_tab.
clear wa_tab.
wa_tab-field1 = '222'.
wa_tab-field2 = '1'.
append wa_tab to it_tab.
clear wa_tab.
wa_tab-field1 = '222'.
wa_tab-field2 = '2'.
append wa_tab to it_tab.
clear wa_tab.
入门基础介绍-巩固与提高
at new / at end of的应用
sort it_tab by field1. "所用到的字段一定要是第一个字段,并且要排序
FIELD-SYMBOLS <WA_TAB> LIKE LINE OF IT_TAB.
loop at it_tab ASSIGNING <WA_TAB>.
at new field1.
break-point.
*注意观察wa_tab的值
endat.
at end of field1.
break-point.
*注意观察wa_tab的值
endat.
endloop.
入门基础介绍-巩固与提高
求内表总行数:
data:IT_MARA like table of MARA with header line,
P_LINES type I value 0.
do 10 times.
IT_MARA-MATNR = SY-TABIX.
append IT_MARA.
enddo.
P_LINES = lines( IT_MARA ). "方法1
write:/ 'lines of table:' , P_LINES.
clear P_LINES.
describe table IT_MARA lines P_LINES. "方法2
write:/ 'lines of table:' , P_LINES.
入门基础介绍-巩固与提高
删除内部中某些列字段内容相同/全部字段内容相同的行
types:begin of S_TAB,
FIELD1(10),
FIELD2(10),
end of S_TAB.
data:IT_TAB type table of S_TAB with header line,
IT_TAB_TEMP type table of S_TAB with header line,
WA_TAB type S_TAB.
WA_TAB-FIELD1 = '111'.
WA_TAB-FIELD2 = '1'.
append WA_TAB to IT_TAB.
clear WA_TAB.
WA_TAB-FIELD1 = '111'.
WA_TAB-FIELD2 = '2'.
append WA_TAB to IT_TAB.
clear WA_TAB.
WA_TAB-FIELD1 = '111'.
WA_TAB-FIELD2 = '2'.
append WA_TAB to IT_TAB.
clear WA_TAB.
入门基础介绍-巩固与提高
删除内部中某些列字段内容相同/全部字段内容相同的行
sort IT_TAB.
IT_TAB_TEMP[] = IT_TAB[].
WRITE:/'内表全部行数据:'.
loop at IT_TAB into WA_TAB.
write:/ WA_TAB.
clear WA_TAB.
endloop.
delete adjacent duplicates from IT_TAB.
*删除全部字段内容相同的行
WRITE:/'删除全部字段内容相同的行后的结果:'.
loop at IT_TAB into WA_TAB.
write:/ WA_TAB.
clear WA_TAB.
endloop.
delete adjacent duplicates from IT_TAB_TEMP comparing FIELD1.
*删除字段field1内容相同的行
WRITE:/'删除字段field1内容相同的行的结果:'.
loop at IT_TAB_TEMP into WA_TAB.
write:/ WA_TAB.
clear WA_TAB.
endloop.
入门基础介绍-巩固与提高
删除内部中某些列字段内容相同/全部字段内容相同的行
代码运行结果:
入门基础介绍-课后作业
字符串的操作:
有字符串‘abcdefg,1234567,abcdefg’,
求字符串的字符数;
从第八位开始取之后的所有字符;
以逗号为分割,把分割后的字段放到内表中。
内表的操作:
定义一个内表1,添加若干数据.
统计内表中的总行数;
再建一个相同结构的内表2,从内表1中分一半数据到内表2;
清空内表2中最后一个字段的所有内容.
入门基础介绍-课后作业答案
字符串的操作的代码:
types: begin of ITAB_TYPE,
WORD(20),
end of ITAB_TYPE.
data: IT_TAB type standard table of ITAB_TYPE with header line.
data:P_STRING type STRING value 'abcdefg,1234567,abcdefg',
P_STRLEN type I value 0,
P_START_8 type STRING.
write:/ '有字符串:' , P_STRING.
P_STRLEN = strlen( P_STRING ).
write:/ '字符串的长度为:' , P_STRLEN.
P_STRLEN = P_STRLEN - 8.
P_START_8 = P_STRING+8(P_STRLEN).
write:/ '从第八位开始取之后的所有字符:' , P_START_8.
split P_STRING at ',' into table IT_TAB.
write:/'以逗号为分割,把分割后的字段放到内表中,内表的值为:'.
loop at IT_TAB.
write:/ IT_TAB-WORD.
endloop.
入门基础介绍-课后作业答案
运行结果:
入门基础介绍-课后作业答案
内表的操作:
types:begin of S_TAB,
FIELD1(10),
FIELD2(10),
end of S_TAB.
data:IT_TAB1 type table of S_TAB with header line,
IT_TAB2 type table of S_TAB with header line,
WA_TAB type S_TAB,
P_CHAR(9),
P_LINES type I value 0.
do 10 times.
WA_TAB-FIELD1 = SY-TABIX.
P_CHAR = SY-TABIX.
condense P_CHAR.
concatenate 'A' P_CHAR into WA_TAB-FIELD1.
concatenate 'B' P_CHAR into WA_TAB-FIELD2.
append WA_TAB to IT_TAB1.
clear WA_TAB.
enddo.
入门基础介绍-课后作业答案
write:/ '内表1的内容为:'.
loop at IT_TAB1 into WA_TAB.
write:/ WA_TAB-FIELD1 , WA_TAB-FIELD2.
clear WA_TAB.
endloop.
P_LINES = lines( IT_TAB1 ).
write:/ '内表1的总行数为:' , P_LINES.
P_LINES = P_LINES / 2.
loop at IT_TAB1 into WA_TAB from 1 to P_LINES.
append WA_TAB to IT_TAB2.
clear WA_TAB.
endloop.
delete IT_TAB1 from 1 to P_LINES.
write:/.
write:/ '从内表1中分一半数据到内表2后的结果:'.
write:/ '内表1的内容为:'.
loop at IT_TAB1 into WA_TAB.
write:/ WA_TAB-FIELD1 , WA_TAB-FIELD2.
clear WA_TAB.
endloop.
入门基础介绍-课后作业答案
write:/ '内表2的内容为:'.
loop at IT_TAB2 into WA_TAB.
write:/ WA_TAB-FIELD1 , WA_TAB-FIELD2.
clear WA_TAB.
endloop.
WA_TAB-FIELD2 = ''.
modify IT_TAB2 from WA_TAB transporting FIELD2 where FIELD1 ne ''.
write:/.
write:/ '清空内表2中最后一个字段后的结果:'.
loop at IT_TAB2 into WA_TAB.
write:/ WA_TAB-FIELD1 , WA_TAB-FIELD2.
clear WA_TAB.
endloop.
入门基础介绍-课后作业答案
运行结果:
page *
*
Report -事件块详细讲解
事件块的简单处理过程:
ABAP程序运行的时候,INITIALIZATION首先被调用;
经过初始化的输入屏幕会显示在表示服务器;
用户离开输入屏幕的时候,START-OF-SELCTION事件会被自动调用;
结果数据会以列表的形式显示在第二个屏幕上;
page *
*
Report -事件块顺序
ABAP运行中的程序系统CALL事件块的顺序
INITIALIZATION
2.一个选择屏幕传递到本地机器selection screen
3.当用户离开选择屏幕,START-OF-SELECTION 被CALL
4.列表结果传递到本地机器
page *
*
Report -事件块编码规则(1)
INITIALIZATION
通常在此事件块中设定输入屏幕字段的初始值
例如: INITIALIZATION .
P_DATE = ‘20030201’ .
效果:
输入屏幕的日期字段初始显示值为2003年2月1日
page *
*
Report -事件块编码规则(2)
AT SELECTION-SCREEN
通常在此事件块中进行用户输入数据的合法性检查,发现错误则以消息的形式给出警示,直到用户输入正确的数值
例如: AT SELECTION-SCREEN .
IF P_DATE = SPACE .
MESSAGE E001 .
ENDIF.
效果: 如果字段P_DATE为空,则程序会用消息001“日期字段不能为空!”来提示用户必须输入一个日期。而且输入屏幕会等待用户输入,知道该字段数值合法
page *
*
Report -事件块编码规则(3)
START-OF-SELCTION
通常在此事件中针对业务需求进行系统数据的查询
例如:
start-of-selection .
perform get_data_for_oil .
效果:
在输入屏幕用户按下执行按钮后,子程序get_data_for_oil被执行, 在其中获得业务相关的数据存放到内表或者其它变量,这些数据在END-OF-SELECTION事件块中被输出
page *
*
Report -事件块编码规则(4)
END-OF-SELCTION
通常在此事件中进行结果清单的输出
例如:
end-of-selection .
write : 23(1) sy-vline,
24(20) tab-gas_plan right-justified ,
效果:
数据以清单的形式输出
page *
*
Report -事件块编码规则(5)
GET
从逻辑数据库中得到数据(较少用)
TOP-OF-PAGE
在此事件块中设计输出清单的页头
例如: TOP-OF-PAGE
write : /1(240) '汽柴油日出厂情况表' centered .
write : /20(8) '日期:' ,
29(10) s_date ,
180(6) '单位:' ,
190(10) '吨' .
page *
*
Report -事件块编码规则(6)
END-OF-PAGE
在此事件中设定输出清单的页脚
例如:
END-OF-PAGE .
Write : ‘制作人’ , p_name .
Report -选择屏幕
REPORT Z_YW_TEST2.
tables:mara. SELECTION-SCREEN BEGIN OF BLOCK radio1 WITH FRAME TITLE text-001. PARAMETERS: p_matkl LIKE mara-maktl OBLIGATORY. “物料组 SELECT-OPTIONS:s_matnr for mara-matnr, “物料 s_ersda for mara-ersda. “创建时间
SELECTION-SCREEN END OF BLOCK radio1.
Report -选择表
MOVE:‘I' TO SE_AEDAT-sign,
‘BT' TO SE_AEDAT-option,
‘20090201’ TO SE_AEDAT-LOW,
‘20090228’ TO SE_AEDAT-HIGH.
APPEND SE_AEDAT.
Report -选择屏幕
对应多选的操作
Report -创建选择文本
创建选择屏幕的文本
Report -创建选择文本
维护字段名称
Report -创建选择文本
双击text-001
Report -创建选择文本
维护了选择文本后的结果为:
Report - CHECK 语句
SELECT-OPTIONS S1 FOR SY-INDEX.
DO 10 TIMES.
CHECK S1.
WRITE: / SY-INDEX.
ENDDO.
Using CHECK with SELECT-OPTIONS
1
2
3
4
6
9
10
Selection Table
Contents:
I BT 1 10
E EQ 5
E BT 7 8
Report - PARAMETERS语句
PARAMETERS:FNAME(50) TYPE C DEFAULT ‘/tmp/abap/myfile’
LOWER CASE
OBLIGATORY.
File Name
/tmp/abap/myfile
Report -创建复选框
PARAMETERS: INCL_INV AS CHECKBOX DEFAULT ‘X’.
TABLES: KNA1.
SELECT *
FROM KNA1.
WRITE: / KNA1-KUNNR, KNA1-NAME1.
IF INCL_INV = ‘X’.
PERFORM GET_AND_WRITE_INV.
ENDIF.
ENDSELECT.
TABLES: KNA1
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME
TITLE TEXT-001.
PARAMETERS: ONE_TIME RADIOBUTTON GROUP GP1,
REGULAR RADIOBUTTON GROUP GP1,
BOTH RADIOBUTTON GROUP GP1
DEFAULT ‘X’.
SELECTION-SCREEN END OF BLOCK B1.
IF ONE_TIME = ‘X’.
PERFORM WRITE_ONE_TIME_CUST.
ELSEIF REGULAR = ‘X’.
PERFORM WRITE_REG_CUST.
ELSE.
PERFORM WRITE_CUST.
ENDIF.
Report -创建单选按钮
Report -格式化选择屏幕
SELECTION-SCREEN <选项>.
SELECTION-SCREEN SKIP <n>.
SELECTION-SCREEN ULINE [ [/]<位置(长度)>].
SELECTION-SCREEN COMMENT [/]<位置(长度)> <名字> [FOR FIELD <f>].
SELECTION-SCREEN BEGIN OF LINE.
:
:
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN POSITION <位置>.
ALV
The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自
定义来进行增强,因此可以允许你可以在大型的应用程序中使用.
ALV
它包括3 大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏. ALV 家族包含3 中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.
ALV- ALV GRID CONTROL
ALV GRID CONTROL (ALV网格控制器)
ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作
使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理
ALV-常用的控制字段
ALV GRID相关的几个控制结构
1.字段目录 [Field catalog]
字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.
常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURE LVC_S_FCAT)
2 ROW_POS ALV 控制: 输出行 (内部使用)
3 COL_POS ALV 控制: 输出列 列的位置,第几列,例如1,2,…..
4 FIELDNAME ALV 控制: 内部表字段的字段名称 字段名称
5 TABNAME LVC 标签名称 表名,如果是内表,是1
6 CURRENCY ALV 控制: 货币单位
7 CFIELDNAME ALV 控制: 参考的当前单位的字段名称
8 QUANTITY ALV 控制: 计量单位
9 QFIELDNAME ALV 控制: 参考计量单位的字段名称
10 IFIELDNAME ALV 控制: 内部表字段的字段名称
11 ROUND ALV 控制: ROUND 值
12 EXPONENT ALV 控制:流动表示的指数
13 KEY ALV 控制: 关键字段 关键字段,前面变蓝色
14 KEY_SEL ALV 控制: 可以被隐藏的关键列 可以被隐藏的关键列
15 ICON ALV 控制: 作为图标输出 此列作为图标输出
ALV-常用的控制字段
16 SYMBOL ALV 控制: 输出作为符号
17 CHECKBOX ALV 控制: 作为复选框输出 复选框输出
18 JUST ALV 控制: 对齐 对齐方式:
'R': right justified
'L': left justified
'C': centered
19 LZERO ALV 控制: 输出前导零 X'
20 NO_SIGN ALV 控制:输出抑制符号 X',不输出符号
21 NO_ZERO ALV 控制: 为输出隐藏零 X',隐藏0
22 NO_CONVEXT ALV 控制: 不考虑输出的转换退出
23 EDIT_MASK ALV 控制: 为输出编辑掩码 格式
24 EMPHASIZE ALV 控制: 带有颜色的高亮列 列的颜色
25 FIX_COLUMN ALV 控制: 固定列
26 DO_SUM ALV 控制: 总计列值 X‘,合计
27 NO_SUM ALV 控制: 没有总计列值 X' ,没有合计
28 NO_OUT ALV 控制: 列没有输出 X' ,隐藏此列
29 TECH ALV 控制: 技术字段 X'.也是隐藏,但是有点不一样
30 OUTPUTLEN ALV 控制: 列的字符宽度 输出的长度
31 CONVEXIT 转换例程
32 SELTEXT ALV 控制: 对话功能的列标识符
33 TOOLTIP ALV 控制: 列抬头的工具提示
34 ROLLNAME ALV 控制: F1 帮助的数据元素
35 DATATYPE ABAP 字典中的数据类型 ABAP 字典中的数据类型
ALV-常用的控制字段
36 INTTYPE ABAP 数据类型(C,D,N,...) ABAP 数据类型(C,D,N,...)
37 INTLEN 以字节计的内部长度 内容的长度
38 LOWERCASE 允许/不允许小写字母 X' 允许大小写
39 REPTEXT 标题
40 HIER_LEVEL ALV 控制: 内部使用
41 REPREP ALV 控制: 价值是补充/补充接口的选择标准
42 DOMNAME 定义域名
43 SP_GROUP 组代码
44 HOTSPOT ALV 控制: 单击敏感 X',下面出现下划线,响应单击
45 DFIELDNAME ALV 控制: 数据库中列组的字段名称
46 COL_ID ALV 控制: 列 ID
47 F4AVAILABL 字段有输入帮助吗 X'.此列有搜索帮助
48 AUTO_VALUE ALV 控制: 自动复制值
49 CHECKTABLE 表名
50 VALEXI 固定值存在
51 WEB_FIELD ALV 控制: 内部表字段的字段名称
52 HREF_HNDL 自然数 热点连接的句柄
53 STYLE ALV 控制: 样式 下面有例子会介绍,比如PUSHBUTTION
54 STYLE2 ALV 控制: 样式
55 STYLE3 ALV 控制: 样式
56 STYLE4 ALV 控制: 样式
ALV-常用的控制字段
57 DRDN_HNDL 自然数 下拉的句柄
58 DRDN_FIELD ALV 控制: 内部表字段的字段名称 下拉的字段
59 NO_MERGING 字符字段长度 1 相同的值不合并
60 H_FTYPE ALV 树控制: 功能类型 (总计,平均,最大.最小, ...)
61 COL_OPT 可选列优化的条目
62 NO_INIT_CH 字符字段长度 1
63 DRDN_ALIAS 字符字段长度 1
64 REF_FIELD ALV 控制: 内部表字段的参考字段名称
65 REF_TABLE ALV 控制: 内部表字段的参考表名称
66 TXT_FIELD ALV 控制: 内部表字段的字段名称
67 ROUNDFIELD ALV 控制: 带有 ROUND 说明的字段名称
68 DECIMALS_O ALV 控制: 输出小数位的编号
69 DECMLFIELD ALV 控制: 带有 DECIMALS 说明的字段名称
70 DD_OUTLEN ALV 控制: 输出字符长度
71 DECIMALS 小数点后的位数 设置小数的位数
72 COLTEXT ALV 控制: 列标题 列标题
73 SCRTEXT_L 长字段标签
74 SCRTEXT_M 中字段标签
75 SCRTEXT_S 短字段标签
ALV-常用的控制字段
76 COLDDICTXT ALV 控制: 确定 DDIC 文本参考
77 SELDDICTXT ALV 控制: 确定 DDIC 文本参考
78 TIPDDICTXT ALV 控制: 确定 DDIC 文本参考
79 EDIT ALV 控制: 准备输入 输出状态.'X'可输入
80 TECH_COL ALV 控制: 内部使用
81 TECH_FORM ALV 控制: 内部使用
82 TECH_COMP ALV 控制: 内部使用
83 HIER_CPOS ALV 控制: 层次列位置
84 H_COL_KEY 树控制: 列名称/项目名称
85 H_SELECT 标识是否可以选择树控制中的列
86 DD_ROLL 数据元素 (语义域)
87 DRAGDROPID ALV 控制: 拖&放处理拖放对象
88 MAC 字符字段长度 1
89 INDX_FIELD 自然数
90 INDX_CFIEL 自然数
91 INDX_QFIEL 自然数
92 INDX_IFIEL 自然数
93 INDX_ROUND 自然数
94 INDX_DECML 自然数
95 GET_STYLE 字符字段长度 1
96 MARK 字符字段长度 1
ALV-布局控制[layout]
布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.
参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.
详细的结构说明
字段名 描述 Value range
CWIDTH_OPT 最优化宽度 SPACE, 'X'
SMALLTITLE 小标题,如果设置了这个字段,
则标题与列标题大小一样 SPACE, 'X'
GRID_TITLE 标题,在网格和工具条之间 最长70个字符
NO_HEADERS 如果被设置,列标题隐藏 SPACE, 'X'
NO_HGRIDLN 隐藏水平线 SPACE, 'X'
NO_MERGING 禁用单元格合并 SPACE, 'X'
NO_ROWMARK 如果被设置,选择列在选择模式
为D和A的时候隐藏 SPACE, 'X'
NO_TOOLBAR 隐藏工具条 SPACE, 'X'
NO_VGRIDLN 隐藏垂直线 SPACE, 'X'
SEL_MODE 选择模式 SPACE, 'A', 'B', 'C', 'D'
EXCP_CONDS 合计例外 SPACE, 'X'
EXCP_FNAME 字段名称带有例外编码 最长30个字符
EXCP_LED 例外作为 LED SPACE, 'X'
EXCP_ROLLN 例外文档的数据元素 SPACE, 'X'
CTAB_FNAME 带有复杂单元格颜色编码的字段名称 最长30个字符
INFO_FNAME 带有简单行彩色代码的字段名称 最长30个字符
ZEBRA 可选行颜色,如果设置了,出现了间隔色带 SPACE, 'X'
NO_TOTLINE 没有总计 SPACE, 'X'
NUMC_TOTAL 可以对NUMC字段进行合计 SPACE, 'X'
TOTALS_BEF 总计输出在第一行,小计在新的值之前 SPACE, 'X'
STYLEFNAME 设置单元格,比如PUSHBUTTON 最长30个字符
ALV-实例代码
********************************************************************** * Copyright 2009 ZeJia ABAP Training, BeiJing * * All Rights Reserved * *--------------------------------------------------------------------* * Program Name : Z_YW_ABAPTEST_ALV * * Project : ZeJia ABAP Training * * Program Title: ALV test * * Created by : yao wei(yaowei_yaowei@) * * Created on : 2009/02/25 * * Version : * *--------------------------------------------------------------------* *Modification Log: *Request Date Programmer Transport Description *========== ========== ========== ========== ========================= * *--------------------------------------------------------------------- REPORT Z_YW_ABAPTEST_ALV. ***********************************TOP TYPE-POOLS:slis. "for alv TABLES:MARA. types:begin of s_tab, chx(1), "作为选择列 FIELD1(10), FIELD2(10), FIELD3(10), END OF S_TAB. DATA:IT_TAB TYPE TABLE OF S_TAB WITH HEADER LINE. ***selection-screen SELECTION-SCREEN BEGIN OF BLOCK radio1 WITH FRAME TITLE text-001. PARAMETERS: p_ERSDA LIKE mara-ERSDA OBLIGATORY. "日期 SELECTION-SCREEN END OF BLOCK radio1.
ALV-实例代码
***********************************INITIALIZATION INITIALIZATION. ***********************************SELECTION-SCREEN AT SELECTION-SCREEN OUTPUT. ***********************************START-OF-SELECTION START-OF-SELECTION. DATA: f_repid LIKE sy-repid, "program name f_title TYPE lvc_title. "alv title DATA: gs_layout TYPE slis_layout_alv, it_fields TYPE slis_t_fieldcat_alv, wa_fields TYPE LINE OF slis_t_fieldcat_alv. do 10 TIMES. it_tab-field1 = sy-index. it_tab-field2 = 'field2'. it_tab-field3 = 'field3'. append it_tab. ENDDO. f_repid = sy-repid. "程序名称 CONCATENATE 'TEST ALV' p_ERSDA INTO f_title. "标题
ALV-实例代码
gs_layout-colwidth_optimize = 'X'. "为字段自动匹配适合的列宽 gs_layout-box_fieldname = 'CHX'. "确定选择列 gs_layout-zebra = 'X'. "各行显示不同的颜色 REFRESH it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD1'. wa_fields-seltext_l = '字段1'. WA_FIELDS-KEY = 'X'. "关键字段 APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD2'. wa_fields-seltext_l = '字段2'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD3'. wa_fields-seltext_l = '字段3'. APPEND wa_fields TO it_fields. CLEAR wa_fields. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = f_repid i_callback_pf_status_set = 'SET_PF' i_callback_user_command = 'USER_COM' i_grid_title = f_title is_layout = gs_layout it_fieldcat = it_fields i_save = 'X' TABLES t_outtab = it_TAB EXCEPTIONS program_error = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
ALV-实例代码
*&--------------------------------------------------------------------* *& Form set_pf_client *&--------------------------------------------------------------------* * text:ALV STATUS *---------------------------------------------------------------------* * -->EXTAB text *---------------------------------------------------------------------* FORM set_pf USING extab TYPE slis_t_extab. SET PF-STATUS 'ZTEST_ALV1'. ENDFORM. "SET_PF *&--------------------------------------------------------------------* *& Form user_com *&--------------------------------------------------------------------* * text:button function *---------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELDtext *---------------------------------------------------------------------* FORM user_com USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield . CASE r_ucomm. WHEN: 'BACK' OR 'EXIT' OR 'CANCEL'. LEAVE TO SCREEN 0. ENDCASE. ENDFORM. "user_com_second
ALV-实例运行结果
ALV-状态栏标准按钮的添加
添加菜单中的标准按钮,双击 SET PF-STATUS ‘ZTEST_ALV1’ 中的‘ZTEST_ALV1’.
ALV-状态栏标准按钮的添加
ALV-状态栏标准按钮的添加
保存激活运行后就会发现ALV中添加了标准的按钮:
ALV巩固与提升
介绍常用的标准按钮:排序、小计、合计、导出数据到本地文本等
如何设置列:颜色、格式、是否可编辑、搜索帮助等
介绍如何添加自己的按钮和对按钮的触发
介绍如何实现双击字段的触发
更新内表数据后刷新屏幕,屏幕数据更改后更新内表
介绍带有top of page / botter of page的ALV
page *
*
Message运用(消息的类型)
消息类型
后续操作
E:错误
所有字段重新输入,重新启动PAI 处理,所有字段重新输入
W:警告
所有字段允许输入,在未输入新值回车,也会继续PAI 处理
I:信息(弹出窗口)
中断当前操作
A:异常终止
返回
S:成功
处理PAI
Message运用(消息的类型)
例如:MESSAGE 'Test message type I' TYPE 'I'.
运行结果:
page *
*
MESSAGE 的创建
T-CODE SE91
MESSAGE 的创建
返回后,点击 change 来创建消息内容
MESSAGE 的创建
设置了一个消息号‘000’,其中‘test message 000’ 是常量,3个&对应3个变量
MESSAGE 的创建
对自创消息类或者系统消息类的应用:
代码:message E000(zyaowei) with '变量1' '变量2' '变量3'.
执行效果:
‘E000(zyaowei)’中的E表示消息的TYPE,000表示消息号,zyaowei表示消息类, ‘test message 000’ 就是刚才对000消息号设置中的固定值,变量1、变量2、变量3是对应了000消息号中的3个变量‘&’
Report-课后作业
编写一个完整的report程序。要求有选择界面(单选和多选),内表的处理,ALV显示内表结果;
在ALV中固定前2个字段,对数字字段进行合计;
在ALV中加个按钮,点击按钮则弹出一个MESSAGE统计ALV的总行数。
Report-课后作业答案
实现代码:
********************************************************************** * Copyright 2009 ZeJia ABAP Training, BeiJing * * All Rights Reserved * *--------------------------------------------------------------------* * Program Name : Z_YW_ABAPTEST_ALV * * Project : ZeJia ABAP Training * * Program Title: ALV test * * Created by : yao wei(yaowei_yaowei@) * * Created on : 2009/02/25 * * Version : * *--------------------------------------------------------------------* *Modification Log: *Request Date Programmer Transport Description *========== ========== ========== ========== ========================= * *--------------------------------------------------------------------- REPORT Z_YW_ABAPTEST_ALV. ***********************************TOP TYPE-POOLS:slis. "for alv TABLES:MARA. types:begin of s_tab, chx(1), "作为选择列 FIELD1(10), FIELD2(10), FIELD3(10), field4 type p DECIMALS 2, END OF S_TAB. DATA:IT_TAB TYPE TABLE OF S_TAB WITH HEADER LINE. ***selection-screen SELECTION-SCREEN BEGIN OF BLOCK radio1 WITH FRAME TITLE text-001. PARAMETERS: p_ERSDA LIKE mara-ERSDA OBLIGATORY. "日期 SELECT-OPTIONS:s_option for mara-matnr. SELECTION-SCREEN END OF BLOCK radio1.
Report-课后作业答案
***********************************INITIALIZATION INITIALIZATION. ***********************************SELECTION-SCREEN AT SELECTION-SCREEN OUTPUT. ***********************************START-OF-SELECTION START-OF-SELECTION. DATA: f_repid LIKE sy-repid, "program name f_title TYPE lvc_title. "alv title DATA: gs_layout TYPE slis_layout_alv, it_fields TYPE slis_t_fieldcat_alv, wa_fields TYPE LINE OF slis_t_fieldcat_alv. do 10 TIMES. it_tab-field1 = sy-index. it_tab-field2 = 'field2'. it_tab-field3 = 'field3'. it_tab-field4 = sy-index. append it_tab. ENDDO. f_repid = sy-repid. "程序名称 CONCATENATE 'TEST ALV' p_ERSDA '物料从:' s_option-low '到' s_option-high INTO f_title. "标题
Report-课后作业答案
gs_layout-colwidth_optimize = 'X'. "为字段自动匹配适合的列宽 gs_layout-box_fieldname = 'CHX'. "确定选择列 gs_layout-zebra = 'X'. "各行显示不同的颜色 REFRESH it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD1'. wa_fields-seltext_l = '字段1'. WA_FIELDS-KEY = 'X'. "关键字段 APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD2'. wa_fields-seltext_l = '字段2'. WA_FIELDS-KEY = 'X'. "关键字段 APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD3'. wa_fields-seltext_l = '字段3'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD4'. wa_fields-seltext_l = '字段4'. WA_FIELDS-do_sum = 'X'. APPEND wa_fields TO it_fields. CLEAR wa_fields. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = f_repid i_callback_pf_status_set = 'SET_PF' i_callback_user_command = 'USER_COM' i_grid_title = f_title is_layout = gs_layout it_fieldcat = it_fields i_save = 'X' TABLES t_outtab = it_TAB EXCEPTIONS program_error = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
Report-课后作业答案
&--------------------------------------------------------------------* *& Form set_pf_client *&--------------------------------------------------------------------* * text:ALV STATUS *---------------------------------------------------------------------* * -->EXTAB text *---------------------------------------------------------------------* FORM set_pf USING extab TYPE slis_t_extab. SET PF-STATUS 'ZTEST_ALV2'. ENDFORM. "SET_PF *&--------------------------------------------------------------------* *& Form user_com *&--------------------------------------------------------------------* * text:button function *---------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELDtext *---------------------------------------------------------------------* FORM user_com USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield . DATA:P_LINES TYPE I VALUE 0, P_STRING TYPE STRING. CASE r_ucomm. WHEN: 'BACK' OR 'EXIT' OR 'CANCEL'. LEAVE TO SCREEN 0. WHEN 'ZSUM_LINE'. P_LINES = LINES( it_tab ). p_string = P_LINES. CONCATENATE '总行数为:' p_string INTO P_STRING. message P_STRING TYPE 'I'. ENDCASE. ENDFORM. "user_com_second
Report-课后作业答案
执行结果:
page *
*
ABAP/4数据字典
ABAP/4数据字典是和ABAP/4工作台密切结合在一起的一个活动组件
数据字典的修改将立刻影响到相关的程序和屏幕
R/3系统是一个解释执行的系统,程序或是屏幕并不直接读取源代码,而是执行内部经过“生成”的描述
对于ABAP/4字典的修改将触发内部描述的重新生成
page *
*
ABAP数据字典-对象
数据字典中包括:
数据库表
视图
数据类型
域
搜索帮助
锁对象
page *
*
ABAP数据字典-基本对象
page *
*
ABAP数据字典-域和数据元素
在ABAP/4中有两种类型对象用来进行数据定义的:技术域(域)和语义域(数据元素)
域是描述一个对象属性的核心对象,它描述了一个字段的取值,格式和长度
数据元素是一个语义对象,它用来描述一个在一个字段中域的真正用途
page *
*
ABAP数据字典-域和数据元素
page *
*
ABAP数据字典-表类型详解(一)
透明表每个透明表在数据库中有一个相应的物理表。物理表的名称和数据字典中的逻辑表定义的名称一致。所有事务和应用数据存贮在透明表中。
结构在数据库不存在数据记录。结构用于在程序之间或程序与屏幕之间的接口定义。
附加结构定义字段的子集,该字段属于其他表格或结构,但是在修正管理中作为单独的对象。
存储表可以用来存贮控制数据(例如:屏幕顺序,程序参数或临时数据)。几个存储表可以组合成一个表库。该表库和数据库中的一物理表库相一致。它包含了各组合库分派给它的所有记录。
page *
*
ABAP数据字典-表类型详解(二)
簇表连续的文本如文档之类可以存贮在簇表中。几个簇表可以组合成一个表簇。对这种表类型,不同表中的几个逻辑行组合到一物理记录。这可以实现一对象接一对象地存贮或访问,访问簇中的表的一个前提是,至少关键字的一部分必须相符合。几个簇表存贮在数据库中 一个相应的表里。
视图可以包含来自一个表格或几个表格里的栏位,它运行用户从几个表格里汇集相应的栏位并提供给R/3系统用户使用。活动期间生成视图的结构。该结构在运行时间环境作为接口使用。 通常不显示在ABAP/4 词典中。
page *
*
ABAP数据字典-表组件
R/3 系统中的每 个表由几个 组件组成。 这些组件是 :
a) Tables: 代表 ABAP 字典中的表 。
b) Fields: 定义 存储在表中 的信息。
c) Data Elements: 描述字段内 容并决定字段如何显示 给端用户。 Data Elements在 Dictionary中作为对象出现。 因为它们是独立的对象 ,因此可以在相同表内或几个表的字段中重新使用Data Elements。
d) Domain: 描述字段的有效值.如同Data Elements ,域在字典中作为对象存储。可以象重新使用 Data Elements一 样重新使用 Domain。
e) Technical Settings: 指定 R/3 系统如何处理表。
page *
*
ABAP数据字典-创建表格中应注意的问题
货币栏位通常用类型CURR,但是必须定义其相关的币种类型 (类型CUKY)作为参考栏位
长度、重量和其他用于测量的尺寸单位通常用类型QUAN,必须定义其相关的栏位单元 (类型 UNIT) 作为其参考栏位
page *
*
ABAP数据字典-如何使用表格及其相应栏位
更改栏位的显示: 字段名->(变成)字段文本
(设置->用户参数->数据浏览->关键字)
双击键的使用:
双击数据表格名展示其详细资料
双击栏位名展示其详细资料
当表格已经激活,通过TCODE: SE14可以对表格进行维护
page *
*
ABAP数据字典-创建自定义透明表
page *
*
ABAP数据字典-创建自定义透明表
page *
*
ABAP数据字典-创建自定义透明表
page *
*
ABAP数据字典-创建自定义透明表
page *
*
ABAP数据字典-创建自定义透明表
page *
*
ABAP数据字典-创建自定义结构
page *
*
ABAP数据字典-创建自定义结构
page *
*
ABAP数据字典-创建自定义结构
ABAP 数据字典-域
表 A
数据元素
域
ABAP 数据字典-域的属性(允许值)
数值表
域
域
一月
二月
三月
.
.
.
.
.
.
.
十二月
ABAP 数据字典-表数据维护
输入TCODE:SE55,输入函数组名称和屏幕号,选择权限组
ABAP 数据字典-表数据维护
输入TCODE:SM30,输入表名后单击维护按钮
有效值
无效值
ABAP 数据字典-使用允许值的好处
ABAP 数据字典-课后作业
自建3个以上的域,域对应的数据元素,形成一个数据库表
其中一个域需要有value range的限制,要求有一个货币类型,有个测量类型
把数据库表制作成可通过SE30维护数据的
ABAP 数据字典-课后作业答案
创建域1:
T-CODE SE11
ABAP 数据字典-课后作业
设置value range的限制,通过限制以后所用到改域的字段只能取限制内的值
ABAP 数据字典-课后作业
自建域2
ABAP 数据字典-课后作业
自建域3,货币类型的
ABAP 数据字典-课后作业
自建域4,测量类型的
ABAP 数据字典-课后作业
给每个域创建对应的数据元素
ABAP 数据字典-课后作业
ABAP 数据字典-课后作业
自建数据库表:
T-CODE SE11
ABAP 数据字典-课后作业
ABAP 数据字典-课后作业
添加字段:
ABAP 数据字典-课后作业
维护货币字段和测量字段(参考系统标准表的字段)
ABAP 数据字典-课后作业
维护技术设置
ABAP 数据字典-课后作业
维护表格生成器
ABAP 数据字典-课后作业
ABAP 数据字典-课后作业
维护表数据:T-CODE SM30
数据库
SQL语句-读取数据库
数据
John
Smith
Mary
Stiles
SQL语句-基本SELECT语句
数据库
Mary
Stiles
John Smith
工作区域
SELECT *FROM <表名字> […..]
ENDSELECT.
SQL语句-使用SELECT语句的例子
TABLES: KNA1.
SELECT *
FROM KNA1.
WRITE: / KNA1-KUNNR, KNA1-NAME1.
ENDSELECT.
SQL语句-带有WHERE子句
TABLES: KNA1.
SELECT *
FROM KNA1
WHERE KTOKD = ‘0001’.
WRITE: / KNA1-KUNNR, KNA1-NAME1.
ENDSELECT.
SQL语句-检查SY-SUBRC
TABLES: KNA1.
SELECT *
FROM KNA1
WHERE KTOKD = ‘0001’.
WRITE: / KNA1-KUNNR, KNA1-NAME1.
ENDSELECT.
IF SY-SUBRC <> 0.
WRITE: / ‘No records found.’.
ENDIF.
SQL语句- INTO子句
TABLES: KNA1.
SELECT KUNNR
NAME1
FROM KNA1
INTO (KNA1-KUNNR,
KNA1-NAME1).
WRITE : / KNA1-KUNNR, KNA1-NAME1.
ENDSELECT.
IF SY-SUBRC <> 0.
WRITE: / ‘No records found.’.
ENDIF.
SQL语句- CORRESPONDING-FIELDS
TABLES: KNA1.
SELECT KUNNR
NAME1
FROM KNA1
INTO CORRESPONDING-FIELDS
OF KNA1.
WRITE : / KNA1-KUNNR, KNA1-NAME1.
ENDSELECT.
IF SY-SUBRC <> 0.
WRITE: / ‘No records found.’.
ENDIF.
SQL语句- SELECT
ABAP 程序
REPORT: YNEWAPPL.
TABLES...
SELECT * FROM TABNA.
ENDSELECT.
ABAP
报表
数据
数据库
TABNA
LFA1
LFC1
SQL语句- WHERE 子句: 获取单一数据
&
& ------------------------------------------------------------------------------------------
report y170dm64.
tables: tabna.
Syntax of a select single statement for single access. ----------
select single from tabna
where country eq ’D’
and id eq ’00000002’.
if sy-subrc = 0.
write: tabna-country, tabna-id,
tabna-name1.
endif.
在返回字段
(SY-SUBRC)中,
0 = 成功
4 = 记录不存在
SELECT SINGLE* 语句要求在WHERE语句中提供全部的关键字
*
*
*
*
*
*
*
SQL语句-语法: 有条件的循环处理
SELECT * FROM <表>
WHERE <表字段1> <关系操作> <数值1>
AND <表字段2> <关系操作> <数值2>
OR <表字段3> <关系操作> <数值3>
AND <表字段4> <关系操作> <数值4>
:
:
OR <表字段n> <关系操作> <数值n>.
ENDSELECT.
EQ =
GE >= =>
LE <= =<
NE <> ><
GT >
LT <
关系操作
SELECT * FROM <表> WHERE <表字段>...
BETWEEN <数值 1> AND <数值2>
LIKE <使用‘%’ 和 ‘_’ 的模糊查询>
IN (<数值1, 数值 2,......数值 n>)
SQL语句-语法: Between 子句, 模版和列表
SQL语句- WHERE 语句: 有条件的循环
report y170md65.
tables: tabna.
The result of the select statement is limited by the conditions of
the where clause.
*
*
select * from tabna
where country eq ‘USA’
and id between ‘0000001’
and ‘0000002’ .
write: / tabna-country, tabna-id.
tabna-name1.
endselect.
if sy-subrc ne 0.
write: / ‘The conditions cannot be satisfied’.
endif.
结果集由于 WHERE 子句中的条件被限制住了
SQL语句- LIKE: 模版的例子 (%_)
& *
& *
&-----------------------------------------------------------------------------------------------*
report y170dm66.
tables: t001.
Using a template during selection.-----------------------------------------------
select from t001
where bukrs like ‘__01’
and butxt like ‘SAP%’.
write: / t001-bukrs, t001-butxt.
endselect.
if sy-subrc ne 0.
write: / ‘The conditions cannot be satisfied’.
endif.
*
*
*
*
*
‘_’ 代表一个占位符,可以表示任意字符 ‘%’ 代表任何长度的任意字符串
SQL语句- IN语句:可选的数值列表
tables: tabna.
parameters: country1 like tabna-country.
country2 like tabna-country.
select from tabna
where country in (country1, country2).
where country = country1 or country = country2.
write: / tabna-country, tabna-id,
tabna-name1.
endselect.
if sy-subrc ne 0.
write: / ‘The conditions cannot be satisfied’.
endif.
*
*
½
SQL语句- IN语句: 范围的例子
tables: lfa1.
data: begin of tab occurs 10.
sign (1),
option (2),
low like lfa1-lifnr,
high like lfa1-lifnr,
end of tab.
move: ‘I’ to tab-sign,
‘BT’ to tab-option,
‘0000000001’ to tab-low,
‘9999999999’ to tab-high.
append tab.
select from lfa1
where lifnr in tab.
write: / lfa1-lifnr, lfa1-name1.
endselect.
此内表结构和处理selection screen时产生的表格结构一样.RANGES 语句同样可以自动创建相同结构的内表
Ranges: tab for lfa1-lifnr.
move: ‘I’ to tab-sign,
‘BT’ to tab-option,
‘0000000001’ to tab-low,
‘9999999999’ to tab-high.
append tab.
select from lfa1
where lifnr in tab.
write: / lfa1-lifnr, lfa1-name1.
endselect.
*
tables: lfa1.
DATA: BEGIN OF <名字>
OCCURS <n>,
SIGN(1),
OPTION(2),
LOW LIKE <字段>,
HIGH LIKE <字段>,
END OF <名字>.
RANGES <名字> FOR <字段>.
SQL语句- ORDER BY 语句
&-----------------------------------------------------------------------------------------------
& Report Y170DM71
&
&-----------------------------------------------------------------------------------------------
&
&
&-----------------------------------------------------------------------------------------------
report y170dm71.
tables: lfa1.
Notice the order by clause below.----------------------------------------------
select from lfa1
order by name1.
write: / lfa1-lifnr, lfa1-name1.
endselect.
*
*
*
*
½
*
*
*
*
*
*
*
*
*
*
*
*
*
SELECT * FROM <表>
WHERE <条件>
ORDER BY <表字段 1>
<表字段 2>
<表字段 3>
:
:
<表字段 n>.
ENDSELECT.
REPORT Y170DM72.
TABLES: TABNA.
DATA: CNTRY LIKE TABNA-COUNTRY.
SELECT DISTINCT COUNTRY
FROM TABNA INTO (CNTRY).
WRITE: / CNTRY.
ENDSELECT.
SQL语句- SELECT DISTINCT 语句
使用 SELECT DISTINCT语句,可以从结果集中消除重复的记录
SQL语句- SELECT 使用总计功能
REPORT Y170DM73.
TABLES: TABNA.
DATA: TOTAL TYPE I,
MAX_SALES LIKE TABNA-SALES,
AVG_SALES LIKE TABNA-SALES,
MIN_SALES LIKE TABNA-SALES.
SELECT COUNT( DISTINCT COUNTRY )
MAX( SALES )
AVG( SALES )
MIN( SALES )
FROM TABNA
INTO (TOTAL, MAX_SALES, AVG_SALES, MIN_SALES)
WHERE COUNTRY <> SPACE.
WRITE: / ‘Table TABNA Statistics’,
/ TOTAL, ‘Different Countries’,
/8 MIN_SALES, ‘Lowest Sales’,
/8 AVG_SALES, ‘Average Sales’,
/8 MAX_SALES, ‘Highest Sales’.
SQL语句- CONCATENATE 语句
REPORT Y170DM74.
TABLES: TABNA.
PARAMETERS:
WHERECL1(72) DEFAULT ‘COUNTRY = ‘ ‘USA’ ’ ’,
WHERECL2(3) DEFAULT ‘OR’,
WHERECL3(72) DEFAULT ‘COUNTRY = ‘ ‘GB’ ’ ’.
TYPE: BEGIN OF ITAB_RECORD,
TEXT(72),
END OF ITAB_RECORD.
DATA: WHERE_ITAB TYPE STANDARD TABLE OF ITAB_RECORD INITIAL SIZE 3 WITH HEADER LINE.
CONCATENATE WHERECL1 WHERECL2 WHERECL3
INTO WHERE_ITAB-TEXT SEPARATED BY SPACE.
APPEND WHERE_ITAB.
SELECT * FROM TABNA WHERE (WHERE_ITAB).
WRITE: / TABNA-COUNTRY, TABNA-ID.
ENDSELECT.
CONCATENATE <原字段1>
<原字段2>
<原字段3>
:
:
<原字段n>
INTO <目标字段>
SEPARATED BY <常量>.
REPORT Y170DM76.
PARAMETERS: TAB_NAME(5) DEFAULT 'MKPF'.. DATA: TABLE_LINE(240). SELECT MBLNR FROM (TAB_NAME) INTO TABLE_LINE. WRITE: / TABLE_LINE. ENDSELECT.
SQL语句-动态指定表名称
SQL语句-连接: 为什么我们要使用它们
在同一个select语句中使用不同的表
SQL语句-内连接
SFLIGHT
SCARR
SQL语句-内连接语法
SELECT <表1~字段1 表1~字段2 表2~字段3. . . >
INTO (<目标 >)
FROM <表1 > INNER JOIN <表2 >
ON <表1~关键字段1 > = <表2~关键字段1 >
AND <表1~关键字段2 > = <表2~关键字段2 >
AND . . .
WHERE . . .
ENDSELECT.
SQL语句-主表
SELECT scarr~carrname sflight~carrid sflight~connid sflight~fldate
INTO (carrid, connid, date, carrname)
FROM scarr INNER JOIN sflight
ON scarr~carrid = sflight~carrid.
WRITE: / carrid, connid, date, carrname.
ENDSELECT.
SQL语句-左外连接
SFLIGHT
SCARR
SQL语句-左外连接语法
SELECT <表1~字段1 表1~字段2 表2~字段3. . . >
INTO (<目标 >)
FROM <表1 > LEFT OUTER JOIN <表2 >
ON <表1~关键字段1 > = <表2~关键字段1 >
AND <表1~关键字段2 > = <表2~关键字段2 >
AND . . .
WHERE . . .
ENDSELECT.
SQL语句-多于两个表的连接
SELECT <表1~字段1 表1~字段2 表2~字段3. . . >
INTO (<目标 >)
FROM <表1 > INNER JOIN <表2 >
ON <表1~关键字段1 > = <表2~关键字段1 >
AND <表1~关键字段2 > = <表2~关键字段2 >
AND . . .)
INNER JOIN <表3 >
ON <表1~关键字段> = <表3~关键字段>
AND . . .
WHERE . . .
ENDSELECT.
SQL语句-别名
SELECT A~carrname
B~carrid
B~connid
B~fldate
INTO (carrid, connid, date, carrname)
FROM scarr AS A INNER JOIN sflight AS B
ON scarr~carrid = sflight~carrid.
WRITE: / carrid, connid, date, carrname.
ENDSELECT.
SQL语句-子查询
SFLIGHT
SCARR
哪一条航线在sflight表中没有记录?
SQL语句-子查询语法/例子
SELECT * FROM scarr
WHERE NOT carrid IN
( SELECT carrid FROM sflight ).
WRITE:/ scarr-carrid, scarr-carrname.
ENDSELECT.
SQL语句- Having 语句
列出 Luftansa的 CONNIDs ,其中 LUGGWEIGHT 之和要 > 25,0000.
SQL语句- Having 语句语法/例子
SELECT carrid connid COUNT( *) SUM( luggweight )
INTO (carrid, connid, count, sum_weight)
FROM sbook
WHERE carrid = 'LH'
GROUP BY carrid connid
HAVING SUM( luggweight ) > 25.
WRITE:/ carrid, connid, count, sum_weight.
ENDSELECT.
SQL语句-巩固与提高
插入数据库数据
*INSERT dbtab FROM TABLE itab
*INSERT dbtab FROM wa.
tables:ZTYAOWEI_2.
data:IT_ZTYAOWEI_2 like table of ZTYAOWEI_2 with header line,
WA_ZTYAOWEI_2 like ZTYAOWEI_2.
do 10 times.
WA_ZTYAOWEI_2-FIELD2 = SY-TABIX.
WA_ZTYAOWEI_2-FIELD5 = 'aaa'.
append WA_ZTYAOWEI_2 to IT_ZTYAOWEI_2.
enddo.
insert ZTYAOWEI_2 from table IT_ZTYAOWEI_2. “插入内表数据
if SY-SUBRC = 0.
commit work.
else.
rollback work.
endif.
WA_ZTYAOWEI_2-FIELD2 = '11'.
WA_ZTYAOWEI_2-FIELD5 = 'bbb'.
INSERT ZTYAOWEI_2 FROMWA_ZTYAOWEI_2. “插入一条数据
if SY-SUBRC = 0.
commit work.
else.
rollback work.
endif.
SQL语句-巩固与提高
插入数据库数据
代码运行效果:
SQL语句-巩固与提高
修改数据库数据
*MODIFY dbtab FROM wa. *MODIFY dbtab FROM TABLE itab. tables:ZTYAOWEI_2. data:IT_ZTYAOWEI_2 like table of ZTYAOWEI_2 with header line, WA_ZTYAOWEI_2 like ZTYAOWEI_2. WA_ZTYAOWEI_2-FIELD2 = '11'. WA_ZTYAOWEI_2-FIELD5 = 'bbb'. modify ZTYAOWEI_2 from WA_ZTYAOWEI_2. "修改一条数据 if SY-SUBRC = 0. commit work. else. rollback work. endif. do 10 times. WA_ZTYAOWEI_2-FIELD2 = SY-index. WA_ZTYAOWEI_2-FIELD5 = 'aaa'. append WA_ZTYAOWEI_2 to IT_ZTYAOWEI_2. enddo. WA_ZTYAOWEI_2-FIELD5 = 'bbb'. modify it_ZTYAOWEI_2 from WA_ZTYAOWEI_2 TRANSPORTING field5 where field2 <> '11'. modify ZTYAOWEI_2 from table it_ztyaowei_2. "修改批量数据 if SY-SUBRC = 0. commit work. else. rollback work. endif.
SQL语句-巩固与提高
修改数据库数据
代码执行结果:
SQL语句-巩固与提高
删除数据库数据
*DELETE dbtab FROM wa. *DELETE FROM dbtab. *DELETE dbtab FROM TABLE itab. tables:ZTYAOWEI_2. data:IT_ZTYAOWEI_2 like table of ZTYAOWEI_2 with header line, WA_ZTYAOWEI_2 like ZTYAOWEI_2. WA_ZTYAOWEI_2-FIELD2 = '11'. WA_ZTYAOWEI_2-FIELD5 = 'bbb'. delete ZTYAOWEI_2 from WA_ZTYAOWEI_2. "删除一条数据 if SY-SUBRC = 0. commit work. else. rollback work. endif. do 10 times. WA_ZTYAOWEI_2-FIELD2 = SY-index. WA_ZTYAOWEI_2-FIELD5 = 'aaa'. append WA_ZTYAOWEI_2 to IT_ZTYAOWEI_2. enddo. delete ZTYAOWEI_2 from table it_ZTYAOWEI_2. "删除批量数据 if SY-SUBRC = 0. commit work. else. rollback work. endif.
SQL语句-巩固与提高
删除数据库数据
运行结果: (数据被全部删除了)
SQL语句-课后作业
创建2张自建表,他们之间能够通过主键关联
用SQL语句分别对2张表插入若干数据
用SQL语句分别对2张表删除若干数据
用SQL语句分别对2张表修改若干数据
用ALV显示2张表中可关联的数据
SQL语句-课后作业答案
自建2张数据库表,ZTYAOWEI_1/ZTYAOWEI2,他们共有主键field2.
SQL语句-课后作业答案
主要代码:
********************************************************************** * Copyright 2009 ZeJia ABAP Training, BeiJing * * All Rights Reserved * *--------------------------------------------------------------------* * Program Name : Z_YW_ABAPTEST_ALV * * Project : ZeJia ABAP Training * * Program Title: ALV test * * Created by : yao wei(yaowei_yaowei@) * * Created on : 2009/02/25 * * Version : * *--------------------------------------------------------------------* *Modification Log: *Request Date Programmer Transport Description *========== ========== ========== ========== ========================= * *--------------------------------------------------------------------- REPORT Z_YW_ABAPTEST_ALV. ***********************************TOP TYPE-POOLS:slis. "for alv TABLES:ZTYAOWEI_1,ZTYAOWEI_2. types:begin of s_tab, chx(1), "作为选择列 FIELD1 like ZTYAOWEI_1-field1, FIELD2 like ZTYAOWEI_1-field2, FIELD3 like ZTYAOWEI_1-field3, FIELD4 like ZTYAOWEI_1-field4, field5 like ZTYAOWEI_2-field5, field6 like ZTYAOWEI_2-field6, END OF S_TAB. DATA:IT_TAB TYPE TABLE OF S_TAB WITH HEADER LINE, it_ztyaowei_1 like table of ztyaowei_1 WITH HEADER LINE, it_ztyaowei_2 like table of ztyaowei_2 WITH HEADER LINE, wa_ztyaowei_1 type ztyaowei_1, wa_ztyaowei_2 type ztyaowei_2.
SQL语句-课后作业答案
***********************************INITIALIZATION INITIALIZATION. ***********************************SELECTION-SCREEN AT SELECTION-SCREEN OUTPUT. ***********************************START-OF-SELECTION START-OF-SELECTION. DATA: f_repid LIKE sy-repid, "program name f_title TYPE lvc_title. "alv title DATA: gs_layout TYPE slis_layout_alv, it_fields TYPE slis_t_fieldcat_alv, wa_fields TYPE LINE OF slis_t_fieldcat_alv. do 20 times. WA_ztyaowei_1-field1 = 'CITY1'. WA_ztyaowei_1-field2 = SY-INDEX. CONDENSE WA_ztyaowei_1-field2. WA_ztyaowei_1-field3 = ''. WA_ztyaowei_1-field4 = ''. append WA_ztyaowei_1 TO it_ztyaowei_1. enddo. do 10 times. WA_ztyaowei_2-field2 = SY-INDEX. CONDENSE WA_ztyaowei_2-field2. WA_ztyaowei_2-field5 = 'AAA'. WA_ztyaowei_2-field6 = 'BBB'. append WA_ztyaowei_2 TO it_ztyaowei_2. enddo.
SQL语句-课后作业答案
插入数据库表数据 INSERT ZTYAOWEI_1 from table it_ztyaowei_1. if sy-subrc <> 0. ROLLBACK work. endif. insert ZTYAOWEI_2 from table it_ztyaowei_2. if sy-subrc = 0. commit work. else. rollback work. endif. *修改数据库表数据 WA_ztyaowei_1-field1 = 'CITY1'. WA_ztyaowei_1-field2 = '1'. WA_ztyaowei_1-field3 = ''. WA_ztyaowei_1-field4 = ''. WA_ztyaowei_2-field2 = '1'. WA_ztyaowei_2-field5 = 'BBB'. WA_ztyaowei_2-field6 = 'AAA'. MODIFY ZTYAOWEI_1 from WA_ztyaowei_1. if sy-subrc <> 0. ROLLBACK work. endif. MODIFY ZTYAOWEI_2 from WA_ztyaowei_2. if sy-subrc = 0. commit work. else. rollback work. endif. *删除数据库数据 WA_ztyaowei_1-field1 = 'CITY1'. WA_ztyaowei_1-field2 = '2'. WA_ztyaowei_2-field2 = '2'. DELETE ZTYAOWEI_1 from WA_ztyaowei_1. if sy-subrc <> 0. ROLLBACK work. endif. DELETE ZTYAOWEI_2 from WA_ztyaowei_2. if sy-subrc = 0. commit work. else. rollback work. endif.
SQL语句-课后作业答案
*取2个数据库表的数据到内表中 select ZTYAOWEI_1~field1 ZTYAOWEI_1~field2 ZTYAOWEI_1~field3 ZTYAOWEI_1~field4 ZTYAOWEI_2~field2 ZTYAOWEI_2~field5 ZTYAOWEI_2~field6 into CORRESPONDING FIELDS OF TABLE it_tab from ztyaowei_1 INNER JOIN ztyaowei_2 on ztyaowei_1~field2 eq ztyaowei_2~field2. f_repid = sy-repid. "程序名称 * CONCATENATE 'TEST ALV' p_ERSDA INTO f_title. "标题 gs_layout-colwidth_optimize = 'X'. "为字段自动匹配适合的列宽 gs_layout-box_fieldname = 'CHX'. "确定选择列 gs_layout-zebra = 'X'. "各行显示不同的颜色 REFRESH it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD1'. wa_fields-seltext_l = '字段1'. WA_FIELDS-KEY = 'X'. "关键字段 APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD2'. wa_fields-seltext_l = '字段2'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD3'. wa_fields-seltext_l = '字段3'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD4'. wa_fields-seltext_l = '字段4'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD5'. wa_fields-seltext_l = '字段5'. APPEND wa_fields TO it_fields. CLEAR wa_fields. wa_fields-fieldname = 'FIELD6'. wa_fields-seltext_l = '字段6'. APPEND wa_fields TO it_fields. CLEAR wa_fields.
SQL语句-课后作业答案
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = f_repid i_callback_pf_status_set = 'SET_PF' i_callback_user_command = 'USER_COM' i_grid_title = f_title is_layout = gs_layout it_fieldcat = it_fields i_save = 'X' TABLES t_outtab = it_TAB EXCEPTIONS program_error = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. *&--------------------------------------------------------------------* *& Form set_pf_client *&--------------------------------------------------------------------* * text:ALV STATUS *---------------------------------------------------------------------* * -->EXTAB text *---------------------------------------------------------------------* FORM set_pf USING extab TYPE slis_t_extab. SET PF-STATUS 'ZTEST_ALV1'. ENDFORM. "SET_PF *&--------------------------------------------------------------------* *& Form user_com *&--------------------------------------------------------------------* * text:button function *---------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELDtext *---------------------------------------------------------------------* FORM user_com USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield . CASE r_ucomm. WHEN: 'BACK' OR 'EXIT' OR 'CANCEL'. LEAVE TO SCREEN 0. ENDCASE. ENDFORM. "user_com_second
SQL语句-课后作业答案
运行代码后的结果:
Query
用Query做报表开发简单易懂操作简单,但是相对于ABAP来说就没有这么灵活,而且对数据的处理有没有ABAP那么全面。但是对于没有编程功底的SAP用户来说,Query确实是一个比较容易上手的报表开发工具。(它的事务码是SQ01、SQ02、SQ03)
Query概述
用Query做报表开发简单易懂操作简单,但是相对于ABAP来说就没有这么灵活,而且对数据的处理有没有ABAP那么全面。但是对于没有编程功底的SAP用户来说,Query确实是一个比较容易上手的报表开发工具。
Query-实现步骤
一步:首先我们要创建一个用户组通过事务码SQ03进入,在弹出的屏幕窗口中输入我们要创建的用户组的名称点基创建—输入用户组的文本描述—创建完成在环境—查询区域中选择相应的查询区域(一般有两种:标准区(客户-专用)和全局区域(交叉-客户))可以选择标准区(客户-专用)。
二步:接着我们要创建功能区。环境—功能区—输入要创建的功能区的的名字—点击创建—输入功能区的文本描述(对于权限组可以选择刚才创建的用户组,也可以不选,一般情况下不选)数据源选择“Table join using basis table”(填入要进行查询的透明表的名称)—运行,若是还要用其他表的数据就在随后出现的屏幕中插入相关的表即可。(表与表之间会自动相关连—点信息集,在弹出的对话框中可以选择“Greate empty field group”(选择这一项是为了后面可以自己选择添加要输出的行项目)—运行,在弹出的窗口中,在左边的数据字段栏中选择需要的的字段拖到右边的相关字段组中。(在“细节”中可以添加自定义的表或字段名称,添加完成后要想添加代码可以点“Coding for addition”(一个兰色按钮)这里添加的代码回我们自己添加的字段或表起作用,若是选择“Code”按钮,就是对全局进行操作。保存生成,功能区就创建完成。
三步:返回我们创建功能区的原始屏幕,点“Rode/User group assignment”选择相应的用户组(这里会出现我们刚刚创建的用户组,选上就可以了)。
四步:返回我们刚刚创建用户组的原始屏幕,选择我们刚刚创建的用户组的名称,点“Assign infsets”(分配用户和功能区)进行功能区的分配,选中我们刚刚创建的功能区,保存退出。五步:创建查询。用SQ01进入,输入程序的名称(即我们要创建的查询的名称)—创建——输入文本,在“Output format”中选择输出方式—点基进入下一屏幕的按钮选择相应的表—点基进入下一屏幕选择要输出的屏幕字段—点基进入下一屏幕,勾选要输出的屏幕字段保存,对各个字段的输出顺序进行排序(“SV”为范围选择“IZ”为单值)保存—点基“基本列表”在输出的屏幕字段中对输出的格式和字段进行调整,保存,测试,通过,OK!
Query-实例
TCD CODE: SQ03.
进入后输入用户组:
Query-实例
点击创建,出现如下窗口,输入用户组描述,点击保存.
Query-实例
出现如下画面后点击’分配用户和功能区:
Query-实例
输入用户名,保存退出
Query-实例
输入T-CODE SQ02,
输入功能区,点击创建:
Query-实例
输入名称,在按基础表的表连接栏,填入一个透明表名,点击继续.
Query-实例
出现如下画面,点击Insert table,插入其他相关透明表.可以更改表之间的关键字的链接.
Query-实例
点击后退
Query-实例
回车
出现如下画面,删除字段组02 凭证部分:商品;03 商品评估.
Query-实例
然后把所需要的字段拖到 字段组01 抬头:物料管理
双击字段可看到字段名,用来核对是不是透明表中的相应字段.
Query-实例
保存,退出,跳出如下窗口:点击’是’
Query-实例
点击用户组分配
Query-实例
选择用户组,点击保存
Query-实例
退出,输入TCD SQ01, 输入查询名,点击创建.
Query-实例
选择功能区,点击选择
Query-实例
Query-实例
输入标题,点击下一屏幕
Query-实例
选择字段组,点击下一页,然后再点击下一屏幕.
Query-实例
选择字段,点击下一页,再点击下一屏幕.
Query-实例
选择字段及顺序(最终查询界面),
保存,退出
Query-实例
点击基本列表
Query-实例
把数据字段加到右边栏中.
可以在左下脚修改栏的长度,也可在栏中拖动字段以调整顺序.
保存,点击测试.
Query-实例
点击继续
Query-实例
点击执行出现最终查询出的数据,点击更改可以隐藏一些字段.后退到如下界面
Query-实例
后退到如下界面
Query-实例
点击:查询---其他功能---生成程序
查询---其他功能---显示报表名.
Query-课后作业
自建2张数据库表
按照Query实例自建1个关联2张表的Query
SMARTFORMS-特征
SMARTFORM是在SAPScript的基础之上产生的一种新的FORM制作方式,它完全兼容SAPScript。在做SMARTFORM的过程中基本上不需要多少编程知识,它有一个图形界面来帮助我们完成工作。这个图形界面由三个部分组成,它们分别是:Form Painter、PC Editer、Table Painter。
SMARTFORMS-介绍
启动SMARTFORM设计的事务代码:SMARTFORMS,进入的界面如下:
SMARTFORMS-介绍
输入你要创建的SMARTFORM的名称,然后点击“创建”,进入下面的Form Builder界面:
注:上面另外两个选项 Style、Text module分别是用来定义FORM的样式和文本模块的。
SMARTFORMS-介绍
上面的屏幕分为三个部分:
Form Painter:主要用来设计SMARTFORM输出页面的格式,可以在页面上包含窗口和图(最右边) 形,还可以指定它们在页面上的位置以及它们的大小等。在图片左上角的工具栏有一个按钮可以用来显示和隐藏这个窗口。
PC Editer:主要用来初始化文本(TEXT)和域(FIELD),它包含的功能主要有以下几个方(中间) 面,1)输入、删除、选择、
Navigating in the SAP Form Builder:它主要用来显示一个SMARTFORM的层次结构。
(最左边) 当你在层次结构中选择了一个NODE(结点)后,在上面截屏的中间部分会显示这个NODE的MAINTENANCE屏幕。
SMARTFORMS-概念
FORM的结构:一个FORM往往是由页面(PAGES)、输出区域(OUTPUT AREAS即WINDOWS)、地址栏(ADRESS)、图形(GRAPHICS,比如公司LOGO)、数据(DATA)、以及文本内容(TEXT)组成。
主窗体和子窗体:(MAIN WINDOWSAND SUBWINDOWS)这是页面上两个不同的输出区域,用来输出数据,文本等内容。对于主窗体,你在一个FORM中只能定义一个窗体作为主窗体;不同PAGE上的主窗体必须宽度相同,但是高度可以不同;一个没有主窗体的PAGE指向的下一个页面不能为它自己。对于子窗体,它也可以在多个页面上面显示,但是那些不匹配SUBWINDOWS的值,子窗体不会将它们显示出来。
SMARTFORMS-实例
T-CODE SMARTFORMS,首先给要创建的SMARTFORM取名为ZTEST_HXG_F3,点击“创建”按钮
SMARTFORMS-实例
SMARTFORMS-实例
首先看一下这个截图的左上角:
FORM ATTRIBUTES:主要是这个窗体的一般属性和输出选择。
FORM INTERFACE:这个属性很重要!它主要用来描述这个SMARTFORM的接口属性,比如IMPORT、EXPORT、TABLES、EXCEPTION。当我们做好了一个SMARTFORM以后,如果想从ABAP程序中调用这个FORM的话,就会用到这些接口来传递参数,这个将在下面详细说明。
GLOBAL DEFINITIONS:主要用来定义一些全局的数据,还有FIELD SYMBOLS、初始化等。
SMARTFORMS-实例
当我们创建了ZTEST_HXG_F3的时候,系统会默认的建立一个页面(也就是刚开始在PAGES AND WINDOWS下面的%PAGE,它下面是一个MAIN WINDOWS)。现在我将它的名字改为FIRST ,描述改为“第一页“。然后在MAIN WINDOW上点击右键,如下图创建一个TABLE。
SMARTFORMS-实例
看图:这就是刚才我们定义的TABLE的MAINTENANCE屏幕。我们在这个屏幕上可以定义很多的内容,看到‘Table Painter’了吗?它是SMARTFORM中一个很重要的组成部分哦,我们将要在FORM中显示的表格,都是在这里定义的。
我们可以定义的内容有:TABLE的宽度,水平线对齐方式。
SMARTFORMS-实例
这个图用来定义TABLE的输出格式,比如现在我们定义了LINE1,我们定义了三个列,三个列的宽度分别都是4CM。但是请注意,当你制定这些列的宽度的时候,它们三个的列的和不能大于表格的宽度,否则系统会报错。当然这里我只定义了一个LINE TYPE,你还可以在下面定义很多的LINE TYPE。做完了这一步以后我们可以点击’Table Painter’进入这个屏幕看一下我们定义的表格的效果。
SMARTFORMS-实例
我们在屏幕上输出报表的时候,画表格,一般的表格都是由表头,还有内表的填充数据来组成,这里也不例外,比如我们就可以把我们定义的TABLE和内表联系起来,只需点击上面的“TABLE“边上的”DATA“选项卡,进去设置一下就可以了,取内表名为ITAB。具体设置如下图所示:
SMARTFORMS-实例
首先我们来定义表头HEADER,也就是各个列的列名:
SMARTFORMS-实例
首先选中上面这些内容,这样在就会在TABLE下面多处一个HEADER事件,如图所示:
SMARTFORMS-实例
这样我们就可以在HEADER下面定义各个列的名称了。这里我们以固定列(即三列)来演示!
SMARTFORMS-实例
在它下面首先要建立一个FOLER。你必须得为每一列都定义一个FOLDER,这里有三列,我们就在HEADER下面创建三个FOLDER。FOLDER结点的作用是用来合并一些相关结点的,并且它帮助我们很好的区分各个层次。建立好FOLDER之后,在每个FOLDER下面再创建一个TEXT。
SMARTFORMS-实例
这样就形成了这样一个层次结构。
要想显示成下面这个样子:
SMARTFORMS-实例
我们还得设置一两个地方:如图所示
SMARTFORMS-实例
表示接下来的两个FOLDER中的内容是和第一个FOLDER同处一行,但是是不同的CELL。
接下来的事情就是设置每一列的列名了,注意这里的列名是静态的文本。我以第一列为例子来介绍,其他两列类似,选中FOLDER1下的TEXT1
在椭圆选中的地方输入你想要取的列名,比如我这里就是取为:第一列。其他两列的列名类似,这里就不再赘述了。
SMARTFORMS-实例
在前面我们已经把这个SMARTFORM和内表ITAB连接起来了。接下来就看看通过SMARTFORM显示动态内容的情况!
首先我们在FORM INTERFACE中定义这个表的名字和其他参数
然后点击左上角椭圆选中的那个按钮,这样在左下角就会出现这个SMARTFORM的FIELD LIST。
SMARTFORMS-实例
同在TABLE的HEADER中定义一样,我们还要定义三个FOLDER和三个TEXT,定义好了图如下:
SMARTFORMS-实例
这几个FOLDER的设置和上面HEADER一样,唯一不同的就是这里每个FOLDER下面的TEXT的内容不是我们自己在上面输入“第一列“、”第二列“、”第三列“。而是如上图的箭头所示,从左边那个地方用鼠标按住以后拖到右边的箭头所指的那个地方。这样我们这列对应的数据就会是”动态“的。
做好了这一切以后,测试,没有错误,那么基本上一个简单的SMARTFORM就完成了。当一个SMARTFORM激活以后,系统就会自动给它分配一个FUNCTION MODULE。我们只需要点击“F8“直接运行这个SMARTFORM,就会进入这个界面:
SMARTFORMS-实例
上面这个FUNCTION MODULE就是我们做完了的SMARTFORM所对应。你可以在程序中调用这个SMARTFORM。下面就介绍一下在程序中如何写代码:
report z_hxg_007 .
data: itab like alsmex_tabline occurs 0 with header line.
data fm_name type rs38l_fnam.
data: num1 type i,
num2 type i,
num3 type i.
num1 = 1.
num2 = 2.
num3 = 3.
do 20 times.
itab-row = num1.
itab-col = num2.
itab-value = num3.
append itab.
clear itab.
num1 = num1 + 1.
num2 = num2 + 1.
num3 = num3 + 1.
enddo.
SMARTFORMS-实例
call function 'SSF_FUNCTION_MODULE_NAME' “这个FUNCTION主要是用来取你要调用的
exporting “ SMARTFORM对应的FUNCTION MODULE的
formname = 'ZTEST_HXG_F3' “名字然后赋值给FM_NAME,因为SMARTFORM
importing “对应的FUNCTION MODULE名字很长,并且
fm_name = fm_name “ 难以记忆
exceptions
no_form = 1
no_function_module = 2
others = 3.
call function fm_name “调用SMARTFORM,很显然这里是以FUNCTION
* EXPORTING “ MOUDULE的方式和SMARTFORM交互
tables
itab = itab “把ITAB内表的内容传递到SMARTFORM中去
exceptions
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4.
* others = 5.
SMARTFORMS-实例
运行程序,到达这个屏幕:
SMARTFORMS-实例
系统会提示你输入一个“输出设备”,随便输入一个,然后点击下面的“PRING PREVIEW”。
你就会看到最后的结果!如下图
SMARTFORMS-SMART样式
SMART样式用于设置段落格式和字符格式.
T-CODE SMARTSTYLES
SMARTFORMS-SMART样式
右击创建段落节点
SMARTFORMS-SMART样式
设置格式:
SMARTFORMS-SMART样式
格式设置:
SMARTFORMS-SMART样式
表头设置:设置默认的格式
SMARTFORMS-SMART样式
SMART样式的应用:
Smartforms中’样式’中选择自己做的SMART样式.
SMARTFORMS-创建logo
用制图工具创建1张文件类型为‘.bmp’的图片(logo)
SMARTFORMS-创建logo
T-CODE SE78 (import the image)
SMARTFORMS-创建logo
按红色提示操作
SMARTFORMS-创建logo
按红色提示操作
SMARTFORMS-创建logo
T-CODE SMARTFORMS
SMARTFORMS-创建logo
按红色提示操作
SMARTFORMS-创建logo
‘Name’栏中输入的值是刚才T-CODE SE78导入时的值
SMARTFORMS-创建logo
按红色提示操作
SMARTFORMS-创建logo
SMARTFORMS-创建logo
Save->activate->run
SMARTFORMS-课后作业
自建一个SMARTFORMS,其中包括LOGO;大小标题;具有几十条数据的表;
第几页/共几页
(本人的系统在预览的时候无法区分字体大小,抱歉)
SMARTFORMS-课后作业答案
SMARTFORMS设置如下:
接口参数:
SMARTFORMS-课后作业答案
布局:窗口1为大标题;窗口2为小标题;窗口3为底部(页码、用户签字等);窗口4是LOGO;主窗口为表内容
SMARTFORMS-课后作业答案
设置大标题内容,包括变量处理:
SMARTFORMS-课后作业答案
设置LOGO
SMARTFORMS-课后作业答案
设置页码:
SMARTFORMS-课后作业答案
表的设置:
SMARTFORMS-课后作业答案
实现代码:
REPORT Z_YAOWEI_ABAPTEST_SMARTFORM. TABLES:ZSYAOWEI_1. data: f_formname type tdsfname value 'ZSMYAOWEI_1'. "Smart form formname data: f_funcname type rs38l_fnam. "Smart form function name data:control_parameters type ssfctrlop. data:p_title(30) value 'YAOWEI_TEST_SMARTFORMS', P_SMALL_TITLE1(20) value 'small title 1 for report Z_YAOWEI_ABAPTEST_SMARTFORM', P_SMALL_TITLE2(20) value 'small title 2 for report Z_YAOWEI_ABAPTEST_SMARTFORM'. data:it_ZSYAOWEI_1 like table of ZSYAOWEI_1 with header line. do 50 times. it_ZSYAOWEI_1-field1 = sy-index. CONDENSE it_ZSYAOWEI_1-field1. CONCATENATE it_ZSYAOWEI_1-field1 '_field1_aaaaa' into it_ZSYAOWEI_1-field2. CONCATENATE it_ZSYAOWEI_1-field1 '_field2_bbbbb' into it_ZSYAOWEI_1-field3. CONCATENATE it_ZSYAOWEI_1-field1 '_field3_ccccc' into it_ZSYAOWEI_1-field4. append it_ZSYAOWEI_1. CLEAR it_ZSYAOWEI_1. enddo.
SMARTFORMS-课后作业答案
***open call function 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = f_formname IMPORTING fm_name = f_funcname. *control_parameters-no_dialog = 'X'. if sy-ucomm = 'PRIR'. control_parameters-preview = 'X'. else. control_parameters-preview = 'X'. endif. control_parameters-no_open = 'X'. control_parameters-no_close = 'X'. call function 'SSF_OPEN' EXPORTING control_parameters = control_parameters EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 others = 5. ***执行 call function f_funcname EXPORTING control_parameters = control_parameters p_title = p_title P_SMALL_TITLE1 = P_SMALL_TITLE1 P_SMALL_TITLE2 = P_SMALL_TITLE2 TABLES it_ZSYAOWEI_1 = it_ZSYAOWEI_1. ***close call function 'SSF_CLOSE' * IMPORTING * JOB_OUTPUT_INFO = exceptions formatting_error = 1 internal_error = 2 send_error = 3 others = 4 .
SMARTFORMS-课后作业答案
运行结果:
(本人的系统在预览的时候无法区分字体大小,抱歉)
文件的上传下载-TXT文本文件的下载
使用FUNCTION下载
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = v_downphz
filetype = 'DAT'
col_select = 'X'
col_selectmask = 'X'
mode = 'C'
TABLES
data_tab = i_download
EXCEPTIONS
file_open_error = 1
file_write_error = 2
invalid_filesize = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9.
page *
*
文件的上传下载- 文本文件的上传
上传文本
CALL FUNCTION 'UPLOAD'
EXPORTING
* CODEPAGE = ' '
FILENAME = 'C:\\商品主配分析表模板.XLS'
filetype = 'DAT'
TABLES
data_tab = IT_IMPORT
EXCEPTIONS
conversion_error = 1
invalid_table_width = 2
invalid_type = 3
no_batch = 4
unknown_error = 5
gui_refuse_filetransfer = 6
OTHERS = 7
.
文件的上传下载- 文本文件的下载
下载文本
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
* CODEPAGE = '8400'
FILENAME = 'C:\\商品主配分析表模板.XLS'
FILETYPE = 'DAT'
MODE = ''
TABLES
DATA_TAB = IT_HEAD.
page *
*
文件的上传下载- Excel文件的上载
将Excel文件的内容加载到内表
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = filename
i_begin_col = c_begin_col
i_begin_row = c_begin_row
i_end_col = c_end_col
i_end_row = c_end_row
TABLES
intern = it_excel.
page *
*
Excel文件的上载
注意:
Excel文件最多只能有9999行,如果数据多与9999行,则会忽略后面的列。
数据加载到内表后,是放在一个固定格式的内表中,内表中的数据要根据前两列的坐标值进行处理。
数据加载到内表后,可能含有固定的格式,要注意类型转换。
page *
*
OLE对象——将数据输出到Excel
为了方便报表数据的下载与保存,SAP创建了一组对象,将Excel程序与SAP紧密地集成在一起。可以通过SAP的OLE对象处理数据,将报表数据输出到Excel文件,方便用户的浏览与打印。
调用OLE对象时,SAP系统会调用用户计算机上的Excel程序,然后将数据传递给Excel程序,然后以指定的格式将数据用Excel程序显示出来。
OLE对象所在的类型池:TYPE-POOLS OLE2 .
page *
*
OLE对象——将数据输出到Excel
调用OLE对象时常用的变量
DATA: V_EXCEL TYPE OLE2_OBJECT, " Excel object
L_WINDOW TYPE OLE2_OBJECT, " list of workbooks
L_BOOKS TYPE OLE2_OBJECT, " list of workbooks
L_BOOK TYPE OLE2_OBJECT, " workbook
L_CELL TYPE OLE2_OBJECT, " cell object
L_FONT TYPE OLE2_OBJECT, " font object
L_COLUMN TYPE OLE2_OBJECT, " COLUMN OBJECT
L_ROW TYPE OLE2_OBJECT, " COLUMN OBJECT
L_RANGE TYPE OLE2_OBJECT, " RANGE OBJECT
L_FORMAT TYPE OLE2_OBJECT, " RANGE OBJECT
L_BORDER TYPE OLE2_OBJECT, " BORDER OBJECT
L_EDGEBOTTOM TYPE OLE2_OBJECT, " BORDER OBJECT
L_SHEET TYPE OLE2_OBJECT, " cell object
L_PAGESETUP TYPE OLE2_OBJECT, " font object
L_INTERIOR TYPE OLE2_OBJECT.
page *
*
OLE对象的使用
M_INIT '正在为输出到EXCEL作准备……'.
CREATE OBJECT V_EXCEL ''.
PERFORM FRM_ERR_HDL.
M_INIT '正在创建EXCEL进程……'.
CALL METHOD OF V_EXCEL 'Workbooks' = L_BOOKS NO FLUSH.
PERFORM FRM_ERR_HDL.
* 创建一个sheet
CALL METHOD OF L_BOOKS 'Add' = L_BOOK NO FLUSH.
PERFORM FRM_ERR_HDL.
CALL METHOD OF V_EXCEL 'ActiveWindow' = L_WINDOW NO FLUSH.
PERFORM FRM_ERR_HDL.
M_SET_PROPERTY L_WINDOW 'DisplayZeros' 0.
M_INIT '正在创建工作表……'.
M_SET_PROPERTY V_EXCEL 'Visible' 0.
page *
*
OLE对象的使用
调用OLE对象,对Excel输出的基本格式进行设置。
*/-------------------------------------------------
* 设置所有单元格的属性
CALL METHOD OF V_EXCEL 'Cells' = L_CELL NO FLUSH.
PERFORM FRM_ERR_HDL.
M_SET_PROPERTY L_CELL 'HorizontalAlignment' 3.
M_SET_PROPERTY L_CELL 'VerticalAlignment' 2.
GET PROPERTY OF L_CELL 'Font' = L_FONT NO FLUSH.
PERFORM FRM_ERR_HDL.
M_SET_PROPERTY L_FONT 'Name' '宋体'.
M_SET_PROPERTY L_FONT 'Size' 9 .
M_SET_PROPERTY L_CELL 'WrapText' 1.
page *
*
OLE对象的使用
给固定的列指定属性。
FORM F_GETCOLUM.
DO N TIMES.
WHEN ..
TEM_COL = '8'.
CALL METHOD OF V_EXCEL 'Columns' = L_COLUMN NO FLUSH
EXPORTING #1 = TEM_STEP.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_COLUMN 'ColumnWidth' = TEM_COL NO FLUSH.
PERFORM FRM_ERR_HDL.
ENDDO.
ENDFORM.
page *
*
OLE对象的使用
*对大标题所在行进行属性设置
CALL METHOD OF V_EXCEL 'Range' = L_RANGE NO FLUSH
EXPORTING #1 = 'A1' #2 = 'N1'.
PERFORM FRM_ERR_HDL.
M_SET_PROPERTY L_RANGE 'MergeCells' 1 .
M_SET_PROPERTY L_RANGE 'HorizontalAlignment' 3.
M_SET_PROPERTY L_RANGE 'VerticalAlignment' 2.
GET PROPERTY OF L_RANGE 'Font' = L_FONT NO FLUSH .
PERFORM FRM_ERR_HDL.
M_SET_PROPERTY L_FONT 'Bold' 2 .
M_SET_PROPERTY L_FONT 'Size' 20.
M_SET_PROPERTY L_RANGE 'Value' V_TITLE.
*标题行第二行('填报单位'一行) 进行设置
PERFORM ROW_HIGH USING 3 '22'.
M_SET_PROPERTY L_FONT 'Size' 20 .
PERFORM FRM_ERR_HDL.
page *
*
OLE对象的使用
对每一行的数据进行处理。
FORM F_RESULT USING P_V_LINES.
DATA: TEM_LINES(4),
TEM_CHAR(5),
TEM_CHAR1(5).
LOOP AT I_OUT.
TEM_LINES = P_V_LINES.
CONDENSE TEM_LINES.
CLEAR TEM_CHAR.
CONCATENATE 'C' TEM_LINES INTO TEM_CHAR.
CONCATENATE 'D' TEM_LINES INTO TEM_CHAR1.
PERFORM ROW_HIGH USING P_V_LINES '15'.
PERFORM DOWN USING P_V_LINES 1 I_OUT-PRCTR 2.
..
* 设置行高
PERFORM ROW_HIGH USING P_V_LINES '15'.
P_V_LINES = P_V_LINES + 1.
CLEAR I_OUT.
ENDLOOP.
ENDFORM.
page *
*
OLE对象的使用
FORM FRM_EXCEL_PRINT
USING L_PAGERSIZE " 纸张型号(9--A4纸)
L_ZOOM " 缩放比例(1-100)
L_ORIENTATION " 1-竖排 2-横排
L_TOPMARGIN " 顶部空白尺寸
L_BOTTOMMARGIN " 底部空白尺寸
L_VALIGN. " 垂直方向是否居中
DATA: L_SHEET TYPE OLE2_OBJECT, " cell object
L_PAGESETUP TYPE OLE2_OBJECT. " font object
* set print properties.
CALL METHOD OF V_EXCEL 'ActiveSheet' = L_SHEET.
PERFORM FRM_ERR_HDL.
GET PROPERTY OF L_SHEET 'PageSetup' = L_PAGESETUP.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'PaperSize' = L_PAGERSIZE.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'Zoom' = L_ZOOM.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'Orientation' = L_ORIENTATION.
OLE对象的使用
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'LeftMargin' = 0.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'RightMargin' = 0.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'TopMargin' = L_TOPMARGIN.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'BottomMargin' = L_BOTTOMMARGIN.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'HeaderMargin' = 0.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'FooterMargin' = 0.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'CenterHorizontally' = 1.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'CenterVertically' = L_VALIGN.
PERFORM FRM_ERR_HDL.
SET PROPERTY OF L_PAGESETUP 'Order' = 2.
PERFORM FRM_ERR_HDL.
* free object.
FREE OBJECT L_SHEET.
FREE OBJECT L_PAGESETUP.
ENDFORM. " frm_excel_print
page *
*
OLE对象的使用
设置单元格的边框属性。
FORM BORDER USING X Y.
L_C1 = X.
L_C2 = Y.
CONCATENATE 'A' L_C1 INTO L_C1.
CONCATENATE 'N' L_C2 INTO L_C2.
CALL METHOD OF V_EXCEL 'Range' = L_RANGE NO FLUSH
EXPORTING #1 = L_C1 #2 = L_C2.
PERFORM FRM_ERR_HDL.
* 设置边界线
**设置外框左边(xlEdgeLeft)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '7'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
**设置外框上边(xlEdgeTop)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '8'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
OLE对象的使用
**设置外框下边(xlEdgeBottom)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '9'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
**设置外框右边(xlEdgeRight)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '10'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
**设置内框垂直(xlInsideVertical)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '11'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
**设置内框水平(xlInsideHorizontal)线条的线型和粗细
CALL METHOD OF L_RANGE 'BORDERS' = L_BORDER EXPORTING #1 = '12'.
SET PROPERTY OF L_BORDER 'LineStyle' = '1'.
SET PROPERTY OF L_BORDER 'WEIGHT' = 2. "4=max
ENDFORM. " border
page *
*
OLE对象
注意:
每个单元格的属性都需要一设置,如果报表数据量非常大,此程序执行效率会非常低下,不建议使用OLE对象下载数据。
page *
*
文件的上传下载-将相应的数据写到指定的服务器目录
在服务器指定目录生成文件
OPEN DATASET v_file FOR OUTPUT MESSAGE v_message.
IF sy-subrc = 0.
LOOP AT i_text.
CLEAR l_str.
CONCATENATE i_text-field v_tab INTO l_str.
TRANSFER l_str TO v_file.
ENDLOOP.
CLOSE DATASET v_file.
page *
*
文件的上传下载-将相应的数据写到指定的服务器目录
注意:
打开文件时,如果是写入数据,则用FOR OUTPUT
OPEN DATASET时,最好指定字节模式,如果不指定,默认是文本模式。
OPEN DATASET事件后面,处理结束后,要跟上CLOSE DATASET语句。
重新打开此文件写入数据时,会指定文件开始的位置,并会删除文件现有的内容。
打开此文件读取数据时,也会指到文件开始的位置。
page *
*
文件的上传下载-读取文件数据
读取服务器上指定文件的内容
OPEN DATASET FNAME FOR INPUT IN BINARY MODE. DO. READ DATASET FNAME INTO TEXT2 LENGTH LENG. WRITE: / SY-SUBRC, TEXT2, LENG. IF SY-SUBRC <> 0. EXIT. ENDIF. ENDDO. CLOSE DATASET FNAME.
page *
*
文件的上传下载-给指定的文件追加数据
OPEN DATASET <dsn> FOR APPENDING .
给文件追加数据
OPEN DATASET FNAME FOR APPENDING. NUM = 0. DO 5 TIMES. NUM = NUM + 10. TRANSFER NUM TO FNAME. ENDDO.
page *
*
文件的上传下载- TEXT MODE与BINARY MODE的区别
TEXT MODE
使用这种模式访问文件时,数据一行一行的传输.系统默认为文件有一个行结构.
在每一个TRANSFER语句中,系统传输所有的字节(除了末尾的空格外)给文件,并在行尾放一个结束标识.
你应该只用TEXT MODE,如果你想把字符串写到文件中或者你访问的文件有一个固定的行结构.你可以用这种模式访问服务器上任何编辑器创建的文件.
BINARY MODE
如果你用BINARY MODE模式访问文件时,数据一个字节一个字节地传输。传输时系统不解析文件的内容。你把一个字段内容写到文件时,系统传输这个源字段的所有字节,而你从文件读取到字段时,传输的字节依告目标字段的长度。如果你用其他ABAP语句寻找目标字段时,系统会根据这个字段的类型来解析字段内容。
文件的上传下载-课后作业
创建一个内表,其中包括若干数据,把内表的数据导出到本地TXT文本
新建一个Excel文件,其中包括若干行的数据,把该Excel数据导入到内表中
用OLE2技术编写一个有大小标题、表标题和数据、合并单元格的Excel文件
Function、Function Group的开发与使用
在程序中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数,即Function。
创建以及查看函数的事务代码为SE37。
在运行时共享相同程序上下文的逻辑上关联的函数模块的分组。函数组是它包含的函数模块的主程序。使用相同数据的函数通常被指定到相同的函数组中。可以在函数制作器里创建函数组。
Function的创建
事务代码SE37。
自创建的函数应以Z开头。
Function的创建
设定输入参数。
Function的创建
设定输出参数。
Function的创建
添加程序代码。
Function的创建
如果是远程调用函数(Remote Function Call)需要在属性(Attributes)栏位里面勾选中激活远程模式选项(Remote-enabled module)
Function的调试
保存并激活后即可在程序代码中使用已创建好的函数。
也可以在SE37中直接调试测试此函数。点选单次测试按钮或F8。
Function的调试
在“输入参数”的栏位输入测试数值。
点选“执行”或“调试”。
Function的调试
输出参数中显示出所输入的数据执行后的结果。
Function的使用
Function在程序中通过Call Function语句进行调用。
例如:
CALL FUNCTION 'SG_PS_GET_LAST_DAY_OF_MONTH'
EXPORTING
DAY_IN = PUT_IN(此处可输入常量或变量)
IMPORTING
LAST_DAY_OF_MONTH = newdate(此处为输出的结果)
Function的使用
通过系统选择来调用函数
Function的使用
调用的结果(给所需要的输入输出赋自己的参数):
Function-课后作业
在培训系统中创建函数,要求输入一个合法日期,进行输入合法性检查(不合法的输入值要返回错误信息),输出该日期所在期间的第一天和最后一天(即月初和月末两个日期)。
在SE37中通过调试模式进行调试和修改。
创建一个简单程序,以此函数的输入值为选择条件,在程序中调用此函数,输出函数的输入值和输出值或错误信息。
有条件的可以试行通过外部系统(JAVA、VB等语言)远程调用函数。
BDC的概念
Batch Input是一种数据批量输入SAP系统的辅助程序,SAP系统的资料、格式可以通过Batch Input录入SAP系统
Batch Input的机制是模拟事务处理将数据录入R/3系统
Batch Input类似SAP的CATT,控制性更好,处理能力更强
BDC的创建
首先我们需要把需要批导入事务的操作步骤记录下来,可以用T-CODE“SHDB”来记录。
在COMMAND LINE中输入“SHDB”。
BDC的创建
进入TRANSACTION RECORDER界面 。
BDC的创建
点“NEW RECORDER”创建一个记录,现在以修改订单为例,键入记录名“ZAMAO”,输入事务代码“VA02”,
然后“START RECORDING”。
BDC的创建
下面的任务就是记录下修改订单的操作步骤。
BDC的创建
填入订单号码,按确定
BDC的创建
现在来增加一下订单的PO DATE。
BDC的创建
填入“”,点“保存”。
BDC的创建
这样就完成了一个最最简单的BDC录取工作,录完之后会出现系统运行的操作的跟踪,包括程序号,屏幕号,字段名,值等等,下面的任务是根据这些写到程序里面以完成SAP自动跑订单修改的这一动作。
BDC的创建
首先必须定义BDC变量:
* BDC table DATA: t_bdc LIKE bdcdata OCCURS 0 WITH HEADER LINE, t_bdcmsg LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE. DATA: BEGIN OF t_log OCCURS 0, information(289) TYPE c, "返回信息 END OF t_log. DATA: v_mode TYPE c VALUE 'N'.
其中TABLE t_bdc中记录的具体的操作步骤,而TABLE t_bdcmsg是记录系统返回的信息,成功与否都记录到自定义的信息表t_log中。
BDC的创建
先写个记录BDC的函数:
FORM. fm_set_bdc TABLES t_bdc STRUCTURE bdcdata USING u_sign TYPE c u_par1 u_par2.
CLEAR: t_bdc. IF u_sign = 'X'. t_bdc-program = u_par1. t_bdc-dynpro = u_par2. t_bdc-dynbegin = u_sign. ELSE. t_bdc-fnam = u_par1. t_bdc-fval = u_par2. ENDIF. APPEND t_bdc. ENDFORM.
BDC的创建
然后写入T_bdc:
PERFORM. fm_set_bdc: TABLES t_bdc USING 'X' 'SAPMV45A' '0102', TABLES t_bdc USING ' ' 'BDC_OKCODE' '/00', TABLES t_bdc USING ' ' 'VBAK-VBELN' it_display-vbeln, TABLES t_bdc USING 'X' 'SAPMV45A' '4001', TABLES t_bdc USING ' ' ' VBKD-BSTDK' ''.
因为此处是修改操作,所以要切记写入的只是你修改的数据,千万别把订单本来的数据也写入t_bdc,如果写入则会把需要修改的所有订单都该成举例的订单的数据,而我们需要修改的仅仅是增加一个PO DATE“”。
BDC的创建
然后是调用事物代码:
CALL TRANSACTION 'VA42' USING t_bdc MODE v_mode "Background performance UPDATE 'S' "local updata MESSAGES INTO t_bdcmsg. "all message table
v_mode是显示模式:
“A”表示显示每一步操作步骤,
“N”表示不显示步骤,
“E”表示当出现错误的时候显示出错的位置。
系统信息写入到t_bdc中。
BDC的创建
最后是收集系统信息(成功与否,要是失败,失败的原因)并输出到SAP程序屏幕
READ TABLE t_bdcmsg WITH KEY msgtyp = 'S' msgid = 'V1' msgnr = '311'. "批导入成功的标志,可以自己debug表t_bdcmsg中去找. IF sy-subrc EQ 0. CONCATENATE '订单号码:' it_display-vbeln ',项目号:' it_display-posnr '修改成功' INTO t_log. APPEND t_log. CLEAR t_log. ELSE.
BDC的创建
LOOP AT t_bdcmsg. IF t_bdcmsg-msgtyp = 'E' OR t_bdcmsg-msgv1 <> '' OR t_bdcmsg-msgv2 <> '' OR t_bdcmsg-msgv3 <> '' OR t_bdcmsg-msgv4 <> ''. MESSAGE ID t_bdcmsg-msgid “收集错误信息,并写入自定义的表t_log中。 TYPE 'S' NUMBER t_bdcmsg-msgnr WITH t_bdcmsg-msgv1 t_bdcmsg-msgv2 t_bdcmsg-msgv3 t_bdcmsg-msgv4 INTO t_log-information. CONCATENATE '订单号码:' it_display-vbeln ',项目号:'
it_display-posnr '出错:' t_log-information INTO t_log-information. APPEND t_log. CLEAR t_log. ENDIF. ENDLOOP. ENDIF.
BDC的创建
LOOP AT t_log. "显示出错信息
WRITE:/ t_log-information.
ENDLOOP.
输出出错信息后,一个批导入程序基本完成。
练习题
选择自己最熟悉的SAP业务操作,用SHDB创建一个BDC,仿照例子创建一个BDC程序。
有条件的可以结合“文本文件的上传下载”部分的内容,将批导入的数据从文本中上传到BDC程序中。
LSMW的概念
在SAP系统中,批处理操作有多种方法。如果是对一个事物码(TCODE)进行批处理操作,常用的是LSMW。LSMW全称是Legacy System Migration Workbench。它能够对静态数据(如各个主数据)、动态数据(如初始化库存)、业务数据(如销售订单)等进行成批操作,是上线数据准备的主力武器。
LSMW的原理是对需要批处理操作的流程进行录像,然后设定模板,再将准备好的数据传入到SAP系统进行预转换,如果合适就进行实际的转换。
LSMW导入数据操作分为以下几大步骤:
准备需要导入的数据
转换模板定义;
读取数据并预转换
实际转换
LSMW的概念
LSMW的创建
批导入的事物码(TCODE)就是LSMW,在主窗口界面输入就可以进入
LSMW的创建
进入到LSMW的管理界面(我们暂且以“管理界面”来命名)
LSMW的创建
这个界面主要解决以下几方面问题:
(1)批导入对象的管理,包括新增、修改、删除、查找、导出、导入等操作。
(2)进入到其它工作界面,主要有录像操作界面、分步操作界面。
我们如果要进行一个批处理操作,则需要输入或通过选择确定Project、Subproject、Object,如图所示,然后再进行具体的操作。
LSMW的创建
按 运行键进入分步操作界面,如图所示。
LSMW的创建
在上图中显示了分步操作的菜单,用鼠标双击各菜单行可进入不同界面。这里共有20个步骤,在实际操作中我们不需要这么多,只需要14个就可以了,点击键进入选择用户菜单的对话框,如图所示。
LSMW的创建
做一个完整的批处理操作,需要很多步骤。这些步骤分为几大部分:
1.数据准备(步骤1)
2.创建批处理对象(步骤2)
3.模板定义(步骤3至步骤9),此部份又可分为三个小部份
屏幕录像(步骤3)
源表定义(步骤4至步骤6)
转换字段对应(步骤7至步骤9)
4.预转换(步骤10至步骤15),此部份又可分为两个小部份
读取源表数据(步骤10至步骤13)
预转换(步骤14至步骤15)
实际转换(步骤16至步骤18)
在以上操作中,除前三个步骤外,步骤4至步骤18均在分步操作界面下运行。
LSMW的创建
步骤1:数据准备
数据准备一般使用Excel整理数据,并转换成标准文本。我们以创建物料主数据(事物代码MM01)的基本视图为例。
物料主数据的基本视图我们需要输入以下字段的数据:
物料编码
物料名称
计量单位
物料组
T3-AT-050
A型T三通50mm
只
0501
T3-AT-250
A型T三通250mm
只
0501
T3-AT-300
A型T三通300mm
只
0501
T3-AT-350
A型T三通350mm
只
0501
T3-AT-400
A型T三通400mm
只
0501
T4-AT-025
A型T四通25mm
只
0502
T4-AT-040
A型T四通40mm
只
0502
T4-AT-060
A型T四通60mm
只
0502
LSMW的创建
对于每种物料,它的物料编码、物料名称、物料组是不尽相同的,这需要设为变量;而计量单位全部为“只”,可以设为常量。我们将变量的数据放入Execl表中,如图,第一行是字段的名称,不可使用汉字,只能使用英文字母,其中“物料编码”对应的是“MCODE”;“物料名称”对应的是“MNAME”;“物料组”对应的是“MATKL”;“计量单位”是常量,不需要放入表中。MATKL的列的单元格式设为文本字段,不要选择常规或数字,否则“0501”就会变成“501”。
LSMW的创建
将整理好数据的Execl表另存为txt文件,用制表符分隔。
用文本方式打开已保存好的文件(“物料数据.txt”),如图所示,显示出数据已准备好,各字段之间是以Tab键分隔的(记住Tab键这点很重要,以后需要对应设置)。
LSMW的创建
步骤2:创建批处理对象
一个批处理对象是个树形结构,包括三层:Project、Subproject、Object,我们分称为项目、子项目、对象。本步骤就是创建一个批处理对象(Object)。如果此对象(Object)已存在,可以不用创建,用输入或选择的方法找到指定的对象。
在主界面输入事物码LSMW,进入系统工作界面,如图
LSMW的创建
输入需要创建的项目对象名称。批处理对象命名分为三层,分别为项目名(Project)、子项目名(Subproject)、对象名(Object)。
LSMW的创建
本例中我们给对象命名为:物料(Z_MANTR)、物料(MANTR)、基本视图(BASIC)。
点击创建按钮输入相应短文本描述,如图
LSMW的创建
在上图所示对话框中,输入项目的描述,按键进入下一屏幕,如图所示。
LSMW的创建
在上图所示对话框中,输入子项目的描述,按键再进入下一屏幕,如图
LSMW的创建
在上图所示对话框中,输入对象的的名字,再按键保存退出对话框,如图所示,批处理对象就创建成功了。
LSMW的创建
点击 显示对象命名信息,如图所示。
LSMW的创建
步骤3:屏幕录像并定义变量(上)
在管理界面点击菜单 goto -> recordings 进入屏幕录像界面,如图所示。
LSMW的创建
进入了录像界面,点击键创建录像,弹出对话框如图
在图所示对话框中,需输入录像名称(recording)及描述(Description)。所有者(Owner)是自带出来的值,可不用管理。本例录像名称为MMBASIC。
LSMW的创建
进入下一屏,弹出对话框
输入需要录像的事物代码,本例为创建物料主数据,事物代码MM01。
LSMW的创建
进入事物代码的操作录像。
录像的数据是准备数据中的第1个(当然可以是任意一个),物料编号为“T3-AT-050”,物料名称为“A型T三通50mm”,计量单位为“只”,物料组为“0501”。录像的屏幕如图所示。
LSMW的创建
输入物料编号“T3-AT-50”,并选择行业领域(M 机械工程)、物料类型(FERT 成品)等相应的值,按回车键进入选择组织级别视图。
LSMW的创建
LSMW的创建
LSMW的创建
在上图所示的基本视图2界面中,不需要输入任何值,按回车键保存,界面弹出是否保存的对话框,如图所示,按“是”键保存退出。
LSMW的创建
步骤3:屏幕录像并定义变量(下)
录像后返回LSMW的操作界面,如图,每一图代表刚才操作步骤的一个界面当中的输入和操作
LSMW的创建
LSMW的创建
LSMW的创建
LSMW的创建
LSMW的创建
以下需要定义变量,本例中的变量有物料编号,物料名称。计量单位是默认值(只),不需要定义为变量。
如图所示,用鼠标选中物料编号行,图上“T3-AT-50”,点击 定义为变量。
LSMW的创建
定义了一个变量,变量名称为“MATNR”,描述为“物料号”。如需要改变,双击此行(本例中点击“T3-AT-50”),弹出对话框,如图
LSMW的创建
相同方法,在屏幕4004中(第一个)再定义物料描述和物料组,如图所示。基本计量单位是常量值(只),可以不用设为变量。
LSMW的创建
在第二个4004屏幕(基本视图2)中又有一个“T3-AT-50”,需要选中后删除(按 ),如图所示。如果不删除,那么它就成为常量值,所有物料创建到基本数据2的屏幕时,它的物料描述就都会变成“T3-AT-50”,这就不对了。
LSMW的创建
以上变量设定完成后按保存键退出,返回到管理界面
LSMW的创建
步骤4:定义对像属性
在以下步骤中,我们将从管理界面进入到分步操作界面。
在管理界面点击 键,进入分步操作界面,如图所示。
LSMW的创建
这一步骤是定义对象的属性,主要是将对象指明录像的名称。用鼠标双击Maintain Object Attributes进入到定义对象属性界面。
LSMW的创建
如果进入的界面是显示状态,请点击编辑按钮,进入编辑状态,如图所示。这个界面只需要按图所示选中“Batch Input Recording”项,并选择录像名就可以了。由于我们只有一个录像,一按弹出键就会显示;如果我们有多个录像,则弹出一个对话框让我们选择。按键返回分步操作界面。
这时分步操作的界面的右部显示了一行,表示最后操作的日期、时间和操作者,如图
LSMW的创建
步骤5:定义源表结构名称
此步骤定义源表的结构名称,在分步操作界面用鼠标双击Maintain Source Structures进入操作界面,如图
LSMW的创建
步骤6:定义源表字段结构
此步骤是在 LSMW 对象中定义源表的数据结构,也就是定义第1个步骤数据准备时的字段信息。
在分步操作界面,用鼠标双击Maintain Source Fields,进入定义源表字段结构界面。如图所示。如果进入的是显示状态,按进入修改状态。
LSMW的创建
选中源数据结构名称(”OIL_MANTR”)点击 进入字段编辑界面
LSMW的创建
上图显示了源表结构输入界面,共有4列,需要分别填写:
1.字段名(Field Name):输入源表中的字段名,详见EXCEL表中的表头。
2.类型(Type):数据类型,C为字符型。
3.长度(Length):字段长度,可尽量大一些。
4.描述(Field Description):字段描述,可选项。
填写的内容就是步骤1数据准备时的表字段,如下图所示,上部为Execl表信息,下部为本步骤中填写的字段信息。Execl表中有什么字段,那么本步骤就按顺序填写什么字段,并给出字段类型(一般为字符型C)和字段长度(相对大一些为好)。
LSMW的创建
LSMW的创建
以上填写清楚按保存键保存并按返回键返回本步骤开始界面,界面上显示已创建的字段信息,如图,再退回到分步操作界面。
LSMW的创建
步骤7:源表结构与录像关联
本步骤定义源表结构与录像之间的关系。在分步操作界面双击Maintain Structure Relations进入操作界面
LSMW的创建
步骤8:源表字段与录像字段关联
本步骤需要将源表的字段结构与录像中定义的变量相关联。在分步操作界面用鼠标双击Maintain Field Mapping and Conversion Rules,进入源表及录像字段关联操作界面
LSMW的创建
上图显示了在录像MMBASIC中定义的3个变量,如不记得请查看步骤3。选中“MATNR”字段,点击按钮,弹出源表字段列表对话框,如图
LSMW的创建
在上图所示的源表字段列表对话框中,选中录像中“MATNR”字段对应的源表字段“MCODE”,按键确认退出。此时屏幕弹出对话框,如图所示,提示源表字段比目标表字段长,可不必管理,继续按键确认退出。此时操作界面如下图所示。
LSMW的创建
LSMW的创建
依次类推,分别将物料描述和物料组分别对应,全部完成后界面如图
LSMW的创建
返回分步操作界面,屏幕弹出对话框,如图,提示是否保存,按“是”返回分步操作界面。
LSMW的创建
步骤9:固定值,转换条件,用户定义
在此步骤中可以设定录像中字段的值来源,除对应源表字段外,在此步骤中还可以设定为固定值、转换条件、或是更为复杂的用户定义(用ABAP编程)。一般使用可跳过此节。
如需进入请在分步操作界面用鼠标双击Maintain Fixed Values, Translations, User-Defined Routines。
LSMW的创建
步骤10:指定源表文件
本步骤指定源表的文件,也就是在步骤1中生成的文本文件(“物料数据.txt”)。在分步操作界面用鼠标双击Specify Files进入操作界面,如图
LSMW的创建
在本步骤中要指定三个值,其中一个需要手工指定,两个自动生成。手工指定的“Legacy Data”,自动生成的是“Imported Data”、“Converted Data”。点击进入修改状态,如图
LSMW的创建
在上图中显示了自动创建两个系统文件。其中“Imported Data”设定了导入的数据文件名;“Converted Data”设定了转换的数据文件名。这两个数据文件都在本机上。
用鼠标先指定“Legacy Data”行,再用鼠标点击创建,屏幕弹出设定源表文件的对话框,如图
LSMW的创建
在上图中,“File”项输入源表的文件名(步骤1中的物料数据.txt文件);“Name项输入说明,可为任意值,但不能不输入。“Separators”指定文件的分隔符,我们的文件的分隔符是Tab键,所以选中Tabulator,可参见步骤1;“Field Name At Start Of File”项指定第一行是否有字段名,我们的txt文件的第一行是字段名,所以需要选中。“Field Order Matches Source Structure Definition”项指定字段顺序是否与源表数据相同,我们进行选中处理。
全部填写和选择完成后,按后退键确认退回到操作界面,如下图
LSMW的创建
LSMW的创建
步骤11:指定文件
本步骤是指定源表数据结构和对应的数据文件(.txt)。在分步操作界面用鼠标双击Assign Files,进入操作界面,如图
LSMW的创建
步骤12:读取数据
此步骤是将源表数据读取进本机的系统文件,也就是步骤10指定源表文件中的“Imported Data”指定的文件。在分步操作界面用鼠标双击Import Data,进入操作界面,如图
LSMW的创建
在上图中第一行填写要读取的起止行数,如不填则全读取,按运行键执行。执行完毕界面显示如图所示,表示正确读取了8行数据。再按键返回到分步操作界面。
LSMW的创建
步骤13:显示读取的数据
本步骤就是显示上一步骤读取的数据。在分步操作界面用鼠标双击Display Imported Data,弹出对话框,如图
LSMW的创建
上图“From Line”项和“To Line”要求填写显示的开始行数和结束行数,如不填写则显示全部。按键进入显示数据界面,如图
LSMW的创建
显示了上一步骤读取的数据,共有8行。用鼠标双击任意一行,比如第1行,显示详细信息,如图
LSMW的创建
步骤14:转换数据
本步骤是将读进系统文件的数据进行转换,存放在步骤10指定源表文件“Converted Data”指定的转换文件中。本步骤和下一步骤显示可以查看转换是否正确,如不正确可返回到以前步骤进行操作。本步骤操作的数据不会在SAP系统中真正执行。
在分步操作界面用鼠标双击Convert Data,进入操作界面,如图
LSMW的创建
输入转换的开始和结束行数,如不填写则全部转换。按执行键执行。执行完毕屏幕显示转换结果,如图
LSMW的创建
步骤15:显示转换数据
本步骤就是显示上一步的以预转换结果。在分步操作界面用鼠标双击Display Converted Data,弹出对话框,如图所示。
LSMW的创建
填入显示的开始行和结束行,如不填则全部显示。和步骤13显示读取的数据一样,“From Line”项和“To Line”要求填写显示的开始行数和结束行数,如不填写则显示全部。按键进入显示转换数据界面,如图
LSMW的创建
步骤16:创建转换任务
此步骤开始实际转换。本步骤是创建一个转换任务但不实际转换,并将转换的数据存放到SAP服务器端。在分步操作界面用鼠标双击Create Batch Input Session,进入操作界面,如图
LSMW的创建
在Keep Batch Input Folder(s)项打上勾。按运行键执行。运行后显示对话框,如图所示创建成功,再按键返回到分步操作界面。
LSMW的创建
步骤17:执行转换任务
本步骤进行实际的转换。在分步操作界面用鼠标双击Run Batch Input Session,进入操作界面,如图
LSMW的创建
显示已创建的转换任务,尚未执行。用鼠标选中此任务,并按键,弹出执行选择对话框,如图所示。
LSMW的创建
对话框中,运行模式Processing Mode有三个可选项
1.处理/前台:每个事物代码运行在前台,可一步一步运行,可在运行时修改,可看其效果,并可以修改,但速度慢,一般用于测试。有机会对其专门论述。
2.仅显示错误:后台运行,错误时显示到前台。
3.不可见:后台运行,错误时也不报出,在全部运行完后可通过查看转换结果看到错误。
本次操作选择“不可见”,再选中专家方式。按 执行。
转换任务是在后台SAP服务器上运行,客户端可退出。
LSMW的创建
步骤18:查看执行结果
等任务执行完毕我们可以查看批处理的结果。也可以在执行过程中查看,当然数据是不完整的,但可以看到已执行部份的情况。
和上一步一样,在分步操作界面用鼠标双击Run Batch Input Session再次进入转换界面。如下图所示,任务条的状态是已完成但有错,成功7条,错误1条。
LSMW的创建
LSMW的创建
用鼠标选中此任务,双击显示转换结果,如图
LSMW的创建
屏幕表明索引号为2至8项运行成功(Processing),第1项失败(Incorrect)。点击“显示”组中的“Incorrect”项,只显示不成功的索引,如图
练习题
将刚才BDC的练习题当中的业务和数据,通过LSMW的方式制作。
接口技术介绍
接口技术介绍
SAP所提供的外部接口包括程序通信接口、文件I/O接口以及数据接口。
数据接口用于在系统内部对程序运行时数据和数据库数据进行传递,其实现技术包括批输入、SAP SQL等。程序通信接口和文本I/O接口则是与其他系统进行数据交换的通路。文件I/O实现文件中数据和运行时数据间的交换。RFC位于程序通信接口中,以实现外部程序对SAP系统内部数据的访问。
接口技术介绍-Remote Function Call(RFC)
RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议.简单的说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP程序.这种远程功能调用也可在同一系统内部进行(如本地SAP系统内的远程调用);但通常情况下,调用程序和被调用程序处于不同系统.
接口技术介绍-RFC通信模式
在网络技术中,数据通信可以大致划分为两种基本模式:同步通信和异步通信。其本义是:异步通讯时,通信双方时钟允许存在一定的误差;同步通信时,双方时钟的允许误差较小。在SAP的系统间通信过程中,也借用术语同步通信和异步通信,但其主要差异在于调用系统是否需要立即接收返回结果。着两种通信模式各有局限性,不同的应用适用于不同的通信模式。
接口技术介绍-RFC
接口技术介绍- RFC Automation Server
一个独立运行在Windows平台下的组件。它能够为不同的OLE Automation Client(例如VB、Access、Excel等)建立与R3服务器的连接。
接口技术介绍- Electronic Date Interchange(EDI)
EDI是不同应用间进行电子数据交换的结构型数据,基于EDIFACT或ANSI 等格式
接口技术介绍
T-CODE SM59建立RFC的连接
接口技术介绍-BAPI
BADI 是 Business Application Programming Interfaces 的缩写,即业务应用编程接口。它是一种新的功能增强概念,使用 ABAP 对象技术。这是一种使用面向对象的方法来进行 SAP 增强。实现 BADI 要用到类、接口及方法等面向对象的概念。
BAPI在SAP内部组件及SAP与非SAP组件之间的技术整合和业务数据交换过程中起着非常重要的作用。SAP通过BAPI实现组件间的信息和数据交换,并通过该标准接口把整个系统链接为一个整体。BAPI是SAP中心组件R/3和ECC以及BW系统的入口之一。
要对一个 SAP 应用程序进行增强,必须首先定义 BADI。为 BADI 创建一个接口,接着创建一个适配器类(Adapter Class)来实现这个接口, 然后创建这个适配器类的实例。
接口技术介绍-创建和调用BAPI实例
T-CODE SE11,创建一个结构
接口技术介绍-创建和调用BAPI实例
维护结构的字段
接口技术介绍-创建和调用BAPI实例
T-CODE SE37,创建函数组
接口技术介绍-创建和调用BAPI实例
T-CODE SE37 创建函数,并把其函数包括在刚才创建的函数组中。
接口技术介绍-创建和调用BAPI实例
Processing Type 选择RFC
接口技术介绍-创建和调用BAPI实例
添加输入参数
接口技术介绍-创建和调用BAPI实例
添加TABLE参数:
接口技术介绍-创建和调用BAPI实例
添加CODE:
接口技术介绍-创建和调用BAPI实例
T-CODE SWO1:
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
添加方法:
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
保存,下达
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
T-CODE:SE37,释放模组
接口技术介绍-创建和调用BAPI实例
T-CODE:SWO1
释放业务对象类型 选择 对象类型—>修改版本状态到—>已实现
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
T-CODE BAPI,查看生成的BAPI
接口技术介绍-创建和调用BAPI实例
接口技术介绍-创建和调用BAPI实例
写程序调用BAPI
接口技术介绍-创建和调用BAPI实例
程序执行结果:
接口技术介绍-BAPI
课堂具体演示个调用系统标准BAPI来实现某种业务功能的例子
接口技术介绍- Application Link Enable(ALE)
SAP定义的松耦合系统,系统使用不同的数据库。使用同步或异步通信,同步通信用在必须立刻得到结果的场合,例如信用检查等。异步通信用在发布别的应用可以定购的消息,例如发布一个SD order给应收系统。
IDOC概念
IDOC接口应用于SAP系统与其他系统的业务数据交换过程,包含数据结构的定义以及数据的处理逻辑,其中的数据结构即为是一种系统间通用的数据交换格式,通过IDOC,SAP系统可以和多种外部系统进行数据交换,包括SAP R2/R3/ECC、DEI子系统等外部系统等。
IDOC 是在一个 R/3 系统中创建的,并且被发送到一个或多个将应用程序链接启用(ALE)作为经常使用 R/3 RFC 的基础通信工具使用的 R/3 系统。通过抢先地管理 IDOC 的转移,您可以避免当业务数据(如记帐代码和工厂位置)在 R/3 系统间不同步时可能对商务应用程序产生的损害。
R/3使用logical process code的方法來派遣Idoc处理与功能函数作业.他们给函数分配logical name,而不是physical name
Message type and Idoc決定logical process code, process code指向function ,当函数修改时,只需要修改process code与function的对应关系,并且新函数会立即对于该process code对应的Idoc起作用
Process code被分配给message types后, The Message才会被Receiving system处理
IDOC实例
Define Processing code -- WE41 (Outbound)/ WE42 (Inbound)
IDOC实例
IDOC实例
设置Orders 类型IDOC的前期设置[ODCHG,ORDRSP设置类似]
本例子使用的Output Type 为 NEU
查看spro设置: Material Management Purchasing Messages
IDOC实例
存在的procedure有:
IDOC实例
查看系统默认设置的:
IDOC实例
说明针对EF的Application,使用的是procedure为: RMBEF1 [下边为该procedure适用范围]
IDOC实例
用NACE进行设置:
IDOC实例
进行default设置:
IDOC实例
在NACE里边设置Condition records:
IDOC实例
仍然选择Output Type: NEU
IDOC实例
然后进入修改的页面,即通过何种方式进行维护:
IDOC实例
上图中,数字6 和 4的意思如下:
IDOC实例
在partner profile的设置过程中,需要设置LI类型以及LS类型:
输出Idoc端设置LI类型的outbound 配置如下:
IDOC实例
在接收端设置LS类型的partner profile的Inbound为:
IDOC实例
对于ODERCHG 的设置类似,只是Process Code变为ME11. 设置如下:
IDOC实例
然后Inbound 的设置类似,Process Code 为: ORDC.
IDOC实例
另外还需要设置(VOE4):Assign Customer/Vendor To Sales Organization Data, (如果该处不设置的话,需要自己在程序中修改: EXIT_SAPLVEDA_001或者EXIT_SAPLVEDA_007,存在Project: RADTEST [T-code: CMOD]当中,修改完成后需要激活.)
IDOC实例
设置output determination procedure. (T-Code: V/71)
The output determination procedure must be assigned to the document type (delivery type) whichis used. This can be done in SD Customizing by selecting Basic functions → Output control →Output determination → Output determination via condition technique → Maintain messagedetermination for deliveries → Assign output determination procedure (transaction V/71). [这里的设置将决定了各种delivery type中使用的output procedure]
IDOC实例
查看output type 对应使用的procedur (T-Code: NACE)
IDOC实例
选中V2,然后点 Procedures 按钮, 出现下边的画面 :
IDOC实例
选中对应的procedure, 双击Control,出现下边的叶面,必须确保存在 Type为 :LAVA的,否则后期将会无法发出Desadv的Idoc.
IDOC实例
回到NACE的原始界面,设置output Types
IDOC实例
选中LAVA,设置default value:
IDOC实例
再次回到NACE叶面,维护Condition records: [这里的设置主要是应用于针对某些ship-to party,设置对于这些自动产生desadv idoc,其他的则不会自动产生。 这样的设置对于其他类型的idoc 设置是相似的]
IDOC实例
双击选中的type,进入维护叶面:
IDOC实例
下边显示的是维护好的纪录 :
IDOC实例
至此,除了partner profile 之外的几乎所有设置已经完成了,但是上边的设置是与Partner profile对应的:
IDOC实例
对应的接收端设置LS类型的partner profile的Inbound:
IDOC实例
在IDES中,对于PO Confirmation的部分,加入了自己的一个Confirmation Key, 以便可以同时进行ORDRSP和DESADV的Confirmation. [路径: SPROMaterial ManagementPurchasingConfirmationSet Up Confirmation Control]
IDOC实例
AB是为ORDRSP设置使用,LA为DESADV设置使用。
IDOC实例
在IDES当中的User-exit.
对于ORDERS,ORDCHG,ORDRSP,DESADV 各种message type可以使用的Enhancement
MM06E001, VEDB0001, MCP20008, VEDA0001, SDEDI001, WVFB0001, WVMI0001, LMELA010, V55K000*等等
DIALOG报表开发
Dialog程序常用开发方式
Screen 常用控件设计
Tablecontrol 的使用
OO alv 的使用
DIALOG-SCREEN设计-hello world
Screen 的hello world 程序
创建一个程序如:YTEST007保存后返回
输入TCODE:SE51,进入Screen 设计界面,输入刚建立的程序名“YTEST007”,输入屏幕编号100 后单击“创建”按钮
DIALOG-SCREEN设计-hello world
在属性页输入描述后,直接保存
DIALOG-SCREEN设计-hello world
单击工具条上的“格式”按钮,进入设计界面,添加一个文本字段控件,输入名称和文本
DIALOG-SCREEN设计-hello world
单击按钮 返回到屏幕的代码处理:
PROCESS BEFORE OUTPUT(PBO):屏幕显示前的调用模块。
PROCESS AFTER INPUT(PAI):响应用户输入后的调用模块,如单击按钮,输入字段后回车等事件。
写入代码“MODULE CANCEL AT EXIT-COMMAND.”。表示在退出事件时执行CANCEL
模块,这和退出按钮的函数类型属性对应
DIALOG-SCREEN设计-hello world
编辑程序YTEST007,调整后程序:
REPORT YTEST007 .
*直接调用窗口
CALL SCREEN 100.
*---------------------------------------------------------------------*
* MODULE cancel INPUT
*---------------------------------------------------------------------*
*CANCEL MODULE与屏幕逻辑流对应
MODULE CANCEL INPUT.
LEAVE PROGRAM.
ENDMODULE. "cancel INPUT
执行程序
单击退出按钮,退出程序
DIALOG-SCREEN设计
在“HELLO WORLD!”程序基础上,在屏幕上建立菜单,工具条按钮、系统按钮、添加编辑框;在程序启动时,将程序中的变量传递到窗口的编辑框中;在单击菜单、工具条按钮、系统按钮时,将选中对象的功能码传递到文本框;离开屏幕时,将两个编辑框内容输出,表示窗口变量正确传递回主程序。
学习本章后,会对屏幕布局及相关控制有一个完整的了解,并且有融会贯通的感觉,所以本节非常重要,主要介绍:菜单编辑器,应用工具条设计,菜单设计,系统按钮设计,逻流程设计,加编辑框,加入OK_CODE,代码设计,输出结果
DIALOG-SCREEN设计-工具条和菜单
工具条和菜单设计,需要用菜单编辑器功能(TCODE:SE41),可以在屏幕设计的通过单击工具条按钮进入。单击工具条的“其他对象”按钮
DIALOG-SCREEN设计-工具条和菜单
工具条设计
在“GUI”状态名称后,单击创建按钮( )
DIALOG-SCREEN设计-工具条和菜单
展开“应用工具条”,在项目1 输入“BIN1”,并双击它
以同样的方式,可以添加第二个按钮,完成后单击工具条上的按钮
DIALOG-SCREEN设计-工具条和菜单
DIALOG-SCREEN设计-工具条和菜单
菜单栏的设计
单击“菜单栏”,展开它,输入主菜单后双击它,输入相应的菜单项
DIALOG-SCREEN设计-工具条和菜单
单击测试按钮,输出界面如图
DIALOG-SCREEN设计-工具条和菜单
系统按钮设计
与菜单和工具条按钮设计一样,单击“功能键”
DIALOG-SCREEN设计-输入字段
进入屏幕设计界面,添加两个文本字段和两个输入字段。选择输入字段时,设定属性为输入输出字段
DIALOG-SCREEN设计-OK_CODE
单击按钮 ,定义OK_CODE 变量来处理屏幕交互
DIALOG-SCREEN设计-单选按钮组
单选按钮组是多个单选按钮( )的组合操作。选中多个单选按钮,单击右键选菜单“单选按钮组”—>“定义”,取消多个单选按钮组合单击“分解”菜单
DIALOG-SCREEN设计-数据字典关联字段
在Screen 设计过程中,数据字典关联字段可以根据数据字典中定义的透明表、结构等信息,方便地在屏幕上建立与字典关联的文本、输入输出字段。
例如使用航班计划表(SPFLI),在屏幕上定义相关该表字段,并根据输入的主关键字检索其他字段的信息,并显示到输入输出字段
航班计划表结构如下:
DIALOG-SCREEN设计-数据字典关联字段
新建一个程序并建立一个屏幕后,单击 “字典字段窗口”按钮( )
DIALOG-SCREEN设计-数据字典关联字段
输入表“SPFLI”后,回车,系统显示该表所有字段,选择需要输出的字段,定位输出位置后,所有字段自动输出
DIALOG-SCREEN设计-逻辑流
系统是按照逻辑流的顺序执行的,例如下面的逻辑流(PAI):
PROCESS AFTER INPUT。
MODULE USER_COMMAND_TEST.
MODULE CANCEL AT EXIT-COMMAND.
MODULE USER_COMMAND_0100.
如果单击退出键,那么“MODULE USER_COMMAND_0100”是不会执行的
DIALOG-SCREEN设计-字段检查与逻辑流控制
相关语法:
单个字段检查
FIELD<FLD1> MODULE <MDL1>.
单个字段多个MODULE 检查,如FLD1 有两个MODULE 检查
FIELD<FLD1> MODULE <MDL1>.
MODULE <MDL2>.
检查多字段,使用CHAIN
CHAIN.
FIELD <FLD1>.
FIELD <FLD2>,<FLD3>,<FLD4>.
MODULE <MDL 1>.
MODULE <MDL 2>.
ENDCHAIN.
表示FLD1,FLD2,FLD3,FLD4 有MDL1 与MDL2 检查。
不是初始值检查
FIELD <FLD1> MODLE <MDL1> ON INPUT.
ON INPUT 表示是初始值改变时执行.
有一个特殊情况:
FIELD <FLD1> MODULE <MDL1> ON *-INPUT.
表示用户输入字段首字输入’*’,并且输入字段属性 ,MODULE 无效
DIALOG-SCREEN设计-字段检查与逻辑流控制
有改变检查
FIELD <FLD1> MODULE <MDL1> ON REQUEST.
CHAIN 中有字段不是初始值检查
CHAIN.
FIELD <FLD1>.
FIELD <FLD2>,<FLD3>,<FLD4>.
MODULE <MDL 1> ON CHAIN-INPUT.
MODULE <MDL 2>.
ENDCHAIN.
.注意,CHAIN_INPUT 表示FLD1,FLD2,FLD3,FLD4 不是初始值时执行MDL1 检查
DIALOG-SCREEN设计-Listbox 下拉框设计
在屏幕上建立一个输入输出FIELD,设定属性下拉:Listbox
执行结果如下
关键代码见备注
DIALOG-SCREEN设计-修改屏幕状态
可以在程序运行时动态地设置对象的属性,如设置一个字段是否有效,在Screen 设计时,可以将字段分组,在PBO 事件中设置属性。
本节在屏幕上建立一个CHECKBOX、若干输入字段,将字段分成两个组,每一个组有一个BUTTOM,单击组BUTTON,根据CHECKBOX 的值更改字段组的属性,设计界面如下
例如要控制组1的为不可输入那么就需要在pbo的module中添加代码
Loop at screen.
if screen-group1 = ‘NO1’.
screen-input = 0.
endif.
modify screen.
Endloop.
同样的道理,可以控制到单个控件的可修改、可见、必须输入等等属性,他们对应的控制参数可以通过se11,输入表screen去查看
DIALOG-SCREEN设计-练习
自定义一个表,在屏幕上显示这个表的相关字段,要求:
1.屏幕上用两个按钮,来控制这些字段的可修改性,当点击修改按钮时,所以字段都可以修改,点击保存按钮,可以根据屏幕上的内容更新自定义表,主键重复时更新条目,未重复时,插入;当点击显示按钮时所有字段都不可修改
2.要求有一个数量字段,数值范围只能是0-100之间,要求此检查要放到fieldcheck中,体会fieldcheck时,用到chain 和没有用到chain,message对屏幕的影响
DIALOG-SCREEN设计-子窗口
一个程序可以有多个窗口,通过子窗口,可以把若干个子窗口放在一个窗口上,这样,既保持了整体性,又方便对单个屏幕的维护。在SAP 业务程序中,大量地使用了子窗口设计。
窗口对象子屏幕范围( )对象用来定义一个子窗口在主窗口上的大小、位置等属性,通过逻辑流和主程序将对象关联到子窗口。
例如:建立一个主窗口和两个子窗口,在主窗口上再创建一个子窗口范围,增加两个按钮,单击按钮时切换子窗口,设计界面如图
DIALOG-SCREEN设计-子窗口
定义两个子屏幕200和300
DIALOG-SCREEN设计-子窗口
在点击不同的按钮时,调用不同的子屏幕
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*SUBSCR是定义的子屏幕范围的名称
CALL SUBSCREEN: SUBSCR INCLUDING SY-REPID SID1.
PROCESS AFTER INPUT.
MODULE CANCEL AT EXIT-COMMAND.
MODULE USER_COMMAND_0100.
*使子屏幕显示
CALL SUBSCREEN SUBSCR.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
*当单击第一个按钮,显示200子窗口
WHEN 'BTN1'.
SID1 = '200'.
*当单击第二个按钮,显示300子窗口
WHEN 'BTN2'.
SID1 = '300'.
WHEN 'EXIT'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
DIALOG-SCREEN设计-表条目控制
表条目控制是实现将多个子屏幕以页面形式切换的控件,有手工制作和向导生成两种,在本节中,不再重复子屏幕创建操作,只表达操作上的特殊性,手工制作的图标是“ ” 向导制作的图标是“ ”
DIALOG-SCREEN设计-表条目控制
手工制作
逐页设置名称、文本、功能码属性,接着选中“子屏幕范围”按钮,在第一页创建该对象,设定好子屏幕的属性后,第一页就设置完成,不再显示粉红色
DIALOG-SCREEN设计-表条目控制
向导制作
在设计屏幕上创建“表条目控制制作向导对象,启动向导程序,其好处就是系统自动建立完成全部页面、逻辑流和主程序代码,操作简便
DIALOG-SCREEN设计-表条目控制
DIALOG-表控制TABLE CONTROL设计
表控制(Table Control)是SAP 应用中最重要的对象之一,业务单据的输入、基础数据的表格输入等都是使用Table Control 控件,本章主要介绍:
(1) 在屏幕设计中通过向导来制作表控制对象,由系统生成程序;
(2) 通过系统生成数据表维护程序,并在程序中调用;
(3) 表格设计技巧;
DIALOG-表控制TABLE CONTROL设计-向导生成
(1) 在屏幕设计中通过向导来制作表控制对象,由系统生成程序;
首先创建一个程序,定义一个内表:
DATA SP1 LIKE TABLE OF SPFLI WITH HEADER LINE.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP1 FROM SPFLI.
CALL SCREEN 100.
在100屏上,点击控件:
DIALOG-表控制TABLE CONTROL设计-向导生成
输入Table Control 的名称,继续
选择从内表建立,输入内表名称SP1
DIALOG-表控制TABLE CONTROL设计-向导生成
选择表字段,继续
选择表格控件能输入(Input control)
有表头(With colum headers)
单选纪录(Single)
DIALOG-表控制TABLE CONTROL设计-向导生成
设定属性无滚动条,继续
维护生成程序的名称,使用默认的名称
DIALOG-表控制TABLE CONTROL设计-向导生成
单击“完全”按钮,完成设计
完成后设计界面如图,
可以双击列,去修改列描述
DIALOG-表控制TABLE CONTROL设计-表格维护
(2) 通过系统生成数据表维护程序,并在程序中调用;
通过系统生成数据表维护程序TCODE:SE55,通过系统数据维护功能使用生成程序(TCODE:SM30),过程如下:建立一个数据表(SE11),生成维护程序(SE55),数据维护(SM30),设计代码调用生成程序。
新建一个数据表YMANA,表结构如图
DIALOG-表控制TABLE CONTROL设计-表格维护
单击右下角的状态条,屏幕显示程序名为“SAPLYTESTF008B”
生成程序的表头等信息都可以调整,输入TCODE:SE51 进入屏幕编辑器,输入程序名“SAPLYTESTF008B”,找到编号为100 的屏幕,进入设计界面后,可以调整屏幕对象
DIALOG-表控制TABLE CONTROL设计-表格维护
通过函数调用生成程序,程序如下:
REPORT YTEST23 .
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
ACTION = 'U'
VIEW_NAME = 'YMANA'
EXCEPTIONS
FOREIGN_LOCK = 2
NO_TVDIR_ENTRY = 8.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
DIALOG-表控制TABLE CONTROL设计-设计技巧
(3) 表格设计技巧;
双击启动事件
定义状态条中的F2 功能键,在程序中处理返回功能码
DIALOG-表控制TABLE CONTROL设计-设计技巧
取得行号
*取得当前屏幕和行号
GET CURSOR LINE LINEA.
CHECK SY-SUBRC = 0.
*当前行号 = 当前屏首行序号 + 当前屏行号
LINEA = TBLA-TOP_LINE - 1.
*用取得当前行号读取内表
READ TABLE WA_FPFLI INDEX LINEA.
DIALOG-表控制TABLE CONTROL设计-设计技巧
定义表格的读写属性
WHEN 'READWR'.
*当单击按钮时,第一列只读,其他列读写切换
LOOP AT TBL1-COLS INTO ACOL WHERE INDEX GT 0.
IF SY-TABIX = 1.
ACOL-SCREEN-INPUT = '0'.
ELSE.
IF ACOL-SCREEN-INPUT = '0'.
ACOL-SCREEN-INPUT = '1'.
ELSEIF ACOL-SCREEN-INPUT = '1'.
ACOL-SCREEN-INPUT = '0'.
ENIF.
ENDIF.
ENDLOOP.
MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.
DIALOG-表控制TABLE CONTROL设计-练习
设计一个屏幕,显示ekko和ekpo里面的采购订单信息,要求:
1.用tablecontrol来显示ekpo的行项目信息,用可输入文本控件来输出ekko的表头信息
2.对于第一个行项目,要求有一个红灯显示,其他行项目显示为绿灯
3.能够响应双击事件,双击后,相应的行项目的灯变为黄灯
4.有兴趣的同学可以在行项目上添加按钮,当点击按钮时去做类似的处理
DIALOG- OO ALV设计
在屏幕上创建两个文本元素控件、一个退出按钮控件、一个定制控制控件
DIALOG- OO ALV设计
简单的OO ALV输出实例可以参照sap系统中的alv输出实例,这里就不贴代码了,事物代码se83,里面有专门的OO ALV CONTROL的实例
我们主要来学习一下以下3个知识点:
自定义ALV 控件的工具条按钮
处理ALV事件,以双击事件为例
DIALOG- OO ALV设计-自定义ALV 控件的工具条按钮
在ALV 的工具条上增加一个自定义的按钮,单击它弹出窗口提示选择行数据内容
DIALOG- OO ALV设计-自定义ALV 控件的工具条按钮
定义ALV 控件相关事件、接口和实现方法等,主要定义以下事件。
(1)ALV 控件的工具条处理事件,定义了新按钮和功能码;
(2)ALV 控件的功能码处理事件,定义用户单击按钮产生的功能码事件。
关键代码如下:
CLASS LCL_EVENT_RECEIVER DEFINITION. “类定义
PUBLIC SECTION.
METHODS:
HANDLE_TOOLBAR
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE,
HANDLE_USER_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
ENDCLASS. "lcl_event_receiver DEFINITION
DIALOG- OO ALV设计-自定义ALV 控件的工具条按钮
添加按钮:
METHOD HANDLE_TOOLBAR.
DATA: LS_TOOLBAR TYPE STB_BUTTON.
CLEAR LS_TOOLBAR-BUTN_TYPE.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 'SHOW_DETA' TO LS_TOOLBAR-FUNCTION.
MOVE ICON_PPE_VNODE TO LS_TOOLBAR-ICON.
MOVE '航班明细显示' TO LS_TOOLBAR-QUICKINFO.
MOVE '航班明细显示'(112) TO LS_TOOLBAR-TEXT.
MOVE '' TO LS_TOOLBAR-DISABLED.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD. "handle_toolbar
DIALOG- OO ALV设计-自定义ALV 控件的工具条按钮
按钮对应的执行处理
METHOD HANDLE_USER_COMMAND.
DATA: LT_ROWS TYPE LVC_T_ROW.
CASE E_UCOMM.
WHEN 'SHOW_DETA'.
CALL METHOD ALV_GRID->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = LT_ROWS.
IF SY-SUBRC = 0.
MESSAGE S005(YMESS) WITH '已选择行!'.
ENDIF.
ENDCASE.
ENDMETHOD. "HANDLE_USER_COMMAND
DIALOG- OO ALV设计-处理ALV 双击事件
alv的双击有一个专门的事件来响应,其代码跟前面的按钮添加、按钮处理是类似的,只是
响应的事件不一样,关键代码如下:
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS:
HANDLE_DOUBLE_CLICK
FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW E_COLUMN.
ENDCLASS. "lcl_event_receiver DEFINITION
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_DOUBLE_CLICK.
DATA: LI_SPFLI LIKE LINE OF WA_SPFLI.
READ TABLE WA_SPFLI INDEX E_ROW-INDEX INTO LI_SPFLI.
*将行列等信息合并到字符串
DATA: S1(100) TYPE C.
CONCATENATE '行:' E_ROW-INDEX '列名:' E_COLUMN-FIELDNAME INTO S1.
CONCATENATE S1 'connid:' LI_SPFLI-CONNID INTO S1.
CONCATENATE S1 'carrid:' LI_SPFLI-CARRID INTO S1.
*在状态条显示单击的行与列信息
MESSAGE S208(00) WITH S1.
ENDMETHOD. "handle_double_click
ENDCLASS. "lcl_event_receiver IMPLENTATION
DIALOG- OO ALV设计-ALV其他事件的处理
通过对双击事件的学习,我们可以举一反三,可以去尝试练习使用alv的其他的一些事件,如:Hotspot_click、ondrag、before_user_command、onf1、onf4等等,这里就不一一演练了,系统中有很多的实例,可以在se38 中输入*alv* 去查找相关的程序
DIALOG- OO ALV设计-练习
创建一个简单的alv显示,可以获取ekko ekpo的数据,要求:
1.有hotspot,点击时,根据订单号,调用me23n
2.订单行项的数量字段可修改
3.双击某一行,调用一个tablecontrol来显示相关信息,且数量字段可修改,而且数量字段要求能在tc和alv之间传递
4.有删除标记的行项目,要求数量为红色
5.可以自由发挥,增加一些自己研究的成果,如,将某列弄成list_box
增强的了解和学习
增强主要分为一下几种方式:
出口增强
在Sap中出口就是标准程序在某个特定的时候要调用的一个函数或者功能模块,这个函数或功能模块的输入已经由Sap定义好。 自己写的SAP出口程序在系统升级的时候会被保留,而如果更改标准程序在SAP系统升级的时候会被覆盖
BADI-Business Add-Ins
SAP预定义了一些接口类, 这个接口类有一些方法,但是这些方法都是空的,客户可以自己定义,在标准程序中会调用客户自定义接口类,来实现一些特殊的处理要求,但是这个也有局限性,因为很多接口参数都是写死的
BAPI- Business Application programming Interface
BAPI是SAP提供的基于业务对象的函数,关键是它们处理的对象是R/3的业务相关的业务对象 ,比如单据类销售订单,组织,公司等,它们是一系列实体
增强的了解和学习-出口增强
SAP有四种基本用户出口的类型:
1.菜单出口-Menu Exits 定义自己的菜单
2.屏幕出口-Screen Exits定义自己的屏幕
3.功能模块出口-Function Module Exits在SAP应用程序中添加功能
4.关键字出口-Keyword Exits在ABAP/4字典中的关键字数据元素添加文档。结果是你在使用这些数据元素的字段处按F1后会出现你自定义的说明文档
那么怎么寻找自己需要的出口呢?
1:可以通过配置文档的帮助和SAP library 寻找业务系统的出口,sap library 在‘implementation guide’中寻找出口,在配置功能执行按钮左边一般都有一个说明文档,描述相关的出口。
2:网上有很多根据事物代码查找出口的程序,可以参照一下,也有所有模块的出口清单,大家可以去找一下
出口找到后,就可以根据自己的需求,在cmod中建立项目,写增强代码,下面以
IW31 在设备维护工单抬头里增加一个字段放停工检修号 为例进行学习
增强的了解和学习-出口增强
第一步:确定增强IWO10018
第二步:给AUFK表APPEND一个自己定义的字段
增强的了解和学习-出口增强
第三步:T-CODE:CMOD,建立增强
点 Enhancement assignments按钮
输入增强IWO100018,然后点Components
增强的了解和学习-出口增强
双击,0900,建立屏幕
第四步:扩展CI_AUFK结构,因为在增强里的EXIT_SAPLOIH_018,EXIT_SAPLOIH_019都用到这个结构来把增强屏幕上数据进行输入标准程序中和把标准程序里对应字段值输出到增强屏幕
增强的了解和学习-出口增强
第5步:就是在EXIT_SAPLOIH_018,EXIT_SAPLOIH_019写输入输出程序。
EXIT_SAPLOIH_018是PBO的过程
增强的了解和学习-出口增强
EXIT_SAPLOIH_019是PAI的过程。
OK,完成!!!把这些都激活看看效果,建立维护订单的T-CODE:IW31,进入第二个屏幕后就会看到一个“增强”tab了
增强的了解和学习-BADI
如何从SAP中查找BADI
1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中;
2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。
3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。
4、se18 查找接口,se19 实现接口就可以实现用户增强。
增强的了解和学习-BADI
BADI的应用
以ME_GUI_PO_CUST为例
通过SE19 中的 Classic BADI BADI Name来创建,输入的名称为找到的BADI名称,在创建的过程中会产生一个Implementation名称(自己命名的),该名称在se19中 Edit Implementaion ->Classic BADI Implementation中使用
增强的了解和学习-BADI
ZTEST_badi_yw1 是以后用来查看和修改的Implementaion名称
增强的了解和学习-BADI
点击方法:IF_EX_ME_GUI_PO_CUST~SUBSCRIBE ,添加自己的代码
激活后输入me22n执行,会停在刚才的断点处
增强的了解和学习-的课后练习
练习发货过帐的增强,T-CODE VL02N
MCS50001
EXIT_SAPLMCS5_001 :SIS: User Exit for Deliveries - Header Data
EXIT_SAPLMCS5_002 :SIS: User Exit for Deliveries - Item Data
程序优化与效率提高
1.首先是找出有问题的程序: 一般查询程序执行时间只要超过100秒(这是观察SAP标准程序的效率值)以上这些程序就是要Tune的可以透过T-CODE:SM50 或 T-CODE:SM37 去找资料,分析在线或是后台执行有哪些ABAP 很慢
2.程序效能分析 T-CODE:SE30 程序执行时间分析,找出程序慢的部份,执行完程序可以区分三个阶段的执行时间:ABAP、Database、System,这三个部份对效能的优先级为Database -> System -> ABAP要依序排除程序这些部份的问题
程序优化与效率提高
效能分析 一般来说自行开发的程序大部份对数据库的有效率存去都会忽略,这部份可以透过检查索引、调整程式语法改善,在SE30分析程序可以看出哪些Table花费的成本最高,针对程序中这些SQL语法进行检查:首先要检查索引,程序中的Where字段在Table index是有满足,如果没有Index,就要评估该报表执行频率,如果很高就要建一个索引(T-CODE:SE11)给它用
4.系统资源的控制 当DB的问题处理完成后,就要注意程序对系统资源使用的控制了,ABAP中不能无限制的使用系统内存,有些大量耗用内存的程序是可以透过程序技巧调整的,还有就是用完了要清。
程序优化与效率提高
5.经验分享
从se30的分析结果来看,abap程序最耗费时间的其实是两部分:数据库、abap,一般来说比较慢的abap程序都是慢在取数和数据处理上,总的来讲有以下几个基础的技巧
1). 表关联时,inner join是一个比较费时间的操作,比如A INNERJOIN B INNERJOIN C
他处理的方式是A * B * C而且他筛选的一个过程是A->B->C,就是A的筛选结果去B中做对比,再去C中做对比,所以在关联的时候要注意,inner join的表不能太多,而且关联的顺序应该是小表->大表,where条件要尽量使用索引和主键字段,而且where条件的顺序应该遵循小表->大表的原则
程序优化与效率提高
2).抽取数据时,避免使用SELECT *, 尽量使用SELECT A B INTO TABLE ITAB这样的语句,而且A B的顺序最好跟ITAB定义的field顺序一致,这样就少一个into corresponding的操作,也会提高效率
3).不要使用SELECT...ENDSELECT语句,尽量使用select …into table的语句,因为前者是一个数据库->工作区->内表而且是逐条操作,后者是一个直接数据库->内表的操作
4).尽量避免在LOOP中访问数据库。可以在之前先把数据取到内表,在LOOP中用READ TABLE WITH KEY ... BINARY SEARCH.进行读取对应的数据,loop嵌套sql是一种极其低效的语句,比select endselect的效率还要低很多,大家一定要切记
5).用SORT代替ORDER BY,将数据取出来后,再用内表做排序
程序优化与效率提高
6).避免使用嵌套的循环,多重循环也是非常耗费时间的,不到万不得已不要去使用
7).避免使用SELECT DISTINCT语句。在抽取数据到内表后用DELETE ADJACENT DUPLICATES语句来消除重复行。
8).使用二分查找法。 READ TABLE的之前使用SORT TABLE BY对内表进行排序, 然后使用READ TABLE WITH KEY ...BINARY SEARCH.
9).在某些时候,一些簇表,不能直接关联,这个时候无可避免的要用到内表的数据去跟其他的数据库表做关联,这个时候呢,大家可以使用for all entries in的方式去取数,千万不要用loop套sql,当然,如果内表条目过多,2万条左右,for all entries in的效率是很低的
10).尽量不要使用模糊查询,更不要在中文字段用模糊查询
程序优化与效率提高
用SE38编辑程序时,可以通过Environment-Examples-Performance Examples看到有很多性能优化的资料,针对常用的语句进行了对比分析,作为ABAPer应该好好看看;
程序的性能优化没有一个万能的标准,需要大家在平时的实际工作和练习中去对比学习,养成好的习惯,对于有性能问题的地方,要多做尝试,找到一个最好的解决方法.
可以找一个比较慢的程序做现场代码分析,修正,来共同学习一下优化的技巧.
内表的种类
内表的定义:TYPES|DATA itab {TYPE|LIKE} tabkind OF {linetype|lineobj}[WITH key] [INITIAL SIZE n].
内表的种类:
1. 标准表(STANDARD TABLE).系统为该表的每一行数据生成一行数据生成一个逻辑索引.填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行.在对表进行插入,删除等操作时,各数据行在内在中的位置不变,系统仅重新排列各数据行的索引值.
2. 排序表(SORTED TABLE).与标准表相同,也具有一个逻辑索引,但其按关键字升序排序后再进行存储,其访问方式与标准表相同.
3. 哈希表(HASHED TABLE).没有索引,只能通过关键字来访问.系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的行数无关.
哈希表,主键自然排序,没有索引功能,读数据用READ 效率比较好,适合数量大结构复杂数据。可INSERT插入。
*
*
*
HP template
*
*
*
HP template
*
*
*
HP template
*
*****取日期(中文格式)*********
CONCATENATE ITAB_BKPF-BUDAT(4) '年' ITAB_BKPF-BUDAT+4(2) '月' ITAB_BKPF-BUDAT+6(2) '日' INTO P_BUDAT.
*
*
HP template
*
该过程的输 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X 4 0
itt 0 11
.e . 0 15
*e 0 10
s* 0 17
*
*
*
*
*
*
*
*
HP template
*
编译型和解释型的根本区别在于生成的代码不同:编译型生成的是机器码,所以运行速度快,目前的调试环境也很强大,可以支持各种源代码调试方法,唯一欠缺的是不能象解释系统那样当出错的时候立即定位相关的代码,不过这对有经验的程序员不是问题;解释型生成的是伪代码(P-代码),运行速度慢,而且由于生成的代码结构比较有规律,所以容易反汇编。
*
*
HP template
*
航班订票表中有一个字段FORCURAM(外币帐面价格),航班表中有一个字段PRICE(价格),它们都是基于同一个域S_PRICE(价格),但是为了区分它们的用途,表SBOOK的FORCURAM引用的数据元素和表SFLIGHT的PRICE引用的数据元素就不一样
*
*
HP template
*
1、路径:工具-〉ABAP工作台-〉开发-〉ABAP字典,或TCode:SE11
2、输入表格的名称,最佳开发的表一般用’Y’或’Z’开头,然后单击“创建”按钮
*
*
HP template
*
设置表的属性:
1、Short description:输入该表的描述
2、Delivery Class:一般为A(应用表)
3、Table maintenance allowed:打上钩,使得该表内容可以手工维护
属性设置完成后,按保存按钮保存
*
*
HP template
*
在字段设置中,输入所有的字段并且定义相依的关键字段,然后单击“技术设置”按钮
*
*
HP template
*
技术参数的设置主要针对两方面内容:
1、逻辑存储参数(用来申明数据规模)
2、缓冲机制
我们一般只需要设置第一个属性可以了,然后保存
*
*
HP template
*
1、要想让自己定义的表格有用,能过被程序访问或是能够进行数据维护,必须进行“激活”
2、注意每次表修改以后,也必须重新“激活”,修改才能够生效
*
*
HP template
*
结构的定义,在不同的SAP R/3版本中不尽相同,在老版本的R/3的ABAP 字典中专门有一项叫做结构,但在新版本的R/3中,结构被并到了数据类型中,请注意
*
*
HP template
*
选择结构
*
*
HP template
*
设置结构的字段信息后保存,结构就定义完成了
*
*
*
可以提供自动检查,包括屏幕检查
用户通过F4可以获取有效数值列表
*
*
*
*
*
*
TIPS
*
*
*
TIPS
*
*
*
*
TIPS
*
*
TIPS
*
TIPS
*
TIPS
*
TIPS
*
*
*
*
Syntax for inner join above:
SELECT scarr~carrname sflight~carrid sflight~connid sflight~fldate
INTO (carrname, carrid, connid, date)
FROM scarr INNER JOIN sflight
ON scarr~carrid = sflight~carrid.
WRITE: / carrname, carrid, connid, date.
ENDSELECT.
*
*
*
*
*
*
*
*
*
*
*
*
HP template
*
*
*
HP template
*
*
*
HP template
*
*
*
*
*
*
*
*
*VRM类型定义接口
TYPE-POOLS VRM.
DATA: FLD1(20) TYPE C.
*内表、记录,字段变量定义
DATA: FNAME TYPE VRM_ID,
VVA TYPE VRM_VALUES,
LVVA LIKE LINE OF VVA.
*加两条记录
FNAME = 'FLD1'.
LVVA-KEY = '1'.
LVVA-KEY = '广州'.
APPEND LVVA TO VVA.
CLEAR LVVA.
FNAME = 'FLD1'.
LVVA-KEY = '上海'.
APPEND LVVA TO VVA.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
ID = FNAME
VALUES = VVA
* EXCEPTIONS
* ID_ILLEGAL_NAME = 1
* OTHERS = 2
*