分享

SAP ABAP语言编程手册

 taewon 2011-06-16

第一章程序调试  

编译任何程序最基本的技能就是对程序的调试(debugging. 所以让我们先熟悉一下SAP ABAP程序的调试手段。

如何调试ABAP程序?

在这本书中,我假设你使用的是ABAP编辑器(事务代码 SE38)开发ABAP程序。 但是,如果你使用的是Object Navigator (事务代码 SE80)做开发工作,过程也是相同的。

ABAP编辑器屏幕,采取以下步骤设置你的调试断点:

  1. 选择你要开始调试的代码行。
  2. 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 <User Logon ID>.

如果你代码中的登录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 <string> using 'XY'.

如何分割一个被tab分隔(tab-delimited的字符串

你可以方便地使用“SPLIT”命令,分裂一个被分隔符分隔的字符串。 在大多数情况下,分隔符是一个或多个字符,如“|”"||",''等,但是,” tab-delimited “分隔符是不同的。它必须定义为值是“09”'×'类型。

下面的代码范例显示了如何分割tab分隔(tab-delimited)的字符串。请注意” tab-delimited “分隔符变量是如何定义的。

代码 范例

Data: tab_del type x value '09'.

SPLIT <string> at tab_del into <field1> <field2> ….

如何删除字符串中的分隔符?

你可以先把分隔符除掉 然后再把所有分割后的子字符串串联在一起。

代码 范例

DATA: tab_del TYPE C VALUE '|'.
DATA: field1, field2, ……,  fieldn, final_str TYPE string.

  SPLIT <string> AT tab_del   INTO: field1 field2 … fieldn.

  CONCATENATE  field1 field2 … fieldn INTO final_str.

2.2条件运算符和循环

如何调用在另一个程序中的子程序?

语法

PERFORM <subroutine>(<program name>) 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)中。

如果<logic expression>检查结果为负,当前循环进程终止 然后开始下一个循环。

2“CHECK”在一个子程序(Subroutine)或报表程序(Report)里 

如果<logic expression>检查结果为负,程序停止运行并退出当前的子程序或报表程序。

语法

CHECK <logic expression>.

 

和需要若干行的“IF”结构比较,CHECK”语句干净简洁。 往往若干行的“IF”代码可以被只有一行的“CHECK“语句取代。

如何在循环结构中使用“AT…ENDAT”结构?

语法

Loop at itab.

At FIRST.

… … ... ...

ENDAT.

At LAST.

… … ... ...

ENDAT

ENDLOOP

2.3文件输入/输出

如何打开一个文件?

你可以使用下面的语句来打开文件。 但请注意,如果你不使用任何附加值,打开的文件只能进行读取而不能更改。而且是二进制模式。

如果你没有指定目录,系统将使用配置参数DIR_HOME定义的目录作为默认目录。 因此 我建议你在文件名变量里使用完整的文件路径 以避免混乱。  

语法

OPEN DATASET <file_name>.

SY-SUBRC = 0.文件打开.

SY-SUBRC = 8.文件无法打开。

如何从文件中读取数据?

如果你想从文件中读取数据,可以使用”OPEN DATASET“ ”READ DATASET 语句.  只要用户有更改权限, 这个语句就能以读取/更新模式打开文件。

如果用户没有更改权限,文件只以'读取'模式打开。 如果这仍然不能打开文件,错误信息就会出现。

 下面的代码范例显示如何打开一个文件,一行行读出数据,并保存数据到一个内部表中。

代码 范例

DATA: input_file(40TYPE c,
itab(
94OCCURS 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(40TYPE c,
itab(
94OCCURS 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             = 
'<file_name>'
*  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命令

如果你是一个UnixWindows操作系统,下面的代码范例显示如何在该操作系统上运行命令。

该机制其实就是打开一个文件 运行命令。 然后将运行结果写入一个文件。

代码范例显示了如何运行的Unix命令。

如果你在Windows系统上,你只需把文件的路径和命令更改成Windows格式。

代码 范例

DATA: result_file(50VALUE '/tmp/test',
msg_text(
50),
command(
255VALUE '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 -DATUMSY - UZEIT分别是系统的日期和时间。

如果你需要得到本地日期,时间,而所在时区,你可以分别使用域值SY - DATLOSY - TIMLOSY - 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 ',datetime.
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 ',datetime.

如何使用Field Symbols

ABAP,Field symbol就像是C语言里的指针。 它有一个参考值指向内部表记录或一个变量。 它的本身不包含任何数据。

Field Symbol的最大优点就是灵活性。 它不关心指向数据是什么类型。当然它的不利之处也是由于这种灵活性。编译器不检查field symbol的类型。由于没有类型检查,编译器几乎不可能在运行前检测到错误。

field symbol的语法是它总是由尖括号括起来。ASSIGN命令用于把变量或内部表记录分配给field symbol

语法

FIELD-SYMBOLS <fs>.   

代码 范例

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 <fs>.
READ TABLE itab ASSIGNING <fs>.
<fs>-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 - DOWHILE循环,SY-INDEX给出目前通过循环数

     SY-TABIX – 当前内部表行号。

     SY-DBCNT – 当前“select … from …”语句读到的行数。

     SY-TFILL - 当运行完“DESCRIBE TABLE“”LOOP AT“”READ TABLE”后, SY - TFILL给出内部表的总行数目

     SY-UCOMM – 用户命令。 你可以到菜单系统》状态...“去查找SY_UCOMM值。

如果我只能在运行期间得到数据库表名,我该如何在运行时动态地指定数据库表名

下面的代码范例显示了如何在SELECT语句中使用数据库表名变量。 

在运行时,程序先获取数据库表的名称- SFLIGHT,并把该数据库表的名称赋予一个变量- <tablename>

在稍后的SELECT语句中,使用这个数据库表名称的变量。

请注意 SQL语句里, 变量必须放在括号里。

代码 范例

DATA: tablename TYPE tabname16,
rows TYPE i.
tablename = 
'SFLIGHT'.
SELECT COUNT(*) FROM (tablename) INTO rows.
WRITErows.  

如何在多个程序中搜索特定的字符串?

在某些情况下,你需要在某些程序里寻找特定的字符串。这里几个搜索的办法。

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(2TYPE p VALUE 123,
unp_field(
8TYPE 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 ViewDD07V 然后根据Domain (DOMNAME) 固定值(DOMVALUE_L)和语言(DDLANGUAGE)来搜索短文字(DDTEXT)。

第三章数据库表

如何数据库表选择数据?

select a  b  into (l_a, l_b) from <db_table> 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_wait_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 <f> [not] between <g1> and <g2> 如果<f> []<g2>之间<g1>

Where <f> [not] like <g1> ('_' a single char. '%' any char. string including empty. 如果<f> []喜欢<g1>'_'一个单一的字符。''的任何字符。串包括空。

<f> [not] in (<g1>, …, <gn>) <f> []在(<g1>...<gn>

<f> is [not] NULL <f>[]

 

* name and field type in <it_tab> match <db_table> *名和字段类型<it_tab>比赛<db_table>

Select a b  Into (appending) corresponding fields of table it_tab

from <db_table> <db_table>

where c = 'XXX'. 其中c ='三十'

 

Select ab 选择抗体

into (appending) table it_tab 成(附加)表it_tab

from <db_table> <db_table>

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 选择A1b

into corresponding fields of table it_tab 到相应的字段表it_tab

from <db_table_A> as A inner join <db_table_B> as B <db_table_A>A内加入乙<db_table_B>

on A~id = B~id 对阿= B的身份证号

where A~id = '12345' 其中A编号= '12345'

and A~date between param_open and param_close. A之间param_openparam_close日期

Data: condition_str(100) type c, 数据:condition_str100C型,

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_strI_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_strI_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. 编辑通过SM30SE11 菜单实用程序 “> 表维修发电机 à”创建按钮 输入认证。 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 = <table name>” 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_ <lock_object>

DEQUEUE_ <lock_object>

如何在SELECT语句中动态地定义WHERE条款?

代码范例

DATA:  l_name1 LIKE lfa1-name1,
l_symbol 
VALUE '%'.
DATA : t_lfa1 LIKE lfa1 OCCURS 0 WITH HEADER LINE.

FIELD-SYMBOLS <ltfs> TYPE ANY.

PARAMETERS : name1 LIKE lfa1-name1.

CONCATENATE name1 l_symbol INTO l_name1.

ASSIGN l_name1 TO <ltfs>.

SELECT * FROM lfa1 INTO TABLE t_lfa1 WHERE name1 LIKE <ltfs>.

如何从ABAP程序中创建或修改数据库表

如果你需要从一个ABAP程序里创建或修改表或结构,你可以参考下面的例子。 这个例子显示了如何用功能模块DDIF_TABL_GET DDIF_TABL_PUTDDIF_TABL_ACTIVATE达到这一目的。

首先,它从数据库表读取信息 然后用特定的数据库表领域创建一个新的结构。 最后以这个新的结构创建一个新数据库表。 

代码范例

DATA: t_dd03p LIKE dd03p OCCURS 0 WITH HEADER LINE,
      wa_dd02v 
LIKE dd02v .

FIELD-SYMBOLS: <fs> 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(2NE '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 <fs>.
    <fs>-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:
   <int_tab> 
TYPE STANDARD TABLE OF <db_table> with header line.

SELECT *
INTO TABLE <int_tab>
FROM <db_table>.

SORT <int_tab> BY f1 f2 f3.

READ TABLE <int_tab> WITH KEY
  f1 = var1
  f2 = var2
  f3 = var3
BINARY SEARCH.  

如何检查内表的大小?

在运行完“DESCRIBE TABLE, LOOP AT, 和 ” READ TABLE 之后, SY-TFILL被赋予内表大小数目。

Describe table <itab>.

If sy-tfill > 0.

<。。。你的程序。。。 >

endif.

Describe table <itab> lines <line>.

If <line> = 0.

Endif.

如何删除内表的数据?

代码范例

Loop at <itab>

 tabix = sy-tabix.

Delete <itab> index tabix.

Endloop.

如何删除内表中的重复行?

代码范例

 

sort <i_tab> by field_1 field_2.

delete adjacent duplicates from <i_tab> 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:
 <val_low> 
TO wa_tcode-low,
 <val_high> 
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表。

代码范例

TYPESBEGIN 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的关键在于:
1Field symbol的定义类型要和内表中的记录类型相同。

代码范例

TYPESBEGIN 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: <it_vbpa_line> TYPE it_vbpa_line.


2)在处理内表时候,使用ASSIGNING命令。

代码范例

在循环(LOOP)中的使用的范例。

LOOP AT it_vbak ASSIGNING <it_vbak_line>.
ENDLOOP.

直接从表中读取的范例。
READ TABLE it_vbpa ASSIGNING <it_vbpa_line>
WITH TABLE KEY vbeln = <it_vbak_line>-vbeln.


3) Field symbol里读取数据。

代码范例

wa_zpartner-vkorg = <it_vbak_line>-vkorg. 

 

如何在程序调试过程中,下载内表内容到Excel

如果你在程序调试中,发现内表有太多的表项 而难以发现问题的时候, 一个好办法是把内表的内容下载到Excel再分析!在调试模式下,从菜单路径“转到->“显示对象-〉内表” 显示内表  键入内表的名称。然后 菜单路径:“转到->“显示对象〉结构编辑器”。此时,你的内表的内容就全部显示出来。为了要确保所有内容都显示出来菜单路径:“对象>显示完整列表”。现在您可以通过菜单路径:“系统〉列表->保存” 下载您的内表内容到Excel了。

R / 3版本4.7开始,在程序调试过程中保存的内表的内容成为可能:

  • 在调试器(得不够个人)里显示内表的内容。
  • 然后按Ctrl - F11键或鼠标右键鼠标 点击另存为Excel工作表Save As Excel Worksheet
  • 输入要保存的起始行数和结束行数。
  • 选择你PC机上的文件夹/文件名,然后保存。

如何写一个程序把内表内容在运行时下载到Excel

下面的范例是先形成一个内表,在把这个内表下载到用户PCExcel文件里。

代码范例

 

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(
20TYPE c.
DATA: tablen TYPE i VALUE 255.

DATABEGIN OF htmlview OCCURS 0,
            htmlcode(
500TYPE c,
      
END OF htmlview.

DATA BEGIN OF zdfies OCCURS 0.
        
INCLUDE STRUCTURE dfies.
DATA END OF zdfies.

DATABEGIN OF flditab OCCURS 0,
     fldname(
11TYPE 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 <> 0MESSAGE 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 < 1EXIT FROM STEP-LOOPENDIF.
  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: <table> 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 <Format Options> 写克至f <Format Options>

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. 如果 fI 型或 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'. YF'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 <ENTER> key àstart-of-selection” 初始化 仅处理一次选择屏幕上输出 进行处理时 用户按 < 回车开始的选择

At selection-screen on <parameter>. à check user input in parameter field. 在选择屏幕上<parameter> 支票在外地的用户输入参数。

用户界面(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 <itab>. <itab>循环。

write: / ' ' as checkbox , <itab>-cust_name. /''的复选框 <itab>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 - lisel1='X' 低。

write sy-lisel+31(10) to <variable>. 写型号:SY - lisel +3110<variable>

loop at <itab> into <itab_wa> where <itab_field> = <variable>. 循环在进入<itab_wa>其中<itab_field> = <itab> <variable>

<do your job …> <do你的工作>

endloop. endloop

endif. endif

enddo. enddo

文件相关的选择参数

PARAMETERS: p_infile  LIKE rlgrap-filename DEFAULT  'c:\'. 参数:p_infilerlgrap文件名默认'?\'

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_pathin_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 <internal_table> where <table_field> in so_xxx . 循环在<internal_table><table_field>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_input1XXX - MODIF编号第二十第三十强制性的,

p_input2 LIKE xxx-xxx OBLIGATORY MODIF ID XX . p_input2XXX - MODIF编号二十三十强制性的。

AT SELECTION-SCREEN OUTPUT. 在选择屏幕输出。

<manipulate your input fields> <manipulate您输入fields>

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  <OBLIGATORY> MEMORY ID YYY. 参数:p_xx型三十<OBLIGATORY> 内存标识 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'. 选择屏幕评论115'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. 创建一个对话框 在其中您了解具体的决策点通过诊断文本的用户。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多