TYPES、DATA、TYPE、LIKE、CONSTANTS、STATICS、TABLES


TYPESDATATYPELIKE. 42

TYPESDATATYPELIKE

TYPES語句是定義數據類型,而DATA語句聲明變量。

TYPES:定義數據類型

-       數據類型是純粹的說明。

-       沒有與數據類型相關聯的內存。

-       數據類型描述數據對象的技術屬性。

-       數據類型是數據對象的屬性並與數據對象聯系緊密。

DATA:聲明數據對象(變量、常量)

-       數據對象是程序在運行時使用的物理單元。

-       每個數據對象都有分配給它的特定數據類型。

-       每個數據對象占據一些內存空間。

-       ABAP/4 根據數據對象的數據類型處理數據對象。

 

TYPES定義的類型需要用來聲明一個變量(DATA)來使用,即TYPES定義的類型是供DATA語句來聲明一個變量來使用的。

 

使用自定義的類型使用TYPE,引用其他變量所屬類型要使用LIKE

TYPES znumtype TYPE i.
TYPES num1 TYPE znumtype."
只能使用TYPE關鍵字來使用自定義類型znumtype
DATA num2 TYPE
znumtype.

DATA znumobj TYPE i
.
TYPES num5 LIKE znumobj."
只能使用LIKE關鍵字來使用自定義變量znumobj
DATA num6 LIKE
znumobj.

TYPES : BEGIN OF
address1,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
address1.
TYPES type1 TYPE address1-city."
只能使用TYPE關鍵字來使用自定義結構體類型或其中的組件類型
DATA obj1 TYPE address1-city.
TYPES type2 TYPE
address1.
DATA obj2 TYPE
address1.

DATA : BEGIN OF
zaddress2,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
zaddress2.
TYPES type3 LIKE zaddress2-city."
只能使用LIKE關鍵字來使用自定義結構體變量或其中的組件變量
DATA obj3 LIKE zaddress2-city.
TYPES type4 LIKE
zaddress2.
DATA obj5 LIKE
zaddress2.

 

透明表即可看作是一種類型,也可看作是對象,所以即可使用TYPE,也可以使用LIKE

TYPES type6 TYPE mara-matnr.
TYPES type7 LIKE
mara-matnr.
DATA obj6 TYPE
mara-matnr.
DATA obj7 LIKE
mara-matnr.

 

注:定義的變量名千萬別與詞典中的類型相同,否則表面上即可使用TYPE也可使用LIKE,就會出現這兩個關鍵字(TypeLike)都可用的奇怪現像下面是定義一個變量時與詞典中的結構同名的后果(導致)

DATA : BEGIN OF address2,
  street(
20) TYPE c
,
  city(
20) TYPE c
,
 
END OF
address2.
DATA obj4 TYPE STANDARD TABLE OF address2."
這里使用的實質上是詞典中的類型address2
DATA obj5 LIKE STANDARD TABLE OF address2."
這里使用是的上面定義的變量
address2

上面程序編譯通過,按理obj4定義是通過不過的(只能使用LIKE來引用另一定義變量的類型,TYPE是不可以的),但由於address2是數字詞典中定義的結構類型,所以obj4使用的是數字詞典中的結構類型,而obj5使用的是LIKE,所以使用的是address2變量的類型。注:結構(Structure)類型也只能使用TYPE,而不能使用LIKE

 

數據類型和數據對象是有不同的命名空間的,即同一程序中可以出現同名的數據類型和對象,但程序中的同名局部數據類型將覆蓋數據字典中定義的同名類型。

 

如果使用的是數據詞典中的類型,則即可以使用Like 也可使用 Type
"SFLIGHT為表類型
DATA plane LIKE sflight-planetype.
DATA plane2 TYPE
sflight-planetype.
DATA plane3 LIKE
sflight.
DATA plane4 TYPE
sflight.
"syst
為結構類型
DATA sy1 TYPE syst.
DATA sy2 LIKE
syst.
DATA sy3 TYPE syst-index
.
DATA sy4 LIKE syst-index
.

創建數據類型與變量

數據對象和數據類型有獨立的名稱空間。這意味着一個名稱既可以是數據類型名,同時又可以是數據對象名,如:

DATA c .
TYPES c.

在程序中,可以使用數據聲明語句靜態地定義數據對象,或者利用操作語句動態地創建數據對象。ABAP/4 包括下列用於靜態地創建數據對象和數據類型的關鍵字:

 

DATA 語句

用於創建變量

CONSTANTS 語句

用於創建常量

STATICS語句

用於創建變量這些變量在程序運行期間一直存在但僅在過程中可見

TABLES語句

用於創建表工作區

TYPES 語句

用於創建用戶定義的數據類型

 

TYPES 語句

基本類型

TYPES { {dtype[(len)] TYPE abap_type [DECIMALS dec]}
      | {dtype
TYPE abap_type [LENGTH len] [DECIMALS dec]} }
.

TYPES: c,
       text10
TYPE c LENGTH 10,
       result
TYPE p LENGTH 8 DECIMALS 2. 

參照已存在的類型

TYPES dtype { {TYPE [LINE OF] type}
            | {
LIKE [LINE OF] dobj}  }
.

TYPES itab_typ TYPE TABLE OF string.
DATA itab TYPE itab_typ.
TYPES: wa_itab1 TYPE LINE OF itab_typ,
       wa_itab2
LIKE LINE OF itab.

引用類型:

TYPES dtype { {TYPE REF TO type}
            | {
LIKE REF TO dobj} }
.

INTERFACE i1.
...
ENDINTERFACE.

CLASS c1 DEFINITION.
 
PUBLIC SECTION.
   
INTERFACES i1.
ENDCLASS.

TYPES: iref TYPE REF TO i1,
       cref
TYPE REF TO c1,
       dref
TYPE REF TO iref.

結構類型:

TYPES BEGIN OF struc_type.
 
...
 
TYPES comp ...
  TYPES
 comp TYPE struc_type BOXED.
 
INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
        [
AS name [RENAMING WITH SUFFIX suffix]].

 
...
TYPES END OF struc_type.

TYPES: BEGIN OF street_type,
         name
TYPE c LENGTH 40,
        
no   TYPE c LENGTH 4,
      
END OF street_type.
TYPES
: BEGIN OF address_type,
         name
TYPE c LENGTH 30,
         street
TYPE street_type,

       
 
BEGIN OF city,
           zipcode
TYPE n LENGTH 5,
           name
TYPE c LENGTH 40,

        
END OF city,
     
END OF address_type.
TYPES zipcode_type TYPE address_type-city-zipcode.

INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
        [
AS name [RENAMING WITH SUFFIX suffix]]
.

該語句只能用在定義結構的BEGIN OF and END OF之間。作用是將結構類型struc_type與結構變量struc的所有組件字段拷貝到當前結構定義的指定位置,INCLUDE就是將可以重復使用的東西先做好,再包含進來。

AS name:給包含進來的結構類型(或結構變量)取一個別名,這樣就可以通過結構組件符(-)來選取這個結構類型(或結構變量)

RENAMING WITH SUFFIX suffix:如果include進來的結構類型(或結構變量)的組件字段與現有的重復,則可以使用此選項重命名include進來的結構類型(或結構變量)的各組件字段名,具體做法只是在原來組件名后加上了指定的后綴suffix

TYPES: BEGIN OF t_day,
        
work TYPE c LENGTH 8,
        
free TYPE c LENGTH 16,
      
END OF t_day.
DATA BEGIN OF week.
       
INCLUDE TYPE t_day AS monday    RENAMING WITH SUFFIX _mon.
       
INCLUDE TYPE t_day AS tuesday   RENAMING WITH SUFFIX _tue.
       
INCLUDE TYPE t_day AS wednesday RENAMING WITH SUFFIX _wed.
...
DATA END OF week.

可以通下面的方式來訪問week結構變量:

直接看作是week結構變量組件:week-work_mon, week-free_mon, week-work_tue

由於使用as別名,所以還可以這樣訪問:week-monday-work, week-monday-free, week-tuesday-work

內表類型

Ranges Table Types 條件內表類型

TYPES dtype {TYPE RANGE OF type}|{LIKE RANGE OF dobj}
            [
INITIAL SIZE n]
.

 

定義了以下相同行結構的內表:

TYPES: BEGIN OF linetype,
        
sign   TYPE c LENGTH 1,
        
option TYPE c LENGTH 2,
        
low    {TYPE type}|{LIKE dobj},
        
high   {TYPE type}|{LIKE dobj},
      
END OF linetype.

 

DATA 語句

預定義類型

DATA { {var[(len)] TYPE abap_type [DECIMALS dec]}
     | {var [
TYPE abap_type [LENGTH len] [DECIMALS
dec]]} }
     [
VALUE  val|{IS INITIAL}]
 

DATA p LENGTH 2 TYPE p VALUE '1.1' DECIMALS 1.

DATAp(2)TYPEpVALUE'1.1'DECIMALS1.

DATA p(2) TYPE p VALUE IS INITIAL DECIMALS 1.

 

DATA: text_buffer TYPE string VALUE `Text`,
     
count TYPE i VALUE 1,
      price
TYPE p LENGTH 8 DECIMALS 2 VALUE '1.99'.

參照已存在類型

DATA var { {TYPE [LINE OF] type}
           | {
LIKE [LINE OF
] dobj} }
           [
VALUE  val|{IS INITIAL
}]

 

DATA: spfli_wa1 TYPE spfli,
      spfli_wa2
LIKE spfli_wa1
.
DATA <f> LIKE LINE OF <itab>.

在這種情況下,<itab>必須是某個內表數據對象。

 

ABAP中,定義內存變量時,除了可以參照標准的ABAP的數據類型與詞典中的表(或表字段)、結構(或表字段)、視圖(或視圖字段))外,還可以直接參考詞典中的Data Element,但不能直接引用Domain。以下是兩句等效:

DATA mycarrid2 TYPE spfli-carrid."參照數據庫表字段
DATA mycarrid TYPE s_carr_id."直接參照
Data Element

image044

 

如果要定義一個屏幕字段時,最好是參照結構體中的一個字段或透明表中的一個字段,或直接采用一個Data Element,這樣屏幕字段會自動帶有應Data Element上語文上以及技術上的屬性,即該輸入域將自動帶有F1 HelpF4 Help

引用類型

DATA ref { {TYPE REF TO type}
           | {
LIKE REF TO
dobj} }
           [
VALUE IS INITIAL]
.

 

"因為沒有定義方法,所以這里不需要 C1 Implements
CLASS c1 DEFINITION.
 
PUBLIC SECTION.
   
DATA a1 TYPE i VALUE 1.
ENDCLASS.

DATA: oref  TYPE REF TO c1,
      dref1
LIKE REF TO oref,
      dref2
TYPE REF TO i.

CREATE OBJECT oref.
" dref1 也指向 oref 所指向的對象
GET REFERENCE OF oref INTO dref1.

CREATE DATA dref2.
"ref->* 的作用就是求地址,與C語言中的 & 符號一樣,求地址所對應的對象或變量
dref2
->* = dref1->*->a1.

WRITE: dref2->*." 1

結構類型

DATA BEGIN OF struc .
 
...
 
DATA comp ...
 
INCLUDE { {TYPE struc_type} | {STRUCTURE struc} }
     [
AS name [RENAMING WITH SUFFIX suffix]].

 
...
DATA END OF struc
.

RENAMING WITH SUFFIX具體用法請參照前面的TYPES語句中的結構定義

內表

條件內表類型:

DATA rtab {TYPE RANGE OF type}|{LIKE RANGE OF dobj}
          [
INITIAL SIZE
n]
          [
VALUE IS INITIAL
]

或者:

RANGES: s_ebeln1 FOR ekko-ebeln.

 

DATA: spfli_wa TYPE spfli,
      r_carrid
TYPE RANGE OF spfli-carrid,
      r_carrid_line
LIKE LINE OF r_carrid.

r_carrid_line
-sign   = 'I'.
r_carrid_line
-option = 'BT'.
r_carrid_line
-low    = 'AA'.
r_carrid_line
-high   = 'LH'.
APPEND r_carrid_line TO r_carrid.

SELECT *
      
FROM
spfli
      
INTO
spfli_wa
      
WHERE carrid IN r_carrid.

 
...
ENDSELECT.

CONSTANTS 語句

語法

CONSTANTS<c>[<length>] <type>[<decimals>]<value>.

要將結構定義為常量,請寫:

CONSTANTS: BEGIN OF <fstring>,
<component declaration>,

..............

END OF <fstring>.

利用<value>參數指定的初始值,在程序的執行期間不能更改。

image045

STATICS 語句

如果要在過程的運行時間之外仍保留某變量的數值,可以在該過程中利用 STATICS 語句定義該變量。

 

語法

STATICS <s>[<length>] <type> [<value>] [<decimals>].

要在過程中將結構定義為靜態有效,請寫:

STATICS: BEGIN OF <fstring>,
<component declaration>,
..............

END OF <fstring>.

如果在程序中多次調用某過程,對於利用 STATICS 定義的變量,過程總是使用該變量的最新(近)值,但不能從過程外部來訪問靜態局部變量。

TABLES 語句

利用 TABLES 語句,可以創建稱為表工作區的內存變量。表工作區是參考 ABAP/4 詞典對象的結構。語法如下:

TABLES <structure_type>.

TABLES <transparent table_type>.

TABLES <view>.

 

<dbtab> ABAP/4 詞典對象的名稱,同時也是創建的內存變量名。可以用來參照的的有效 ABAP/4 詞典對象是

2 結構

2 視圖

2  數據庫表(透明表)

表工作區提供一個接口,通過該接口可以將數據從數據庫表加載到程序,或利用OPEN SQL 語句修改數據庫表的內容。

 

TABLES: SPFLI.
SELECT * FROM SPFLI.
  
WRITE: SPFLI-MANDT, SPFLI-CARRID, SPFLI-CONNID, ......
ENDSELECT.

示例中,TABLES 語句創建表工作區 SPFLISPFLI  ABAP/4 詞典中聲明的數據庫表 SPFLI 結構相同。在 SELECT 循環中,用屬於數據庫表 SPFLI 的行填充表工作區 SPFLI,並且不用在查詢語句中可以省略into spfli選項

 

TABLES: spfli.

DATA spfli TYPE spfli.

以上兩個語句等價。即在定義內存變量時,可以將透明表當做結構體來使用

 

另外在屏幕對話屏幕、選擇屏幕如果需要引入數據中的表字段需要使用TABLES語句定義一個接口工作區進行屏幕和程序間的數據交換PARAMERTS可以不需要SLECTION-OPTION需要


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM