iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
自我挑戰組

ABAP 基礎30天學習筆記系列 第 21

Day21_複雜Internal Table

  • 分享至 

  • xImage
  •  

原文連結:Declaring a Complex Internal Table

先前章節有簡單提及用單一變數構成的Internal Table,現在既然已經介紹完structure,就來看看如何用structure建構具有多欄位的Internal Table吧!

https://ithelp.ithome.com.tw/upload/images/20240917/20113802lLkuIuTkN8.png

上圖的numbers為第9天中有介紹到的單欄Internal Table,下表connections則是用connection這個structure建構而成,具有多欄位的Internal Table。

所謂的複雜Internal Table定義其實很簡單,就是用structure做為每一列(row)的資料型態,因此可以擁有許多欄(columns),Internal Table的欄位順序、名稱和型別與structure是相對應的。

跟資料表格有關的章節很推薦各位去翻原文附圖,附有精美圖示易懂又好理解。

internal table 的存取

存取方式

internal table的資料存取可分為索引存取與鍵存取:

  1. 索引存取(index access):以1開始作為第一列,指定資料所在表格中的列數進行存取。

  2. 鍵存取(key access):
    尋找特定列中的特定值,在多欄位的複雜internal table中更為方便。可以一次將多個列中的值都設為搜索條件。

* 以上圖中的表connections為例
connection = connections[ 3 ]. "用索引存取第三列"

connection = connections[ airport_from_id = 'SFO' airport_to_id = 'SIN'] "用鍵存取出發地為SFO,抵達地為SIN的列"

雖然用鍵搜尋很方便,然而在搜尋速度上相較用索引慢上許多。為了改善這個問題,選擇適當的存取模式可以促進以鍵搜尋的速度。

存取模式

存取模式決定了表格資料的儲存方式,以及系統如何檢索表格。每個internal table都具有三種存取模式中的其中一種:

    " 標準表格,鍵非唯一識別 (簡短寫法)
    DATA connections_1 TYPE TABLE OF st_connection.

    " 標準表格,鍵非唯一識別 (詳細寫法)
    DATA connections_2 TYPE STANDARD TABLE OF st_connection
                            WITH NON-UNIQUE DEFAULT KEY.

    " 排序表格,鍵非唯一識別
    DATA connections_3  TYPE SORTED TABLE OF st_connection
                             WITH NON-UNIQUE KEY airport_from_id
                                                 airport_to_id.

    " 雜湊表格,鍵唯一識別
    DATA connections_4  TYPE HASHED TABLE OF st_connection
                             WITH UNIQUE KEY carrier_id
  1. 標準表格(Standard Table):
    表格內容並不以特定順序排列,在預設下,新的資料列將添加在最尾端。由於未有預設排序,當使用鍵存取資料時將依序存取每一行,若為資料量大的表格將花費巨大的檢索時間。

  2. 排序表格(Sorted Table):
    在排序表格中,表格內容將按照鍵的值升序排列,當表格中被插入一筆新資料,系統會確保它放在正確的位置。由於表格資料經過排序,故在搜尋上相較標準表格更有效率(當遵照特定規則時)。

  3. 雜湊表格(Hashed Table):
    雜湊表格使用特殊的演算法,可以使系統在即使表格很大時仍非常快的搜尋到資料,然而此種能效能提升的表格僅能在特定情境下運作。

每個 internal table 都有一個代表鍵(key)的欄位。相比標準表格,鍵對於排序表格非常重要,因其決定了排序表格的排序方式。

並且,只有在用鍵存取資料時,排序表格與雜湊表格才有搜尋更快的優勢。

另一個關於鍵的特色,在於其唯一性,而對於不同模式的表格,鍵的規則也有些不同:

  • 標準表格:允許鍵值重複
  • 雜湊表格:不允許鍵值重複
  • 排序表格:可自行選擇鍵值是否可重複/不可重複

註:Internal table也可能有有第二個鍵,透過不同欄位的聯合搜尋,可以幫助存取時的效能提升。

宣告local internal table

建議internal table在建立表格型別(TYPES)時就一起宣告表格的存取模式與鍵,而不是在表格實體(DATA)建立時才進行宣告。

"1. 建立structure"
TYPES: BEGIN OF st_connection,
         carrier_id      TYPE /dmo/carrier_id,
         connection_id   TYPE /dmo/connection_id,
         airport_from_id TYPE /dmo/airport_from_id,
         airport_to_id   TYPE /dmo/airport_to_id,
         carrier_name    TYPE /dmo/carrier_name,
       END OF st_connection.

"2. 建立internal table型別"
TYPES tt_connections TYPE SORTED TABLE OF st_connection
                              WITH UNIQUE KEY carrier_id
                                              connection_id.
                                              
"3. 建立internal table"
DATA connections_5 TYPE tt_connections.

如上例的三步驟,首先定義 structure st_connection,接著根據該structure建立internal table型別並宣告存取模式與鍵,最後使用前述型別建立internal table實體。

宣告gobal internal table

如果建立了gobal 的 internal table type,就可在系統全域都使用這個型別。ADT有為這類的資料庫物件提供專屬GUI編輯器,簡單介紹如下:
左上:定義internal table參照的structure
右上:定義internal table的存取模式
右中:定義鍵是否具唯一性
右下:從structure的欄位元件中指定鍵

https://ithelp.ithome.com.tw/upload/images/20240917/20113802VqS0uf1SvH.png

明天來了解如何使用internal table吧~


上一篇
Day20_用ABAP SQL存資料進structure & JOIN使用
下一篇
Day22_Internal Table與work area
系列文
ABAP 基礎30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言