金载沅在韩国的地位:SAP ABAP语言编程手册

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 13:19:24
第一章程序调试
编译任何程序最基本的技能就是对程序的调试(debugging). 所以让我们先熟悉一下SAP ABAP程序的调试手段。
如何调试ABAP程序?
在这本书中,我假设你使用的是ABAP编辑器(事务代码 SE38)开发ABAP程序。 但是,如果你使用的是Object Navigator (事务代码 SE80)做开发工作,过程也是相同的。
在ABAP编辑器屏幕,采取以下步骤设置你的调试断点:
选择你要开始调试的代码行。
按“Session断点“钮。
如果要删除断点, 只要双电击程序行上的Session断点图标(icone)即可删除断点。
提示:
如果你的SAP版本较老,点击断点图标后,会有一个画面弹出, 让你选择是“Session断点“还是”External断点“。
如果你要管理程序里设置的所有断点, 你可以去菜单:实用程序 (Utilities)> 断点。
如何调试Web应用程序?
如果你需要调试一个Web应用程序,设置断点的步骤和你设置ABAP程序断点完全相同,只是你设置的不是Session断点,而是外部断点(External Breakpoint)。
假设你在ABAP编辑器里编辑Web应用程序, 请按照下面的步骤设置断点:
1.在Web应用程序里,选择你想要调试的代码行。
2.点击“External断点”按钮。
3.如果要删除断点,只要双电击程序行上的External断点图标(icone)即可删除断点
提示:
在较老版本上,点击断点图标后,会有一个画面弹出, 让你选择是“Session断点“还是”External断点“。
你也可以去菜单:“实用程序 (Utilities)> External 断点“,去管理所有External断点。
如何在程序里手动设置断点?
你可以在你的程序里设置断点语句,让程序在运行时只会为预先设定的用户停在断点。 这样,其他用户可以自自如地运行程序,而你可以自由地调试程序。
语法
Break .
如果你代码中的登录ID和用户的登录ID相匹配的话, 该程序运行到断点时会停止。
如何调试一个SAP事务(Transaction)?
你可以在事务命令代码框里使用“/H”命令,让后运行SAP事务。事务会停在最开始的程序行。
如何调试弹出屏幕?
前面提到,你可以在事务代码框里使用“/H”来调试事务。不过,如果你想调试在程序运行中弹出的屏幕,你就不能使用命令“/H”了。
这里给你个技巧提示,如何在屏幕弹出时进行调试:
在你的计算机上,用下面的代码创建一个文本文件, 然后将其保存起来。
在SAPGUI窗口弹出时,把文本文件从Windows资源管理器的窗口里拖拉到SAPGUI弹出窗口。 这时,SAPGUI就进入调试模式了。 (在屏幕下,你可以看到”调试被激活“的信息。)
代码 范例
[FUNCTION]
Command=/H
Title=Debugger
Type=SystemCommand
如何调试在背景工作的程序?
如果你有权限可以更改程序,你可以使用这个小技巧调试在背景工作的程序。
在程序中你要调试的地方,加一个无限循环的逻辑。 在这个无限循环的逻辑里,添加一个检查条件以便退出循环。 例如,检查一个变量的值是否被更改。
·         开始在背景里运行程序。
·         运行事务SM50,等到你的程序显示在列表中。
·         到菜单: 处理》程序》调试。 (菜单路径可能在不同的版本中略有不同)
·         现在你的程序正在无限循环逻辑中。 你可以改变变量的值 , 以便退出循环。
第二章    程序基础
2.1数据处理
如何从一个文本字符串中删除尾随或前置的'0'或空格?
代码 范例
SHIFT c RIGHT DELETING TRAILING c1.
SHIFT c LEFT DELETING LEADING c1.
在上面代码中的“C1”变量可以被定义为“空格”或“0”。
如何转移负号?
在SAP的世界里,负号标志是在数字的右侧,如“123.45-”。然而,在某些情况下,用户通常会要求把负号转移到左侧。 例如,如果你的报表列表要下载到个人电脑上的Excel文件,用户将要求你重新安排负号。下面是转移负号的代码 范例。
代码 范例
Data: p_amt(18).
P_amt = '         12345.67-'.
shift p_amt right deleting trailing '-'.
shift p_amt left deleting leading space.
concatenate '-'  p_amt into p_amt.
如何替换字符串?
你可以使用“TRANSLATE”语句来代替字符串中的字符。  下面的代码范例可以把字符串里的‘X' 替换成”Y“。
代码 范例
translate using 'XY'.
如何分割一个被tab分隔(tab-delimited)的字符串?
你可以方便地使用“SPLIT”命令,分裂一个被分隔符分隔的字符串。 在大多数情况下,分隔符是一个或多个字符,如“|”,"||",或','等,但是,” tab-delimited “分隔符是不同的。它必须定义为值是“09”的'×'类型。
下面的代码范例显示了如何分割tab分隔(tab-delimited)的字符串。请注意” tab-delimited “分隔符变量是如何定义的。
代码 范例
Data: tab_del type x value '09'.
SPLIT at tab_del into ….
如何删除字符串中的分隔符?
你可以先把分隔符除掉 , 然后再把所有分割后的子字符串串联在一起。
代码 范例
DATA: tab_del TYPE C VALUE '|'.
DATA: field1, field2, ……,  fieldn, final_str TYPE string.
SPLIT AT tab_del   INTO: field1 field2 … fieldn.
CONCATENATE  field1 field2 … fieldn INTO final_str.
2.2条件运算符和循环
如何调用在另一个程序中的子程序?
语法
PERFORM () using …
如何在程序之间传输数据?
为了在不同的程序之间传输数据,你可以先将数据保存到global ABAP内存,然后在另一个程序中读取它。
注意 :数据传输完成后, 一定要清干净global ABAP内存。
代码 范例
Program 1
EXPORT obj1 ... objn TO MEMORY ID ‘m_id’.
Program 2
IMPORT obj1 ... objn FROM MEMORY. ID ‘m_id’.
… …
FREE MEMORY ID ‘m_id’.
如何使用“MOVE-CORRESPONDING”在两个结构之间复制数据?
如果你有两个结构 , 你想把同一字段类型(field type)的值从一个结构拷贝到另一个结构, 你只要使用语句“MOVE-CORRESPONDING”来实现这一目标。 只要一行代码即可。
然而,尽管这个命令非常方便 , 但对于CPU来说是非常昂贵的, 因为“MOVE-CORRESPONDING”语句会逐一检查每一个字段的类型。因此,如果程序的运行速度要求很高,你可能需要一个字段一个字段地拷贝。
另外请注意 ,因为 “MOVE-CORRESPONDING”语句会逐一检查每一个字段的类型, 如果你有两个相同类型的字段,你将会得到重复的数据。所以请先弄清楚两个结构的内容, 然后再应用此命令。
语法 。
MOVE-CORRESPONDING struc1 TO struc2.
如何把程序分配到不同的包(package)?
在事务SE38或者SE80窗口里,用右键单击Repository Browser窗口里的程序名。然后 选择“更多功能“ à “更改包(Change package assignment)。
如何在循环(Loop),子程序(Subroutine)或报表程序(Report)里使用“EXIT”?
1。“EXIT”在循环(LOOP)结构里。
EXIT命令可以用来跳出循环结构 , 并终止循环的过程。
注意,在这里所说的“循环”结构不仅是指循环结构本身(Loop),而且还包括诸如DO, WHILE, SELECT等结构,
2。“EXIT”在一个子程序中(Subroutine)。
如果“EXIT”命令用在一个子程序或其它模块里,它是用来离开子程序或模块的。
“子程序”在这里指的是”FORM“结构 , 而“模块”是指 如MODULE, FUNCTION, TOP-OF-PAGE, and END-OF-PAGE等结构。
请注意 ,
如果EXIT是在子程序或其他模块内的循环结构里,它只能让你跳出循环,但不能跳出子程序或模块。
3。“EXIT”在报表程序中(Report)。
如果EXIT既不在一个子程序或模块里,也不在循环结构里,那么它就会终止报表程序或者启动最后的清单显示。
如何使用“CHECK”语句 , 而不是”IF“语句?
1。“CHECK”语句用在循环(LOOP)中。
如果检查结果为负,当前循环进程终止 , 然后开始下一个循环。
2。“CHECK”在一个子程序(Subroutine)或报表程序(Report)里
如果检查结果为负,程序停止运行并退出当前的子程序或报表程序。
语法
CHECK .
和需要若干行的“IF”结构比较,CHECK”语句干净简洁。 往往若干行的“IF”代码可以被只有一行的“CHECK“语句取代。
如何在循环结构中使用“AT…ENDAT”结构?
语法
Loop at itab.
At FIRST.
… … ... ...
ENDAT.
At LAST.
… … ... ...
ENDAT
ENDLOOP
2.3文件输入/输出
如何打开一个文件?
你可以使用下面的语句来打开文件。 但请注意,如果你不使用任何附加值,打开的文件只能进行读取而不能更改。而且是二进制模式。
如果你没有指定目录,系统将使用配置参数DIR_HOME定义的目录作为默认目录。 因此 , 我建议你在文件名变量里使用完整的文件路径 , 以避免混乱。
语法
OPEN DATASET .
SY-SUBRC = 0. “文件打开.
SY-SUBRC = 8. “文件无法打开。
如何从文件中读取数据?
如果你想从文件中读取数据,可以使用”OPEN DATASET“ 和”READ DATASET 语句.  只要用户有更改权限, 这个语句就能以“读取/更新”模式打开文件。
如果用户没有更改权限,文件只以'读取'模式打开。 如果这仍然不能打开文件,错误信息就会出现。
下面的代码范例显示如何打开一个文件,一行行读出数据,并保存数据到一个内部表中。
代码 范例
DATA: input_file(40) TYPE c,
itab(94) OCCURS 0 WITH HEADER LINE,
msg(100).
OPEN DATASET input_file FOR INPUT IN TEXT MODE
ENCODING DEFAULT MESSAGE msg.
IF sy-subrc NE 0.
WRITE:/ 'ERROR opening file', input_file, 'with message',
ELSE.
DO.
READ DATASET input_file INTO itab.
IF sy-subrc = 0.
APPEND itab.
ENDIF.
ENDDO.
CLOSE DATASET input_file.
ENDIF.
如何到一个文件中填写数据?
如果你需要保存数据到一个文件中,你可以使用“OPEN DATASET”
对于OUTPUT的语句, 只要用户有文件读取的授权, 此语句试图以'写/更新'模式打开文件。  如果用户没有授权,系统中打开'写'模式文件。
如果该文件已存在,其现有的内容被删除。
如果该文件不存在,系统会创建一个新文件。
代码范例通过循环(LOOP)从 内表中读取数据, 然后一行行地转移到文件中。
代码 范例
DATA: output_file(40) TYPE c,
itab(94) OCCURS 0 WITH HEADER LINE,
msg(100).
OPEN DATASET output_file FOR OUTPUT IN TEXT MODE
ENCODING DEFAULT MESSAGE msg.
IF sy-subrc EQ 0.
LOOP AT itab.
TRANSFER itab TO output_file.
ENDLOOP.
CLOSE DATASET output_file.
ELSE.
WRITE:/ 'ERROR: Writing file with message', msg.
ENDIF.
如何将数据加到一个文件的尾部?
前面的范例是把数据加到一个文件中。
如果文件在系统中存在,旧的内容会被删除然后加进新的数据。 但在很多情况下,你不想清除现有的内容。
你只是想追加新的内容到文件的末尾。
要做到这一点,你可以使用“OPEN DATASET... FOR APPENDING“语句. 这个语句会试图打开文件成”追加'模式, 然后你可以把新的数据加到文件的末尾。
代码 范例
如何使你的文件I / O程序可以在不同的操作系统下运行?
正如你在下面的例子中看到,你需要提供一个逻辑文件名和所属操作系统的名称,从而获得实时的物理文件名。
If you don't specify the operating system, the function module will use system defined operating system name, sy-opsys, by default. 如果你不指定操作系统,功能模块将使用系统定义的默认操作系统的名(SY - opsys)。
代码 范例
DATA: lv_filenam TYPE string.
CALL FUNCTION 'FILE_GET_NAME'
EXPORTING
*  CLIENT                       = SY-MANDT
logical_filename             = ''
*  OPERATING_SYSTEM             = SY-OPSYS
*  PARAMETER_1                  = ' '
*  PARAMETER_2                  = ' '
*  PARAMETER_3                  = ' '
*  USE_PRESENTATION_SERVER       = ' '
*  WITH_FILE_EXTENSION          = ' '
*  USE_BUFFER                   = ' '
*  ELEMINATE_BLANKS             = 'X'
* IMPORTING *进口
*  EMERGENCY_FLAG               =
*  FILE_FORMAT                  =
file_name                    = lv_filenam
EXCEPTIONS
file_not_found               = 1
OTHERS                       = 2.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*        WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
如何在ABAP程序里运行Windows /Unix命令?
如果你是一个Unix或Windows操作系统,下面的代码范例显示如何在该操作系统上运行命令。
该机制其实就是打开一个文件 , 运行命令。 然后将运行结果写入一个文件。
代码范例显示了如何运行的Unix命令。
如果你在Windows系统上,你只需把文件的路径和命令更改成Windows格式。
代码 范例
DATA: result_file(50) VALUE '/tmp/test',
msg_text(50),
command(255) VALUE 'ls'.
OPEN DATASET result_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT
FILTER command MESSAGE msg_text.
CLOSE DATASET result_file.
DELETE DATASET result_file.
如何从应用服务器(Application Server)上检索到文件列表?
使用功能模块“RZL_READ_DIR_LOCAL”, 你可以从应用服务器上得到给定的文件目录中的文件列表。
下面的代码范例显示了如何从当前目录检索文件列表。
代码范例:
DATA: lv_fdir TYPE pfeflnamel VALUE '.',
it_files LIKE salfldir OCCURS 0 WITH HEADER LINE.
CALL FUNCTION 'RZL_READ_DIR_LOCAL'
EXPORTING
name     = lv_fdir
TABLES
file_tbl = it_files.
LOOP AT it_files.
WRITE: / it_files-name.
ENDLOOP.
2.4其他有用的建议
如何转换不同的时区的日期和时间?
日期和时间的转换可以通过先转换日期和时间到格林尼治标准时区(GMT), 然后从格林尼治时区的日期和时间转换到所需时区的日期和时间。
首先,你可以使用功能模块“IB_CONVERT_INTO_TIMESTAMP”转换日期和时间到GMT时区。 输入参数是日期,时间和时区。 输出参数就是格林尼治时间。
然后,你使用功能模块“IB_CONVERT_FROM_TIMESTAMP”再转换日期和时间到你所需的时区。
输入参数是从上面的功能模块获得时间和所需转换的时区。 输出参数是需要的时区的日期和时间。
Please note some related system fields here.
请注意一些相关的系统域值。
域值SY -DATUM和SY - UZEIT分别是系统的日期和时间。
如果你需要得到本地日期,时间,而所在时区,你可以分别使用域值SY - DATLO,SY - TIMLO与SY - ZONLO。
代码 范例
DATA :
timestamp LIKE tzonref-tstamps,
time     LIKE sy-uzeit,
date     LIKE sy-datum.
time = sy-uzeit.
date = sy-datum.
WRITE :/ 'Current system Date and Time is ',date, time.
WRITE :/ 'Current system located at Time Zone is ', sy-zonlo.
CALL FUNCTION 'IB_CONVERT_INTO_TIMESTAMP'
EXPORTING
i_datlo     = date
i_timlo     = time
i_tzone     = sy-zonlo
IMPORTING
e_timestamp = timestamp.
CALL FUNCTION 'IB_CONVERT_FROM_TIMESTAMP'
EXPORTING
i_timestamp = timestamp
i_tzone     = 'PST'
IMPORTING
e_datlo     = date
e_timlo     = time.
WRITE :/ 'Current Date and Time at PST zone is ',date, time.
如何使用Field Symbols?
在ABAP里,Field symbol就像是C语言里的指针。 它有一个参考值指向内部表记录或一个变量。 它的本身不包含任何数据。
Field Symbol的最大优点就是灵活性。 它不关心指向数据是什么类型。当然它的不利之处也是由于这种灵活性。编译器不检查field symbol的类型。由于没有类型检查,编译器几乎不可能在运行前检测到错误。
field symbol的语法是它总是由尖括号括起来。ASSIGN命令用于把变量或内部表记录分配给field symbol。
语法
FIELD-SYMBOLS .
代码 范例
DATA: itab TYPE TABLE OF spfli,
wa LIKE LINE OF itab.
* 传统的方法更新内部表的记录。
* 1. 把记录读入工作区
* 2. 在工作区里改值。
* 3. 从工作区修改内部表的记录。
READ TABLE itab INTO wa INDEX 3.
wa-carrid = 'AA'.
MODIFY itab FROM wa INDEX 3.
*使用field symbol修改内部表的记录。
FIELD-SYMBOLS .
READ TABLE itab ASSIGNING .
-carrid= 'AA'.
什么是系统域值(System Field)?
系统域值提供了极其有用的系统运行时的数据。 系统域值的语法是SY -《名称》, 如SY - SUBRC。
系统域值的总数超过170,其中包括曾经一些现在已经过时系统域值。 为了你的方便,我在这里给出一个常常在我们的日常工作中使用的系统域值列表。
SY-SYSID – 正在使用的R / 3系统的名字。
SY-DYNNR – 屏幕数字。在对话程序中,你可以使用此系统域值来确定你需要的屏幕。 语法是“ LEAVE TO SCREEN SY-DYNNR.”。
SY-LANGU - 用户的登录语言(一个字节) , 例如英语是E和德语是D。
SY-MANDT – 你所在的系统客户端号。
SY-UNAME – 你的系统用户名。
SY-DATLO – 用户的本地日期。
SY-DATUM – 当前服务器的日期。
SY-TIMLO – 用户的本地时间。
SY-TCODE – 目前的交易(Transaction)代码。
SY-ULINE/VLINE – 水平/垂直的屏幕输出线。
SY-INDEX - 在DO或WHILE循环,SY-INDEX给出目前通过循环数
SY-TABIX – 当前内部表行号。
SY-DBCNT – 当前“select … from …”语句读到的行数。
SY-TFILL - 当运行完“DESCRIBE TABLE“或”LOOP AT“或”READ TABLE”后, SY - TFILL给出内部表的总行数目
SY-UCOMM – 用户命令。 你可以到菜单 “系统》状态...“去查找SY_UCOMM值。
如果我只能在运行期间得到数据库表名,我该如何在运行时动态地指定数据库表名?
下面的代码范例显示了如何在SELECT语句中使用数据库表名变量。
在运行时,程序先获取数据库表的名称- SFLIGHT,并把该数据库表的名称赋予一个变量-
在稍后的SELECT语句中,使用这个数据库表名称的变量。
请注意 , 在SQL语句里, 变量必须放在括号里。
代码 范例
DATA: tablename TYPE tabname16,
rows TYPE i.
tablename = 'SFLIGHT'.
SELECT COUNT(*) FROM (tablename) INTO rows.
WRITE: rows.
如何在多个程序中搜索特定的字符串?
在某些情况下,你需要在某些程序里寻找特定的字符串。这里几个搜索的办法。
1.使用程序“RPR_ABAP_SOURCE_SCAN”。然而,在4.6C及更高版本, 这一程序不再适用。
2.如果你找不到上面的程序,试试程序RSRSCAN1。 不幸的是,这一程序在新的NetWeaver 6.20平台上也过时了。
3.还有另一种方便的方法可以在某些程序字符串搜索。在transaction SE38的第一个屏幕,进入菜单 “实用程序”》 在源代码中查找“。
如何解开压缩域值(packed field)?
下面的代码范例显示了如何解开压缩域值,并包在域值前置零。压缩域值“p_field”打印出“123”。解压缩后的域值“unp_field”打印出“00000123”。
代码 范例
DATA: p_field(2) TYPE p VALUE 123,
unp_field(8) TYPE c.
WRITE: 'packed filed: ', p_field.
UNPACK p_field TO unp_field.
WRITE: / 'unpacked field: ', unp_field.
打印结果
packed filed: 123
unpacked field: 00000123
如何显示Domain Fixed Value的简短文字?
你可以通过运行transaction SE16来打开表视图(Table View)DD07V。 然后根据Domain (DOMNAME), 固定值(DOMVALUE_L)和语言(DDLANGUAGE)来搜索简短文字(DDTEXT)。
第三章数据库表
如何数据库表选择数据?
select a  b  into (l_a, l_b) from where c = 'XXX'.
If sy-subrc = 0. 如果型号:SY - subrc = 0。
it_tab_wa-a = l_a. it_tab_wa - 1 = l_a。
it_tab_wa-b = l_b. it_tab_wa -乙= l_b。
append it_tab_wa to it_tab. 追加it_tab_wa的it_tab。
clear it_tab_wa. 明确it_tab_wa。
Else. 其他的。
Exit. 退出。
Endif. Endif。
endselect. endselect。
Sy-dbcnt gives number of lines read from “select” 翟思dbcnt提出了一些“行数选择阅读”
Where [not] between and 如果 [不]和之间
Where [not] like ('_' a single char. '%' any char. string including empty. 如果 [不]喜欢('_'一个单一的字符。'%'的任何字符。串包括空。
[not] in (, …, ) [不]在(,...,
is [not] NULL 是[不]空
* name and field type in match *名和字段类型比赛
Select a b  Into (appending) corresponding fields of table it_tab
from
where c = 'XXX'. 其中c ='三十'。
Select ab 选择抗体
into (appending) table it_tab 成(附加)表it_tab
from
for all entries in it_tab2 在it_tab2所有条目
where c = it_tab2-c 其中c = it_tab2 - ?
and d = it_tab2-d. 和d = it_tab2三维。
Select A~a B~b 选择A1乙b
into corresponding fields of table it_tab 到相应的字段表it_tab
from as A inner join as B 从为A内加入乙
on A~id = B~id 对阿= B的身份证号
where A~id = '12345' 其中A编号= '12345'
and A~date between param_open and param_close. 和A之间param_open和param_close日期。
Data: condition_str(100) type c, 数据:condition_str(100)C型,
I_condition like condition_str occurs 0 with header line. 像condition_str I_condition发生与标题行0。
Concatenate 'Y =' y into condition_str separated by space. 串联'? ='Y到用空格分隔condition_str。
Append condition_str to I_condition. 追加condition_str的I_condition。
If NOT z is initial. 如果没有Z是最初的。
Concatenate 'Z =' z into condition_str separated by space. 串联的'Z ='?进入空间分隔condition_str。
Append condition_str to I_condition. 追加condition_str的I_condition。
Endif. Endif。
Select x into y from db_tble X到辎请从db_tble
Where x = a 其中x = 1
And ( I_condition ). 和(I_condition)。
当用“FOR ALL ENTIRES IN”语句作选择时的最佳方式。
Beware when using 'FOR ALL ENTRIES' in select statement. 小心使用为所有参赛作品的'在选择语句。 Although this addition to the select statement is an efficient way to fetch distinct records from DB table, follow the below steps to ensure data consistency and efficiency. 虽然这对选择语句除了是一种有效的方法 , 从数据库表中提取不同的记录,请按照下列步骤 , 以确保数据的一致性和效率。
1. 1。 Sort the Internal table used in the 'FOR ALL ENTRIES IN' clause. 排序表使用内部的所有参赛作品'中'的条款。
2. 2。 make sure they do not contain duplicates. 确保它们不包含重复。
3. 3。 last and most importantly include a primary key field(Unique entry) 最后 , 也是最重要的是包括一个主键字段(唯一项)
in the select list. 在选择列表中。 The reason, the system gets unique field records based 究其原因,该系统获得的唯一字段的记录
on the where condition. 在WHERE条件。 It summarizes the data based on the Data type and 它总结了基于数据类型和数据
field list in the target internal table. 字段列表中的目标内部表。
如何使数据库表能够被编辑?
三种办法:
第一种:当通过SE11创建新的数据库表时,选择“Table maintenance allowed”. 这样用户就能通过SE16编辑表的内容。
第二种:通过SM30编辑. 首先通过SE11使表处于编辑状态。去菜单:实用程序 〉表格维护生成器〉创建
第三种:
Edit via SM30: SE11 à menu Utilities>table maintenance generator à “Create” button à Input “Auth. 编辑通过SM30:SE11 菜单实用程序 “> 表维修发电机 à”创建“ 按钮 , 输入”认证。 groups” à Input “Functional group” à check “one step” à screen number in “Overview screen” 团体à输入”功能组“ 支票 ”一步到位“ 屏幕号码”概述屏幕“
Define a transaction code to edit à after above steps to create maintenance screen for the table à SE93 to create a transaction code à check “ Transaction with parameters ” à Transaction “SM30” à check “Skip initial screen” à parameters: “VIEWNAME = ” and “UPDATE = X”. 定义一个交易代码编辑上述步骤后创建的表维护屏幕 SE93创建一个交易代码 检查“ 交易与参数 ” 一宗 “SM30” 开支票 “跳过初始画面” 一个 参数:“视图名=”表名“”和“update = X”的。
如何添加/删除/修改数据库表中的关键项?
你可以通过Tcode SE14来更改数据库表。
如何显示和分配权限组?
显示和分配权限组是通过事务SE54来实现的。
要显示权限组, 你可以在事务SE54窗口(生成彪维护对话)上,选择“权限组“。 然后点击“显示“按钮。 所有权限组就会罗列在屏幕上。其实这些数据全部来自数据库表S_TABU_DIS。
如果要分配权限组,你可以选择“分配权限组“, 然后点击”创建/更改“按钮。
如何在数据库表的选择字段里加下拉选择值?
通过事务SE11 对数据库表进行更改 。双击字段的数据元素。,在数据词典窗口 双击“Domain“。然后再“Value Range”视窗,添加”固定值“。
如何在数据库表的选择字段里添加F4功能?
首先,要在数据库字段上增加检查表(Check Table). 通过事务SE11 对数据库表进行更改。 选择字段, 然后点击“Foreign Key”按钮 。在弹起的Foreign Key 选择窗口里,设定作为检查表(Check Table)的数据库表和字段为Foreign Key。
如何显示和删除表上的锁定(locks on the table)?
你可以通过事务代码SM12来显示被锁定的数据库表。如果需要删除表上的锁定,可以先在锁定表目清单上选择被锁定的表名,然后点击删除按钮。
如何在程序中动态地锁定/解锁数据库对象?
当锁定对象已被激活,系统生成功能模块ENQUEUE/DEQUEUE。如果你要删除程序里所有的锁定对象:调用功能模块'DEQUEUE_ALL'。
语法
ENQUEUE_
DEQUEUE_
如何在SELECT语句中动态地定义WHERE条款?
代码范例
DATA:  l_name1 LIKE lfa1-name1,
l_symbol VALUE '%'.
DATA : t_lfa1 LIKE lfa1 OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS  TYPE ANY.
PARAMETERS : name1 LIKE lfa1-name1.
CONCATENATE name1 l_symbol INTO l_name1.
ASSIGN l_name1 TO .
SELECT * FROM lfa1 INTO TABLE t_lfa1 WHERE name1 LIKE .
如何从ABAP程序中创建或修改数据库表 ?
如果你需要从一个ABAP程序里创建或修改表或结构,你可以参考下面的例子。 这个例子显示了如何用功能模块DDIF_TABL_GET, DDIF_TABL_PUT和DDIF_TABL_ACTIVATE达到这一目的。
首先,它从数据库表读取信息 , 然后用特定的数据库表领域创建一个新的结构。 最后以这个新的结构创建一个新数据库表。
代码范例
DATA: t_dd03p LIKE dd03p OCCURS 0 WITH HEADER LINE,
wa_dd02v LIKE dd02v .
FIELD-SYMBOLS:  LIKE LINE OF t_dd03p.
START-OF-SELECTION .
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name      = 'CE31000'
IMPORTING
dd02v_wa  = wa_dd02v
TABLES
dd03p_tab = t_dd03p.
DELETE t_dd03p WHERE fieldname(2) NE 'VV'.
wa_dd02v-tabclass = 'INTTAB' .
wa_dd02v-tabname  = 'ZMYTABLE' .
wa_dd02v-as4user  = sy-uname .
wa_dd02v-as4time  = sy-uzeit .
wa_dd02v-as4date  = sy-datum .
wa_dd02v-applclass = '' .
wa_dd02v-authclass = '' .
LOOP AT t_dd03p ASSIGNING .
-tabname   = 'ZMYTABLE'.
ENDLOOP.
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name      = 'ZMYTABLE'
dd02v_wa  = wa_dd02v
TABLES
dd03p_tab = t_dd03p.
CALL FUNCTION 'DDIF_TABL_ACTIVATE'
EXPORTING
name = 'ZMYTABLE'.
第四章内表
如何定义和使用内表?
代码范例
DATA:
* Define Internal Table without header line.
it_tab LIKE sflight OCCURS 0,
* Define work area for Internal Table without header line.
it_tab_wa TYPE sflight,
* Define Internal Table without header line.
it_tab_hdln LIKE sflight OCCURS 0 WITH HEADER LINE.
* Handle Internal Table without header line.
SELECT * FROM sflight INTO TABLE it_tab.
LOOP AT it_tab INTO it_tab_wa.
WRITE: / it_tab_wa-carrid.
ENDLOOP.
* Handle Internal Table with header line.
SELECT * FROM sflight INTO TABLE it_tab_hdln.
LOOP AT it_tab_hdln.
WRITE: / it_tab_hdln-carrid.
ENDLOOP.
ABAP Objects:
Data: it_tab type Standard/Sorted/Hashed table of <…> with key [initial size n].
如何读取内表?
代码范例
DATA:
 TYPE STANDARD TABLE OF  with header line.
SELECT *
INTO TABLE 
FROM .
SORT  BY f1 f2 f3.
READ TABLE  WITH KEY
f1 = var1
f2 = var2
f3 = var3
BINARY SEARCH.
如何检查内表的大小?
在运行完“DESCRIBE TABLE“, ”LOOP AT,“ 和 ” READ TABLE” 之后, SY-TFILL被赋予内表大小数目。
Describe table .
If sy-tfill > 0.
<。。。你的程序。。。 >
endif.
Describe table lines .
If = 0.
Endif.
如何删除内表的数据?
代码范例
Loop at
tabix = sy-tabix.
Delete index tabix.
Endloop.
如何删除内表中的重复行?
代码范例
sort by field_1 field_2.
delete adjacent duplicates from comparing field_1 field_2.
一些和内表相关的系统阈值。
SY-TABIX --内表的当前行行数。
SY-TFILL -- 内表所含行数。
如何定义内表类型的“Selection option” (Range)?
代码范例
DATA: t_tcode TYPE RANGE OF syst-tcode WITH HEADER LINE.
DATA: wa_tcode TYPE LINE OF t_tcode.
CLEAR wa_tcode.
MOVE 'I' TO wa_tcode-sign.
*     move 'BT' to wa_tcode-option.
*     move 'CP' to wa_tcode-option.
*     move 'EQ' to wa_tcode-option.
MOVE:
 TO wa_tcode-low,
 TO wa_tcode-high.
APPEND wa_tcode TO t_tcode.
如何循环内表 ?
在LOOP语句里使用Field Symbol,  而不是使用一个工作区(或通过标题行)。这样你可以避免传输数据进出工作区。 Field Symbol 直接指向表内的纪录,这样你可以直接修改表的纪录,而避免把数据传进和传出到工作区。
语法
FIELD-SYMBOLS: < field symbol > TYPE <内表类型>.
LOOP AT 《内表》 ASSIGNING 《field symbol》
如何使用Hash表快速的搜索内表?
如果你的程序里的内表是用于查找数据,那最好的办法就是使用Hash表。
代码范例
TYPES: BEGIN OF mrp_lookup_type,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
dispo LIKE marc-dispo,
dzeit LIKE marc-dzeit,
END OF mrp_lookup_type.
* Define static hashed table to hold results
DATA: st_mrp TYPE HASHED TABLE OF mrp_lookup_type
WITH UNIQUE KEY matnr werks.
DATA: l_wa_mrp TYPE mrp_lookup_type.
CLEAR dzeit.
* See if data is in the table
READ TABLE st_mrp INTO l_wa_mrp WITH TABLE KEY matnr = matnr
werks = werks.
在内表里使用Field Symbol的最佳做法。
你想提高处理内表的效率吗?新的ABAP Object extension标准对内表的定义有很大改进。新的定义方式有很多更好的选择,如使用Hash表和排序表的性能。Field Symbol的使用又把处理内表的效率更进一步。
新的内表定义通常不包括一个内表工作区。 此外,ABAP Objects也不允许内表由头行(Header Line)。所以为了增加性能,你不应该定义一个工作区, 而是使用Field Symbol。
工作区和头行的概念都需要将数据从内表向工作区或头行移动。而Field Symbol只是一个指向内表纪录的指针。用Field Symbol就不再需要把数据迁移进或出工作区和头行了。因为没有数据复制和转移,所以处理的速度要快得多。
使用Field Symbol的关键在于:
1)Field symbol的定义类型要和内表中的记录类型相同。
代码范例
TYPES: BEGIN OF it_vbpa_line,
vbeln LIKE vbak-vbeln,
kunnr LIKE vbak-kunnr,
END OF it_vbpa_line.
DATA: it_vbpa TYPE HASHED TABLE OF it_vbpa_line
WITH UNIQUE KEY vbeln.
FIELD-SYMBOLS:  TYPE it_vbpa_line.
2)在处理内表时候,使用ASSIGNING命令。
代码范例
在循环(LOOP)中的使用的范例。
LOOP AT it_vbak ASSIGNING .
ENDLOOP.
直接从表中读取的范例。
READ TABLE it_vbpa ASSIGNING 
WITH TABLE KEY vbeln = -vbeln.
3) 从Field symbol里读取数据。
代码范例
wa_zpartner-vkorg = -vkorg.
如何在程序调试过程中,下载内表内容到Excel?
如果你在程序调试中,发现内表有太多的表项 而难以发现问题的时候, 一个好办法是把内表的内容下载到Excel再分析!在调试模式下,从菜单路径“转到->“显示对象-〉内表” 显示内表。  键入内表的名称。然后 , 菜单路径:“转到->“显示对象〉结构编辑器”。此时,你的内表的内容就全部显示出来。为了要确保所有内容都显示出来,菜单路径:“对象>显示完整列表”。现在您可以通过菜单路径:“系统〉列表->保存” 下载您的内表内容到Excel了。
从R / 3版本4.7开始,在程序调试过程中保存的内表的内容成为可能:
在调试器(得不够个人)里显示内表的内容。
然后按Ctrl - F11键或鼠标右键鼠标 , 点击“另存为Excel工作表”(Save As Excel Worksheet)。
输入要保存的起始行数和结束行数。
选择你PC机上的文件夹/文件名,然后保存。
如何写一个程序把内表内容在运行时下载到Excel?
下面的范例是先形成一个内表,在把这个内表下载到用户PC的Excel文件里。
代码范例
DATA itab LIKE sflight OCCURS 0 WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
SELECT-OPTIONS :  carrid FOR itab-carrid.
SELECTION-SCREEN END OF BLOCK bl1.
START-OF-SELECTION.
SELECT carrid connid fldate price
INTO CORRESPONDING FIELDS OF TABLE itab
FROM sflight
WHERE carrid IN carrid.
* Excel direct download
DATA : excel_file_and_path(128).
DATA : tmp_name LIKE rlgrap-filename.
CALL FUNCTION 'REGISTRY_GET'
EXPORTING
key     = 'protocolStdFileEditingserver'
section = 'ExcelWorksheet'
IMPORTING
value   = excel_file_and_path.
DATA : file_name    LIKE rlgrap-filename VALUE 'C:TEMP.xls'.
DATA : cancel.
CALL FUNCTION 'DOWNLOAD'
EXPORTING
filename     = file_name
filetype     = 'DAT'
IMPORTING
act_filename = file_name
cancel       = cancel
TABLES
data_tab     = itab.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
commandline = file_name
program     = excel_file_and_path.
如何以HTML格式显示内表内容?
下面的程序范例给你一个如何形成一个内表然后把表的内容以HTML的格式显示出来。
代码范例
TABLES  dd02l.
DATA: tabname TYPE dd02l-tabname VALUE 'SFLIGHT'.
DATA: zx030l LIKE x030l,
p_number TYPE i,
tablefound TYPE i.
DATA: colorval TYPE i.
DATA: packval TYPE p, totalrows TYPE n.
DATA: w_area1 TYPE sflight,
charval(20) TYPE c.
DATA: tablen TYPE i VALUE 255.
DATA: BEGIN OF htmlview OCCURS 0,
htmlcode(500) TYPE c,
END OF htmlview.
DATA BEGIN OF zdfies OCCURS 0.
INCLUDE STRUCTURE dfies.
DATA END OF zdfies.
DATA: BEGIN OF flditab OCCURS 0,
fldname(11) TYPE c,
END OF flditab.
htmlview-htmlcode = ''.
APPEND htmlview.
htmlview-htmlcode = ' Table View : '.
APPEND htmlview.
htmlview-htmlcode = tabname.
APPEND htmlview.
htmlview-htmlcode = ' '.
APPEND htmlview.
***********************************************
PERFORM check-table-class.
PERFORM read-direct-table.
PERFORM downloadhtml.
PERFORM showhtml.
********************************************
FORM check-table-class.
tablefound = -1.
SELECT * FROM dd02l
WHERE tabname EQ tabname.
IF dd02l-tabclass CS 'TRANSP' OR
dd02l-tabclass CS 'POOL' OR
dd02l-tabclass CS 'CLUSTER '.
tablefound = 1.
EXIT.
ENDIF.
ENDSELECT.
IF tablefound < 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH 'Table Not Found.... or Table Class Not in "TRANSP","POOL", "CLUSTER"'.
STOP.
ENDIF.
ENDFORM.                    "CHECK-TABLE-CLASS
************************************************************************
FORM read-direct-table.
DATA: anz_numb TYPE i.
PERFORM gettableinfo USING tabname.
htmlview-htmlcode = ''.
APPEND htmlview.
htmlview-htmlcode = ''.
APPEND htmlview.
LOOP AT zdfies.
PERFORM htmlheader USING zdfies-fieldname.
ENDLOOP.
htmlview-htmlcode = ''.
APPEND htmlview.
colorval = 1.
anz_numb = 0.
SELECT * FROM sflight INTO w_area1.
ADD 1 TO anz_numb.
IF anz_numb GT 100. " U can alter the Hits, now Max. is 100 EXIT. ENDIF.
IF colorval > 0 .
htmlview-htmlcode = ''.
APPEND htmlview.
ELSE.
htmlview-htmlcode = ''.
APPEND htmlview.
ENDIF.
colorval = colorval * -1 .
*************
LOOP AT zdfies.
charval = w_area1+zdfies-offset(zdfies-intlen).
CASE zdfies-inttype.
WHEN 'P'.
packval = w_area1+zdfies-offset(zdfies-intlen).
charval = packval.
ENDCASE.
PERFORM htmlfield USING w_area1+zdfies-offset(zdfies-intlen).
ENDLOOP.
*************
htmlview-htmlcode = ''.
APPEND htmlview.
CLEAR: w_area1.
ENDIF.
ENDSELECT.
htmlview-htmlcode = ''.
APPEND htmlview.
ENDFORM.                    "READ-DIRECT-TABLE
****************************************************************
FORM downloadhtml.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename = 'C:TABLEVIEW.HTM'
TABLES
data_tab = htmlview.
IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
ENDFORM.                    "DOWNLOADHTML
***************************************************************
FORM showhtml.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
commandline = 'c:tableview.htm'
program     = 'C:PROGRA~1INTERN~1IEXPLORE.EXE'.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.                    "DOWNLOADHTML
************************************************************************
FORM gettableinfo USING tname.
CALL FUNCTION 'GET_FIELDTAB'
EXPORTING
langu               = sy-langu
only                = space
tabname             = tname
withtext            = 'X'
IMPORTING
header              = zx030l
TABLES
fieldtab            = zdfies
EXCEPTIONS
internal_error      = 01
no_texts_found      = 02
table_has_no_fields = 03
table_not_activ     = 04.
CASE sy-subrc.
WHEN 0.
LOOP AT zdfies. ENDLOOP.
WHEN OTHERS.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-subrc.
ENDCASE.
ENDFORM.                    "DOWNLOADHTML
********************************************************
FORM htmlfield USING name TYPE c.
htmlview-htmlcode = ''.
APPEND htmlview.
htmlview-htmlcode = name.
APPEND htmlview.
htmlview-htmlcode = ''.
APPEND htmlview.
ENDFORM.                    "DOWNLOADHTML
********************************************************
FORM htmlheader USING name TYPE c.
htmlview-htmlcode = ''.
APPEND htmlview.
htmlview-htmlcode = name.
APPEND htmlview.
htmlview-htmlcode = ''.
APPEND htmlview.
ENDFORM.                    "DOWNLOADHTML
如何在运行时检索内表信息?
功能模块GET_FIELDTAB可用于程序中检索的内表的信息。这个功能模块会提供内表的所有细节, 比如表中的列,他们的数据元素, 和检查表的名称等等。
如何在运行时动态地定义内表?
当在一个屏幕上使用表控制(table control)时,用户选择表控制的一行并不会自动引起任何PAI事件。 但在某些情况下,对用户在表控制上选择行应立即作出反应 , 不必等待下一个PAI的事件发生。 譬如,客户要求,当用户选择或取消选择某一行时,菜单能被动态地改变,(在这种情况下,只允许单一的选择 。)
解决方案:
在表控制的第一列,用函数代码'ROWS语句'新增了一个按钮。
在表控制里取消选择lineselection“。
用一个变量“prev_selected” 来反映来按钮的开/关状态 。
when ok-code = 'ROWS', identified the selected row using "GET CURSOR FIELD...." 当确定代码='ROWS语句',确定选定行使用“得到Cursor字段...." (PAI) (排)
When the button state changed from "off" to "on" highlighted the selected row using the "SCREEN-INTENSIFIED" attribute inside the loop at screen(PBO) 当按钮的状态从“小康”到“上”改变突出选中的行内使用在屏幕(贿赂循环“屏幕,强化”属性)
Portion of the ABAP code (PAI and PBO) is shown below. 在ABAP代码段(PAI和贿赂)所示。 TBL_ZAWBST is the table control variable. TBL_ZAWBST是表的控制变量。
代码范例
* process before output.
MODULE status_0100.
LOOP AT int_triggers
with control tbl_zawbst cursor tbl_zawbst-current_line.
MODULE display_triggers.
ENDLOOP.
process after input.
LOOP AT int_triggers.
MODULE set_line_count.
ENDLOOP.
MODULE user_command_0100.
pai
module user_command_0100 input.
WHEN 'ROWS' .
GET CURSOR FIELD csl_field LINE csl_line.
*
idx = csl_line + tbl_zawbst-top_line - 1.
IF idx > 0.
READ TABLE int_triggers INDEX idx.
prev_selected = ''.
IF int_triggers-chk_tbl_zawbst = 'X'.
prev_selected = 'X'.
ENDIF.
line_count = 0.
LOOP AT int_triggers.
CLEAR wa_int_triggers.
wa_int_triggers = int_triggers.
line_count = line_count + 1.
wa_int_triggers-chk_tbl_zawbst = ''.
MODIFY int_triggers FROM wa_int_triggers INDEX line_count.
ENDLOOP.
READ TABLE int_triggers INDEX idx.
IF prev_selected = ''.
int_triggers-chk_tbl_zawbst = 'X'.
row_selected = 'x'.
ELSE.
row_selected = ''.
ENDIF.
MODIFY int_triggers INDEX idx.
ENDIF.
pbo
*&---------------------------------------------------------------------*
*&      Module  DISPLAY_TRIGGERS  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module display_triggers output.
IF lin < 1. EXIT FROM STEP-LOOP. ENDIF.
chk_tbl_zawbst =''.
IF int_triggers-chk_tbl_zawbst NE ''.
chk_tbl_zawbst ='X'.
LOOP AT SCREEN.
IF screen-name = 'ZAWBST-WBSTYP' OR
screen-name = 'ZAWBST-WBSTNR' OR
screen-name = 'ZAWBST-WFCLO' OR
screen-name = 'ZAWBST-WFCHI' OR
screen-name = 'ZAWBST-WFNDL' OR
screen-name = 'ZAWBST-WFNDH' OR
*      screen-name = 'ZAWBST-TRIGR' OR
screen-name = 'ZAWBST-TROPR' OR
screen-name = 'ZAWBST-TRVAL' OR
screen-name = 'ZAWBST-WBSOA' OR
screen-name = 'ZAWBST-WBSOC' OR
screen-name = 'ZAWBST-WBSOD'.
screen-intensified = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
zawbst-wbstyp    = int_triggers-wbstyp.
zawbst-wbstnr    = int_triggers-wbstnr.
zawbst-wfclo    = int_triggers-wfclo.
zawbst-wfchi    = int_triggers-wfchi.
zawbst-wfndl    = int_triggers-wfndl.
zawbst-wfndh    = int_triggers-wfndh.
* zawbst-trigr    = int_triggers-trigr.
zawbst-tropr    = int_triggers-tropr.
zawbst-trval    = int_triggers-trval.
zawbst-wbsoa    = int_triggers-wbsoa.
zawbst-wbsoc    = int_triggers-wbsoc.
zawbst-wbsod    = int_triggers-wbsod.
ENDMODULE.                             " DISPLAY_TRIGGERS  OUTPUT
field-symbols:
type any.
types: fieldref type ref to data.
data: dyn_table type fieldref.
As for the actual code to generate the table: 至于实际的代码生成表:
create data dyn_table type (SAP Table). 创建数据dyn_table类型(SAP表)。
assign dyn_table->* to table. 分配dyn_table -“*表。
The table is now a field symbol which can be referenced in the normal way. 该表现在是一个字段符号可以在正常的方式引用。
第五章 报表程序
如何显示信息?
信息类型包括下面几类:
E:  错误;
W:警告;
I:信息;
S:成功;
A: 不正常结束
语法
MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
Write g to f 写克至f
Format options 格式选项
Note 注意 :
NO-ZERO 无零
If the contents of f are equal to zero, only blanks are output; if f is of type C or N , leading zeros are replaced by blanks. 如果F是等于零的内容,只有空白的输出; 如果 f类型是 C 或 N,前导零用空格代替。
NO-SIGN 无标志
The leading sign is not output if f is of type I , P or F 领先的标志是不输出如果 f的类型是我,P或 F
NO GROUPING 没有分组
If f has the type I or P , the thousand separators are omitted. 如果 f有I 型或 P的千位分隔符被省略。
MM/DD/YY or MM/DD/YYYY 月/日/年或MM / DD /年
CURRENCY w 货币瓦特
Treats the contents of f as a currency amount. 视为一个货币金额f 的内容。 The currency specified in w determines how many decimal places this amount should have. W 中规定的货币决定了小数点这一数额应。
DECIMALS d 小数
DATA: X TYPE P DECIMALS 3 VALUE '1.267', 数据:X P型小数3值'1 0.267',
Y TYPE F            VALUE '125.456E2'. Y型F值'125 0.456 E2'类。
WRITE: /X DECIMALS 0,  "output: 1 写:/ X小数0,“输出:1
/X DECIMALS 2,  "output: 1.27 / X小数2,“输出:1.27
/X DECIMALS 5,  "output: 1.26700 / X小数5,“输出:1.26700
/Y DECIMALS 1,  "output: 1.3E+04 /年小数1,“输出:1.3E +04
/Y DECIMALS 5,  "output: 1.25456E+04 /年小数5,“输出:1.25456E +04
/Y DECIMALS 20. /年小数20。 "output: 1.25456000000000E+04 “输出:1.25456000000000E +04
ROUND r 圆形
DATA: X TYPE P DECIMALS 2 VALUE '12493.97'. 数据:X P型小数2值'12493 .97'。
WRITE: /X ROUND -2,   "output: 1,249,397.00 写:/ x圆桌会议-2,“输出:1,249,397.00
/X ROUND  0,   "output:    12,493.97 / x圆桌会议0,“输出:12,493.97
/X ROUND  2,   "output:       124.94 / x圆桌会议2,“输出:124.94
/X ROUND  5,   "output:         0.12 / x圆桌会议5,“输出:0.12
LEFT-JUSTIFIED 左对齐
/ CENTERED /中心
/ RIGHT-JUSTIFIED /右对齐
如何打印页眉和页脚的?
START-OF-SELECTION. 裁减的,选择。
TOP-OF-PAGE. 顶级页。
END-OF-PAGE. 终了页。
Selection Screen Events 选择屏幕活动
“Initialization” is processed only ONCE à “ selection-screen output” is processed when user presses key à “ start-of-selection” “初始化” 仅处理一次 “ 选择屏幕上输出” 进行处理时 , 用户按 < 回车键 “ 开始的选择”
At selection-screen on . à check user input in parameter field. 在选择屏幕上。 支票在外地的用户输入参数。
用户界面(GUI)上有用的系统域 值(System Fields)
SY-DYNNR 型号:SY - DYNNR
Screen number 屏幕数字
LEAVE TO SCREEN SY-DYNNR. 留给屏幕型号:SY - DYNNR。
SY-UCOMM 型号:SY - UCOMM
User command 用户命令
menu System à Status … à double click on “ GUI Status” value 菜单系统的 一个 状态... 一个 关于“界面状态双击”价值
Multiple selection checkbox. 多选复选框。
parameters: p_xxx type c as checkbox, 参数:p_xxx的复选框C型
loop at . 在循环。
write: / ' ' as checkbox , -cust_name. 写 :/''的复选框 ,,cust_name。
endloop. endloop。
at line-selection. 在选线。
do. 做。
read line sy-index . 读线 型号:SY -索引 。
if sy-subrc <> 0. 如果型号:SY - subrc“”0。
exit. 退出。
endif. endif。
if sy-lisel (1) = 'X'. 如果 型号:SY - lisel(1)='X' 低。
write sy-lisel+31(10) to . 写型号:SY - lisel +31(10)
loop at into where = . 循环在进入其中 =

endloop. endloop。
endif. endif。
enddo. enddo。
与文件相关的选择参数
PARAMETERS: p_infile  LIKE rlgrap-filename DEFAULT  'c:\'. 参数:p_infile像rlgrap文件名默认'?:\'。
parameters: in_file like rlgrap-filename. 参数:如rlgrap in_file文件名。
at selection-screen on value-request for in_file. 在选择屏幕上的价值为in_file要求。
clear g_tmp_file_path. 明确g_tmp_file_path。
perform select_input_file_name. 执行select_input_file_name。
move g_tmp_file_path to in_file. 移动g_tmp_file_path的in_file。
form select_input_file_name. 形式select_input_file_name。
call function 'F4_FILENAME' 调用函数'F4_FILENAME'
exporting 出口
program_name  = sy-repid 程序program_name =型号:SY - repid
dynpro_number = sy-dynnr dynpro_number =型号:SY - dynnr
field_name    = 'PATH' field_name ='路径'
importing 进口
file_name     = g_tmp_file_path. FILE_NAME的= g_tmp_file_path。
endform. endform。
Additional advantage is browse files can be of specific type eg. 另一个好处是 , 可以浏览文件的具体类型 , 例如。 *.XLS if a mask value is given. *.如果口罩值就是大件。
如何加入单选按钮 ?
parameters: r_wc radiobutton group r user-command rb, 参数:r_wc单选群为R用户命令包,
r_cc radiobutton group r default 'X'. r_cc单选R组默认的X'。
Selection Options 选择选项
select-options: s_vkorg for vbrk-vkorg default '0600', 选择-选项:为vbrk s_vkorg - vkorg默认'0600',
select … from … where vkorg in s_vkorg. 从选择... ...凡在s_vkorg vkorg。
Write: /3 'From', s_vkorg-low, 'To', s_vkorg-high. 写入:/从'3',s_vkorg低,'要',s_vkorg高。
If selection range is not wanted : 如果选择范围并不想 :
select-options: s_vkorg for vbrk-vkorg no intervals . 选择-选项:为vbrk s_vkorg - vkorg 没有间隔 。
If need to add selection pattern: 如果需要添加选择的模式:
select-options: 选择,选项:
so_xxx for tstc-tcode no intervals default 'Z*' option cp . so_xxx的东方信联tcode 没有间隔默认的'Z *'选项的念头 。

loop at where in so_xxx . 循环在在so_xxx。
Endloop. Endloop。
如何在输入屏幕加入文本 ?
selection-screen comment 1(15) 'XXXX'.
如何修改输入屏幕?
Screen-required: Field input mandatory 屏幕要求:字段输入强制
Screen-input: Field ready to accept input (1-OK, 0-no input) 屏幕上输入:现场准备接受输入(1行,0,没有输入)
Screen-invisible: text field not visible; for I/O field, input text not visible (such as password field) 屏幕无形:文本字段不可见的,用于I / O方面,输入文本不可见的(如密码字段)
Screen-length: field length 屏幕长度:字段长度
Screen-active: '0' — I/O field not displayed. 屏幕活跃:'0' -的I / O字段不显示。
Loop at screen. 环在屏幕上。
If screen-name = 'XX'. 如果屏幕名称='二十'。
Screen-xx = … 屏幕二十= ...
Modify screen . 修改屏幕 。
Endif. Endif。
Endloop. Endloop。
PARAMETERS: p_input1 LIKE xxx-xxx OBLIGATORY MODIF ID XX, 参数:p_input1了XXX - MODIF编号第二十第三十强制性的,
p_input2 LIKE xxx-xxx OBLIGATORY MODIF ID XX . p_input2了XXX - MODIF编号二十三十强制性的。
AT SELECTION-SCREEN OUTPUT. 在选择屏幕输出。

LOOP AT SCREEN. 回路在屏幕上。
CHECK screen-group1 = 'XX'. 检查屏幕1组='二十'。 (if not, out of loop. If yes, go on) (如果不是只有一个循环。如果是的话,请继续)
screen-input = '0'.  (make the group of input parameters can not input) 屏幕上输入= '0'。(使输入参数不能输入组)
MODIFY SCREEN . 修改屏幕 。
ENDLOOP. ENDLOOP。
如何不显示I / O 的文本字段?
LOOP AT SCREEN. 回路在屏幕上。
Screen-invisible = '1'. 屏幕隐形= '1'。 “ Not display text field “不显示文本字段
Screen-active = '0'.   “ Not display I/O field 屏幕积极= '0'。“不显示的I / O领域
ENDLOOP. ENDLOOP。
Make I/O field read-only 如何使I / Ofield只读 ?
LOOP AT SCREEN. 回路在屏幕上。
If screen-name = 'XXXX'. 如果屏幕名称='XXXX的'。
Screen-input = '0'. 屏幕输入= '0'。
Modify screen. 修改屏幕。
Exit. 退出。
Endif. Endif。
ENDLOOP. ENDLOOP。
领域里的下拉和F4功能 ,
参数编号
PARAMETERS: p_xx  TYPE xxx  MEMORY ID YYY. 参数:p_xx型三十 内存标识 YYY。
GET PARAMETER ID 'YYY' FIELD p_xx. GET参数身份证'YYY'场p_xx。 –> Read PID and put in field p_xx - “阅读PID和外地p_xx投入
SET PARAMETER ID 'YYY' FIELD p_xx. 设置参数身份证'YYY'场p_xx。 –> Set PID with the value from field p_xx. - “设置的PID与实地p_xx价值。
Search Parameter thru se11 “Data type”. 搜索参数“通过se11”数据类型。
MATNR MATNR
MAT 垫
WERK 工厂
WRK WRK
LIFNR LIFNR
LIF 白血病抑制因子
BUKRS BUKRS
BUK 北
QMNUM QMNUM
IQM IQM
匹配码(Match code)
Search “matchcode object” in SE11 “Search help” field. 搜索“matchcode对象”在SE11“搜索帮助”领域。
Matchcode object XXX. Matchcode对象三十。
Create matchcode: 创建matchcode:
In “Selection method” field: put in mater data table, such as LFA1 or MARA. 在“选择法”领域:在母校数据表,提出如LFA1或马拉。 Text table will be inserted automatically if available. 文本表将自动插入如果可用。
In “Search help parameter”, enter all fields you need to as inputs and outputs. 在“搜索帮助参数”,进入各个领域的需要作为输入和输出。
“EXP” refers to search/input fields; “IMP” refers to output fields “进出口”,是指搜索/输入域,“进出口”,是指输出字段
Lpos is output position while Spos is input/search position Lpos是输出的地位 , 同时该工具输入/搜索排名
如何获得选择屏幕上的内容?
data:selection_table like rsparams occurs 0 with header line, 数据:像rsparams selection_table发生与标题行0,
report like rsvar-report. 报告一样rsvar的报告书。
report = sy-repid. 报告=型号:SY - repid。
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS' 呼叫函数'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING 出口
curr_report          = report curr_report =报告
*IMPORTING *进口
*  SP                   = *警司=
TABLES 桌
selection_table       = selection_table selection_table = selection_table
EXCEPTIONS 例外
not_found            = 1 not_found = 1
no_report            = 2 无报告= 2
OTHERS               = 3. 其它= 3。
如何在输入屏幕内加空格?
selection-screen skip 1.
如何在Field里设置光标?
set cursor field 'XXX'. 设置游标字段'三十'。
如何把很多Fields放在一行?
selection-screen begin of line . 选择屏幕开始行 。
selection-screen comment 1(15) 'XXXX'. 选择屏幕评论1(15)'XXXX的'。
parameters: p_xx like xxx. 参数:如XXX p_xx。
selection-screen end of line . 选择屏幕的行的末尾 。
如何产生弹出窗口?
Ws_msg -- Create a dialog box in which you display an one-line message. Ws_msg - 创建一个对话框 , 在其中显示了一个在线留言。
Search for “POPUP_TO_*” function modules 搜索“POPUP_TO_ *”功能模块
data: a. 资料:答 :
call function 'POPUP_TO_CONFIRM_DATA_LOSS' 调用函数'POPUP_TO_CONFIRM_DATA_LOSS'
exporting 出口
*  DEFAULTOPTION       = 'J' * DEFAULTOPTION =的J'
titel              = 'Testing Title' 标题='测试标题'
*  START_COLUMN        = 25 * START_COLUMN = 25
*  START_ROW          = 6 * START_ROW = 6
importing 进口
answer             =    a. 答 : 答案=
answer: 'J' – YES, 'N' – NO, 'A' – CANCEL. 回答:的J' -是的,'东经' -一氧化氮,'甲' -取消。
· ·   Popup_to_display_text Popup_to_display_text
Create a dialog box in which you display a two-line message. 创建一个对话框 , 在其中您显示两行信息。
· ·   Popup_to_confirm_step Popup_to_confirm_step
Create a dialog box in which you make a question whether the user wishes to perform the step. 创建一个对话框 , 在其中你犯了一个问题 , 用户是否愿意执行的步骤。
· ·   Popup_to_confirm_with_message Popup_to_confirm_with_message
Create a dialog box in which you inform the user about a specific decision point during an action. 创建一个对话框 , 在其中您了解具体的决定点行动期间用户。
· ·   Popup_to_confirm_with_value Popup_to_confirm_with_value
Create a dialog box in which you make a question whether the user wishes to perform a processing step with a particular object. 创建一个对话框 , 在其中你犯了一个问题 , 用户是否愿意执行与特定对象的加工步骤。
· ·   Popup_to_confirm_loss_of_data Popup_to_confirm_loss_of_data
Create a dialog box in which you make a question whether the user wishes to perform a processing step with loss of data. 创建一个对话框 , 在其中你犯了一个问题 , 用户是否愿意执行与数据丢失的加工步骤。
· ·   Popup_to_decide Popup_to_decide
Create a dialog box in which you require the user between the two processing alternatives, or to cancel the action. 创建一个对话框 , 在其中您需要两者之间的处理办法的用户,或取消行动。
·  Popup_to_decide_with_message · Popup_to_decide_with_message
Create a dialog box in which you inform the user about a specific decision point via a diagnosis text. 创建一个对话框 , 在其中您了解具体的决策点通过诊断文本的用户。