內(nèi)部表實(shí)際上是一個臨時表,它包含正在執(zhí)行的 ABAP 程序的記錄。 內(nèi)部表僅在 SAP 程序的運(yùn)行時期間存在。 它們用于通過使用ABAP語言處理大量數(shù)據(jù)。 當(dāng)您需要從數(shù)據(jù)庫表中檢索數(shù)據(jù)時,我們需要在 ABAP 程序中聲明一個內(nèi)部表。
內(nèi)部表中的數(shù)據(jù)存儲在行和列中。 每一行稱為行,每一列稱為字段。 在內(nèi)部表中,所有記錄具有相同的結(jié)構(gòu)和鍵。 使用索引或鍵訪問內(nèi)部表的各個記錄。 由于內(nèi)部表存在直到正在執(zhí)行相關(guān)聯(lián)的程序,因此當(dāng)程序的執(zhí)行終止時,內(nèi)部表的記錄被丟棄。 因此,內(nèi)部表可以用作臨時存儲區(qū)或臨時緩沖區(qū),其中可以根據(jù)需要修改數(shù)據(jù)。 這些表只在運(yùn)行時而不是在聲明時占用內(nèi)存。
內(nèi)部表僅在程序運(yùn)行時存在,因此在編寫代碼時,內(nèi)部表必須以程序可以使用的方式進(jìn)行結(jié)構(gòu)化。 你會發(fā)現(xiàn)內(nèi)部表的操作方式與結(jié)構(gòu)相同。 主要區(qū)別是結(jié)構(gòu)只有一行,而內(nèi)部表可以有所需的行。
內(nèi)部表可以由多個字段組成,對應(yīng)于表的列,正如在 ABAP 字典中一樣,使用多個字段創(chuàng)建表。 關(guān)鍵字段也可以與內(nèi)部表一起使用,在創(chuàng)建這些內(nèi)部表時,它們提供稍微更大的靈活性。 使用內(nèi)部表,可以指定非唯一鍵,允許存儲任意數(shù)量的非唯一記錄,并且如果需要,允許存儲重復(fù)記錄。
內(nèi)部表的大小或其包含的行數(shù)不是固定的。 內(nèi)部表的大小根據(jù)與內(nèi)部表相關(guān)聯(lián)的程序的要求而改變。 但是建議保持內(nèi)部表盡可能小。 這是為了避免系統(tǒng)運(yùn)行緩慢,因?yàn)樗μ幚泶罅康臄?shù)據(jù)。
內(nèi)部表用于許多目的:
它們可用于保存以后可在程序中使用的計(jì)算結(jié)果。
內(nèi)部表還可以保存記錄和數(shù)據(jù),以便可以快速訪問,而不必從數(shù)據(jù)庫表訪問此數(shù)據(jù)。
他們是非常多才多藝。 它們可以使用任何數(shù)量的其他定義的結(jié)構(gòu)來定義。
標(biāo)準(zhǔn)表,表類型為關(guān)鍵字?STANDARD TABLE
?,系統(tǒng)為該表的每一行生成一個邏輯索引。填充標(biāo)準(zhǔn)表時,可以講數(shù)據(jù)附加在現(xiàn)有行之后,也可以插入到指定的位置,程序?qū)?nèi)表行的尋址操作可以通過索引或者關(guān)鍵字,另外,在對表進(jìn)行插入,刪除等操作時,個數(shù)據(jù)行在內(nèi)存中的位置不變,系統(tǒng)僅重新排列個數(shù)據(jù)行的索引值。
排序表,表類型關(guān)鍵字為?SORTED TABLE
?,也具有一個邏輯索引,不同之處在于排序表總是按其關(guān)鍵字生序排列以后再存儲,其訪問方式與標(biāo)準(zhǔn)表相同。
哈希表,表類型關(guān)鍵字為?HASHED TABLE
?,沒有索引,只能通過關(guān)鍵字來訪問,系統(tǒng)用哈希算法管理表中的數(shù)據(jù),因而其尋址一個數(shù)據(jù)行的時間與表的大小無關(guān)。
standard table
?,?sorted table
?,?hashed table
?TYPES|DATA itab {TYPE|LIKE} tabkind OF {linetype|lineobj} [WITH KEY] [INITIAL SIZE n]
?.standard table
?,?sorted table
? 可以通過索引和關(guān)鍵字進(jìn)行訪問,?hashed table
? 只能通過關(guān)鍵字進(jìn)行訪問standard table
?在增加或插入數(shù)據(jù)行時并不對數(shù)據(jù)行的特理地址進(jìn)行重新排序存儲,只是對其索引進(jìn)行重表排列。?sorted table
? 在增加和插入數(shù)據(jù)行時要對數(shù)據(jù)存儲的物理地址進(jìn)行重新排列。hashed table
? 在檢索數(shù)據(jù)里與數(shù)據(jù)行數(shù)無關(guān),時間復(fù)雜度通常是 o(1) 的時間 any table
index table hashed table
standard table sorted table
any table
? 和 ?index table
?是抽象接口類型,不能用于定義具體的數(shù)據(jù)對象DATA: BEGIN OF line,
num TYPE i,
sqr TYPE i,
END OF line,
itab LIKE STANDARD TABLE OF line WITH KEY table_line.
DO 5 TIMES.
line-num = sy-index.
line-sqr = sy-index ** 2.
APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line.
WRITE: / line-num,line-sqr.
ENDLOOP.
LIKE
?。通過對象來定義內(nèi)表要使用關(guān)鍵字 ?LIKE
?。在黃佳的書上是有誤的。TABLE LINE
?已經(jīng)廢棄不用,而是使用 ?TABLE_LINE
? 代替。?TABLE_LINE
? 表示使用內(nèi)表行作為表關(guān)鍵字。例如:In ABAP Objects, the following statement causes an error message: ... TABLE LINE ... Correct syntax: ... table_line ... Cause: The pseudo-component table_line replaces the TABLE LINE constuction. TABLE_LINE
? 極象一個行字段,所以內(nèi)表基于的行結(jié)構(gòu)體不應(yīng)該包含 ?TABLE_LINE
?字段。WITH [UNIQUE|NON-UNIQUE] KEY COMP1...COMPn,WITH [UNIQUE|NON-UNIQUE] KEY TABLE_LINE,WITH [UNIQUE|NON-UNIQUE] DEFAULT KEY
?定義表關(guān)鍵字。 DEFAULT KEY
?。扁平結(jié)構(gòu)內(nèi)表的默認(rèn)表關(guān)鍵字是非數(shù)字和非內(nèi)表的的組件字段。如果內(nèi)表行是單個基本類型組成,由默認(rèn)關(guān)鍵字為整個行。如果內(nèi)表行中包含內(nèi)表類型字段,則沒有默認(rèn)關(guān)鍵字。TABLE_LINE
? 作為表關(guān)鍵字。UNIQUE
? 表關(guān)鍵字,且無需特別指定 ?NON-UNIQUE
? 表關(guān)鍵字;排序表可以使用? NON-UNIQUE
? 或者 ?UNIQUE
? 表關(guān)鍵字,哈希表不能使用 ?NON-UNIQUE
?表關(guān)鍵字,且必須指定 ?UNIQUE
?表關(guān)鍵字。WITH HEADER LINE
?選項(xiàng)表示定義內(nèi)表時也定義同名的工作內(nèi)。如果在使用的過程中不能明確的分辯出是使用內(nèi)表或是工作區(qū),那么在名稱之后加"[]"表示明確的使用內(nèi)表。如下:TYPES: BEGIN OF address,
street(20) TYPE c,
city(20) TYPE c,
END OF address.
DATA: BEGIN OF company,
name(20) TYPE c,
addresses TYPE address,
END OF company.
DATA: itab_company LIKE STANDARD TABLE OF company WITH NON-UNIQUE KEY
name.
DATA: wa LIKE company.
wa-name = 'china'.wa-addresses-street = 'aaa'.
wa-addresses-city = 'shanghai'.
APPEND wa TO itab_company.
LOOP AT itab_company INTO wa.
WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city.
ENDLOOP.
wa-name = 'america'.
wa-addresses-street = 'ccc'.
wa-addresses-city = 'new york'.
INSERT wa INTO itab_company INDEX 1.
LOOP AT itab_company INTO wa .
WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city.
ENDLOOP.
wa-name = 'america'.
wa-addresses-street = 'DDD'.
wa-addresses-city = 'new york'.
MODIFY itab_company[] INDEX 1 FROM wa.
WRITE: / '...............................'.
LOOP AT itab_company INTO wa .
WRITE: / sy-tabix,wa-name,wa-addresses-street,wa-addresses-city.
ENDLOOP.
更多建議: