如果引用或轉貼,麻煩註明出處與本網誌連結,否則視為侵權。

2006年8月25日

SAP List Viewer(ALV) 簡介與範例程式之一

Author : Fred Wang (http://fredwang.blogspot.com)
Date : 2006/08/25

SAP List Viewer, 稱為ALV, 可以讓表格資料顯示的很好看而且還有有許多內定的功能按鈕, 如排序, 過濾, 統計, 圖表, 輸出excel, word, 下載等, SAP提供了許多function modules支援, 其中最簡單的是'DISPLAY_BASIC_LIST'.

使用的function module 'DISPLAY_BASIC_LIST', 有一個缺點: 必須用一個DO .. ENDDO迴圈, 才可以將您按某個button執行的程式, 執行完畢回到list畫面, 如此一來, 重新顯示list, 則指標每此均會指到第一筆

Example :
FORM CALL_DISPLAY_BASIC_LIST.
DATA: W_FUNC LIKE SY-SUBRC.

DO.
REFRESH GT_SELECTED.
CLEAR W_FUNC.
CALL FUNCTION 'DISPLAY_BASIC_LIST'
EXPORTING
BASIC_LIST_TITLE = SY-TITLE
FILE_NAME = 'Basic List'
HEAD_LINE1 = 'head1'
HEAD_LINE2 = 'head2'
DYN_PUSHBUTTON_TEXT1 = 'Function 1'
DYN_PUSHBUTTON_TEXT2 = 'Function 2'
DYN_PUSHBUTTON_TEXT3 = 'Function 3'
DYN_PUSHBUTTON_TEXT4 = 'Function 4'

IMPORTING
RETURN_CODE = W_FUNC
TABLES
DATA_TAB = GT_ITAB
FIELDNAME_TAB = FIELDNAMES
SELECT_TAB = GT_SELECTED
EXCEPTIONS
DOWNLOAD_PROBLEM = 1
NO_DATA_TAB_ENTRIES = 2
TABLE_MISMATCH = 3
PRINT_PROBLEMS = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
EXIT.
ELSE.
CLEAR GT_SELECTED.
READ TABLE GT_SELECTED INDEX 1.
CASE W_FUNC.
WHEN 1. PERFORM FUNCTION1.
WHEN 2. PERFORM FUNCTION2.
WHEN 3. PERFORM FUNCTION3.
WHEN 4. PERFORM FUNCTION4.

ENDCASE.
ENDIF.

ENDDO.

因此'DISPLAY_BASIC_LIST' OR 'DISPLAY_GRID_LIST'僅適用於查詢, 不適合做進一步的資料選擇, 對選擇的資料進行處理, 除此之外也無法選擇不要顯示某些預設按鈕, 如Total等

可用function module 'REUSE_ALV_LIST_DISPLAY' OR 'REUSE_ALV_GRID_DISPLAY' 取代, 就不會有這種問題! 下回會詳細介紹如何使用這兩個function module

另外, SAP提供很好的範例程式, 直接供你複製, 我就 ALV技術的 sample programs 整理如下(七類) :
1. Simple list
- 超基本 : BALVSD02, BALVSD02_GRID, BALVSD02_SAVE 利用現有的資料結構作為欄位定義
- 基本 : BALVSD03, BALVSD04 程式中自訂欄位定義
- 完整 : BALVSD01, BALVSD11(*程式可以知道使用者選擇哪筆record), BALVST01, BALVST02, BALVEX01,BALVEX02

要注意, 這些程式最好用SE80去看, 因為有些GUI Status 為自訂的, 可從SAPLKKBL複製它的"STANDARD" GUI status到自己的程式, 再增刪需要與不需要的按鈕

2. Mini ALV List (function module使用方式與simple list看起來差不多)
- BCALV_MINIALV_SIMPLE (最簡單), BCALV_MINIALV

3.. Block List
- BALVBT01, BALVBT02

4. Hierarchical-sequential list
- BALVHD01, BALVHD01_GROUP, BALVHT01

5. ALV Grid Control (用Grid control object, 採物件導向式的設計, 注意, 按鈕並不是在GUI status上)
- BCALV_GRID_DEMO, BCALV_GRID_*

6. ALV Tree Control
- BCALV_TREE_SIMPLE_DEMO, BCALV_TREE_DEMO, BCALV_TREE_*

7. Other ALV
- BCALV_TEST_*

2006年8月21日

ABAP : 如何轉換ASCII code與字元

From : http://www.sap-img.com/abap/how-can-i-get-ascii-value-of-any-letter.htm

report Demotest.

* 1.將字元轉成ASCII code

data : c value 'A'.
field-symbols : <n> type x.
data : rn type i.
assign c to <n> casting.
move <n> to rn.
write rn.

* 2. 將ASCII code轉成字元

data : i type i value 66.
data : x type x.
field-symbols : <fc> type c.
move i to x.
assign x to <fc> casting type c.
move <fc> to c.
write c.

2006年8月14日

ABAP - SAP 顯示金額與實際儲存值差異的問題

SAP在顯示金額及儲存金額時會透過一個Table(TCURX)及特定的計算公式產生其結果
建議的寫法如下:
A. 顯示儲存的金額
DATA: SHIFT TYPE I.
CLEAR SHIFT.
SELECT SINGLE * FROM TCURX WHERE CURRKEY = (幣別).
IF SY-SUBRC = 0.
SHIFT = 2 - TCURX-CURRDEC.
ENDIF.
(顯示金額) = (儲存金額) * 10 ** SHIFT.
B. 儲存輸入的金額(至CURR type的欄位)
DATA: SHIFT TYPE I.
CLEAR SHIFT.
SELECT SINGLE * FROM TCURX WHERE CURRKEY = (幣別).
IF SY-SUBRC = 0.
SHIFT = TCURX-CURRDEC – 2.
ENDIF.
(儲存金額) = (顯示金額) * 10 ** SHIFT.
由上面公式您可以瞭解為何TWD顯示100為何儲存值為 1
在TCURX中CURRKEY = ‘TWD’ 其CURRDEC = 0, 因此顯示金額會乘十的負二次方才是
儲存結果
Note: 也有現成得Function modules可用:
CURRENCY_AMOUNT_ SAP _TO_ DISPLAY : 顯示儲存的金額
CURRENCY_AMOUNT_DISPLAY_TO_SAP : 儲存輸入的金額(至CURR type的欄位)