ABAP学习笔记(2)---ABAP基础--代码汇总

*本人学习ABAP参考书为黄佳的<SAP程序设计>以下例子来自该书:
*&---------------------------------------------------------------*
*& Report  Z_FIRST_PROGRAM01

*&

*&---------------------------------------------------------------*
*&
*&---------------------------------------------------------------*

*&修改每行代码显示列数:实用程序---设置----ABAP Editor-editor---default line length(72)前勾打掉

REPORT  z_first_program01
              .
DATA: text(30) TYPE c,len TYPE i,time TYPE t,date TYPE  d.

text = 'This is my first ABAP Program.' .

time = sy-uzeit.

MOVE '20071130' TO date.

date = date + 1.

DESCRIBE FIELD text LENGTH len IN BYTE MODE.

WRITE: '(1)',text,'是USACPA于',date,time,'创建的'.
WRITE: text,'has length',len .



*2结构体赋值:----------------------------------------------------*
DATA: BEGIN OF add_personel,
           tetle(5) VALUE 'MR',
           name(20),
           street(100),
           no(3) TYPE n,
      END OF add_personel.
DATA: BEGIN OF add_company,
           position(20) VALUE 'consultant',
           name(20) VALUE 'JZCK HUANG',
           street(100) TYPE n VALUE 'Beijing Avenue',
           no(3) TYPE n VALUE '002',
           postcode(6) TYPE n VALUE '100875',
      END OF add_company.
MOVE-CORRESPONDING add_company TO add_personel.
WRITE: / ,'(2)',   add_personel-name.
CLEAR add_personel-name.

*3赋值类型转换----------------------------------------------------*
DATA: char(10) TYPE c VALUE '-X1Y2Z3.A4',
      numc(10) TYPE n,
      time0 TYPE t VALUE '010001',
      int TYPE i.
numc = char. int = time0.

WRITE : / ,'(3)赋值类型转换',char, / numc, / time0, / int.
"*-X1Y2Z3.A4,0000001234,010001,3,601-------60*60*1+1=3,600秒

*4数学函数--------------------------------------------------------*
DATA:result(20) TYPE c,
       float TYPE f VALUE '2.5E00'.
result = trunc( float ).
WRITE: / ,'(4)数学函数', /10 result.


*5时间运算--------------------------------------------------------*
DATA: seconds TYPE i,
      hours TYPE i,
      time1 TYPE t VALUE '100000',"10:00:00 AM
      time2 TYPE t VALUE '080000'."08:00:00 AM

seconds = time1 - time2.
hours   = seconds / 3600.

WRITE: / ,'(5)时间运算',/ 'Seconds between time1 and time2:',seconds,
       / 'Hours   between time1 and time2:',hours.


*6数据格式化输出--------------------------------------------------*
DATA: g(5) TYPE c VALUE 'Hello',
      f(5) TYPE c VALUE 'ABAP'.
WRITE: / ,'(6)数据格式化输出', / g, f.
WRITE: /10 g,
       /  f UNDER g,
       /  f UNDER g RIGHT-JUSTIFIED.
WRITE: / g NO-GAP, f,/ .

DATA time3 TYPE t VALUE '154678'.
WRITE: time3 ,
/(8) time3 USING EDIT MASK '__:__:__',/ ,
/(4) time3 USING EDIT MASK '__:__:__',/ .

WRITE: '000123',
     /'000123' NO-ZERO,/ .

DATA float1 TYPE p VALUE '1234567890'.  "有问题的
WRITE: float1 EXPONENT 9 ,/ .

DATA: pack TYPE p VALUE '123.456' DECIMALS 3.

WRITE: pack DECIMALS 2.
WRITE: / pack ROUND -2,
       / pack ROUND -1,
       / pack ROUND 1,
       / pack ROUND 2,/ .

WRITE: sy-datum,
/ sy-datum YYM MDD. "此处不应有空格,因视野自动过滤M-M-D为骂人话,发不成功.


*7分支控制---------------------------------------------------------*

WRITE : / ,'(7)分支控制语法事例:'.

IF sy-uzeit < '120000'.
  WRITE / 'Good Morning!'.
  IF sy-uzeit < '060000'.
    WRITE: / ,'You are very early.'.
  ENDIF.
ELSEIF sy-uzeit < '180000'.
  WRITE: / , 'Good Afternoon!'.
ELSE.
  WRITE / 'Good Evening!'.
ENDIF.


CASE sy-datum+4(2).  "+4(2),是什么样意思?
  WHEN '12' OR '01' OR '02'.
    WRITE / 'The season now is Winter.'.
  WHEN '03' OR '04' OR '05' .
    WRITE / 'The season now is Spring.'.
  WHEN '06' OR '07' OR '08'.
    WRITE / 'The season now is Summer.'.
  WHEN '09' OR '10' OR '11'.
    WRITE / 'The season now is Autumn.'.
  WHEN OTHERS.
    WRITE 'This is illegal date.'.
ENDCASE.

WRITE: / , / .
DATA:outer_index TYPE i,
     inner_index TYPE i.

DO 2 TIMES.
  outer_index = sy-index.
  WRITE sy-index.
  SKIP.

  DO 3 TIMES.
    inner_index = sy-index.
    WRITE:outer_index NO-GAP,'-' NO-GAP,
          inner_index LEFT-JUSTIFIED.
  ENDDO.
  SKIP.
ENDDO.

WRITE: / , / .

DATA: len1 TYPE i,
      string(30) TYPE c VALUE 'Beijing 2008'.
WHILE string NE space.
  len1 = sy-index.
  SHIFT string.
ENDWHILE.
WRITE:/ 'Length of string:', len1.

WRITE: / , / .

DO 4 TIMES.
  IF sy-index = 2.
    CONTINUE.
  ENDIF.
  WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
  CHECK sy-index BETWEEN 2 AND 3.
  WRITE sy-index.
ENDDO.
SKIP.
DO 4 TIMES.
  IF sy-index = 3.
    EXIT.
  ENDIF.
  WRITE sy-index.
ENDDO.
SKIP.



WRITE: / , / .
DATA: s1(9)  TYPE c VALUE 'Firstname',
      s2(10) TYPE c VALUE 'Secondname',
      s3(20), sep(1) TYPE c VALUE '.' .
CONCATENATE s1 s2 INTO s3.
WRITE / s3.
CONCATENATE s1 s2 INTO s3 SEPARATED BY sep.
WRITE / s3.


WRITE: / , / .

DATA: text1 TYPE string,
      itab TYPE TABLE OF string.

text = 'ABAP is a programming language'.
SPLIT text AT space INTO TABLE itab.
LOOP AT itab INTO text.
  WRITE / text.
ENDLOOP.


WRITE: / , / .
DATA string1(30) TYPE c VALUE 'This is a testing sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.

SEARCH string1 FOR 'X'.
WRITE: / 'X',sy-subrc UNDER 'SY-SUBRC',
             sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string1 FOR 'itt   '.
WRITE:/ 'itt    ',sy-subrc UNDER 'SY-SUBRC',
                  sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string1 FOR '.e.'.
WRITE : / '.e.' ,sy-subrc UNDER 'SY-SUBRC',
                 sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string1 FOR '*e'.
WRITE: / '*e',sy-subrc UNDER 'SY-SUBRC',
              sy-fdpos UNDER 'SY-FDPOS'.
SEARCH string1 FOR 's*'.
WRITE : / 's*' ,sy-subrc UNDER 'SY-SUBRC',
                sy-fdpos UNDER 'SY-FDPOS'.

WRITE: / , / .
DATA name TYPE string.
name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
  REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.


WRITE: / , / .
DATA : text3(24) TYPE c VALUE  'ABAB Language',
       len2 TYPE i.

len2 = strlen( text3 ) .
WRITE: / 'Length of', text3, 'is',len2.


WRITE: / , / .
DATA: s5 TYPE string ,
      s6 TYPE string.
s5 = 'SAP ABAP'.
s6 = 'ABAP'.
IF s5 CS s6 .
  WRITE : / s6,'is in position',sy-fdpos,
          'of',s5,'string'.
ENDIF.




DATA: f1(8) VALUE 'ABCDEFGH',
      f2(20) VALUE '12345678901234567890'.
f2+6(5) = f1+3(5).
WRITE: / ,f2.

*8使用内表1-------------------------------------------------------------*

WRITE: / , / ,'(8)使用内表1'.
DATA: BEGIN OF line,
        num TYPE i,
        sqr TYPE i,
      END OF line.
DATA itab1 LIKE STANDARD  TABLE OF line WITH KEY table_line .
"此句原TYPE错误!应改为LIKE
DO 5 TIMES.
  line-num = sy-index.
  line-sqr = sy-index ** 2.
  APPEND line TO itab1 .
ENDDO.
LOOP AT itab1 INTO line.
  WRITE: / ,line-num,line-sqr.
ENDLOOP.
CLEAR itab1.



*8使用内表2---------------------------------------------------------------*
WRITE: / , / ,'(8)使用内表2'.

*Defining Internal Tables

DATA: BEGIN OF address,
         street(20) TYPE c,
         city(20)   TYPE c,
         END OF address.

TYPES address_tab LIKE STANDARD TABLE OF address
WITH NON-UNIQUE KEY city.

DATA: BEGIN OF company,
name(25) TYPE c,
addresses TYPE address_tab,
END OF company.

DATA company_tab LIKE HASHED TABLE OF company
WITH UNIQUE KEY name.


DATA company_sorted_tab LIKE SORTED TABLE OF company
WITH UNIQUE KEY name.

DATA idx TYPE sy-tabix.

*Filling Internal Tables

company-name = 'Jacky Computer Pte Ltd'.

address-street = 'Alexandra Street'.
address-city = 'Sinagpore'.
APPEND address TO company-addresses.

address-street = 'Havelock Avenue'.
address-city = 'New York'.
APPEND address TO company-addresses.
INSERT company INTO TABLE company_tab.

CLEAR company.

company-name = 'Beijing CaoYa Co.Ltd'.

address-street = 'Tian An Men Square'.
address-city = 'Biejing'.
APPEND address TO company-addresses.

address-street = 'Nanjing Road'.
address-city = 'Shang Hai'.
APPEND address TO company-addresses.

address-street = 'Wangfujing Street'.
address-city = 'Beijing'.
APPEND address TO company-addresses.

INSERT company INTO TABLE company_tab.

*Reading Internal Tables

READ TABLE company_tab
WITH TABLE KEY name = 'Jacky Computer Pte Ltd'
INTO company.

WRITE : / company-name.

LOOP AT company-addresses INTO address.
  WRITE: / sy-tabix, address-street, address-city.
ENDLOOP.
*Modifying Internal Tables

address-street = 'Tian He Road'.
address-city = 'Beijing'.

READ TABLE company_tab WITH TABLE KEY name = 'Beijing CaoYa Co.Ltd' INTO company.
READ TABLE company-addresses TRANSPORTING NO FIELDS
WITH TABLE KEY city = address-city.
idx = sy-tabix.

MODIFY company-addresses FROM address INDEX idx.

*Moving and sorting Internal Tables

company_sorted_tab = company_tab.

LOOP AT company_sorted_tab INTO company.
  WRITE / company-name.
  SORT company-addresses.
  LOOP AT company-addresses INTO address.
    WRITE: / sy-tabix ,address-street,address-city.
  ENDLOOP.
ENDLOOP.


*&Exract---------------------------------------------------------------*
*8使用内表3---------------------------------------------------------------*
WRITE: / , / ,'(8)使用内表3'.

DATA: f3 TYPE i,
      f4 TYPE i.

FIELD-GROUPS header.
INSERT f3 f4 INTO header.

DO 10 TIMES.
  f3 = sy-index.
  f4 = sy-index ** 2.
  EXTRACT header.
ENDDO.

SORT DESCENDING.
LOOP.
  WRITE: / f3, f4.
ENDLOOP.


*插入已有关键字结构:
*CASE f.  "模式--其他模式
*  WHEN w1.
*    .....
*  WHEN w2.
*    .....
*  WHEN OTHERS.
*    .....
*ENDCASE.

*9动态数据对象:
WRITE: / , / , '(9)动态数据对象'.
*静态分配:
DATA: BEGIN OF address1,
       street(20) TYPE c VALUE 'Nanyang Street',
       no(4) TYPE c VALUE '1234',
       zip(5) TYPE c VALUE '56789',
       city(20) TYPE c VALUE 'Singapore',
      END OF address1.
FIELD-SYMBOLS: <street_no> TYPE c,
               <zip_city> TYPE c.
ASSIGN:address1(24) TO <street_no>,
       address1+24(25) TO <zip_city>.
WRITE: / <street_no>,
       / <zip_city>.



*动态分配:

FIELD-SYMBOLS: <fs>.
DATA:str(20) TYPE c VALUE 'output string',
     name1(20) TYPE c VALUE  'str'.
*static assignment
ASSIGN name1 TO <fs>.
WRITE:  /  ,/ <fs>.

*dynamic assignment
ASSIGN (name1) TO <fs>.
WRITE / <fs>.


*字段符号中的Casting
TYPES: BEGIN OF t_date,
         year(4)  TYPE n,
         month(2) TYPE n,
         day(2)   TYPE n,
       END OF t_date.
FIELD-SYMBOLS <fs1> TYPE t_date.
ASSIGN sy-datum TO <fs1> CASTING.
WRITE: / ,/ , / <fs1>-year , / <fs1>-month, / <fs1>-day.

*数据引用:????主要用于哪些方面?
TYPES: BEGIN OF t_struct,
         co11 TYPE i,
         co12 TYPE i,
       END OF t_struct.
DATA:dref1 TYPE REF TO data,
     dref2 TYPE REF TO data.
FIELD-SYMBOLS:<fs2> TYPE t_struct,
              <fs3> TYPE i.
CREATE DATA dref1 TYPE t_struct.
ASSIGN dref1->* TO <fs2>.
<fs2>-co11 = 1.
<fs2>-co12 = 2.
dref2 = dref1.
ASSIGN dref2->* TO <fs3> CASTING.
WRITE / <fs3>.
GET REFERENCE OF <fs2>-co12 INTO dref2.
ASSIGN dref2->* TO <fs3>.WRITE / <fs3>.


*(10)、模块化技术:
WRITE: / , / , '(10)、模块化技术:'.
*子程序的定义和调用:
DATA: int1 TYPE i VALUE 1,
      int2 TYPE i VALUE 2,
      sum TYPE i.

START-OF-SELECTION.
  PERFORM add. "calling subroutine
  WRITE: 'int1 + int2' ,'= ', sum.
*defining subroutine
FORM add.
  sum = int1 + int2.
ENDFORM.                    "add

*使用参数:

DATA:int01 TYPE i VALUE 1,  int02 TYPE i VALUE 2,
     int03 TYPE i VALUE 3,  int04 TYPE i VALUE 4,
     sum1 TYPE i.

*passing parameters
START-OF-SELECTION.
  PERFORM add1 USING int01 int02.
  PERFORM add1 USING int03 int04.

*defining parameters
FORM add1 USING p1 p2.
  sum1 = p1 + p2.
  WRITE: / ,sum1.
ENDFORM.
*不知为什么endform后面不可跟write,

posted @ 2011-08-14 02:42  VerySky  阅读(1611)  评论(0)    收藏  举报