SAP ABAP 內(nèi)部表

2020-10-28 10:29 更新

內(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)來定義。

內(nèi)部表的種類:

  • 標(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)。

表關(guān)鍵字:

  • 如果內(nèi)表行是結(jié)構(gòu)體,則可以指定結(jié)構(gòu)體中的某幾個字段作為內(nèi)表關(guān)鍵字,該字段不能是內(nèi)表或者引用類型,但可以是嵌套體。
  • 如果內(nèi)表的整個行都是由基本類型字段組成,則可以把內(nèi)表整行指定為關(guān)鍵字。
  • 如果不指定任何關(guān)鍵字,則可以使用默認(rèn)的標(biāo)準(zhǔn)關(guān)鍵字,該選項(xiàng)為默認(rèn)選項(xiàng)。
  • 扁平結(jié)構(gòu)內(nèi)表的默認(rèn)表關(guān)鍵字是非數(shù)字和非內(nèi)表的組件字段,舉例來說,一個內(nèi)表有字段姓名(c 類型),年齡(n 類型)和工資(f 類型),則默認(rèn)的關(guān)鍵字為姓名和年齡。
  • 如果內(nèi)表的整個行都是單個基本類型組成,則默認(rèn)關(guān)鍵字為整個行,如果內(nèi)表字段含有內(nèi)表類型字段,則沒有默認(rèn)關(guān)鍵字。

表的使用:

  1. SAP里面主要有三處類型的內(nèi)表:?standard table?,?sorted table?,?hashed table?
  2. 定義語法:?TYPES|DATA itab {TYPE|LIKE} tabkind OF {linetype|lineobj} [WITH KEY] [INITIAL SIZE n]?.
  3. ?standard table?,?sorted table? 可以通過索引和關(guān)鍵字進(jìn)行訪問,?hashed table? 只能通過關(guān)鍵字進(jìn)行訪問
  4. ?standard table?在增加或插入數(shù)據(jù)行時并不對數(shù)據(jù)行的特理地址進(jìn)行重新排序存儲,只是對其索引進(jìn)行重表排列。?sorted table? 在增加和插入數(shù)據(jù)行時要對數(shù)據(jù)存儲的物理地址進(jìn)行重新排列。
  5. ?hashed table? 在檢索數(shù)據(jù)里與數(shù)據(jù)行數(shù)無關(guān),時間復(fù)雜度通常是 o(1) 的時間
  6. SAP 里內(nèi)表的層次結(jié)構(gòu)如下:

    any table
    index table           hashed table
    standard table     sorted table

  1. ?any table? 和 ?index table ?是抽象接口類型,不能用于定義具體的數(shù)據(jù)對象
  2. 舉例:
    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.
  3. 注:特別要注意的定義內(nèi)表的使用的關(guān)鍵字 ?LIKE?。通過對象來定義內(nèi)表要使用關(guān)鍵字 ?LIKE?。在黃佳的書上是有誤的。
  4. 在聲明內(nèi)表關(guān)鍵字時 ?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. 
  5. 因?yàn)??TABLE_LINE? 極象一個行字段,所以內(nèi)表基于的行結(jié)構(gòu)體不應(yīng)該包含 ?TABLE_LINE ?字段。
  6. 內(nèi)表可以通過 ?WITH [UNIQUE|NON-UNIQUE] KEY COMP1...COMPn,WITH [UNIQUE|NON-UNIQUE] KEY TABLE_LINE,WITH [UNIQUE|NON-UNIQUE] DEFAULT KEY ?定義表關(guān)鍵字。
  7. 在內(nèi)表中如果不指定任何表關(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)鍵字。
  8. 如果內(nèi)表行由結(jié)構(gòu)體類型組成,則最好不要使用 ?TABLE_LINE? 作為表關(guān)鍵字。
  9. 標(biāo)準(zhǔn)表不能使用 ?UNIQUE? 表關(guān)鍵字,且無需特別指定 ?NON-UNIQUE? 表關(guān)鍵字;排序表可以使用? NON-UNIQUE? 或者 ?UNIQUE? 表關(guān)鍵字,哈希表不能使用 ?NON-UNIQUE ?表關(guān)鍵字,且必須指定 ?UNIQUE ?表關(guān)鍵字。
  10. 在定義內(nèi)表時使用?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.
  11. 通常為了不至于引起混淆,建議定義與內(nèi)表結(jié)構(gòu)相同的工作區(qū)進(jìn)行內(nèi)表操作。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號