工作生活与爱好

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

2007-01-19

 

SELECT

條件輸入完後要將符合條件的資料篩選出來, 可配合使用 SELECT 指令
1.使用WHERE <條件式>
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI WHERE CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDSELECT.
2.使用CHECK參數
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDSELECT.
*
exp:
TABLES SPFLI.
SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,
S_CITYFR FOR SPFLI-CITYFROM,
S_CITYTO FOR SPFLI-CITYTO,
S_CONNID FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK: SPFLI-CARRID IN S_CARRID,
SPFLI-CITYFR IN S_CITYFR,
SPFLI-CITYTO IN S_CITYTO,
SPFLI-CONNID IN S_CONNID.
WRITE: / SPFLI-CARRID, SPFLI-CONNID,
SPFLI-CITYFROM, SPFLI-CITYTO.
ENDSELECT.

3.使用 IF … IN 敘述
Example:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
IF SPFLI-CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDIF.
ENDSELECT.
*-------------------------------------------------------------------------------------*

SELECTION-SCREEN
1.產生空白列
語法:
SELECTION-SCREEN SKIP []
Example:
SELECTION-SCREEN SKIP 2.
產生兩列空白列
2.產生底線
語法:
SELECTION-SCREEN ULINE / (length)
Example:
SELECTION-SCREEN ULINE /10(30).
自第10格開始產生長度30的底線
3.印出備註說明
語法:
SELECTION-SCREEN COMMENT / (length)
Example:
REMARK = 'Pls enter your name'.
SELECTION-SCREEN COMMENT /10(30) REMARK.
4. 同一列中輸入數個資料項
語法:
SELECTION-SCREEN BEGIN OF LINE.
……
SELECTION-SCREEN END OF LINE.
Example:
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 20.
PARAMETERS NAME(10).
SELECTION-SCREEN POSITION 40.
PARAMETERS BIRTH TYPE D.
SELECTION-SCREEN END OF LINE.
在20格輸入NAME內容, 40格輸入 BIRTH的內容

5. 繪出BLOCK PANEL
語法:
SELECTION-SCREEN BEGIN OF BLOCK
[WITH FRAME [TITLE
…….
SELECTION-SCREEN END OF BLOCK .
Example:
SELECTION-SCREEN BEGIN OF BLOCK RADIO WITH FRAME .
PARAMETER R1 RADIOBUTTON GROUP GR1.
PARAMETER R2 RADIOBUTTON GROUP GR1.
PARAMETER R3 RADIOBUTTON GROUP GR1.
SELECTION-SCREEN END OF BLOCK RADIO.
*-------------------------------------------------------------------------------------*

SQL語法
我們在編寫ABAP4程式的時候,經常需要從TABLE中根据某些條件讀取數据,.讀取數据最常用的方法就是通過SQL語法實現的.
ABAP/4 中可以利用SQL語法創建或讀取TABLE,SQL語法分為DDL(DATA DEFINE LANGUAGE)語言和DML(DATA MULTIPULATION LANGUAGE)語言,DDL語言是指數据定義語言,例如CREATE等, DML語言是數据操作語言,例如SELECT, INSERT等語句. SQL語句有OPEN SQL語句和NATIVE SQL語句. OPEN SQL語句不是標准SQL語句,是ABAP/4語言,利用OPEN SQL語句能在Databases 和 Command 之間產生一個BUFFER,所以它有一個語言轉換的過程.
而NATIVE SQL語句則是標准的SQL語句, 它直接針對Databases操作.

OPEN SQL

SELECT語句
語法格式:
SELECT [INTO ] [FROM ] [WHERE ]
[GROUP BY ] [ORDER BY ]
其中: 指定要抓取的欄位
將讀取的記錄存放在work area中
指定從那個TABLE中讀取資料
抓取資料的條件
指定按那些欄位分組
排序的欄位及方式
相關的系統變量:
SY-SUBRC = 0 表示讀取數据成功
<> 0 表示未找到符合條件的記錄
SY-DBLNT: 被處理過的記錄的筆數.
相關的命令:
EXIT. 退出循環.
CHECK .如果邏輯表達式成立,則繼續執行,否則,開
始下一次循環.

利用循環方式讀取所有記錄
SELECT ….ENDSELECT.是循環方式讀取記錄的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
.
ENDSELECT.
(從MARD中抓取所有料號=3520421700的資料)
◆讀取一筆資料
Example:
TABLES SPFLI.
SELECT SINGLE * FROM SPFLI
WHERE PLANT ='CHUNGLI' AND TEL='4526174'.
WRITE: / SPFLI-COMPANY,SPFLI-PLANT,SPFLI-TEL.
◆將讀取的記錄放在work area中,并且加入Internal table 中.
格式有:
... INTO
... INTO CORRESPONDING FIELDS OF
... INTO (f1, ..., fn) 變量組.
... INTO TABLE
... INTO CORRESPONDING FIELDS OF TABLE
... APPENDING TABLE
... APPENDING CORRESPONDING FIELDS OF TABLE
舉例一:
TABLES MARD.
DATA: BEGIN OF ITAB OCCURS 10,
MATNR LIKE MARD-MATNR,
WERKS LIKE MARD-WERKS,
LGORT LIKE MARD-LGORT,
LABST LIKE MARD-LABST,
END OF ITAB.
SELECT MATNR WERKS LGORT LABST
INTO CORRESPONDING FIELDS OF ITAB
FROM MARD
WHERE MATNR = '3520421700'.
APPEND ITAB.
CLEAR ITAB.
ENDSELECT.
(將讀取的結果放在Internal table ITAB中)

DATA: BEGIN OF WA,
LINE(240),
END OF WA.
DATA NAME(10).
NAME = 'SPFLI'.
SELECT * FROM (NAME) INTO WA.
WRITE: / WA-LINE.
ENDSELECT.
数据库表名 称 SPFLI 被赋给字符 字段 NAME。 SELECT 语句将所有 的行从 SPFLI 中读到目标 区 WA 中。在该示 例中,WA 与 SPFLI 的结构并不 相同,每一 行都将自动 地转换成字 符字段.

舉例二.
TABLES MARD.
SELECT MATNR MTART MAKTX INTO (t_matnr, t_mtart, maktx)
FROM MARD
WHERE MATNR = '3520421700'.
.
ENDSELECT.
(從MARD中抓取料號=3520421700的料號、類型和描述,放在變量t_matnr, t_mtart, maktx中)。

Example:
TABLES SPFLI.
DATA WA LIKE TABLES.
SELECT * FROM SPFLI INTO WA.
WRITE: / WA-COMPANY,WA-PLANT.
ENDSELECT.
逐筆寫入WA 工作區中
舉例三.
將讀取的資料寫入 Initial Table 中
語法:
SELECT .. INTO TABLE
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB.
一次讀10筆(Initial Table的長度)記錄存入 ITAB 中

SELECT .. INTO TABLE PACKAGE SIZE
一次讀取 筆記錄至
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB PACKAGE SIZE 5.
一次讀取 5 筆記錄

exp :

TABLES SPFLI.
DATA: BEGIN OF WA,
NUMBER TYPE I VALUE 1,
CITYFROM LIKE SPFLI-CITYFROM,
CITYTO LIKE SPFLI-CITYTO,
END OF WA.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA.
WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO.
ENDSELECT.
输出如下所 示:

在该示例中 ,系统只将 数据库表 SPFLI 中选定行的 列 CITYFROM 和 CITYTO 传送到 WA 中。WA 中的组件 NUMBER 保持不变。
*-------------------------------------------------------------------------------------*

按指定的欄位排序
TABLES SBOOK.
SELECT * FROM SBOOK WHERE CARRID = 'LH' AND
CONNID = '0400' AND
FLDATE = '19950228'
ORDER BY BOOKID ASCENDING.
WRITE: / SBOOK-BOOKID, SBOOK-CUSTOMID,
SBOOK-CUSTTYPE, SBOOK-SMOKER,
SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
SBOOK-INVOICE.
ENDSELECT.
(利用參數ORDER BY所指定的欄位排序)
*-------------------------------------------------------------------------------------*

◆ 抓取數据的條件敘述
(1) BETWEEN AND
例如: WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE
例如: WHERE NAME LIKE 'MIKE%'.
('%'是通配符號)
(3) IN ()
里面的任意一個值即可.
例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU').
(表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以).
(4) ORDER BY 敘述
指定排序的欄位或順序
(1). ..ORDER BY PRIMARY KEY.
根據 PRIMARY KEY 遞增排序
(2)…ORDER BY [DESCENDING] [DESCENDING]
Example:
SELECT * FROM IM ORDER BY PART .
*-------------------------------------------------------------------------------------*

INSERT 語句
◆從work area 加入到Internal Table中
格式: INSERT INTO VALUES
例如:
DATA: BEGIN OF WA,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.
DATA: VEN LIKE WA OCCURS 10.

WA-CODE = '530120'.
WA-NAME = 'XINGDA ELECTRONICS CO.,LTD'.
INSERT INTO VEN VALUES WA .
如果work area的名稱就是internal table的名稱,可以直接寫成:
INSERT
例如:
DATA: BEGIN OF WA OCCURS 10,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.

WA-CODE = '530120'.
WA-NAME = 'XINGDA ELECTRONICS CO., LTD'.
INSERT WA.
◆從另外一個Internal table中INSERT 資料
格式:
INSERT FROM TABLE [ACCEPTING DUPLICATE KEY]
中非NULL的資料加入中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.

加入一筆記錄至資料庫

1.自 Work Area 工作區
語法:
INSERT INTO VALUES
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO = '34051920'.
WA-COMPANY='DELTA'.
INSERT SPFLI VALUES WA.
將 ITAB 資料加入 SPFLI中, 也可寫成 INSERT SPFLI FROM ITAB.

SPFLI-NO='34299876'.
SPFLI-COMPANY='HP'.
INSERT SPFLI FROM SPFLI.
將Work Area SPFLI中的資料加入資料庫檔案 SPFLI中
因Work Area SPFLI的結構與資料檔 SPFLI一樣, 所以也可
寫成 INSERT SPFLI.

2.自 Internal Table
語法:
INSERT FROM TABLE [ACCEPTING DUPLICATE KEY]
中非 NULL的資料加入 中, 加上 [ACCEPTING DUPLICATE
KEY]能檢查不加入有重覆primary key, 若有重覆則 SY-SUBRC 會傳回 4
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
ITAB-NO = '34051920'.
ITAB-COMPANY = 'DELTA'.
APPEND ITAB.
….
INSERT SPFLI FROM TABLE ITAB
ACCEPTING DUPLICATE KEY.
*-------------------------------------------------------------------------------------*

UPDATE 指令
異動已存在的記錄內容

1.使用 Primary Key
語法:
UPDATE FROM
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO='34051920'.
WA-COMPANY='DELTA'.
UPDATE SPFLI FROM WA.
如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'
的記錄, 將其 COMPANY欄位異動為 DELTA

 

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 大 于等于
>= 大 于等于

 

Batch Input问题

BATCH INPUT 注意事项:

1.不要忘记在导出数据后,回车一下。

2.你的源数据不能包含不需导入的项。

3.定义数据名时要用英文缩写,不能用其他文字。

我用CATT导数据,事务代码是PA40(人事事件)。当我通过外部文件进行数据导入时,老是出错,说某个字段比如PERSK不是输入字段。当我不输入PERSK时,它又说另外一个字段不是输入字段。但其实这些是需要我输入信息的字段。请问导致这个错误的原因是什么?

是不是在修改摸板时忽略这几个字段,重新修改试试,实际上这种提示敲回车可以过,不一定要输的

我忽略掉,或者修改过来正确,它又返回去了。这使得在文件中的数据一条也没有导入。不过,模板中的记录倒是导入了。那重建试试,把这几个字段作为选择字段


 

常用事务代码

Pfcg 角色维护
Su53
查看权限对象 st01 跟踪
St22
dump,以分析错误 eg.找到ABAP程序出错的地方,找出founction,用se37查看找到的founction,找到有关权限检查(authority check),找到object,在pfcg中添加object并赋予权限
/h debug
su01
建用户IDTMSADM这个用户不能锁定,它是系统默认的传输用户,SAPSYS也是系统用户,不能锁定

se09/se10 查看并释放 change request (workbench 表示与集团无关,只需要传一遍;customizing 表示与集团相关,则需要分多次传到每个集团)

sapd 配置打印方式、打印格式。它的配置是跨集团的(打印方式分为:localremotefront end 三种。local的配置较为复杂,它是指printerserver相连,driver全部都装在server上,然后再由server去连接pcremote是指serverprinter server 相连,printer server 再通过serverpc相连;front end 配置比较方便,它是指serverpc相连,pcprinter,并将其设置成默认printer

client的操作:sccL copy
scc3
查看日志
scc4
后台
scc5 delete
选择T000删除条目
000 001 065 066
这四个client为系统client,066用于做earlywatch

sm02 给所有人发送即时消息
se61
修改sap登陆界面
se61------
创建或修改 general text,即常规文本:zlogin_screen_info-----在行首可用@xx@方式引用一个icon(其中xx为数字,se38中运行report rstxicon 可查到所有的icon),文本信息最多为16,每行45个字符.
So01
邮箱

sm04 查看什么人在做什么事情,可踢人,它只能看到一台机器
al08
查看有多少人登陆,session_manage 表示用户出于登陆状态,什么也没有做,它可以看到两台机器,如果要登陆另外一台机器,可以用sm51转到另外一台机器
os01
查看在线机器名称

oss1 public进入sap 服务区,可用来发message或者申请lisence key
S0003605676
密码 I753A556

sm50/sm51 看进程,sm50看当前机器,sm51可以看两台机器

suim 权限比较 eg 查找哪些role里有spro这个事物代码

rz10 编辑系统参数文件
rdisp/gui_auto_logout & rdisp/keepalive
用于控制闲置时间()
login/system_client
用于控制默认登陆的client编号(000-999)
login/fails_to_user_lock
用于控制输错密码被锁定的次数(1-99)

se43 定制显示在用户主菜单中的sap标准菜单条目
1
Su01-----默认----startmenu-----区域菜单(填入定制的菜单)
2
Pfcg-----找到common role-----添加tcode----从范围菜单(填入定制的菜单)

se56 看自己的ID有哪些objectobject的值
su10
批量修改用户,也可由su01的菜单批量修改进入
su02
编辑用户权限的参数文件

su21 object
su20/su22
以不同角度来查看权限对象
sale
建立逻辑系统 eg. P34CLNT800

db13 数据备份
db02
数据库表和索引的监控
db12
数据备份日志
sapdba
数据库管理工具

sm36 定义后台作业 (标准的作业-------缺省的计划)
sm37
查看后台作业

sp01 看打印队列,可清空假脱机请求
spad
选择完全管理,先定义页格式,然后赋格式类型,再赋设备类型(CNSAPWIN

smlg 定义组登陆方式,如果发现机器不能自动分配资源或者分配资源出错,则可以在里面删除掉一台机器,然后再添加进去就可以解决,在它里面按F5可以查看机器响应时间,如果在1000ms以内则表示正常.

sm59 设置sfc连接,也可用它来登陆到别的机器,哪怕是用sap通讯帐号也可以

sm21 看系统日志

os06 操作系统监视器 ,cpu使用率正常在30%以内,30%~70%可能表示很慢,如果无系统信息,则需要在AIX中执行如下命令:
ps –ef|grep saposcol
(查看sap操作系统收集器进程)
cd /usr/sap/P34/SYS/exe/run (
注意这一行中的大写字母)
./saposcol
./表示运行)

st02
监控buffer,看命中率(hitratio),swap出错值大于1000则需要用rz10调整参数,一次最好只改一个参数,改完了重启sap使参数生效。
usr/sap/P34/SYS/profile
中有参数文件,可以在改变参数前做参数文件的备份,具体命令如下 cp xxx yyy ,恢复参数文件时,只需要将备份的参数文件copy回原参数文件名即可。这里的yyy包括:DEFAULT.PFL P34_DVEBMGS00_p34dbsvc P34_D01_p34apsvc START_D01_p34apsvc START_DVEBMGS00_p34dbsvc
———————————————————————————————————————
ls –l
系统中的文件属主如下:
-rwxrwxr-x 1 p34adm sapsys 2919 Sep 26 10:09 DEFAULT.BAK
-rwxrwxr-x 1 p34adm sapsys 2919 Sep 26 14:03 DEFAULT.PFL
-rwxrwxr-x 1 root system 466 Aug 08 15:55 DEFAULT.PFL.0
-rwxrwxr-x 1 p34adm sapsys 8940 Sep 26 12:29 P34_D01_p34apsvc
-rwxrwxr-x 1 p34adm sapsys 8940 Sep 26 09:56 P34_D01_p34apsvc.BAK
-rwxrwxr-x 1 p34adm sapsys 1013 Aug 08 15:55 P34_D01_p34apsvc.bak
-rwxrwxr-x 1 p34adm sapsys 5304 Sep 26 14:02 P34_DVEBMGS00_p34dbsvc
-rwxrwxr-x 1 p34adm sapsys 5014 Sep 26 09:45 P34_DVEBMGS00_p34dbsvc.
BAK
-rwxrwxr-x 1 p34adm sapsys 1891 Sep 01 12:47 START_D01_p34apsvc
-rwxrwxr-x 1 p34adm sapsys 2669 Sep 01 12:47 START_DVEBMGS00_p34dbsv
c
p34db:p34adm> cd ..
p34db:p34adm> ls
exe gen global profile profile.bck src
(红色的是profile的全备份,蓝色的没有用,是从原来的d00系统中带过来的,大写的bak文件是系统自动备份的,但它只保留最后一次保存之前的结果,所以修改参数后不要多次保存,全部改好了然后一次性保存,恢复参数时一定要用p34adm用户登录,以免文件属主发生改变,导致sap无法启动)
———————————————————————————————————————
cp –R profile.bck.2005.9.27 profile (将参数文件恢复)

st04 查看数据库日志 (转到------数据库日志)
oracle/P34/saparch
arch文件

sm13 检查更新是否有效,只需要看中间更新有效这几个字就可以了

sm12 检查锁定条目,可用于解锁,eg.用户锁定条目后断网了,其他人不能用,则需要解锁

st03n 可查看一些系统信息,凡是以“n”结尾的都是sap后来开发的事物代码,用于分析sap的一些系统信息,检查响应时间是否超过了2000ms,如果超过了则需要用其它手段来分析为什么这么慢,eg. sm37看后台作业,sm50看进程,sapdba或者db02tablespace 是否已满,用db02则需要刷新一下,否则有可能不是实时数据,但sapdba就是实时数据。Sm21看系统日志,st22dump.

Sm19 跟踪用户Sm20 看用户的详细动作Stat 粗略的查看用户的动作

利用scat进行数据导入

在系统上线或进行测试时,都需导入大量的主数据。在SAP中有多种方法可批量地导入大量数据,这里介绍利用scat进行数据导入的方法。下同以导入统计指标数据为例进行详细说明。

  • scat事务码进入计算机辅助测试工具屏幕,在测试情况栏内新建一个测试项。该测试项的名称要以z开头,如ztest。输入完名称后,按工具栏上最左边的“TCD”按钮开始记录事务。
  • 首先在弹出窗口内输入需记录的事务代码kk01,按回车,进入统计指标维护界面。
  • 接下来按维护统计指标的操作输入统计指标编码、统计指标名和计量单位,最后按保存完成事务记录,返回scat事务界面。
  • scat事务界面按保存,弹出选择开发类界面,选本地对象,完成ztest测试项目的创建。
  • 返回scat的初始屏幕,这时,在测试事件列表中应该有一个你刚创建的测试项目。选中它,按工具栏的更改按钮,接着双击功能表里的kk01项,接着再双击“SAPLOKSK”项,这时会打开输入统计指标编码窗口,并且光标会停留在编码栏内,接着点击工具栏的“insert import parameter”按钮,创建一个&STAGR参数。接着按工具栏下一页,使当标停留在名称栏,和上面一样,点击工具栏的“insert import parameter”按钮,创建&BEZEI参数。接着光标会自动移到计量单栏,同理,生成&MSEHI参数。按返回按钮回到上一屏幕,接着按保存完成参数创建。
  • 返回初始屏幕,在选中ztest测试项目的情况下,选择菜单的转到”--“变式”--“输出缺省,生成一个ztest.txt文件。
  • 打开ztest.txt文件,内容如下:

· [变量标识] [变式文本] STAGR BEZEI MSEHI

· --> Parameter texts 统计指标 名称 统计关键数单位

· --> 默认数值 Y02 y02 H

· *** Changes to the default values displayed above not effective

增加需导入的数据后的格式如下:

[变量标识] [变式文本] STAGR BEZEI MSEHI

--> Parameter texts 统计指标 名称 统计关键数单位

--> 默认数值 Y02 y02 H

*** Changes to the default values displayed above not effective

Y03 y03 H

Y04 y04 H

Y03Y04是需导入的统计指标,文件中的空格全部是用tab分隔的。整理好导入数据的格式后,就可进行数据导入了。进入scat事务,运行ztest测试项目,变式选择自文件外部的,选择整理好的ztest.txt文件。处理方式可选择前台后台,第一次最好选择前台方式,这样方便除错。最后按工具栏的运行按钮即可。


 

SAP和ABAP内存的区别

1、读取哈使用方法不同
SAP内存使用SET/GET parameters方法;
ABAP内存使用 EXPORT 和 IMPORT 方法;

2、共享范围不同
SAP内存可以被所有的主session访问,内存数据可以同一个session中不同程序之间,或者不同session之间;
ABAP只能在同个session的不同程序之间共享数据;

3、作用范围不同
SAP内存在整个终端session时间内都有效;
ABAP内存只能在一个session时间内有效;

4、使用一般原则
SAP内存用于屏幕默认值输入;
abap内存用于模块之间传替数据


 

整理的函数1

1.'TH_POPUP'
system message

2.'TH_USER_LIST'
用户列表,可以取道每个user 在干吗..

3. 'BAPI_USER_GET_DETAIL'
举例说明
REPORT ZSM message-id za.
data: list like uinfo occurs 0 with header line.
data: mess like sm04dic-popupmsg.
parameters: p_mandt like sy-mandt default sy-mandt,
p_user like sy-uname,
p_mess1(40),
p_mess2(40),
p_mess3(25),
p_sender like sy-uname default sy-uname,
p_time type i default '1'.


at selection-screen.
perform check.

start-of-selection.

concatenate p_sender 'test111' p_mess1
p_mess2 p_mess3 into mess.
condense mess.
do p_time times.
CALL function 'TH_POPUP'
EXPORTING
CLIENT = p_mandt
USER = p_user
MESSAGE = mess.
enddo.
FORM check.
CALL function 'TH_USER_LIST'
TABLES
LIST = list.
read table list with key bname = p_user mandt = p_mandt.
if sy-subrc <> 0.
read table list with key bname = p_user.
message e001 with 'the user not on this client, but in'
list-mandt.
endif.
ENDFORM. " check

 

加锁的方法

加锁-SE11-锁对象-填入primary TABLE的NAME (表名) LOCK MODE -在LOCK PARAMETER中字段生产了字段,可以去掉不需要的,
加锁时:模式-FUNCTION-用*加刚才建立的锁对象的名称
用出现几个function 看描述就知道加锁和解锁的function了
*对地点加锁
CALL FUNCTION 'ENQUEUE_EZTLIS_WERKS'
EXPORTING
MODE_ZTLIS = 'E'
MANDT = SY-MANDT
PERID = SE_PERID
WERKS = SE_WERKS
X_PERID = ' '
X_WERKS = ' '
_SCOPE = '2'
_WAIT = ' '
_COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3


 

获取当前使用某个TCODE的用户的程序样例

REPORT Z_ABAP_SELECT_USER_BY_TCODE .
TABLES:
TSTC,
TSTCT.

DATA OPCODE TYPE X.
DATA: BEGIN OF USR_TABL OCCURS 10.
INCLUDE STRUCTURE UINFO.
DATA: END OF USR_TABL.

SELECT-OPTIONS: S_TCODE FOR TSTC-TCODE.

START-OF-SELECTION.

CLEAR USR_TABL.
FREE USR_TABL.

* set the function call mode
OPCODE = 2.

* get list of all users actually logging on
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
ID 'TAB' FIELD USR_TABL-*SYS*.

SORT USR_TABL BY BNAME TCODE.

LOOP AT USR_TABL WHERE TCODE IN S_TCODE.

SELECT SINGLE TTEXT FROM TSTCT INTO TSTCT-TTEXT
WHERE SPRSL = SY-LANGU AND
TCODE = USR_TABL-TCODE.

TRANSLATE TSTCT-TTEXT TO UPPER CASE.

WRITE:/
USR_TABL-BNAME,
USR_TABL-TCODE,
TSTCT-TTEXT.

ENDLOOP.

IF SY-SUBRC <> 0.
MESSAGE I001(38) WITH 'NO ENTRIES FOR YOUR SELECTION CRITERIA!'.
ENDIF.

 

表的域定义

表的域定义:

ABAP Dictionary 是SAP System中的一个工具tool, 通过它能存取DB中所有有关于table的定义
(表的定义,字段的定义,data element的定义,domain的定义)。
Field definitions放在ABAP Dictionary中.(贴图)
The basic objects for defining data fields in the ABAP Dictionary有以下三种:
1, table
2, data element (业务语义,这个字段在业务中是表示啥?)
A data element is used for the semantic definition(field label) of a table fields.
3, domain (数据库技术角度的字段类型,在数据库中是以啥形势存放的?)
A domain is used for the techical definition (fields type, length) of a table fields.

A field is not a independent object. It depends on tables and can only be maintained
within a table. 如果一个table definition不存在了,则它的所有field definitions都不存在了.

Relationships Between Tables

1, 在ABAP Dictionary中,主表叫做the check table, 外键表叫做the foreign key table.


SAP System中的所有data和system都保存在database中。


 

SAP Business Objects & BAPI

SAP Business Objects (类似于java中的对象有attributes和methods,另外还有tables).
1, An SAP Business Objects is the representation of a central business object
in the real world, such as an employee, sales order, purchase requisition,
purchase order, applicant,invoice, and so on.
2, A business object is composed of :
(1), [tables] that are related in a business context,
(2), [Attributes] are characteristics that specify the business object, The attribute
can only be modified by the methods that belong to the business object.
(3), [the related application programs].

3, Business Objects are maintained by SAP in the Business Object Repository(BOR).
BOR是一个工具被用来create, delete, modify 业务对象。

BAPI (Business Application Programming Interface)业务应用编程接口

SAP R/3为了集成第三方软件,为软件厂商提供了接口BAPI,为了access R/3 中的业务数据(business data)
和业务流程(business),必须使用BAPI.
可以这样说一个BAPI就是某个Business Object的一个public attribute或一个public method.


 

ALE (Application Link Enabling)

许多大企业把整个SAP system分布在多个instance上,每个instance专注于特定的业务.
例如: plant中的物料采购在一个本地的instance上进行处理(the local system).
向供应商付款和总帐处理在公司中心instance上处理(the central system).

分布(distribute)不是简单的数据分割!!!
分布就是把数据分布在多个地点,但同时又能保证数据在整体上的一致性和完整性.
分布用到分割技术, 但是分布不是简单的分割.为了保证不同地点的数据的完整性
和一致性different systems利用ALE进行沟通.
The ALE concept always relates to an enterprise structure with areas that have central tasks
and areas with tasks that are decentralized.

 It may be practical for organizations to use separate application systems so that application components can be installed and operated on decentralized systems that are technically independent of each other.
 The ALE concept supports the implementation and operation of distributed SAP applications. It is based on business-controlled messaging with consistent data storage on loosely coupled systems. The applications are integrated through the message exchange, not via a central database.
 To implement a distributed, yet integrated system, the customer must specify in a logical model, which applications are to run on which systems and how the applications are to exchange data with each other.
 On the technical side, the data exchange is carried out via IDocs (intermediate documents) as used in the EDI (Electronic Data Interchange) interface. On the application side, EDI supports information exchange between R/3 systems in different enterprises, whereas ALE supports information exchange within one enterprise. The ALE distribution mechanism is similar to the EDI mechanism. In ALE, business processes are distributed at the transaction level.

The procurement of materials via the plant in a company code can be handled in a local system. However, payments to vendors and the general ledger are managed in a central system.
 In order that both organizations use the same master data, the head office distributes the master data to the local system. Thus the transaction data in the local systems for which IDocs exist can be sent to the head office without inconsistencies.
 Examples of data that can be distributed:
­ Master data: Customers, vendors, G/L accounts, cost centers, cost elements, activity types
­ Transaction data: Incoming invoices, outgoing invoices, Financial Accounting line items, Controlling documents
 The SAP standard system is delivered with some ALE scenarios. For example:
­ Central contract management in Purchasing
­ Distributed Inventory Management
­ Central Materials Management master data
 The message types required for the distribution via IDocs are also delivered by SAP. You can also define your own ALE scenarios.
 Business to Business Procurement works through ALE with an R/3 backend system


 

如何从SAP中查找BADI

BADI作为SAP的第三代用户出口,他的应用也越来越广泛,但如何找到合适的badi是许多abap程序员的困惑。我这里就介绍一下我个人的应用的经验,供大家参考。

1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包);

2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。

3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。

4、se18 查找接口,se19 实现接口就可以实现用户增强。
示例:用LE_SHP_DELIVERY_PROC控制跨月Cancel

METHOD IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER .
data : thismonth(2) type c.
data : wa_likp type line of SHP_LIKP_T.
data : wa_log type line of SHP_BADI_ERROR_LOG_T.
clear ct_log[],thismonth.
thismonth = sy-datum+4(2). "----->這一個月的月份
loop at it_xlikp into wa_likp.
check IS_V50AGL-WARENAUSG_STORNO ='X'."--->代表作GI cancel
if wa_likp-WADAT_IST+4(2) < vbeln =" cs_likp-vbeln." msgty =" 'E'." msgid =" 'ZDN_ERROR'." msgno =" '001'.">


 

SAP用户出口的类型

sap的用户出口总共有三代:

1、第一代
sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。
示例:USEREXIT.. in SAPMV45A

2、第二代
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。

3、第三代
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),你可以通过EXIT_HANDLER这个单词查找BADI。

 

显示修改数据(tables CDHDR and CDPOS)

*&---------------------------------------------------------------------*
*& Report Z_ALV_CDHDR_CDPOS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_ALV_CDHDR_CDPOS.
TYPE-POOLS slis.
DATA : cdhdr TYPE cdhdr.
SELECT-OPTIONS :
s_objcls FOR cdhdr-objectclas OBLIGATORY,
s_objtid FOR cdhdr-objectid,
s_chngnr FOR cdhdr-changenr,
s_usrnam FOR cdhdr-username DEFAULT sy-uname,
s_udate FOR cdhdr-udate DEFAULT sy-datum,
s_time FOR cdhdr-utime,
s_tcode FOR cdhdr-tcode,
s_plncnr FOR cdhdr-planchngnr,
s_chngno FOR cdhdr-act_chngno,
s_wsplnd FOR cdhdr-was_plannd,
s_chngid FOR cdhdr-change_ind.

SELECTION-SCREEN SKIP.
PARAMETERS p_max TYPE numc3 OBLIGATORY DEFAULT '200'.

*---------------------------------------------------------------------*
TYPES :
BEGIN OF ty_s_cdhdr.
INCLUDE STRUCTURE cdhdr.
TYPES : checkbox,
END OF ty_s_cdhdr,

BEGIN OF ty_s_cdpos.
INCLUDE STRUCTURE cdpos.
TYPES : checkbox,
END OF ty_s_cdpos.

*---------------------------------------------------------------------*
DATA :
* Layout for ALV
gs_layout TYPE slis_layout_alv,
* Change document header
t_cdhdr TYPE TABLE OF ty_s_cdhdr.

*---------------------------------------------------------------------*
START-OF-SELECTION.

* Read Change document header
SELECT * INTO TABLE t_cdhdr
UP TO p_max ROWS
FROM cdhdr
WHERE objectclas IN s_objcls
and objectid in s_objtid
and changenr in s_chngnr
AND username IN s_usrnam
AND udate IN s_udate
AND utime IN s_time
AND tcode IN s_tcode
AND planchngnr IN s_plncnr
AND act_chngno IN s_chngno
AND was_plannd IN s_wsplnd
AND change_ind IN s_chngid.

gs_layout-zebra = 'X'.
gs_layout-colwidth_optimize = 'X'.
gs_layout-box_fieldname = 'CHECKBOX'.

* Display ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
i_callback_user_command = 'USER_COMMAND'
i_structure_name = 'CDHDR'
is_layout = gs_layout
TABLES
t_outtab = t_cdhdr.

*---------------------------------------------------------------------*
* FORM USER_COMMAND *
*---------------------------------------------------------------------*
FORM user_command USING u_ucomm TYPE syucomm
us_selfield TYPE slis_selfield. "#EC CALLED

* Macro definition
DEFINE m_sort.
add 1 to ls_sort-spos.
ls_sort-fieldname = &1.
ls_sort-up = 'X'.
append ls_sort to lt_sort.
END-OF-DEFINITION.

DATA :
ls_cdhdr TYPE ty_s_cdhdr,
ls_sort TYPE slis_sortinfo_alv,
lt_sort TYPE slis_t_sortinfo_alv,
* Change document items
lt_cdpos TYPE TABLE OF ty_s_cdpos.

CASE u_ucomm.
WHEN '&IC1'.
PERFORM check_marked USING us_selfield.

* Read Change document items
LOOP AT t_cdhdr INTO ls_cdhdr WHERE checkbox = 'X'.
SELECT * APPENDING TABLE lt_cdpos
FROM cdpos
WHERE objectclas = ls_cdhdr-objectclas
AND objectid = ls_cdhdr-objectid
AND changenr = ls_cdhdr-changenr.
ENDLOOP.

m_sort 'CHANGENR'.

* Display ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_structure_name = 'CDPOS'
is_layout = gs_layout
it_sort = lt_sort
TABLES
t_outtab = lt_cdpos.

ENDCASE.

ENDFORM. " USER_COMMAND
*---------------------------------------------------------------------*
* Form CHECK_MARKED
*---------------------------------------------------------------------*
* What has been marked in t_cdhdr
*---------------------------------------------------------------------*
FORM check_marked USING us_selfield TYPE slis_selfield.

FIELD-SYMBOLS :
TYPE ty_s_cdhdr.

READ TABLE t_cdhdr TRANSPORTING NO FIELDS WITH KEY checkbox = 'X'.
IF NOT sy-subrc IS INITIAL AND
NOT us_selfield-tabindex IS INITIAL.
READ TABLE t_cdhdr INDEX us_selfield-tabindex ASSIGNING .
-checkbox = 'X'.
ENDIF.

ENDFORM.

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?