工作生活与爱好

工作中的记录; 生活中的记忆; 业余爱好的记载。

2007-01-19

 

ABAP基础知识学习

2.使用條件式
語法:
UPDATE SET <>=… WHERE
根據條件式異動符合條件式的記錄
Example:
UPDATE SPFLI SET NO='34051920'
COMPANY = 'DELTA'
WHERE TEL='4526107'.
*-------------------------------------------------------------------------------------*

3. MODIFY 語法
MODIFY [FROM ].
根據 Primary Key 尋找資料檔中符合的記錄, 若找到則更新異動, 若找不到則新增記錄
語法:
MODIFY FROM
Example:
WA-NO='34051920'.
WA-COMPANY='DELTA'.
MODIFY SPFLI FROM WA.

4. DELETE 語法
DELETE [FROM ].
或: DELETE [WHERE ]
刪除資料檔的記錄

1.使用 Primary Key
語法:
DELETE FROM
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO='34051920'.
WA-COMPANY='DELTA'.
DELETE SPFLI FROM WA.
如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'
的記錄, 找到後將此筆刪除

2.使用條件式
語法:
DELETE FROM WHERE
根據條件式刪除符合條件式的記錄
Example:
DELETE FROM SPFLI WHERE AREA = 'AMERICAN'.

*-------------------------------------------------------------------------------------*

5. DATABASE CURSOR
Database Cursor是一個資料庫暫存區, 將經SELECT指令讀取的記錄存放至此暫存區, 再由此暫存區放至Work Area中, 可減少資料庫讀取的次數.
1.開啟 Database Cursor
語法:
OPEN CURSOR FOR SELECT … WHERE
Example:
TABLES SPFLI.
DATA: WA LIKE SPFLI,
C1 TYPE CURSOR.
OPEN CURSOR C1 FOR SELECT * FROM SPFLI
WHERE AREA ='TAIWAN'.
2.讀取 Database Cursor的資料存入 Work Area
語法:
FETCH NEXT CURSOR INTO
Example:
FETCH NEXT CURSOR C1 INTO WA.
讀取下一筆Cursor位置的資料存入WA, 如果已無資料可讀, SY-SUBRC <>0.
關閉 Database Cursor
語法:
CLOSE CURSOR
Example:
CLOSE CURSOR C1.

*-------------------------------------------------------------------------------------*

COMMIT WORK & ROLLBACK WORK
要確定資料成功寫入資料庫,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要復原, 可使用 ROLLBACK WORK, 可復原在上個COMMIT WORK指令之後的資料, 如:
ROLLBACK WORK.
*-------------------------------------------------------------------------------------*
使用NATIVE SQL指令
語法格式:
EXEC SQL [PERFORMING
].

ENDEXEC.
舉例一.
EXEC SQL.
CREATE TABLE AVERI_CLNT (
CLIENT CHAR(3) NOT NULL,
ARG1 CHAR(3) NOT NULL,
ARG2 CHAR(3) NOT NULL,
FUNCTION CHAR(10) NOT NULL,
PRIMARY KEY (CLIENT, ARG1, ARG2)
)
ENDEXEC.
舉例二.
DATA: F1(3), F2(3), F3(3).
F3 = ' 1 '
EXEC SQL.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
WHERE ARG2 = :F3
ENDEXEC

PERFORMING
的使用:
如果NATIVE SQL的SELECT命令執行結果是抓到多筆記錄,我們想要逐筆記錄處理時,就用PERFORMING 參數,這個FORM能被逐次調用.如果想中止調用,就用EXIT FORM SQL結束調用.
例如:
DATA: F1(3), F2(3), F3(3).

F3 = '010'
EXEC SQL PERFORMING WRITE_AVERI_CLNT.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
WHERE ARG2 = :F3
ENDEXEC.
FORM WRITE_AVERI_CLNT.
WRITE: / F1, F2.
ENDFORM.

DATA: BEGIN OF WA,
NAME(8),
AGE TYPE I,
END OF WA.
DATA F1 TYPE I.
FI = 20.
EXEC SQL PERFORMING OUTPUT.
SELECT NAME,AGE INTO :WA FROM NAME_TABLE
WHERE AGE >= :F1.
ENDEXEC..
FORM OUTPUT.
WRITE: / WA-NAME,WA-AGE.
ENDFORM.

注意:
a. NATIVE SQL把TABLE中的MANDT(client)欄位當作一般欄位使用,所以在抓取資料時必須指定特定的Client;
b. NATIVE SQL中的SELECT語句沒有CHECK權限的功能;
c. 在登入SAP R/3系統時,我們已經自動与Database連接,所以在執行NATIVE
SQL時并不需要CONNECT語句;
d. 一條NATIVE SQL語句可以以分號;結束,一般情況下是以句號.結束.
e. 某些數据庫系統對TABLE名字和FIELD名字有大小寫區別,要正确書寫.
f. 在NATIVE SQL中,雙引號"不表示注釋.
*-------------------------------------------------------------------------------------*

结果语句

條件述敘
1. IF 述敘
語法:
IF .

ELSEIF .

ELSEIF .

…..
ELSE.

ENDIF.
(1).在每個判斷敘述之後要加上 .
(2).在巢狀迥圈之中無法使用 ELSE 敘述, ELSE 敘述屬 IF 敘述
Example:
IF 3 > 8.
WRITE / '3 is less than 8'.
ENDIF.


2. CASE 敘述
語法:
CASE <變數f>.
WHEN .

WHEN .

….
WHEN OTHERS.

ENDCASE.
Example:
S = 'A'.
CASE S.
WHEN 'X'.
WRITE / 'String is X'.
WHEN OTHERS.
WRITE / 'String is not X'.
ENDCASE.

迥圈敘述
1.計次迥圈
語法:
DO [n TIMES] [VARYING FROM TO .

ENDDO.
Example:
DO 2 TIMES.
WRITE / 'X'.
ENDDO.
執行結果:
X
X
DO VARYING I FROM 1 TO 10.
S = S + I.
ENDDO.
WRITE: / ,'1+2+3+…+10=',S
執行結果: 1+2+3+…+10=55
2.條件迥圈
語法:
WHILE .

ENDWHILE
Example:
I = 1.
S=0.
WHILE I <= 10.
S = S+I.
I=I+1.
ENDWHILE.
WRITE: / ' 1+2+3+…+10=',S.
執行結果為: 1+2+3+…+10=55

迥圈控制敘述
1. CONTINUE
跳至迥圈的下一次
Example:
DO 3 TIMES.
IF SY-INDEX = 2.
CONTINUE.
WRITE / SY-INDEX.
ENDDO.
執行結果:
1
3
2. CHECK
CHECK 之後條件成立才繼續往下執行迥圈
Example:
DO 5 TIMES.
CHECK SY-INDEX BETWEEN 2 AND 4.
WRITE / SY-INDEX.
ENDDO.
執行結果:
2
3
4
3. EXIT
跳離迥圈敘述
Example:
DO 10 TIMES.
IF SY-INDEX = 4.
EXIT.
ENDIF
WRITE / SY-INDEX.
ENDDO.
執行結果:
1
2
3

無窮迥圈
DO .

ENDDO.
無窮迥圈必須配合 EXIT 敘述來執行
*-------------------------------------------------------------------------------------*

搜索字符串

要搜索特定 模式的字符 串,请使用 SEARCH 语句,用法 如下:
语法
SEARCH FOR .
该语句在字 段 中搜索 中的字符串 。如果成功 ,则将 SY-SUBRC 的返回代码 值设置为0并 将 SY-FDPOS 设置为字段 中该字符串 的偏移量。 否则将 SY-SUBRC 设置为4。
搜索串 可为下列格 式之一:
目 的
搜 索 ( 任何字符顺 序)。忽略 尾部空格。
.. 搜 索 ,但是不忽 略尾部空格 。
* 搜 索以 结尾的词。
* 搜 索以 开始的词。
单词之间用 空格、逗号 、句号、分 号、冒号、 问号、叹号 、括号、斜 杠、加号和 等号等分隔 。

DATA STRING(30) VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH STRING FOR 'X'.
WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR 'itt '.
WRITE: / 'itt ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR '.e .'.
WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR '*e'.
WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR 's*'.
WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
该过程的输 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X 4 0
itt 0 11
.e . 0 15
*e 0 10
s* 0 17

搜索字符字 段 的各种选项 () 如下
ABBREVIATED
在字段 中搜索包含 中指定字符 串的单词, 其中字符可 能被其它字 符隔开。单 词和字符串 的第一个字 母必须相同 。
STARTING AT
在字段 中搜索从 开始的 。结果 SY-FDPOS 参照相对于 的偏移量而 不是字段的 开始。
ENDING AT
在字段 搜索 直到位置
AND MARK
如果找到搜 索串,则将 搜索串中的 所有字符( 和使用 ABBREVIATED 时的所有字 符)转换为 大写形式。

DATA: STRING(30) VALUE 'This is a fast first example.',
POS TYPE I,
OFF TYPE I.
WRITE / STRING.
SEARCH STRING FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
POS = SY-FDPOS + 2.
SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.
WRITE / STRING.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
OFF = POS + SY-FDPOS -1.
WRITE: / 'Off:', OFF.
该过程的输 出如下:
This is a fast first example.
SY-FDPOS: 10
This is a fast FIRST example.
SY-FDPOS: 4
Off: 15
请 注意,在 找到单词' fast' 之后,为了 查找包含' ft'的第 二个单词, 必须在偏移 量 SY-FDPOS 上加2,然 后从位置 POS 开始查找。 否则,会再 次找到单词 'fast' 。要获得' first' 相对于字段 STRING 开始的偏移 量,从 POS 和 SY-FDPOS 计算。
获得字符串 长度

要决定字符 串到最后一 个字符而不 是 SPACE 的长度,请 使用内部函 数 STRLEN, 用法如下:
语法
[COMPUTE] = STRLEN( ).
STRLEN 将操作数 作为字符数 据类型处理 ,而不考虑 其实际类型 。不进行转 换。
关键字 COMPUTE 可选。有关 内部函数的 详细信息, 参见 使用数学函 数 (页 49) 。

DATA: INT TYPE I,
WORD1(20) VALUE '12345'.
WORD2(20).
WORD3(20) VALUE ' 4 '.
INT = STRLEN( WORD1 ). WRITE INT.
INT = STRLEN( WORD2 ). WRITE / INT.
INT = STRLEN( WORD3 ). WRITE / INT.
结果分别是 5,0 和 4。
*-------------------------------------------------------------------------------------*

Standard Report
一個典型的報表程式是由許多的程式區塊(Code Block)所組成,在區塊間最好能加上一些
說明以利程式可讀性,一個典型的報表程式格式如下:

* PROGRAM SOURCE HEADER : 說明程式名稱及目的
* Program Name:
* Description:
* Date/Author:
* Table Update:
* Special Logic:
* Include:
*-------------------------------------------------------------------------------------*
* MODIFICATION LOG : 程式修改更新記錄
*-------------------------------------------------------------------------------------*
* ChangeDate Programmer Request Description
*-------------------------------------------------------------------------------------*
* NEW PROGRAM
*-------------------------------------------------------------------------------------*
* REPORT NAME : 宣告程式名稱及報表格式,
*-------------------------------------------------------------------------------------*
REPORT Z_____
NO STANDARD PAGE HEADING
MESSAGE-ID __ " 所使用的MESSAGE
LINE-COUNT ___ " 每頁報表列數
LINE-SIZE ___. " 每頁報表寬度

* TABLE DESCRIPTION : 宣告程式會使用的TABLE

*-------------------------------------------------------------------------------------*
TABLES:

* DATA : 宣告程式所使用的變數及自定型態
*-------------------------------------------------------------------------------------*
TYPES:

DATA:


* SELECTION SCREEN / OPTION / PARAMETER : 螢幕輸入報表篩選條件
*-------------------------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK ____
SELECT-OPTIONS:

SELECTION-SCREEN END OF BLOCK ___

* INITIALIZATION : 啟動程式開始執行, 如SELECT-OPTION及PARAMETER
*-------------------------------------------------------------------------------------*
INITIALIZATION.

INCLUDE ____.

* AT START SELECTION : 輸入結束後啟動的區塊, 如按下
*-------------------------------------------------------------------------------------*
START-OF-SELECTION.
SET PF-STATUS ____. " 指定報表執行時所用的 GUI-STATUS名稱

PERFORM READ_DATA.
PERFORM PROCESS_DATA.
PERFORM PRINT_DATA.
PERFORM PRINT_SUMMARY.

* AT USER Commaand : 執行在GUI-STATUS中自定的命令
*-------------------------------------------------------------------------------------*
AT USER_COMMAND.

* AT LINE SELECTION : 由在報表中按下或Double-Click啟動
*-------------------------------------------------------------------------------------*
AT LINE-SELECTION.


* TOP OF PGAE : 每頁開始列印時執行, 用於定義報表表頭
*-------------------------------------------------------------------------------------*

* END OF PAGE : 報表列印完最後一頁後啟動
*-------------------------------------------------------------------------------------*
END-OF-PAGE

* END OF SELECTION : 在結束列印資料後啟動, 如可用來印出USER輸入的條件
*-------------------------------------------------------------------------------------*
END-OF-SELECTION.
INCLUDE _____
* FORM : 撰寫程式中所使用到的副程式
*-------------------------------------------------------------------------------------*
* Read Data : 自TABLE讀取資料放入Internal Table
*-------------------------------------------------------------------------------------*
FORM READ_DATA.
SELECT * FROM ______
INTO _______
WHERE _______.
IF SY-SUBRC = 0.

ENDIF.
APPEND _____. " 增加Internal Table元素
ENDSELECT.

ENDFORM.

* Process Data : 處理Internal Table的資料, 如排序及彙總
*-------------------------------------------------------------------------------------*
FORM PROCESS_DATA.

ENDFORM.

* Print Data : 依序輸出 Internal Table的資料
*-------------------------------------------------------------------------------------*
FORM PRINT_DATA.

ENDFORM.

* Print Summary : 印出數值資料加總
*-------------------------------------------------------------------------------------*
FORM PRINT_SUMMARY.

ENDFORM.

* Include Program : 列出所含入的其它程式source code, 如副程式
*-------------------------------------------------------------------------------------*
INCLUDE _____
INCLUDE _____

*-------------------------------------------------------------------------------------*
*
REPORT rep.
Additions:
1. ... NO STANDARD PAGE HEADING
2. ... LINE-SIZE col
3. ... LINE-COUNT n(m)
表单输出每页由n行,其中的m行作为页脚;
4. ... MESSAGE-ID mid 消息对象
5. ... DEFINING DATABASE ldb
使用逻辑数据库,自动产生
*
事件块
INITIALIZATION
AT SELECTION-SCREEN
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE
*
事件块的简单处理过程:
*
ABAP程序运行的时候,INITIALIZATION首先被调用;
经过初始化的输入屏幕会显示在表示服务器;
用户离开输入屏幕的时候,START-OF-SELCTION事件会被自动调用;
结果数据会以列表的形式显示在第二个屏幕上;
*
源代码中的事件块顺序不影响它们的执行顺序
*
事件块编码规则(1)
INITIALIZATION
通常在此事件块中设定输入屏幕字段的初始值
*
事件块编码规则(2)
AT SELECTION-SCREEN
通常在此事件块中进行用户输入数据的合法性检查,发现错误则以消息的形式给出警示,直到用户输入正确的数值
例如: AT SELECTION-SCREEN .
IF P_DATE = SPACE .
MESSAGE E001 .
ENDIF.
效果: 如果字段P_DATE为空,则程序会用消息001“日期字段不能为空!”来提示用户必须输入一个日期。而且输入屏幕会等待用户输入,知道该字段数值合法
*
事件块编码规则(3)
START-OF-SELCTION
通常在此事件中针对业务需求进行系统数据的查询
例如:
start-of-selection .
perform get_data_for_oil .
效果:
在输入屏幕用户按下执行按钮后,子程序get_data_for_oil被执行, 在其中获得业务相关的数据存放到内表或者其它变量,这些数据在END-OF-SELECTION事件块中被输出
*
事件块编码规则(4)
END-OF-SELCTION
通常在此事件中进行结果清单的输出
例如:
end-of-selection .
write : 23(1) sy-vline,
24(20) tab-gas_plan right-justified ,
效果:
数据以清单的形式输出
*
事件块编码规则(5)
GET
从逻辑数据库中得到数据(较少用)

TOP-OF-PAGE
在此事件块中设计输出清单的页头
TOP-OF-PAGE
write : /1(240) '汽柴油日出厂情况表' centered .
write : /20(8) '日期:' ,
29(10) s_date ,
180(6) '单位:' ,
190(10) '吨' .
*
事件块编码规则(6)
END-OF-PAGE
在此事件中设定输出清单的页脚
例如:
END-OF-PAGE .
Write : ‘制作人’ , p_name .
*-------------------------------------------------------------------------------------*

*
比较所有的 字段类型

要比较所有 的字段类型 ,可以在逻 辑表达式中 使用下列运 算符:

<运算符> 含 义
EQ 等于
= 等于
NE 不 等于
<> 不 等于
>< 不 等于
LT 小 于
< 小于
LE 小 于等于
<= 小 于等于
GT 大 于
> 大于
GE 大 于等于
>= 大 于等于

Comments: 发表评论



<< Home

Archives

1990年1月15日   2007年1月14日   2007年1月15日   2007年1月16日   2007年1月17日   2007年1月18日   2007年1月19日   2007年1月20日   2007年1月22日   2007年1月23日   2007年1月24日   2007年1月25日   2007年1月26日   2007年1月27日   2007年1月29日   2007年1月30日   2007年1月31日   2007年2月1日   2007年2月2日   2007年2月3日   2007年3月13日   2007年5月15日   2007年5月16日   2007年6月2日  

This page is powered by Blogger. Isn't yours?