阅读文章

ABAP基础知识学习 三

[日期:2006-10-23] 来源:sapsky  作者:sapsky [字体: ]

2.使用條件式
語法:
UPDATE SET < f1>=… 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 大 于等于
>= 大 于等于



阅读:
录入:sapsky

评论 】 【 推荐 】 【 打印
上一篇:配合 SELECT 命令
下一篇:Batch Input问题
相关文章      
本文评论       全部评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款