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,