zoukankan      html  css  js  c++  java
  • 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:	emp	esta.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:	emp	esta.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:	emp	esta.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:	emp'
    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:	emp	estad.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.
  • 相关阅读:
    STM32 串口DMA方式接收(转)
    STM32 串口功能 库函数 详解和DMA 串口高级运用(转载)
    内存泄露调试心得
    Android 5.0 5.1 webview 闪退问题
    ios 接入微信开发 新版
    ios 获取app版本号
    ios alamofire4.x网络框架url 中文问题
    微服务监控druid sql
    kotlin 单例模式
    mysql 数据库保存 微信分享时不能换行
  • 原文地址:https://www.cnblogs.com/miaosj/p/10384232.html
Copyright © 2011-2022 走看看