ABAP:從例子學習ABAP


1、插入內表行:

*插入內表行: DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS 2, END OF man. DATA: man1 LIKE TABLE OF man. man-name = '張參'. man-high = '1.68'. man-weight = 120. INSERT man INTO TABLE man1. man-name = '劉志'. man-high = '1.78'. man-weight = 160. INSERT man INTO TABLE man1. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP. ULINE. man-name = '錢華'. man-high = '2.22'. man-weight = 220. INSERT man INTO man1 INDEX 3. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP. ULINE. man-name = '錢華'. man-high = '2.22'. man-weight = 220. INSERT man INTO man1 INDEX 1. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP.

2、讀取文件

2.1、使用upload函數

*讀放文件 DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS 2, END OF man. DATA: man1 LIKE TABLE OF man. CALL FUNCTION 'UPLOAD' EXPORTING codepage = 'test' filename = 'd:\temp\testa.txt' filetype = 'dat' item = '讀取文件' TABLES data_tab = man1 EXCEPTIONS invalid_filesize = 1 invalid_table_width = 2 invalid_type = 3 no_batch = 4 unknown_error = 5 gui_refuse_filetransfer = 6 OTHERS = 7. IF sy-subrc <> 0. * message id sy-msgid type sy-msgty number sy-msgno * with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP.

 2.2、使用WS_UPLOAD函數

*讀取文件
DATA: BEGIN OF man,
      name(20) TYPE c,
      high     TYPE p DECIMALS 2,
      weight   TYPE p DECIMALS 2,
END OF man.

DATA: man1 LIKE TABLE OF man.

CALL FUNCTION 'WS_UPLOAD'
  EXPORTING
    codepage                = 'test'
    filename                = 'd:\temp\testa.txt'
    filetype                = 'DAT'
  TABLES
    data_tab                = man1
  EXCEPTIONS
    invalid_filesize        = 1
    invalid_table_width     = 2
    invalid_type            = 3
    no_batch                = 4
    unknown_error           = 5
    gui_refuse_filetransfer = 6
    OTHERS                  = 7.
IF sy-subrc <> 0.
* message id sy-msgid type sy-msgty number sy-msgno
* with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

LOOP AT man1 INTO man.
  WRITE: / man-name,man-high,man-weight.
ENDLOOP.

2.3、使用GUI_UPLOAD函數

*直接讀取文件
DATA: BEGIN OF man,
      name(20) TYPE c,
      high     TYPE p DECIMALS 2,
      weight   TYPE p DECIMALS 2,
END OF man.

DATA: man1 LIKE TABLE OF man.

CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    filename                      = 'd:\temp\testa.txt'
   FILETYPE                      = 'DAT'
*   HAS_FIELD_SEPARATOR           = ' '
*   HEADER_LENGTH                 = 0
*   READ_BY_LINE                  = 'X'
*   DAT_MODE                      = ' '
*   CODEPAGE                      = ' '
*   IGNORE_CERR                   = ABAP_TRUE
*   REPLACEMENT                   = '#'
*   CHECK_BOM                     = ' '
*   VIRUS_SCAN_PROFILE            =
*   NO_AUTH_CHECK                 = ' '
* IMPORTING
*   FILELENGTH                    =
*   HEADER                        =
  tables
    data_tab                      = man1
* CHANGING
*   ISSCANPERFORMED               = ' '
* EXCEPTIONS
*   FILE_OPEN_ERROR               = 1
*   FILE_READ_ERROR               = 2
*   NO_BATCH                      = 3
*   GUI_REFUSE_FILETRANSFER       = 4
*   INVALID_TYPE                  = 5
*   NO_AUTHORITY                  = 6
*   UNKNOWN_ERROR                 = 7
*   BAD_DATA_FORMAT               = 8
*   HEADER_NOT_ALLOWED            = 9
*   SEPARATOR_NOT_ALLOWED         = 10
*   HEADER_TOO_LONG               = 11
*   UNKNOWN_DP_ERROR              = 12
*   ACCESS_DENIED                 = 13
*   DP_OUT_OF_MEMORY              = 14
*   DISK_FULL                     = 15
*   DP_TIMEOUT                    = 16
*   OTHERS                        = 17
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.


LOOP AT man1 INTO man.
  WRITE: / man-name,man-high,man-weight.
ENDLOOP.

2.4、讀取文件小例子

DATA file_table TYPE file_table. "引用FILE_TABLE對象

DATA: lt_file_names TYPE filetable,
lwa_file_name LIKE LINE OF lt_file_names,
lv_subrc TYPE i.

SELECT-OPTIONS: i_file FOR file_table NO INTERVALS.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR i_file-low.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
*    WINDOW_TITLE            =
*    DEFAULT_EXTENSION     =
*    DEFAULT_FILENAME        =
*    FILE_FILTER             =
initial_directory       = 'd:\temp'
multiselection          = 'X'
CHANGING
  file_table                      = lt_file_names[]
  rc                                 = lv_subrc  "打開文件的數量
*    USER_ACTION             =
EXCEPTIONS
  file_open_dialog_failed = 1
  cntl_error                        = 2
  error_no_gui                    = 3
OTHERS                                 = 4.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

i_file-sign = 'I'.
i_file-option = 'EQ'.

LOOP AT lt_file_names INTO lwa_file_name.
  i_file-low = lwa_file_name.
  APPEND i_file.
ENDLOOP.

START-OF-SELECTION.
  WRITE:'打開文件的數量:',lv_subrc LEFT-JUSTIFIED.
  WRITE: / '打開文件的數量:',LINES( i_file ) LEFT-JUSTIFIED.
LOOP AT i_file.
 WRITE: / i_file-low.
ENDLOOP.

3、保存文件

*保存文件 DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS 2, END OF man. DATA: man1 LIKE TABLE OF man. DATA: name TYPE rlgrap-filename, typa TYPE rlgrap-filetype. man-name = '張參'. man-high = '1.68'. man-weight = 120. INSERT man INTO TABLE man1. man-name = '劉志'. man-high = '1.78'. man-weight = 160. INSERT man INTO TABLE man1. man-name = '錢華'. man-high = '2.22'. man-weight = 220. INSERT man INTO man1 INDEX 2. name = 'd:\temp\testad.txt'. typa = 'dat'. CALL FUNCTION 'DOWNLOAD' EXPORTING codepage = 'testa' filename = name filetype = typa item = '文件測試' TABLES data_tab = man1 EXCEPTIONS invalid_filesize = 1 invalid_table_width = 2 invalid_type = 3 no_batch = 4 unknown_error = 5 gui_refuse_filetransfer =6 OTHERS = 7. IF sy-subrc <> 0. * message id sy-msgid type sy-msgty number sy-msgno * with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.

4、格式化輸出

DATA wa LIKE spfli. WRITE:/. WRITE:10'航班承運人',40'航班連接',60'國家代碼',80'起飛城市',100'起飛機場'.

5、內表排序

*內表排序 DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS 2, END OF man. DATA: man1 LIKE hashed TABLE OF man with unique key name. man-name = '張參'. man-high = '1.68'. man-weight = 120. INSERT man INTO TABLE man1. man-name = '劉志'. man-high = '1.78'. man-weight = 160. INSERT man INTO TABLE man1. man-name = '錢華'. man-high = '2.22'. man-weight = 220. INSERT man INTO table man1. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP. ULINE. sort man1 ascending by weight descending . skip. uline. LOOP AT man1 INTO man. WRITE: / man-name,man-high,man-weight. ENDLOOP.

6、消息

*消息 *--開始 *DATA: msg1(20) TYPE c VALUE '測試'. *DATA: msg2(20) TYPE c VALUE 'ABAP'. *DATA: msg3(20) TYPE c VALUE '消息!'. * *MESSAGE i006(ymess) WITH msg1 msg2 msg3. * *data:BEGIN OF man, * name(30) TYPE c, * high TYPE p DECIMALS 2, * weight TYPE p DECIMALS 2, *END OF man. * *FIELD-SYMBOLS <fsa> LIKE man. *DATA man1 LIKE man. * *man-name = '雨荷'. *man-high = '1.78'. *man-weight = 140. * *ASSIGN man TO <fsa>. *WRITE:/ <fsa>-name, * man-high, *<fsa>-weight. *--結束 *--開始 *DATA: msg1(20) TYPE c VALUE '測試'. *DATA: msg2(20) TYPE c VALUE 'ABAP'. *DATA: msg3(20) TYPE c VALUE '消息!'. * *MESSAGE i001(00) WITH msg1 msg2 msg3. * * *DATA: c1(2) TYPE c, * c2(2) TYPE c, * c3(2) TYPE c, * c4(2) TYPE c, * c5(20) TYPE c VALUE '91* 12*23*344445', * c9(2) TYPE c. * *c9 = '* '. *WRITE: / . *WRITE c5. *SPLIT c5 AT c9 INTO c1 c2 c3 c4 . *WRITE: / c1,c2,c3,c4. *--結束 *--開始 *DATA: msg1(20) TYPE c VALUE '測試'. *DATA: msg2(20) TYPE c VALUE 'ABAP'. *DATA: msg3(20) TYPE c VALUE '消息!'. * *MESSAGE i001(00) WITH msg1 msg2 msg3. * * *DATA: BEGIN OF man, * name(20) TYPE c, * high TYPE p DECIMALS 2, * weight TYPE p DECIMALS 2, *END OF man. * *DATA: man1 LIKE TABLE OF man WITH HEADER LINE, *man2 LIKE TABLE OF man. * *man-name = '張參'. *man-high = '1.68'. *man-weight = 120. *APPEND man TO man1. * *man-name = '劉志'. *man-high = '1.78'. *man-weight = 160. *APPEND man TO man1. * *MOVE man1[] TO man2. * * * WRITE: / man-name,man-high,man-weight. * * *LOOP AT man1. *write: / man1-name,man1-high,man1-weight. *ENDLOOP. *--結束

 7、讀取數據表

**讀取數據表
*定義工作區
DATA a_spfli TYPE spfli.
*定義內表,請注意有Header line
DATA ta_spfli TYPE TABLE OF spfli WITH HEADER LINE.
*分隔線
ULINE.
WRITE / '使用工作區'.
ULINE.
* 將數據表逐行轉移至工作區,只讀前5行
SELECT * INTO CORRESPONDING FIELDS OF
         a_spfli FROM spfli UP TO 5 ROWS.
  WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,
          a_spfli-cityto.
ENDSELECT.

ULINE.
WRITE / '使用內表'.
ULINE.
SELECT * INTO CORRESPONDING FIELDS OF
         TABLE ta_spfli FROM spfli UP TO 5 ROWS.
*從數據表讀數據至內表,直接從內表輸出
*如果TA_SPFLI沒有定義Header line,會出錯
LOOP AT ta_spfli.
  WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,
           a_spfli-cityto.
ENDLOOP.
ULINE.
WRITE / '將內表數據轉移至工作區'.
ULINE.
LOOP AT ta_spfli INTO a_spfli.
  WRITE: / a_spfli-connid,a_spfli-carrid,a_spfli-cityfrom,
             a_spfli-cityto.
ENDLOOP.

8、內連接和外連接

*內連接和外連接
*定義結構
DATA: BEGIN  OF   arcd,
      carrid TYPE spfli-carrid,
      connid TYPE spfli-connid,
      fldate TYPE sflight-fldate,
      END OF arcd.
*工作區
DATA arcd1 LIKE arcd.
*關聯數據表,讀取前10條記錄,寫入工作區,並輸出
SELECT spfli~carrid spfli~connid sflight~fldate INTO arcd1 FROM spfli
       INNER JOIN sflight ON spfli~carrid = sflight~carrid
       AND spfli~connid = sflight~connid UP TO 10 ROWS.
  WRITE: / arcd1-carrid,arcd1-connid,arcd1-fldate.
ENDSELECT.

9、使用package size 讀取數據

**使用package size 讀取數據
*定義內表,請注意有Header line
DATA wa_spfli TYPE TABLE OF spfli WITH HEADER LINE.
*分隔線
ULINE.
* 以每次讀取5條記錄,直到讀取所有數據
SELECT * INTO TABLE wa_spfli FROM spfli PACKAGE SIZE 5.
*輸出內表記錄
  LOOP AT wa_spfli.
    WRITE: / wa_spfli-connid,wa_spfli-carrid,wa_spfli-cityfrom,
             wa_spfli-cityto.
  ENDLOOP.
*輸出5條記錄后輸出一條橫線
  ULINE.
ENDSELECT.

10、交互式列表

**交互式列表
START-OF-SELECTION.
  WRITE:'初如列表,sy-lsind = ' ,sy-lsind.

AT LINE-SELECTION.
  IF sy-lsind = 1.
    WRITE: '第二列表,sy-lsind =',sy-lsind.
  ENDIF.

AT LINE-SELECTION.
  IF sy-lsind = 2.
    WRITE: '第三列表,sy-lsind =',sy-lsind.
  ENDIF.

 11、列表顏色

**列表顏色
*數據庫表spfli相關
TABLES spfli.
SKIP.

*輸出表頭,背景灰藍
FORMAT COLOR COL_HEADING.
ULINE AT /(91).

WRITE: / sy-vline,(15) '航線承運人', sy-vline , (15) '航班連接', sy-vline,
       (15) '國家代碼', sy-vline,(15) '起飛城市', sy-vline,
       (15) '起飛機場',sy-vline.
ULINE AT /(91).
FORMAT COLOR OFF.
*輸出內容,輸出關鍵值為‘LH’為紅色
SELECT * FROM spfli.
  IF spfli-carrid = 'LH'.
    FORMAT COLOR COL_NEGATIVE.
  ELSE.
    FORMAT COLOR OFF.
  ENDIF.
  WRITE: / sy-vline,(15) spfli-carrid,sy-vline,(15) spfli-connid,sy-vline,
         (15) spfli-countryto, sy-vline,(15) spfli-cityfrom,sy-vline,(15)
         spfli-airpfrom,sy-vline.
  ULINE AT /(91).
ENDSELECT.

12、輸出熱點

**輸出熱點
start-of-selection.
  write '請按'.
  format hotspot on color 5 inverse on.
  write '熱點'.
  format hotspot off color off.
at line-selection.
  write 'welcome!'.

13、為列表定義工具條和菜單

*為列表定義工具條和菜單
START-OF-SELECTION.
* 設置已使用的狀態條
  SET PF-STATUS 'STA1'.
  WRITE:'測試工具條按鈕 '.

AT USER-COMMAND.
*當單擊按鈕時輸出
  CASE sy-ucomm.
    WHEN '&NFO'.
      WRITE: '已選擇!'.
    WHEN 'E'.
      leave to screen 0.
    when others.
      WRITE '1111'.
  ENDCASE.

14、在彈出式窗口中顯示列表

*在彈出式窗口中顯示列表
START-OF-SELECTION.
* 設置已使用的狀態條
  SET PF-STATUS 'STA1'.
  WRITE:'測試工具條按鈕 '.

AT USER-COMMAND.
*當單擊按鈕時輸出
  CASE sy-ucomm.
    WHEN '&NFO'.
      WRITE: '已選擇!'.
    WHEN 'E'.
      leave to screen 0.
    when others.
        IF sy-lsind = 1.
        SET PF-STATUS 'STA1'.
*定義子窗口並輸出
        WINDOW STARTING AT 10 10 ENDING AT 30 20.
        WRITE '在子窗口輸出!'.
        WRITE: '請注意!'.
      ENDIF.
  ENDCASE.

15、隱藏字段技術

**隱藏字段技術
*數據庫表spfli相關
TABLES: spfli, sflight.

START-OF-SELECTION.
  SKIP.
*輸出
  ULINE AT /(91).

  WRITE: / sy-vline,(15) '航線承運人', sy-vline , (15) '航班連接', sy-vline,
         (15) '國家代碼', sy-vline,(15) '起飛城市', sy-vline,
         (15) '起飛機場',sy-vline.
  ULINE AT /(91).

*輸出
  SELECT * FROM spfli
*    WHERE carrid = 'UA' AND connid = 3504
    .
    WRITE: / sy-vline,(15) spfli-carrid,sy-vline,
                      (15) spfli-connid,sy-vline,
                      (15) spfli-countryto,sy-vline,
                      (15) spfli-cityfrom,sy-vline,
                      (15) spfli-airpfrom, sy-vline.
*隱藏關鍵字
    HIDE: spfli-carrid,spfli-connid.
    ULINE AT /(91).
  ENDSELECT.

AT LINE-SELECTION.
*只輸出第一頁
  IF sy-lsind = 1.
    write : / 'spfli-carrid:',spfli-carrid.
    write : / 'spfli-connid:',spfli-connid.
    ULINE AT /(91).
    WRITE: / sy-vline,(15) '航線承運人', sy-vline , (15) '航班連接', sy-vline,
         (15) '國家代碼', sy-vline,(15) '起飛城市', sy-vline,
         (15) '起飛機場',sy-vline.
    ULINE AT /(91).
*根據隱藏字段讀取並打印從表
    SELECT * FROM sflight
      WHERE carrid = spfli-carrid AND connid = spfli-connid
      .
      WRITE: / sy-vline,(15) spfli-carrid,sy-vline,
                      (15) spfli-connid,sy-vline,
                      (15) spfli-countryto,sy-vline,
                      (15) spfli-cityfrom,sy-vline,
                      (15) spfli-airpfrom, sy-vline.
      ULINE AT /(91).
    ENDSELECT.
  ENDIF.

16、使用hide技術從列表讀取行

**使用hide技術從列表讀取行
*數據庫表spfli相關
TABLES: spfli.
DATA: sela(1) TYPE c,
      num    TYPE i VALUE 0.

START-OF-SELECTION.
  SKIP.
*輸出
  ULINE AT /(95).

  WRITE: / sy-vline,'',sy-vline,(15) '航線承運人', sy-vline , (15)
           '航班連接', sy-vline,(15) '國家代碼', sy-vline,(15)
           '起飛城市', sy-vline,(15) '起飛機場',sy-vline.
  ULINE AT /(95).

*輸出
  SELECT * FROM spfli.
    WRITE: / sy-vline,sela AS CHECKBOX,sy-vline,(15) spfli-carrid,
             sy-vline,(15) spfli-connid,sy-vline,(15) spfli-countryto,
             sy-vline,(15) spfli-cityfrom,sy-vline,
                      (15) spfli-airpfrom,sy-vline.
* 隱藏關鍵字
    HIDE: spfli-carrid,spfli-connid,spfli-countryto,
          spfli-cityfrom,spfli-airpfrom.
    ULINE AT /(95).
* 隱藏選擇框,使表格行不會選擇
    HIDE sela.
    num = num + 1.
  ENDSELECT.

END-OF-SELECTION.
*  num1 = sy-lsind - 1.

AT LINE-SELECTION.
  WRITE :  'sy-lsind:',sy-lsind.
   WRITE :  'num:',num.
*只輸出第一頁
  IF sy-lsind = 1.
    DO num TIMES.
* 讀取行
      READ LINE sy-index FIELD VALUE sela.
* 如果checked,輸出隱含字段
      IF sela = 'X'.
        WRITE: / spfli-carrid,spfli-connid,spfli-countryto,
                 spfli-cityfrom,spfli-airpfrom.
      ENDIF.
    ENDDO.
  ENDIF.

 


免責聲明!

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



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