1. 程式人生 > >abap內表的操作彙總

abap內表的操作彙總

abap內表是abap開發中最常用的工具之一

這裡總結一個常用的一些操作,以後可以直接複製使用

1,定義

參考欄位定義

DATA:BEGIN OF i_list OCCURS 0 ,
  matnr LIKE mara-matnr,
  werks LIKE marc-werks,
END OF i_list .

這種定義方式是帶表頭的

參考結構體/表/內表定義

DATA:i_list2 LIKE TABLE OF i_list WITH HEADER LINE.

或者

DATA: i_lis2 LIKE i_list OCCURS 0 WITH HEADER LINE.

可以選擇帶表頭或者不帶表頭由 WITH HEADER LINE. 決定

參考結構體/表/內表+欄位定義

DATA: BEGIN OF i_list3 OCCURS 0.
        INCLUDE STRUCTURE i_list.
DATA:   str(10) TYPE c,
END OF i_list3.

定義表頭/工作區

DATA:wa_list LIKE i_list.

2,賦值

APPEND   追加

帶表頭的內表可以直接用內表表頭,不帶表頭的內表需要定義工作區

APPEND i_list.            "帶表頭內表賦值
APPEND wa_list TO i_list. "不帶表頭的內表賦值

i_list-matnr = '1001'.
i_list-werks = '1000'.
APPEND i_list.
CLEAR i_list.
wa_list-matnr = '1002'.
wa_list-werks = '1000'.
APPEND wa_list TO i_list.
CLEAR wa_list.

注意:每次APPEND 完之後記得CLEAR 一下表頭,防止下次重複用到相同的值

INSERT 插入資料

預設在最內表最後插入一條數資料,效果和APPEND wa_list TO i_list一樣
INSERT wa_list INTO TABLE i_list. 

在最內表最前面插入一條資料 index指定位置   注意:abap的內表下標從1開始,和其他變成語言的下標從0開始有所不同 插入的下標會佔用原來資料的位置,原來位置的資料會往下移一行
INSERT i_list INDEX 1.             "帶表頭
INSERT wa_list INTO i_list INDEX 1. "不帶表頭

內表間的賦值

結構相同的內表可以直接賦值

i_list2[] = i_list[].   效果和   MOVE i_list[] TO i_list2[].  相同      會覆蓋i_list2原有的值

MOVE 如果不帶[] 只作用與表頭/工作區

比如:MOVE i_list TO i_list2.  標示表頭之間的賦值 

APPEND LINES OF i_list TO i_list2.  "追加,不會覆蓋i_list2原來的值

APPEND 還可以指定追加第幾行

APPEND LINES OF i_list FROM 1 TO 3 TO i_list2. "將內表i_list的前3行資料附加到內表i_list2 

不同結果內表間的賦值,可以用迴圈處理

LOOP AT i_list.
  MOVE-CORRESPONDING i_list TO i_list3. "將欄位相同的i_list賦值給i_list3.
  APPEND i_list3.
  CLEAR i_list3.
ENDLOOP.

注意:MOVE-CORRESPONDING 只對工作區用,MOVE-CORRESPONDING i_list[] TO i_list3[]. 語法錯誤

也可以迴圈中可以單個欄位賦值,不然欄位太多就很麻煩了

LOOP AT i_list.
  i_list3-matnr = i_list-matnr.
  i_list3-werks = i_list-werks.
  APPEND i_list3.
  CLEAR i_list3.
ENDLOOP.

這個效果同上是一樣的

當然 如果要將不同欄位之間賦值就必須使用單個欄位賦值了

LOOP AT i_list.
  MOVE-CORRESPONDING i_list TO i_list3. "將欄位相同的i_list賦值給i_list3.
  i_list3-str = i_list-matnr. "不同欄位間的賦值
  APPEND i_list3.
  CLEAR i_list3.
ENDLOOP.

3.read內表

read的作用是讀取內表一行,可以指定key或者index 行號

READ TABLE i_list WITH KEY matnr = '1001' werks = '1000'. "根據key讀取
IF sy-subrc = 0.
  WRITE: '讀取到資料'.
ENDIF.
READ TABLE i_list INDEX 1. "根據行號讀取  讀取第一行
IF sy-subrc = 0.
  WRITE: '讀取到資料'.
ENDIF.

4.loop迴圈內表

迴圈內表非帶表頭和不帶表頭的迴圈,不帶標題的迴圈必須迴圈到一個工作區做操作

LOOP AT i_list TO wa_list. "不帶表頭的內表迴圈
ENDLOOP.
LOOP AT I_LIST. "帶表頭的內表迴圈
ENDLOOP.

注意:做loop的時候能做到帶條件最好帶條件,特別是對大資料量做處理的時候,效率會高很多

LOOP AT i_list WHERE matnr = '1001'. "帶條件的迴圈
ENDLOOP.

5.modify內表

abap修改內表常用的是modify   而modify常常在迴圈中使用

***將i_list中工廠為1000的資料物料修改為4001
LOOP AT i_list.
  IF i_list-werks = '1000'.
    i_list-matnr = '4001'.
  ENDIF.
  MODIFY i_list.
  CLEAR i_list.
ENDLOOP.

迴圈中的modify 最好放在每次迴圈最後,而且一般和 clear一起使用,以防修改到不對應的行

modify 還可以不用迴圈,可以根據表頭修改

wa_list-matnr = '4001'.
wa_list-werks = '1000'.
MODIFY i_list FROM wa_list TRANSPORTING matnr WHERE werks = wa_list-werks.

這個效果和上面的效果是一樣的,而且效率要比上面的高

6.delete 內表

根據where條件刪除

DELETE i_list WHERE matnr = '4001'.

迴圈中刪除(能用where條件刪除的情況下不用迴圈刪除,當然有些情況下必須要在LOOP裡面刪除的另說)

LOOP AT i_list.
  IF i_list-matnr = '4001'.
    DELETE i_list.
    CONTINUE.
  ENDIF.
ENDLOOP.

注意:迴圈中刪除的時候需要和CONTINUE.一起使用,不然如果迴圈中還做其他操作可能資料會亂

7.內表排序和刪除重複行

內表排序和刪除重複行也是開發中用的特別多的一個功能

SORT i_list BY werks matnr. "預設的是升序
SORT i_list BY werks matnr DESCENDING. "werks升序  matnr降序
DELETE ADJACENT DUPLICATES FROM i_list COMPARING wreks matnr. "刪除相鄰重複行

注意:刪除相鄰重複行之前,必須先排序

相關推薦

abap操作彙總

abap內表是abap開發中最常用的工具之一 這裡總結一個常用的一些操作,以後可以直接複製使用 1,定義 參考欄位定義 DATA:BEGIN OF i_list OCCURS 0 ,   matnr LIKE mara-matnr,   werks LIKE marc-w

(轉)ABAP 7.4 新語法-嵌生命和操作

    1.內嵌宣告     2.內表操作     3.opensql *&---------------------------------------------------------------------* 1. 內嵌宣告   1)宣告符號:

abap 中的操作

宣告內表 (1)data: begin of itab occurs 0,     a type  c,end of itab. data: begin of itab occurs 0.     include structure mara.     include ty

ABAP 訪問表達式的性能

editor string 分享 index lease time dcl struct 表達式 內表訪問表達式是ABAP 7.4中引入的重要特性,可以使語句變得更加簡潔、美觀。那麽它的讀寫性能怎麽樣呢?我進行了一點點測試。 讀取 測試代碼,使用三種方式讀取

ABAP匯出為EXCEL格式的幾種方法(轉)

目錄 正文  這是一篇轉載文章,本人修改了其中的幾個錯字病句 內表資料下載到EXCEL的幾種方法 1. 函式: GUI_DOWNLOAD   這是一種最基本的方法,對應 CLASS: CL_GUI_FRONTEND_SERVICES 的方法 GUI_DOWN

動態ABAP

REPORT  ZLEIY_ABAP_TEST.FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,                <dyn_wa>,                <dyn_field

ABAP 開發系列(05): ABAP 結構

2.內表和內表結構 2.1.1 結構體的定義 ABAP 中可以定義結構來包含多個基本型別,便於整理及操作; 結構體不屬於資料字典物件(資料字典中可以定義結構體,但不能儲存資料),在程式執行時會被作為臨時物件儲存在記憶體空間; 在建立內表時,可參考直接定義的結構體作為內表結

淺談 ABAP 和工作區

    這幾天一直在跟同事講內表和工作區的問題,網上介紹這方面的資料也比較多,今天順便就這個問題整理下了自己的思路,希望對您在這個問題上有所幫助。         1、首先,我們應該先了解下:內表(internal table) 標題行(header line) 工作區(w

ABAP開發的第一步, 先說說ABAP

      SAP開發的語言是ABAP(C/S模式),ABAP語言中沒有陣列, 它有內表, 就相當於其它語言的陣列,我們平時開發都是與內表打交道,先說說內表的定義: DATA:itab_mseg   LIKE TABLE OF mseg WITH HEADER LINE. 這

操作:LINES/LINE_EXISTS/LINE_INDEX

LINES SELECT carrid FROM scarr INTO TABLE @DATA(lt_tab). OLD: DESCRIBE TABLE lt_tab LINES DATA(LV_TABIX). NEW: DATA(LV

ABAP 清空 refresh clear free

在我們使用完內表或者工作區後,需要進行一些清理工作。abap提供了3中方式:refresh,clear, free。 這3種方式的作用: refresh 此語句將刪除內部表的全部內容(包括header

ABAP幾種操作

1. DELETE itab.  2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.  3. DELETE TABLE itab [FROM wa].  4. DELETE itab INDEX idx.  5. DELETE itab FROM

ABAP動態運用

unique collect cat led vol gin cor ssi ade REPORT ztest. DATA: BEGIN OF wa_ets, vbeln LIKE lips-vbeln

Altium_Designer電層與電層分割操作彙總

http://www.51hei.com/bbs/dpj-30172-1.html 一)內電層與內電層分割     在系統提供的眾多工作層中,有兩層電性圖層,即訊號層與內電層,這兩種圖層有著完全不同的性質和使用方法。訊號層被稱為正片層,一般用於純線路設計,包括外層線

ABAP 通過控制代碼將資料寫入記憶體,然後在SMARTFORM中呼叫

首先要在SMARTFORM 中定義控制代碼。在全域性設定-》表格介面中定義PRT_HANDLER1和PRT_HANDLER2. 在全域性定義中定義和程式中內表結構相同的內表,注意在全域性資料中要定義工作區方便呼叫。   然後在程式中呼叫SMARTFORM,利用S

ABAP 定義縱深結構的

ABAP 定義縱深結構的內表 CLASS DEMO DEFINITION.   PUBLIC SECTION.     CLASS-METHODS:     

abap資料匯出為excel檔案

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF } .L0S31 { font-style: italic; color: #808080 } .L0S32 { color: #33

ABAP 用指標的方式賦值

一般給內表賦值的話我們可以選擇append的方式,也可以使用指標對內表賦值,此處記錄一下如何使用指標為內表賦值 LOOP AT lt_tab_out ASSIGNING <fs_out> WHERE aufnr NE space.         READ TA

ABAP 7.4新特性(四):訪問表示式

現在新語法支援itab[ ] 這種類似陣列的形式了,不過注意的是如果內表不含deep struct ,itab[ 1 ][ 2 ] 是不允許的,這是和二維陣列區別之一。 只能通過itab[ 1 ]-colname 的形式,也就是說用itab[ ] 一般用來返回某一行的資料,

ABAP 查詢數量最大值的記錄到

select matnr max( num ) from *** into corresponding fields of table i_mara group by matnr order by matnr.