ABAP 内表(Internal Table)的定义及使用(三)

二、Internal Table的使用

1 Adding Lines by Key Access 以key access的方式添加数据

abap-3-5

如上图所示的几种命令三种内表均适用,但是对于不同类型的内表,技术层面上的操作略有不同:
Standard table: 在内表的最后一行增加一行数据,与APPEND命令相同
Sorted table: 如果是unique key, 新增的记录将被插入在按照key列升序排列相应的位置,如果是non-unique key,如果已经存在相同Key值的行,输将将被插入第一个相同key值的列前面。
Hashed table: 新增的记录被插入内表最后一行(看上去,实际在哪一行对访问内表都无意义),相应的HASH INDEX中也增加一行。

如果内表是unique key定义的话,内表中如果已经存在同样key值的数据,则操作失败,SY-SUBRC返回值为4;当以上语句成功执行之后,即数据被插入内表,SY-TABIX值为插入后数据所在的位置。

COLLECT命令只能用于非key列全是数字类型(I,P,F)的内表。该语句的作用是将工作区的数据累加入内表相同key值的行,或没有的情况下新增一行。需要注意的是,对于non-unique key定义的内表,如果内表中存在多个key值相同的行,则COLLECT命令将只在第一个key值相同的列累加。示例代码如下:

TYPES: BEGIN OF TY_ITAB,
EBELN TYPE EKKO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE EKPO-MATNR,
MENGE TYPE EKPO-MENGE,
END OF TY_ITAB.
TYPES: TT_ITAB TYPE TABLE OF TY_ITAB.
DATA: WA_ITAB TYPE TY_ITAB.
DATA: T_ITAB_STANDARD TYPE TT_ITAB. "Default: Standard table
DATA: T_ITAB_SORTED TYPE SORTED TABLE OF TY_ITAB WITH NON-UNIQUE KEY EBELN EBELP MATNR. "Sorted table, NON-UNIQUE KEY
DATA: T_ITAB_HASHED TYPE HASHED TABLE OF TY_ITAB WITH UNIQUE KEY EBELN EBELP MATNR. "Hashed table, UNIQUE KEY

*fill data into working area line
DEFINE DEF_WA_ITAB.
WA_ITAB-EBELN = &1.
WA_ITAB-EBELP = &2.
WA_ITAB-MATNR = &3.
WA_ITAB-MENGE = &4.
END-OF-DEFINITION.
DEF_WA_ITAB ‘4500010001’ ‘00010’ ‘000000000010000000’ ‘100’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED.
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED.

DEF_WA_ITAB ‘4500010010’ ‘00010’ ‘000000000010000002’ ‘200’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED.
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED.

DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD. " Just append
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED. " Sorted automatically: sorted table, asending order
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED. " Apears to be append, but an entry of a hash index is made

DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’. "same record as last one
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED. " inserted before the first entry of the same key
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED. " Failed inserting: unique key sy-subrc = 4

DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’. "NUMBERIC FIELDS ARE COLLECTED ACCORDING KEY FIELDS
COLLECT WA_ITAB INTO T_ITAB_STANDARD. " ONLY TO THE FIRST LINE OF KEY-VALUE-OCCURED
COLLECT WA_ITAB INTO T_ITAB_SORTED. " THE SAME AS ABOVE
COLLECT WA_ITAB INTO T_ITAB_HASHED. " UNIQUE-KEY

DATA: T_ITAB_NAK TYPE SORTED TABLE OF TY_ITAB WITH NON-UNIQUE KEY EBELN EBELP. "NOT ALL CHAR-LIKE FIELDS ARE KEY FIELDS
DEF_WA_ITAB ‘4500010003’ ‘00010’ ‘000000000010000002’ ‘200’.
INSERT WA_ITAB INTO TABLE T_ITAB_NAK.
DEF_WA_ITAB ‘4500010003’ ‘00010’ ‘000000000010000002’ ‘100’.
*COLLECT WA_ITAB INTO T_ITAB_NAK. " IF UNCOMMENTED, SYNATX CHECK

2 Adding Lines by Index Access 以index access的方式添加数据

abap-3-6 

以上语句均是以index access的方式向内表添加数据,需要注意的是,如果INDEX指定的数值超过内表已有数据行数的范围,则语句执行失败,SY-SUBRC为4,数据也不会插入到内表中。在LOOP…ENDLOOP中间使用INSERT命令,数据将插入到由LOOP命令打开的游标处。INSERT LINES OF 命令用于批量插入数据。需要注意的是,如果使用Index access向 sorted table插入数据,我们必须确保index所指定的位置是按照key列排序相应的位置,否则将会出现runtime error;由于hashed table根本不支持 index access,写下的代码连语法检查也无法通过。因此建议仅对standard table使用index access方式插入数据。

上图中:Ranked list APPEND wa INTO rank_itab SORTED BY f.这个命令我在试验中发现WA中的数据根本不会添加到内表中,有人知道这是怎么用的话请留言,多谢。其它部分示例代码如下:

DEF_WA_ITAB ‘4500010006’ ‘00010’ ‘000000000010000002’ ‘100’.
INSERT WA_ITAB INTO T_ITAB_STANDARD INDEX 2.
*INSERT WA_ITAB INTO T_ITAB_SORTED index 2. " UNCOMMENT, runtime error
*INSERT WA_ITAB INTO T_ITAB_HASHED index 2. " UNCOMMENT, SEE SYNATX CHECK
LOOP AT T_ITAB_STANDARD INTO WA_ITAB.
INSERT INITIAL LINE INTO T_ITAB_STANDARD. " LOOP…ENDLOOP OPEN A CURSOR
ENDLOOP.
* INSERT INITIAL LINE INTO T_ITAB_STANDARD. " WITHOUT A LOOP, RUNTIME ERROR
INSERT INITIAL LINE INTO T_ITAB_STANDARD INDEX 2. " INDEX ACCESS, AN INIT LINE IS INSERTED INTO LINE 2
INSERT INITIAL LINE INTO T_ITAB_SORTED INDEX 1. " IF POSITION IS NOT CORRECT ACCORDING TO SORT CONDITION,
" RUNTIME ERROR, SO RECOMMAND USING ONLY ON STANDARD TABLE
*INSERT INITIAL LINE INTO T_ITAB_HASHED. " UNCOMMENT, SEE SYNATX CHECK
INSERT LINES OF T_ITAB_SORTED FROM 1 TO 4
INTO T_ITAB_STANDARD INDEX 1. "currently 11 records in the internal table, 1~12 IS OK, BEYOND 12, LIKE 13, 14… INSERTING FAILED

3 Changing Content by Key Access 以Key access的方式修改内容

abap-3-7

如上图所示的语句中,如果使用FROM wa addition,要求wa中的key field必须有值。如果在内表中根据key值没有找到相符的行,删除、修改都没有执行成功,则SY-SUBRC 为4。TRANSPORTING 关键字用于限定更新选定的字段。WHERE addition中可以填写几乎各种条件表达式,但是要求表达式中关系运算符左边的表达式必须是内表中的字段,可以通过(变量名)的方式动态构造WHERE。

DELETE ADJACENT DUPLICATES… 命令用于删除内表中相邻行重复的数据。重复的定义是相对的,如果不适用COMPARING addition,重复是根据KEY FIELD定义的,如果使用ALL FIELDS则是全部字段,如果使用COMPARING,则根据指定的条件比较。通常使用这个命令时,我们首先对内表排序。

4 Changing Content by Index Access 以Index Access的方式修改内表数据

abap-3-8

以上命令可以用于Standard table和Sorted table,不能用于Hashed table.

关于SY-SUBRC, TRANSPORTING, LOOP游标在这里就不再说明了,需要注意的是,LOOP…ENDLOOP中间用DELETE效率较低,对于多行的删除,建议使用DELETE itab FROM N1 TO N2或DELETE WHERE.

ABAP 内表(Internal Table)的定义及使用(二)

2. 内表定义的ABAP Code

通过ABAP Code定义内表有三种方式,
With an implicitly defined (bound) type
With an explicitly defined local type
With an explicitly defined global type

内表定义的文法如下图所示:

abap-3-3

文法中的STANDARD/ SORTED/HASHED TALBE指定了该内表示什么类型,内表定义时所引用的行类型(data_type, data_object, global_itab_type, local_itab_type, itab_data_object等)可以是本地或全局定义的类型或表,也可以是一个Data object。 WITH key_def用于指定内表的key列定义,UNIQUE或NON-UNIQUE指定了该内表的key列性质。需要注意的是,如果不适用WITH key_def addition定义key列,可以通过DEFAULT KEY指定默认字段为key列,对于Standard tables,默认的key列是由所有CHAR-LIKE字段组成的(C,N,D,T,X,STIRNG,XSTRING)。

table kind和key definition有多种组合,简要列出来如下: standrad table(only non-unique), sorted table(unique or non-unique), hashed table(only unique)。

standard table最常用,可以用以下简化方式定义:
DATA: itab_name TYPE TABLE OF line_type. ABAP运行时将此行代码编译为以下代码:
DATA: itab_name TYPE [STANDARD] TABLE OF line_type [WITH NON-UNIQUE DEFAULT KEY].

一个完整的定义如下:

abap-3-4

如上图所示代码为通过参考一个本地定义的LINE TYPE的STANDARD TABLE.如果将TYPE STANDARD TABLE替换为TYPE SORTED TABLE 或TYPE HASHED TABLE将定义两个结构完全一样的另外两种类型的内表。需要注意的是,对于SORTED TABLE,数据存储的顺序不同。定义内表的时候并一定需要通过INITIAL SIZE指定初始内存大小,在程序执行过程中,如果内表的大小不足,系统会自动扩展内表所占内存空间,而且没有最大限制。

Generic table kind是指没有使用TABLE TYPE明确定义是哪种内表,通常用于子程序参数定义。

用SET PARAMETER ID为选择屏幕设定参数

在定义选择屏幕的时候,可以为选择屏幕的选择条件字段指定MEMORY ID,这样的话,在其他SESSION执行过的SET PARAMETER ID动作存入的数据,会在选择屏幕显示的时候自动填入数据。在标准程序中,很多地方都使用到这样的方法。不光是选择屏幕,自己开发的SCREEN也有类似的机制。为SELECTION-SCREEN设定MEMORY ID的方法如下:

PARAMETERS: P_VBELN LIKE VBAK-VBELN MEMORY ID AUN.

程序初始化的时候,相应MEMORY ID 的数据会被自动填入该选择屏幕字段中,如上例,刚刚查看过的销售订单号会被自动填入P_VBELN字段中。

SAP ERP开发ABAP代码走查地方法

      每次讨论质量问题,都不可避免的谈到ERP实施、二次开发的特殊性,需求、过程,与完整的软件系统开发,从表面上看可以说完全不同。SAP ABAP开发不向JAVA, C#等有众多的开发人员基础,因此很少有人专门开发其工具,代码的编码水平、管理水平都非常落后。Eclipse有众多插件,VS2005也一样,插件可以有很多功能,提高开发效率,可是ABAP没有。

      怎么办?ABAP开发是一个需求复杂、技术简单的过程。因此针对需求变更、代码质量的手段也应当有所不同。在此,针对ABAP代码提出代码走查的一些想法,有待实践。下午在对一个已有报表的代码进行重构的过程中总结如下:

      1 检查程序头注释是否更新完整:应包括需求名称、程序标题、修改记录等信息

      2 代码结构体注释:如REPORT PROGRAM EVENT的注释、子程序的注释要明确

      3 数据定义注释:DATA, SELECT-OPTIONS, PARAMETERS等定义要明确

      4 子程序参数是否正确:子程序中的数据应通过参数传递

      5 对于修改的代码注释是否完备:应简洁的注明时间、人、原因

      6 检查传输请求 短描述是否符合项目规范

      7 检查传输请求 文档是否完备

      8 检查传输请求 是否包含且仅包含该程序及相关的对象

      目前仅考虑到这一步,对代码进行走查非常重要,但是以上8条仅对代码、传输请求进行了简单步骤规定,这些步骤还没有涉及到代码对业务的实现逻辑,主要解决的问题是将来维护程序时,不知道先前的改动、逻辑是什么用处。希望能和文档工具配合使用,减少开发人员编写文档的工作量。

      虽说我们不能像VS 2005, Eclipse插件那样开发工具,但是ABAP中也有一些特性可以让我们更轻松的处理其他问题,仍然可以编写一些程序提高工作效率,如写程序辅助代码走查,将某些内容集中显示。

      还是那句话,纵使二次开发的过程再“特殊”,我也不会放弃对于高质量的追求!

ABAP选择屏幕建议

    选择屏幕是用户使用报表等大多数程序的第一步,选择屏幕的显示、操作非常丰富,看似简单,但是若不加以统一,一个项目中的程序将会是五花八门。为了改进用户体验,我在写程序的第一部,规范了选择屏幕的定义,设想如下,并且通过Check List检查各个可能出现的问题,斟酌中。大家有什么好的意见请留言。
    如下图所示:报表选择屏幕规范如下,只有一个F8 Execute按钮和一个Information按钮,这两个按钮都是自动的,F8按钮执行报表,Information按钮打开的是程序的文档。因此同时要求,程序员开发程序的时候为程序创建文档,文档内容有业务顾问协助完成。
    选择条件按块区分,按重要程度依次向下排列,复杂的选择屏幕可在此基础上分类后放在块中,依次摆放在选择屏幕上。
    可参照以下图示:必填选择条件放在最上面,可选放在下面,或分类放在下面。

abap-7-1

      一组业务含义的Checkbox或Radiobutton要放在一行。     数据量很小的如10个以内的字段,且是单值输入的话可以使用dropdown list输入。 

abap-7-2

    所有字段都必须有Search Help,尽量使用标准的,标准若不能满足,则自建Search Help。  如果报表有比较高的Performance要求,或本身逻辑复杂,性能较低,应增加部分额外的限制,如单据日期等缩小取数范围。 Authority Check,涉及到权限的字段应在选择屏幕上作为一个条件,在选择屏幕中检查权限给予提示信息。 Selection Screen Check List

Checklist

ABAP程序在线文档是否完备?

选择条件字段文本在相应的语言环境下是否正确?

选择条件字段必填、非必填设定是否合理?

选择条件是否按照重要程度、分类分块显示?

选择条件自上而下的排列顺序是否按重要程度排列?

Parameters和Select-option的选用是否合理?

SELECT-OPTIONS的NO-EXTENSION, NO INTERVALS设定是否合理?

选择条件字段是否设定了合理的MEMORY ID?

选择条件字段是否设定了合理的默认值?

选择条件是否会引起某些性能问题?

一组业务功能的CHECKBOX或RADIOBUTTON是否排成一行?

是否有Parameters字段可以设置为LISTBOX?

是否每个字段都有合适的Search Help?

选择条件的有效性是否进行了必要的检查?

涉及到权限检查的字段是否作为选择条件了?

所有的权限检查逻辑是否都在AT SELECITON-SCREEN完成了?

LIST-PROCESSING命令的使用

List-Processing用于在程序中任意地方开始List输出,可以放在代码的任何地方。LEAVE TO LIST-PROCESSING 这段命令做两件事:

切换到List输出模式

在这种模式下,标准的List输出所用到的命令:WRITE, ULINE, SKIP等全部可以使用,还包括AT LINE-SELECTION事件、功能码(Function keys)、20 个list level等。

将显示List 输出的屏幕设置为当前调用处的下个屏幕(Following Screen)

程序将离开当前屏幕进入List输出的屏幕,进行接下来的操作,但是Leave screen之后,仍将返回前一个调用Leave to list-processing这条命令屏幕的代码的下一行继续执行。示例代码写在最后了,下面说明一下重要的地方:

LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
PERFORM EDIT_LIST.
LEAVE SCREEN.

注意这一段代码,第一行的作用前面已经说过了,逻辑将转入下一屏幕(不是普通屏幕,是特殊屏幕)。第二行是一个子程序,在这里面要特别注意的是

  1. 设置STATUS, "SET PF-STATUS ‘XXXX’",如果不设置的话,会把调用该语句的屏幕的STATUS继承过去。
  2. 在设置STATUS之后,用WRITE等命令输出。
  3. LIST屏幕上的按钮响应目前还没研究明白,明白人请留言,谢谢!

LIST-PROCESSING的工作过程

运行时,MODULE-POOL放弃屏幕的控制权,可以执行LIST 输出代码,如WRITE等。我们可以选择让LIST输出屏幕替代当前屏幕,或者是作为下一个屏幕,但是不管是哪一种方式,LIST输出的屏幕将在当前屏幕逻辑执行完(LEAVE SCREEN或PAI执行完之时)之后显示,也就是说,WRITE等命令仍然是将输出的东西暂存在缓存中。

LIST输出作为下一个屏幕

将LEAVE TO LIST-PROCESSING放在PAI中,当LIST屏幕执行完之后,系统将重新进入当前屏幕PBO逻辑,显示屏幕。

LIST输出替换当前屏幕

将LEAVE TO LIST-PROCESSING放在PBO中,并以LEAVE SCREEN命令结束当前屏幕逻辑。这种情况下,当前屏幕将被替换,不再显示。

R/3系统中有一个DEMO:可以通过TCODE: TZ70运行。参考:SAP Online Help

**** ABAP module and form: ****

MODULE PREPARE_LIST OUTPUT.
LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
PERFORM EDIT_LIST.
LEAVE SCREEN.
ENDMODULE.

FORM EDIT_LIST.
SET PF-STATUS ‘LIST’.
SET TITLEBAR ‘LST’ WITH SFLIGHT-CONNID SFLIGHT-CARRID.

NEW-PAGE LINE-SIZE 72.
SELECT * FROM SFLIGHT WHERE CARRID = SFLIGHT-CARRID
AND CONNID = SFLIGHT-CONNID.
WRITE: / SY-VLINE NO-GAP,
SFLIGHT-FLDATE COLOR 4 INTENSIFIED OFF NO-GAP,
SY-VLINE NO-GAP,
SFLIGHT-PRICE COLOR 2 INTENSIFIED OFF NO-GAP,
…….
ENDFORM.

在ABAP中用EVAL_FORMULA执行Javascript进行公式计算

      最近在做一个报表,统计仓储费用,但是由于仓储费用条目差异很大,不同条目的计算方法不同,并且存在一些换算关系,最后我决定让用户自己编辑公式。

      一开始想到使用公式是因为EXCEL中的CELL有公式计算的功能,如果用ABAP实现,期初想自己写个程序解析公式,匹配变量后得到结果,这样做的话比较麻烦,得写一个公式解析器。后来想到让用户编辑符合ABAP代码的公式,动态生成子程序,但是这样做也不太现实,后来查资料发现有人已经想到过,的确不好用。

      最后我们想到的办法是让用户编辑JAVASCRIPT公式,用ABAP调用JAVASCRIPT解析器,计算表达式。

方法1:直接调用JAVASCRIPT PROCESSOR CLASS: cl_java_script

方法2:使用FUNCTION: EVAL_FOMULA

转帖一段代码:(原文:如何根据动态公式计算数据

方法一

report ZDEMO_COMPILE.
data jj type i.
perform Dynamicformula  using ‘ 900 + 7  % 3 ‘ jj.
write / jj.
perform Dynamicformula  using ‘ 900 + ( 7 + 10 )  % 3 ‘ jj.
write / jj.
perform Dynamicformula  using ‘ 900 * 30 + ( 7 + 10 )  % 3 ‘ jj.
write / jj.
*&———————————————————————*
*&      Form  Dynamicformula
*&———————————————————————*
*       text
*———————————————————————-*
*      –>SOURCE     text
*      –>RE         text
*———————————————————————-*
FORM Dynamicformula using  formula type STRING
                    changing re type I.
  data source type string.
  data return_value type string.
  data js_processor type ref to cl_java_script.
  js_processor = cl_java_script=>create( ).
  concatenate
    ‘result = ‘
    formula
     ‘;’
   into source.
  RETURN_VALUE = js_processor->evaluate( source ).
  re = RETURN_VALUE.
ENDFORM.                    "Dynamicformula

方法二
CALL FUNCTION ‘EVAL_FORMULA’
  EXPORTING
    FORMULA                       = ‘ ( 9 * 10 + ( 7 + 10 ) * 2 )  div 3  ‘
IMPORTING
   VALUE                         = jj
          .
write / jj.

用MB51作为物料凭证编号搜索帮助

      SAP ABAP程序的选择屏幕字段的搜索帮助通常来讲,我们是通过DICTIONARY创建的SEARCH HELP或DOMAIN上的CHECK TABLE等继承而来,某些情况下我们在定义PARAMETERS的时候使用MATCHCODE OBJECT指定特定的搜索帮助。除此之外,还有一些特殊的搜索帮助,采用了一些特别的方法,比如在标准程序中物料凭证编号,使用的就是MB51的程序,示例代码如下:

CONSTANTS: C_X TYPE C VALUE ‘X’.
PARAMETERS:P_MBLNR TYPE MKPF-MBLNR.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_MBLNR.  
  EXPORT C_X TO MEMORY ID ‘MB51_FLAG’.
  CALL TRANSACTION ‘MB51’.
  GET PARAMETER ID ‘MBN’ FIELD P_MBLNR.

如此,再通过MB51的选择屏幕选出物料凭证清单后,双击某张凭证后就返回到先前的选择屏幕,物料凭证编号就填好了。

ABAP DESCRIBE Keyword Usage All in One

The DESCRIBE keyword in ABAP Language is used to get what an object looks like. You can use this keyword statment to specify a lot of properties of a data object at runtime. The variant of DESCRIBE is listed below:

  • DESCRIBE FIELD (Field properties)
  • DESCRIBE TABLE (Properties of an interal table)
  • DESCRIBE DISTANCE (Distance between of two fields)
  • DESCRIBE LIST (Properties of lists in list buffer)

Do take care of one thing:

"The statement DESCRIBE is basically used to specify the properties of data objects of elementary data types. If DESCRIBE is used for structures or data objects of deeper data types like strings, internal tables, or reference variables, only elementary properties can be specified. Additional information, for example, the static or dynamic type of a reference variable cannot be determined by DESCRIBE. For this information, you must use the type classes of the Run Time Type Services(RTTS), which allow the specification all properties of data objects of all data types. Since the functions of the RTTS type classes comprise the complete functions of the DESCRIBE statement, the system classes can be used instead of the statement." By SAP Help

DESCRIBE FIELD dobj
  [TYPE typ [COMPONENTS com]]
  [LENGTH ilen IN {BYTE|CHARACTER} MODE]
  [DECIMALS dec]
  [OUTPUT-LENGTH olen]
  [HELP-ID hlp]
  [EDIT MASK mask].

  •   [TYPE typ [COMPONENTS com]] is used to specify the elementary type of a data object , you can get a one char identification. The addition tells you how many direct components are there in the data object.
  • [LENGTH ilen IN {BYTE|CHARACTER} MODE] is used to specify how many characters(capacity, not actual chars number) in bytes or characters MODE are there in the data objects.
  • [DECIMALS dec] The number of decimal places of the data object.
  • [OUTPUT-LENGTH olen] is used to to specify the output length on the screen of a data object . For string, the result is always 0.
  • [HELP-ID hlp] is used to specify the reference table and component of an elementary data ojbect. The result is a struc-comp like char string. You can spilt it into 2 data, and use ‘F4IF_FIELD_VALUE_REQUEST’ function to call f4 help screen.
  • [EDIT MASK mask] is used to specify the edit mask of a data object. This can be used to write a number as time format.

DESCRIBE TABLE itab [KIND knd] [LINES lin] [OCCURS n].

  • [KIND knd] is used to specify the table kind, which is one of T(Standard) S(Sorted) H(Hashed).
  • [LINES lin] is used to specify the line count of an internal table.
  • [OCCURS n] is used to specify the initial size of an internal table.

DESCRIBE DISTANCE BETWEEN dobj1 AND dobj2 INTO dst IN {BYTE|CHARACTER} MODE.

  • This is used to specify the distance of two component’s start position in one structure in byte or character MODE.

DESCRIBE LIST DESCRIBE LIST { {NUMBER OF {LINES|PAGES} n}
              | {LINE linno PAGE page}
              | {PAGE pagno page_properties} }
              [INDEX idx].

page_properties:

… [LINE-SIZE width]
    [LINE-COUNT length]
    [LINES lines]
    [FIRST-LINE first_line]
    [TOP-LINES top_lines]
    [TITLE-LINES title_lines]
    [HEAD-LINES header_lines]
    [END-LINES footer_lines] … .

This statment is used to get the attributes of list buffer, these attributes can be defined on the top of a program.

Here is some demo code attached:

DESCRIBE FIELD

*————————————————————*
* Demo code for describe field statement by www.imlex.net    *
*————————————————————*

DATA: BEGIN OF STRUC1,
        COMP1 TYPE C LENGTH 1,
        COMP2 TYPE STRING,
        BEGIN OF STRUC2,
           COMP1 TYPE C LENGTH 1,
          COMP2 TYPE I,
        END OF STRUC2,
        COMP3(10) TYPE P DECIMALS 2,
        COMP4 TYPE SY-DATUM,
        COMP5 TYPE S_FLTIME,
      END OF STRUC1,
      TYP1  TYPE C LENGTH 1,
      COMP1 TYPE I,
      TYP2  TYPE C LENGTH 1,
      COMP2 TYPE I,
      LEN1 TYPE I,
      LEN2 TYPE I,
      DECM TYPE I,
      OUTL TYPE I,
      HLPD(30) TYPE C,
      MASK TYPE STRING.

DESCRIBE FIELD: STRUC1        TYPE TYP1 COMPONENTS COMP1,
                STRUC1-STRUC2 TYPE TYP2 COMPONENTS COMP2.

DESCRIBE FIELD: STRUC1-COMP1 LENGTH LEN1 IN BYTE MODE,
                STRUC1-COMP1 LENGTH LEN2 IN CHARACTER MODE.

DESCRIBE FIELD: STRUC1-COMP3 DECIMALS DECM,
                STRUC1-COMP3 OUTPUT-LENGTH OUTL.

DESCRIBE FIELD: STRUC1-COMP4 HELP-ID HLPD,
                STRUC1-COMP5 EDIT MASK MASK.

*————————————————————*
* End of demo code for describe field statement.             *
*————————————————————*

DESCRIBE TABLE & DESCRIBE DISTANCE

*————————————————————*
* Demo code for describe table statement by www.imlex.net    *
*————————————————————*  

TYPES: BEGIN OF X_ITAB,
        FIELD1 TYPE I,
        FIELD2(6) TYPE C,
        FIELD3(10) TYPE P DECIMALS 2,
      END OF X_ITAB.
DATA: T_ITAB TYPE STANDARD TABLE OF X_ITAB INITIAL SIZE 20 WITH HEADER LINE.
DATA: KND TYPE C,
      LINE TYPE I,
      ONN TYPE I,
      DIS1 TYPE I,
      DIS2 TYPE I.

DESCRIBE TABLE T_ITAB KIND KND LINES LINE OCCURS ONN.

DESCRIBE DISTANCE BETWEEN:
         T_ITAB-FIELD1 AND T_ITAB-FIELD3 INTO DIS1 IN BYTE MODE,
         T_ITAB-FIELD1 AND T_ITAB-FIELD3 INTO DIS2 IN CHARACTER MODE.
*NOTES: You can only use describe distance statment on a structure
*       or table header line. A type or a no header table doesn’t work.

*————————————————————*
* End of demo code for describe table statement.             *
*————————————————————*

DESCRIBE LIST

ABAP中查找代码的标准程序

      RPR_ABAP_SOURCE_SCAN 可以用于搜索SAP中的程序代码,一般使用时填写开发类、程序名及需要查找的字符串即可,选择屏幕布局和功能很简单,熟悉ABAP代码的人一看就明白了,不多解释了,使用方法及截图如下。选择范围太大的话很慢,可以考虑放到后台运行,结束了再看结果。

      用这个程序查看某些特征的代码很有效,比如查找所有程序中BREAK ##这样的代码等。

      1 SE38回车
      2 程序名:RPR_ABAP_SOURCE_SCAN
      3 F8 Execute

abap-4-1

图1:选择屏幕

abap-4-2

图2:执行结果