A Bap Courses line
-
Upload
tqtrungtqt -
Category
Documents
-
view
46 -
download
7
description
Transcript of A Bap Courses line
Http://ecvin.net
ABAP Programming I
I. Tạo chương trình ABAP cơ bản:
1. Định nghĩa dữ liệu với trình soạn thảo ABAP (ABAP Editor):
a. Tạo chương trình ABAP
ABAP (Advanced Business Application Programming) là ngôn ngữ lập trình được sử
dụng để phát triển các ứng dụng SAP.
ABAP Editor là công cụ phát triển mà SAP R/3 cung cấp. Công cụ này cho phép bạn
tạo, hiệu chỉnh và thực thi chương trình ABAP. Bạn có thể sử dụng cửa sổ ‘SAP Easy
Access’ để truy cập ABAP Editor.
Để mở ABAP Editor, gõ transaction code ‘SE38’ vào trường Command và nhấn Enter.
Để tạo chương trình ABAP, cần xác định trên chương trình trong trường Program, tên
bắt đầu là Y hoặc Z → nhấn Create.
Sử dụng cửa sổ ‘Program Attributes’ để xác định tiêu đề và các thuộc tính bao gồm loại
chương trình và application area mà chương trình phụ thuộc.
Khi bạn hiệu chỉnh và lưu chương trình ABAP, đó là phiên bản chưa kích hoạt
(inactive). Không thể thực thi chương trình này, để thực thi được cần kích hoạt
(activate) nó.
b. Cấu trúc ABAP:
http://ecvin.net
Http://ecvin.net
Chương trình ABAP chứa nhiều dòng mã gọi là câu lệnh (statement), được sử dụng để
định nghĩa và thao tác dữ liệu.
Khi viết câu lệnh, bạn cần theo nguyên tắc nhất định để đảm bảo trình xử lý ABAP có
thể biên dịch đúng và thực thi câu lệnh đưa ra kết quả mong muốn.
Câu lệnh bắt đầu bằng từ khóa và kết thúc bằng dấu chấm. Nên có ít nhất một khoảng
trắng để phân chia các từ trong câu lệnh.
Ví dụ:
write / 20(5) 'Hello'.
Chương trình ABAP cũng chứa chú thích để cải tiến tính dễ đọc cho chương trình và nó
được bỏ qua khi thực thi. Dòng ghi chú bắt đầu bằng dấu * hoặc dấu ". Ví dụ:
*&------------------------------------------*
*& Creating Sales Report *
*&------------------------------------------*
c. Xác định kiểu dữ liệu:
Khi chương trình được thực thi, nó thực hiện các thao tác logical trên dữ liệu cục bộ
trong chương trình. Dữ liệu là các trường trong bộ nhớ (working memory). Một trường
là một chuỗi các byte.
Trường trong bộ nhớ lưu dữ liệu của chương trình trong quá trình thực thi gọi là đối
tượng dữ liệu (data object). Các trường trong bộ nhớ này được gán cho chương trình khi
nó thực thi và được giải phóng khi thực thi xong. Trường trong bộ nhớ đã giải phóng có
thể được gán cho chương trình khác.
http://ecvin.net
Http://ecvin.net
Hai loại đối tượng dữ liệu:
+ có thể thay đổi (modifiable)
+ không thể thay đổi (nonmodifiable)
Bạn có thể thay đổi giá trị được lưu trong đối tượng dữ liệu modifiable trong quá trình
thực thi. Đối tượng modifiable bao gồm biến (variable), field string, internal table.
Giá trị của đối tượng dữ liệu nonmodifiable duy trì hông đổi trong quá trình thực thi.
Bạn có thể xác định giá trị của nó khi định nghĩa. Đối tượng nonmodifiable bao gồm
chữ (literal) và hằng (constant).
Loại dữ liệu mà ABAP hỗ trợ:
+ character
+ date
+ hexadecimal
+ numeric
+ time
Kích cỡ của đối tượng như character, numeric hoặc hexadecimal là giữa 1 và 65,535 ký
tự. Tuy nhiên kích cỡ loại dữ liệu date là 8 ký tự hoặc time là 6 ký tự => kích cở của các
kiểu dữ liệu này là cố định.
1. charater: các giá trị alphanumeric
2. hexadecimal: A-F và 0-9
3. numeric: 0-9
d. Định nghĩa biến và literal:
Có nhiều vùng và nhiều khối trong chương trình. Bạn có thể chỉ định các câu lệnh trong
vùng xác định dựa vào loại công việc mà câu lệnh thực hiện.
Có 4 vùng:
+ data declaration
+ initialization
+ start-of-seclection
+ end-of-selection
http://ecvin.net
Http://ecvin.net
Ba câu lệnh được sử dụng để định nghĩa biến:
+ data
+ parameters
+ select-options
Định nghĩa biến sử dụng câu lệnh data, chỉ định tên, kích cỡ và kiểu dữ liệu của biến.
Ví dụ:
data username(15) type c. <= character
data reports(5) type n. <= numeric
Định nghĩa biến sử dụng câu lệnh parameters.
parameters variable name(size) type data type
parameters age(3) type n.
Ví dụ:
Sau khi định nghĩa biến user, cần khởi tạo giá trị trong quá trình thực thi.
parameters user(12) type c.
Để định nghĩa biến bằng câu lệnh select-options, bạn phải chỉ định tên và tiêu đề của
selection screen nơi người dùng khởi tạo dãy giá trị cho biến.
select-options title for variable name.
Ví dụ:
select-options Number for serial. <= định nghĩa biến serial với tên selection screen là
Number.
Khi muốn giá trị của đối tượng dữ liệiu không thay đổi, hãy định nghĩa literal => sử
dụng để hiển thị kết xuất.
Để định nghĩa literal, sử dụng '. Ví dụ: bạn đã định nghĩa chuỗi literal "Samantha" khi
gõ 'Samantha".
Sử dụng câu lệnh write để hiển thị kết xuất. Ví dụ:
write / 'literal'.
Giả sử bạn muốn hiển thị thông điệp "This is a literal". Bạn có thể sử dụng câu lệnh
write để định nghĩa thông điệp như một literal và hiển thị nó.
http://ecvin.net
Http://ecvin.net
Bạn có thể sử dụng đối tượng dữ liệu loại I như biến, field string và internal table để lưu
các giá trị trong chương trình.
2. Thực hiện các thao tác:
a. Phép gán:
Cây lệnh gán cho phép bạn thao tác giá trị của biến, field string và internal table:
+ clear
+ move
Sử dụng câu lệnh clear để thiết lập lại giá trị cho một biến.
clear variable name.
Ví dụ:
clear counter.
=> dùng câu lệnh clear để thiết lập lại giá trị mặc định của biến counter chứa giá trị 102,
sau khi code được thực thi, giá trị của counter sẽ thay đổi là 0.
Sử dụng câu lệnh move để gán giá trị của một biến cho một biến khác.
move a to b.
Ví dụ: giá trị của biến a là 10, giá trị biến b là 33. Bạn có thể sử dụng statement move để
gán giá trị a cho b.
move a to b. => giá trị của b thay đổi từ 33 thành 10.
b. Phép tính:
Statement được sử dụng để thực hiện phép tính chứa hai thành phần:
+ operands
+ operators
http://ecvin.net
Http://ecvin.net
Các statement được sử dụng để thực hiện phép tính:
+ add
+ divide
+ multiply
+ subtract
+ compute
Phép cộng:
add variable1 to variable2.
Ví dụ:
Giả sử giá trị của biến product là 20, giá trị của biến stock là 46. Bạn muốn cộng giá
trị của cả hai biến và lưu tổng vào biến stock. Sử dụng:
add product to stock. <= stock = stock + product
divide effort by hours. <= effort = effort / hours
multiply variable1 by variable2. <= variable1 = variable1 * variable2
subtract variable1 from variable2. <= variable2 = variable1 - variable2
Bạn có thể sử dụng câu lệnh compute để thực hiện các phép tính toán học. Không giống
add, substract, divide và multiply, compute là câu lệnh đa năng cho phép bạn thực thi
nhiều câu câu lệnh tính toán. Hơn nữa nó cho phép bạn lưu kết quả của biểu thức trong
một biến khác.
Ví dụ:
Tính tổng của b và c và lưu kết quả vào biến a
compute a = b + c.
3. Các câu lệnh điều kiện, vòng lặp, điều khiển:
a. Sử dụng các câu lệnh điều kiện
Khi tạo chương trình ABAP, bạn cần điều khiển luồng chương trình để được kết xuất
như mong muốn.
Ví dụ: bạn muốn kiểm tra kết quả của biểu thức logical, và hiển thị kết xuất ra màn hình
dựa vào kết quả.
Các loại câu lệnh được sử dụng phổ biến để điều khiển luồng chương trình là:
+ conditional
+ control
http://ecvin.net
Http://ecvin.net
+ looping
Câu lệnh if được sử dụng phổ biến nhất. Câu lệnh bắt đầu với từ khóa if và kết thúc với
từ khóa endif. Mệnh đề elseif và else được sử dụng để kiểm tra giá trị của expression1
và expression2. Nếu biểu thức là đúng, câu lệnh ABAP tương ứng được thực thi.
if expression1.
statements.
[elseif expression2.
statements.]
[else.
statements.]
endif.
Ví dụ:
if a = 0.
write / 'The value of a is equal to zero!'.
elseif a = 1.
write / 'The value of a is equal to one!'.
else.
write / 'The value of a is equal to one!'.
endif.
Ngoài câu lệnh if, bạn có thể sử dụng câu lệnh case để thực thi các câu lệnh dựa vào giá
trị của một biến. Sử dụng khi muốn thực hiện hơn 3 hành động.
case variable.
when value1.
statements.
when value2.
statements.
endcase.
Ví dụ:
data counter type n value 2.
case counter.
when 1.
write / 'The value of counter is one.'.
when 2.
write / 'The value of counter is two.'.
http://ecvin.net
Http://ecvin.net
when 3.
write / 'The value of counter is three.'.
endcase.
b. Vòng lặp:
Vòng lặp cho phép bạn thực thi nhiều câu lệnh nhiều lần mà hông cần viết lại câu lệnh
mỗi lần bạn muốn thực thi chúng. Câu lệnh lặp phổ biến là do và while. Câu lệnh do là
câu lệnh lặp không điều kiện. Nó thực thi một khối chương trình một số lần mà bạn chỉ
định.
Câu lệnh while là câu lệnh lặp có điều kiện. Nó thực thi khối chương trình nếu biểu thức
logical đúng.
do n times.
statements.
enddo.
Ví dụ:
data num type n value 1.
do 15 times.
write / n.
n = n + 1.
enddo.
while logical expression.
statements.
endwhile.
Ví dụ:
while counter < 20.
counter = counter + 1.
endwhile.
Câu lệnh rẽ nhánh:
+ continue
+ exit
+ stop
data counter type n value 0.
http://ecvin.net
Http://ecvin.net
do 3 times.
counter = counter + 1.
if counter = 2.
continue.
else.
write / 'The value of counter is: '.
write counter.
endif.
enddo.
=> câu lệnh write sẽ không được thực thi khi giá trị của counter là 2.
Sử dụng câu lệnh exit để thoát khỏi vòng lặp. Câu lệnh stop để thoát khỏi khối chương
trình và chuyển đến khối kế tiếp. Ví dụ: bạn chỉ định câu lệnh stop trong vùng "start of
selection". Khi đến stop, sự thực thi sẽ chuyển đến vùng "end of selection".
Tạo chương trình hiển thị danh sách các số từ 1 đến 20.
data counter type n value 0.
data out type n value 0.
data final type c value 'The final value of counter is 0'.
write / 'Here is the list of numbers:'.
do 20 times. "begining of the loop
counter = counter + 1. "incrementing the value
move counter to out. "assign the updated value
write / out. "display the updated value
enddo. "end of the loop
Thay đổi code để đảm bảo giá trị 11 không được hiển thị trong danh sách. Bạn cần sử
dụng câu lệnh điều kiện để kiểm tra giá trị và sử dụng câu lệnh điều khiển để điều khiển
vòng lặp.
data counter type n value 0.
data out type n value 0.
data final type c value 'The final value of counter is 0'.
write / 'Here is the list of numbers:'.
do 20 times. "begining of the loop
counter = counter + 1. "incrementing the value
http://ecvin.net
Http://ecvin.net
move counter to out. "assign the updated value
if out = 11.
continue.
write / out. "display the updated value
enddo. "end of the loop
Thêm giá trị 13 không được hiển thị.
data counter type n value 0.
data out type n value 0.
data final type c value 'The final value of counter is 0'.
write / 'Here is the list of numbers:'.
do 20 times. "begining of the loop
counter = counter + 1. "incrementing the value
move counter to out. "assign the updated value
if out = 11.
continue.
elseif out = 13.
continue.
write / out. "display the updated value
enddo. "end of the loop
II. Tạo chương trình report:
1. Internal table:
a. Định nghĩa internal table:
Chương trình report là chương trình để rút trích các dữ liệu mong muốn từ CSDL và
hiển thị dữ liệu theo định dạng cần thiết.
Khi bạn chạy một chương trình report, nó hiển thị hai loại màn hình: selection và
output.
http://ecvin.net
Http://ecvin.net
Selection screen là màn hình đầu tiên để bạn cung cấp các tiêu chí chọn (selection
criteria). Dựa vào nó một danh sách được hiển thị trên màn hình thứ hai gọi là output
screen. List là report mà bạn tạo.
Chương trình report hông hiển thị trực tiếp dữ liệu được lưu trong table ra màn hình.
Đầu tiên nó lấy dữ liệu từ table đưa vào đối tượng có kiểu dữ liệu tạm gọi là internal
table.
http://ecvin.net
Http://ecvin.net
Cấu trúc của internal table gồm hai phần:
+ body
+ header line
Định nghĩa internal table bằng câu lệnh data. Định nghĩa body bằng
internal_table_name occurs n, trong đó n là số record mặc định trong internal table.
data : begin of internal_table_name occurs n,
field1 (data type) (like database_table_name_dbfield1),
field2 (data type) (like database_table_name_dbfield2),
end of internal_table_name.
Hoặc định nghĩa internal table bằng cách sao chép các trường của cấu trúc trong ABAP
Data Dictionary (DDIC).
data : internal_table_name like copied_internal_table_name occurs n.
b. Lấy dữ liệu đưa vào internal table:
Để lấy dữ liệu từ table vào internal table, bạn có thể sử dụng:
+ câu lệnh select
+ câu lệnh select...endselect và append.
http://ecvin.net
Http://ecvin.net
Khi sử dụng câu lệnh select bạn cần xác định tên các trường mà dữ liệu bạn muốn lấy từ
table. Hơn nữa bạn có thể sử dụng mệnh đề into để xác định tên internal table và mệnh
đề from để chỉ định tên table.
select database_table_name-field1
database_table_name-field2
into table internal_table_name
form database_table_name.
Ví dụ:
selection materials-material_number
materials-procurement_date
materials_type
into table itab_materials from materials.
Khi sử dụng câu lệnh select...endselect và append, bạn đặt câu lệnh append bên trong
select...endselect.
select database_table_name-field1
database_table_name-field2
from database_table_name into header_line_name
*code modify the header line data comes here
append internal_table_name.
endselect.
c. Đọc dữ liệu trong internal table:
Sau khi lấy dữ liệu từ table đưa vào internal table, bạn có thể đọc dữ liệu từ internal
table để hiển thị ra màn hình kết xuất.
Đọc dữ liệu từ internal table bằng hai câu lệnh:
+ loop at
+ read
Hiển thị chi tiết các record nằm giữa 49 và 76.
loop at itab_customers from 50 to 75.
"code to display the data on the screen comes here
endloop.
http://ecvin.net
Http://ecvin.net
Đọc chi tiết vendor có thuế lớn nhất:
read table itab_vendors index 1.
d. Sửa dữ liệu trong internal table:
Sau khi bạn lấy dữ liệu từ table đưa vào internal table, bạn có thể sửa dữ liệu đang tồn
tại trong internal table. Bạn có thể sửa header line và sử dụng câu lệnh modify để cập
nhật dòng chỉ định trong internal table.
modify internal_table_name index i.
Thêm tiền thưởng cho nhân viên:
loop at itab_workers.
"code to add 10% to the salary come here
modify itab_workers.
endloop.
Ngoài lệnh modify, bạn có thể sử dụng lệnh insert để thêm nội dung internal table. Tuy
nhiên, hông giống câu lệnh modify, câu lệnh insert sẽ chèn một dòng mới vào internal
table.
insert internal_table_name index i.
Giả sử một nhân viên mới vừa vào công ty bạn. Bạn cần thêm dòng vào internal table
"itab_employees".
"variable to store total records in the internal table
data : records(20) type n value 0.
loop at itab_employees.
"Calculating the total number of records in the table
records = records + 1.
endloop.
"Code to update the header line comes here
insert itab_workers index records.
e. Chương trình mẫu sử dụng internal table:
Định nghĩa internal table để chứa dữ liệu bảng PO và tính khối lượng tổng cộng của một
PO.
Report PO Journal
http://ecvin.net
Http://ecvin.net
data : begin of itab_PO_header occurs 0,
PO_Number like PO-Number, "PO number
PO_Group like PO-Group, "Purchasing Group
PO_Amount like PO_Items-Amount, "Total PO amount
end of itab_PO_header.
Tạo internal table để lưu bảng PO_Items và tính khối lượng tổng cộng của một PO.
data : begin of itab_PO_items occurs 0,
PO_Number like PO_Items-Number,
PO_Amount like PO_Items-Amount,
end of itab_PO_items.
Sau khi định nghĩa internal table, bạn cần lấy dữ liệu từ table thích hợp và chèn vào
internal table tương ứng.
select PO-Number PO-Group
into table itab_PO_header from PO.
select PO_Items-Numer PO_Items-Amount
into table itab_PO_Items from PO_Items.
Tính khối lượng tổng cộng của một PO:
"variable to store total amount of a PO
data : total_amount(20) type n value 0.
loop at itab_PO_header.
total_amount = 0.
loop at itab_PO_items.
"if the PO numbers of both the tables don't match
if itab_PO_Items-PO_Number NE itab_PO_header-PO_Number.
continue. "continue with the internal loop
else.
total_amount = total_amount + itab_PO_items-PO_Amount.
endif.
endloop. "loop for the itab_PO_items table ends
Sau khi tính toán, cần lưu giá trị đã tính vào internal table ‘itab_POJounal_header’:
"assigning the total PO amount to the header line of itab_PO_header
itab_PO_header-PO_Amount = total_amount.
http://ecvin.net
Http://ecvin.net
modify itab_PO_header.
endloop. "loop for the itab_PO_header table ends
Mã hoàn chỉnh:
Report PO Journal
data: begin of itab_PO_header occurs 0,
PO_Number like PO-Number, " PO number
PO_Group like PO-Group, " Purchasing Group
PO_Amount like PO_Items-Amount , "Total PO amount
end of itab_PO_header .
data: begin of itab_PO_items occurs 0,
PO_Number like PO_Items-Number,
PO_Amount like PO_Items-Amount,
end of itab_PO_items .
select PO~Number PO~Group.
into itab_PO_header from PO.
select PO_Items~Number PO_Items~Amount.
into itab_PO_items from PO_Items.
" variable to store total amount of a PO
data : total_amount(20) type n value 0.
loop at itab_PO_header.
total_amount = 0.
loop at itab_PO_items.
"if the PO numbers of both the tables don't match
if itab_PO_items-PO_Number NE itab_PO_header-PO_Number.
continue. "continue with the internal loop
else.
total_amount = total_amount + itab_PO_items-PO_Amount.
endif.
endloop. "loop for the itab_PO_items table ends
"assigning the total PO amount to the header line of itab_PO_header
http://ecvin.net
Http://ecvin.net
itab_PO_header-PO_Amount = total_amount .
"modifying itab_PO_header with the value of its header line
modify itab_PO_header .
endloop. "loop for the itab_PO_header table ends
Câu lệnh append và select...endselect để rút trích tất cả các dòng từ table, cập nhật dữ
liệu trong mỗi dòng được rút trích và sau đó insert vào internal table.
Lấy dữ liệu từ table vào internal table, sử dụng select hoặc select...endselect và append;
đọc dữ liệu từ internal table, sử dụng loop at...endloop và read table; cập nhật nội dung
internal table, sử dụng modify và insert.
2. Classical report:
a. Classical report:
Chương trình report cho phép bạn lấy dữ liệu từ table vào internal table, đọc dữ liệu từ
internal table, thay đổi dữ liệu trong internal table và hiển thị theo định dạng mong
muốn.
Có hai loại report:
+ classical report
+ interactive report
Cả classical và interactive report đều có cấu trúc modular. Để tạo modular, bạn có thể sử
dụng các thành phần khác gọi là khối xử lý (processing block). Mỗi thành phần chứa
một nhóm câu lệnh ABAP và được thực thi ở một thời điểm nhất định.
Có hai thành phần quan trọng của classical report là event block và subroutine. Trong
quá trình thực thi của classical report, event block được chạy bởi môi trường thực thi
trong khi subroutine được gọi từ chương trình report.
Môi trường thực thi tải và chạy một event block phụ thuộc vào sự kiện xảy ra. Sau khi
thực thi event block, điều khiển quay trở lại môi trường thực thi. Phụ thuộc vào sự kiện
kế tiếp xảy ra, môi trường thực thi sẽ thực thi event block tương ứng. Trong quá trình
thực thi event block, khi câu lệnh thực thi subroutine được thấy, điều khiển được chuyển
từ event block cho subroutine. Sau khi thực thi các câu lệnh trong subroutine, điều khiển
quay trở lại cho người gọi event block.
http://ecvin.net
Http://ecvin.net
b. Các sự kiện trong classical report:
Sáu sự kiện trong classical report:
Không bắt buộc viết câu lệnh trong event block. Nếu bạn không sử dụng event block,
môi trường thực thi ABAP sẽ đặt tất cả câu lệnh ABAP trong event block mặc định:
start-of-selection. Trong trường hợp này, câu lệnh sẽ được thực thi tuần tự.
Nếu bạn sử dụng một vài hoặc tất cả event block trong chương trình report và đặt một
vài câu lệnh ABAP bên ngoài event block thì câu lệnh ABAP sẽ được thực thi như một
phần của event block ‘start-of-selection’.
Tuy nhiên, nếu các câu lệnh như định nghĩa biến không nằm trong event block thì các
câu lệnh này sẽ được thực thi khi chương trình được tải và không thuộc phạm vi start-
of-selection.
Giả sử bạn tạo một chương trình phát sinh ra danh sách hóa đơn. Để làm điều này bạn
cần viết câu lệnh lấy các record từ bảng "billings" bên trong event block thích hợp.
report BillingInfo.
tables: billing.
parameters : charge type N.
http://ecvin.net
Http://ecvin.net
data : begin of itab_billing occurs 0,
document_number like billing-document_number,
party like billing-party.
top-of-page.
"report footer
write: / 'PAGE-NO', SY-PAGNO.
start-of-selection.
select document_number party from billing.
write: / itab_billing-document_number.
write: / itab_billing-party.
endselect.
end-of-page.
"report header
write: / 'Billling Information'.
=> câu lệnh select được thực thi khi event block ‘start-of-selection’ xảy ra.
Bạn sử dụng event block ‘end-of-page’ cho các câu lệnh tạo report footer, sau đó sử
dụng event block ‘end-of-selection’ cho câu lệnh cập nhật nội dung internal table. Sử
dụng event block ‘start-of-selection’ cho câu lệnh lấy dữ liệu từ table và sau đó sử dụng
event block ‘top-of-page’ cho câu lệnh tạo report header.
report Customer_Late_Payment_Charge.
data : begin of itab_customers occurs 0,
customer_name like customers-customer_name,
amount_due like customers-amount_due.
end-of-page.
"report footer
write: / 'PAGE-NO', SY-PAGNO.
end-of-selection.
loop at itab_customers.
itab_customers-amount_due = itab_customers-amount_due + (itab_customers-
amount_due*charge)/100.
modify itab_customers.
endloop.
start-of-selection.
select customer_code customer_name customer_amount_due
http://ecvin.net
Http://ecvin.net
from customers.
top-of-page.
"report header
write: / 'CUSTOMER LATE PAYMENT CHARGE REPORT'.
c. Message trong classical report:
Trong quá trình thực thi chương trình, bạn có thể cần giao tiếp với người dùng cuối. Bạn
có thể sử dụng câu lệnh message trong chương trình report để làm điều này. Sử dụng
câu lệnh này cũng có thể điều khiển lỗi xảy ra.
message 'message_string' Type 'message_type'. => message_string là thông tin bạn
muốn giao tiếp với người dùng, message_type là loại thông tin.
Có sáu loại message:
Giả sử bạn cần hiển thị tài liệu mua bán dựa vào phạm vi ngày. Lấy dữ liệu từ table vào
internal table tốn nhiều thời gian vì phụ thuộc vào phạm vi ngày và số record được lấy
rất lớn. Do đó, bạn cần hiển thị message status trong khi tiến trình fetching đang thực
hiện.
selection document_number sale_person date amount
from into itab_sales from sales.
message 'Fetching data...' Type 'S'.
endselect.
Trong câu lệnh message, thay vì gõ message string mỗi lần, bạn có thể lưu message
http://ecvin.net
Http://ecvin.net
string thường xuyên sử dụng trong message class với message ID duy nhất. Sau đó sử
dụng message ID trong câu lệnh message để hiển thị message string được yêu cầu.
message ID 'message_id' Type 'message_type'.
Bạn có thể tạo message class trên màn hình ‘Message maintenance: Inital Screen’. Để
mở màn hình này, bạn sử dụng transaction code ‘SE91’.
Giả sử bạn tạo message class với ID là "ZProcessing" và lưu nó trong package "Z001".
Để tạo nó gõ Zprocessing trong trường message class => Create => Save trên thanh
công cụ chuẩn => gõ Z001 trong text box ‘package’ => Save và sau đó Continue.
Giả sử bạn cần tạo message "Processing. Please wait..." để hiển thị mỗi khi xử lý dữ liệu
lâu. Bạn muốn thêm message này vào message class "ZProcessing". Để làm điều này,
nhấn Change, gõ "ZProgressing. Pease wait..." trong trường Message short text của
dòng đầu tiên với message ID 000 trên tab Messages và nhấn Save.
Để hiển thị message trước khi thoát chương trình, bạn sử dụng kiểu message là "A".
message 'Wrong Password.' Type 'A'.
Classical report là loại report đơn giản nhất để lấy dữ liệu từ table, xử lý và sau đó hiển
thị. Bạn có thể điều khiển luồng bằng cách sử dụng processing block như event block
hoặc subroutine.
Các sự kiện quan trọng trong classical report là initlization, at selection-screen, top-of-
page, start-of-selection, end-of-page và end-of-page. Bạn có thể làm cho classical report
trả lời các sự kiện này bằng cách viết các câu lệnh bên trong event block thích hợp.
http://ecvin.net
Http://ecvin.net
Ngoài processing block, bạn cũng có thể sử dụng message để điều khiển luồng thực thi
của chương trình. Sử dụng câu lệnh message bạn có thể giao tiếp với người dùng trong
quá trình thực thi chương trình. Phụ thuộc vào tình huống, bạn có thể sử dụng các loại
message khác nhau như: A, E, I, S, W và X. Bạn có thể định nghĩa message riêng của
bạn để sử dụng thường xuyên, và nhóm chúng vào message class.
3. Interactive report:
a. Interactive report:
Kết xuất của interactive report chứa hai loại list: basic list và secondary list.
Interactive report cho phép bạn giao tiếp nhiều cách:
+ chọn dòng trong basic list
+ sử dụng menu
+ sử dụng nút nhấn
http://ecvin.net
Http://ecvin.net
Bạn có thể gọi giao dịch và report khác dựa vào giao tiếp của người dùng.
Dựa vào loại giao tiếp với basic list, sự kiện tương ứng được rút trích. Có 3 loại sự kiện:
+ at line-selection
+ at pf<nn>
+ at user-command
Giả sử bạn tạo danh sách các dụng cụ IT của công ty bạn sử dụng internal table
"itab_ITAsset" và bảng "IT_Asset". Nhấp đối một dòng trong danh sách cơ bản, một
danh sách thứ hai sẽ hiển thị thông tin chỉ định của dụng cụ IT tương ứng. Bạn cần viết
một câu lệnh để tạo danh sách thứ hai trong event block thích hợp.
start-of-selection.
"Basic List
select asset_number acquired_date asset_value
into itab_ITAsset from IT_Asset.
write: / itab_ITAsset-asset_number.
write: / itab_ITAsset-acquired_date.
write: / itab_ITAsset-asset_value.
endselect.
at line-selection.
"code to create the secondary list comes here.
Giả sử bạn có danh sách cơ bản hiển thị danh sách khách hàng của công ty bạn và các
sản phẩm họ mua. Khi người dùng chọn một dòng trong danh sách cơ bản và nhấn F1,
danh sách thứ hai thể hiện chi tiết khách hành tương ứng với dòng được chọn. Khi
người dùng nhấn Shift+F12, danh sách thứ hai hiển thị chi tiết sản phẩm.
start-of-selection.
"create the basic list here.
at pf1.
"create the secondary list displaying customer details here.
at pf24.
"create the secondary list displaying product details here.
http://ecvin.net
Http://ecvin.net
Khi người dùng chọn 1 dòng và nhấn Enter, danh sách chi tiết vendor sẽ xuất hiện. Giả
sử bạn gán function code "20" cho phím Enter.
start-of-selection.
"Basic list
select vendor_code name amount_outstanding
into itab_vendors from vendors.
write: / itab_vendors-vendor_code.
write: / itab_vendors-name.
write: / itab_vendors-amount_outstanding.
endselect.
at user_command.
if sy-ucomm=20.
"system variable sy-ucomm stores function code of the key pressed
"code to create the secondary list comes here
endif.
Giả sử bạn tạo một danh sách hiển thị tài khoản từ internal table "itab_billing" và table
"billing". Khi bạn nhấp đôi một dòng trong danh sách cơ bản, bạn cần hiển thị một danh
sách thứ hai hiển thị thông tin chi tiết của khách hàng. Khi người dùng chọn một dòng
và nhấn F2, một danh sách thứ hai hiển thị thông tin chi tiết của billing sẽ xuất hiện.
start-of-selection.
"Basic list
select * into itab_billing from billing.
"code to create the basic list comes here
endselect.
at line-selection.
"create a secondary list displaying customer information here
at pf2.
"create the secondary list displaying billing document here.
b. Trao đổi dữ liệu trong interactive report:
Bạn tạo danh sách thứ hai dựa vào dòng hoặc trường của danh sách cơ bản mà người
http://ecvin.net
Http://ecvin.net
dùng giao tiếp. Để cung cấp tên và giá trị của trường cho danh sách thứ hai, bạn cần
chuyển tên và giá trị từ danh sách cơ bản đến danh sách thứ hai trong suốt quá trình
thực thi report.
Bạn có thể chuyển dữ liệu từ danh sách cơ bản sang danh sách thứ hai bằng hai câu lệnh
phổ biến:
+ hide
+ get cursor
Câu lệnh hide lưu giá trị của biến h vào vùng Hide cho dòng kết xuất hiện hành trên
màn hình.
hide h.
Giả sử bạn tạo danh sách cơ bản chứa các dụng cụ IT trong công ty sử dụng internal
table "itab_ITAsset". Trong quá trình thực thi report, bạn muốn tất cả các giá trị của
trường asset_number được lưu trong vùng Hide. Khi người dùng nhấp đôi một dòng
trong danh sách cơ bản, bạn muốn sử dụng giá trị của trường asset_number và internal
table "itab_ITAllocation" để tạo danh sách thứ hai hiển thị thông tin chỉ định của dụng
cụ IT tương ứng.
"basic list
select assert_number acquired_date asset_value
into itab_ITAsset from IT_Asset.
write: / itab_ITAsset-asset_number.
hide itab_ITAsset-asset_number.
write: / itab_ITAsset-acquired_date.
http://ecvin.net
Http://ecvin.net
write: / itab_ITAsset-asset_value.
endselect.
at line-selection.
"secondary list
loop at itab_ITAllocation.
"if the asset number of itab_ITAllocation table matched
"the asset number of basic list row on which the user double-clicked
"create the secondary list
if itab_ITAllocation-asset_number = itab_ITAsset-asset_number.
write: / itab_ITAllocation-asset_number.
write: / itab_ITAllocation-employee_name.
write: / itab_ITAllocation-allocation_date.
endif.
endloop.
Câu lệnh get cursor rút trích tên và giá trị của trường nơi con trỏ được đặt trong quá
trình người dùng giao tiếp vào lúc runtime vào biến "f" và "v".
get cusor Field f Value v.
Giả sử bạn tạo danh sách cơ bản hiển thị danh sách khách hàng của công ty và các sản
phẩm họ mua. Vào lúc runtime, nếu một người dùng chọn customer code, customer
name từ danh sách cơ bản, danh sách thứ hai phải hiển thị chi tiết khách hàng tương ứng
như địa chỉ. Mặt khác, danh sách thứ hai cũng hiển thị các khách hàng mua cùng sản
phẩm. Để làm điều này, bạn nên rút trích tên và giá trị của trường nơi con trỏ được đặt
trong quá trình tương tác của người dùng.
data: f(20) type C,
v(10) type N.
"basic list
select customer_code name product
into itab_Customer_Prod from Customer_Prod
write: / itab_Customer_Prod-customer_code.
write: / itab_Customer_Prod-name.
write: / itab_Customer_Prod-product.
endselect.
http://ecvin.net
Http://ecvin.net
at line-selection
"secondary list
get cursor Field f Value v.
if f = "customer_code" or "name"
"create a secondary list to display customer details here using the value of v
else.
"create the secondary list on other customers here using the value of v.
end if.
Ghi chú:
Trong interactive report, bạn có thể tạo cho danh sách cơ bản có khả năng đáp ứng các
tương tác của người dùng để hiển thị danh sách chi tiết thứ hai như mong muốn. Dựa
vào cách người dùng tương tác, bạn có thể đáp ứng các tương tác bằng cách viết các câu
lệnh trong event block ‘at line-selection’, ‘at pf<nn>’ và ‘at user_command’.
Ngoài sử dụng event block để tạo danh sách thứ hai, bạn cần chuyển tên và giá trị của
trường mà người dùng tương tác trong danh sách cơ bản. Để làm điều này, bạn có thể sử
dụng hide hoặc get cursor.
4. Tạo interactive report program:
a. Tạo internal table:
Dữ liệu cho report được lưu trong ba bảng "Billing_BU", "Billing" và "BU". Để tạo
report, đầu tiên bạn cần tạo 3 internal table - một là tạo basic list, hai là tạo hai
secondary list.
Tạo internal table "itab_billing_bu" từ table "Bulling_BU":
data: begin of itab_billing_bu occurs 0,
document_number type Billing_BU-document_number,
BU_code type Billing_BU-BU_code,
billing_amount type billing-billing_amount,
end of itab_billing_bu.
Tạo internal table "itab_billing" từ table "Billing" để tạo danh sách thứ hai hiển thị
thông tin chi tiết về billing. Bạn có thể sử dụng cấu trúc "ZBilling" trong DDIC:
data : itab_billing like ZBilling occurs 0.
http://ecvin.net
Http://ecvin.net
Giả sử bạn tạo internal table thứ ba "itab_bu" từ table "BU" như sau:
data: begin of itab_bu occurs 0,
BU_code type Billing_BU-BU_code,
head_name type BU-head_name,
BU_address type BU-BU_address,
end of itab_bu.
Sau khi định nghĩa 3 internal table với các trường cần hiển thị trong danh sách, bạn có
thể lấy dữ liệu từ table vào internal table:
select document_number BU_code into itab_billing_bu from Billing_BU.
select * into itab_billing from Billing.
select * into itab_bu from BU.
b. Sử dụng event và message:
Bạn muốn modularize chương trình report và cho phép nó trả lời các sự kiện được yêu
cầu. Bạn muốn chứa câu lệnh lấy dữ liệu từ các table "Billing_BU", "Billing" và "BU"
trong event block thích hợp. Hơn nữa, bạn muốn thêm các câu lệnh trong event block để
thực thi khi người dùng nhấp đôi vào danh sách cơ bản.
"create basic list
select document_number BU_code into itab_billing_bu from from Billing_BU.
at start-of-selection.
" create secondary lists
select * from into itab_billing from Billing.
select * from into itab_bu from BU.
Để tạo hai danh sách thứ hai dựa vào dòng và trường mà người dùng nhấp đôi trong
danh sách cơ bản, bạn cần rút trích tên và giá trị của trường vào lúc runtime.
II. Lập trình hướng đối tượng trong ABAP
1. Lớp trong ABAP:
a. Đặc trưng của lập trình HĐT:
Chương trình ABAP chứa nhiều khối: khai báo dữ liệu (data declaration), start-of-
selection, end-of-selection. Khối chương trình được thực thi tuần tự => mô hình lập
trình thủ tục.
http://ecvin.net
Http://ecvin.net
Lập trình thủ tục sử dụng các hàm (function) và subroutine được gọi trong chương trình.
Dữ liệu và hàm không liên kết với nhau.
Lập trình HĐT dựa vào khái niệm lớp. Một lớp là tập hợp các đối tượng có cùng thuộc
tính. Một đối tượng là thể hiện của một lớp.
Ví dụ: Có hai phòng ban: Finance và HR trong công ty, Finance và HR là các đối tượng
của lớp Department. Chúng có các thuộc tính tương tự như Department.
Lập trình HĐT sử dụng các phương thức (method). Dữ liệu và phương thức được liên
kết với nhau và phụ thuộc vào lớp mà chúng được định nghĩa.
Thuận lợi của lập trình HĐT:
+ cho phép cài đặt mô hình nghiệp vụ
+ tái sử dụng code khi tạo chương trình mới
+ dễ hiệu chỉnh vì không ảnh hưởng đến toàn bộ chương trình
+ dễ hiểu vì chứa nhiều khối riêng nhau
+ kích cỡ của chương trình nhỏ
Một lớp chứa 3 thành phần:
+ thuộc tính
+ phương thức
+ sự kiện
Có hai loại lớp:
+ cục bộ
+ toàn cục
Lớp cục bộ chỉ có thể được truy cập bởi chương trình trên application server cục bộ.
Bạn có thể định nghĩa các lớp cục bộ bằng ABAP Editor.
Lớp toàn cục được truy cập bởi các chương trình trên tất cả application server. Bạn định
nghĩa lớp cục bộ bằng công cụ gọi là Class Builder.
b. Định nghĩa lớp và các thuộc tính (attribute) của nó:
Một lớp chứa:
http://ecvin.net
Http://ecvin.net
+ phần định nghĩa
+ phần cài đặt
Định nghĩa các thành phần: thuộc tính, sự kiện, phương thức trong phần định nghĩa.
Phần cài đặt chứa code cho các sự kiện và các phương thức được định nghĩa trong phần
định nghĩa.
Phần định nghĩa của một lớp là:
+ public
+ protected
+ private
Khi định nghĩa lớp, bạn xác định từ khóa class theo sau bởi tên lớp. Đồng thời chỉ định
từ khóa definition hoặc implementation để chỉ phần lớp mà bạn đang định nghĩa.
*---------------------------------------------*
* class name definition *
*---------------------------------------------*
class name definition.
public section.
protected section.
private section.
endclass.
*-------------------------------------------*
* class name implementation *
*-------------------------------------------*
class name implementation.
end class.
Giả sử bạn định nghĩa lớp employee, bạn chỉ muốn lớp employee và các lớp con của nó
có thể truy cập vào biến "first_name" và phương thức "display_attributes".
*---------------------------------------------*
* class name definition *
*---------------------------------------------*
http://ecvin.net
Http://ecvin.net
class employee definition.
protected section.
data first_name(10) type c.
data last_name(10) type c.
"code to define the method comes here
endclass.
*---------------------------------------------*
* class name implementation *
*---------------------------------------------*
class employee definition.
"code to implement the method comes here
endclass.
Thuộc tính là thành phần của lớp. Nó quan trọng vì thuộc tính lưu dữ liệu trong chương
trình. Bạn có thể thao tác dữ liệu và thực hiện các thao tác logical thể tạo ra kết qủa như
mong muốn.
Phương thức nhận dữ liệu từ chương trình, xử lý dữ liệu và trả về kết xuất. Sử dụng câu
lệnh methods để định nghĩa phương thức trong một lớp. Bạn cần xác định tên phương
thức trong câu lệnh methods.
methods : method name.
Giả sử bạn định nghĩa một phương thức "display_attributes" trong lớp "employees". Chỉ
http://ecvin.net
Http://ecvin.net
có các đối tượng của lớp "employees" mới có thể truy cập các phương thức đó.
class employees definition.
private section.
methods : display_attributes.
endclass.
Khi bạn cần định nghĩa một phương thức nhận dữ liệu từ chương trình, bạn sử dụng từ
khóa importing. Xác định tên của đối tượng dữ liệu trong câu lệnh methods.
methods method name importing variable type data type.
Ví dụ:
methods get_name importing name(15) type c.
Khi muốn trả kết xuất của phương thức cho chương trình, bạn sử dụng từ khóa
exporting:
methods method name exporting variable type data type.
Ví dụ:
methods display_name exporting name(15) type c.
Định nghĩa phương thức "display_info" chỉ có lớp "employee" có thể truy cập:
class employee definition.
private section.
methods display_info exporting code type c.
endclass.
Sau khi định nghĩa phương thức trong lớp, bạn cần viết code để cài đặt phương thức
trong phần cài đặt của lớp.
method method name.
statements.
endmethod.
Ví dụ:
method employee.
write : / 'Name of the employee is:', name.
endmethod.
Sau khi định nghĩa và cài đặt phương thức trong lớp, bạn có thể gọi phương thức trong
http://ecvin.net
Http://ecvin.net
chương trình. Bạn sử dụng đối tượng để gọi phương thức trong chương trình.
object name->method name(variable name = value).
emp_name->display_attributes().
Ví dụ:
class airplane definition.
private section.
methods get_attributes importing flight_num type c.
data name type string.
endclass.
class airplane implementation.
method get_attributes.
name = flight_num.
endmethod.
endclass.
start-of-selection.
data flight_list type ref to airplane.
create object flight_list.
flight_list->get_attributes(flight_num(5) = 'JJ25').
Event là một loại phương thức được rút trích dựa vào điều kiện mà bạn chỉ định. Chỉ
định một event thực thi khối chương trình gọi là event handlers.
Định nghĩa event bằng câu lệnh events:
events event name.
Xác định tham số kết xuất cho sự kiện, sử dụng từ khóa exporting với các tham số.
events event name exporting variable name type data type.
Ví dụ:
events increment exporting counter(3) type n.
Định nghĩa một event handler để xác định code cần được thực thi khi một sự kiện được
rút trích. Sử dụng câu lệnh set handler để định nghĩa event handler.
set handler object name->method name for variable.
http://ecvin.net
Http://ecvin.net
Ví dụ:
set handler emp_name->display_name for name.
=> sử dụng đối tượng "emp_name" để gọi phương thức "display_name" khi sự kiện rút
trích event handler. Biến "name" là tham số đầu vào cho phương thức.
Khi bạn định nghĩa một event trong lớp, bạn có thể rút trích sự kiện trong chương trình
bằng câu lệnh raise event.
raise event event name.
if emp_code = 12455.
raise event display_name.
else.
continue.
endif.
Giả sử bạn kiểm tra giá trị "counter" và rút trích event "display_value" khi giá trị là
"10". Khi được rút trích, sự kiện gọi phương thức "display" để hiển thị message "The
value of counter equals 10". Bạn cần định nghĩa event handler cho event.
class numbers definition.
private section.
events display_value exporting value type n.
methods display.
endclass.
class numbers implementation.
"code to implement the method comes here
endclass.
start-of-selection.
data counter type n value 0.
counter = counter + 1.
if counter = 12445.
raise event display_value.
else
continue.
endif.
http://ecvin.net
Http://ecvin.net
set handler emp_name->display for counter.
Bạn muốn định nghĩa event "display_info" trong lớp "products". Bạn muốn rút trích
event nếu giá trị của product code là "pp0023". Khi event handler được rút trích, bạn
muốn gọi phương thức "define" để hiển thị product code.
class products definition.
public section.
methods : display exporting code c.
methods : m1.
events display_info.
endclass.
class products implementation.
method display.
"code for method comes here
endmethod.
method m1.
if code= 'pp0023'.
raise event display_info.
endif.
endmethod.
endclass.
start-of-selection.
"code to create an object comes here
set handler r_dis->display for code.
Trước khi gọi phương thức, cần định nghĩa một biến của lớp.
data variable name type ref to class name.
Ví dụ:
dat flight_num type ref to airplane.
Sau khi định nghĩa một biến lớp, bạn sử dụng câu lệnh create để tạo đối tượng. Sau đó
gọi phương thức của lớp bằng cách sử dụng đối tượng này.
create object object name.
object name-> method name().
http://ecvin.net
Http://ecvin.net
Ví dụ:
start-of-selection.
data flight_num type ref to airplane.
create object flight_num.
flight_num->display_details().
Giả sử bạn định nghĩa phương thức "display_name" trong lớp "employee". Bạn muốn
gọi phương thức trong chương trình bằng cách sử dụng đối tượng "r_dis" của lớp
"employee". Để định nghĩa biến sử dụng data r_dis type ref to employee, để tạo đối
tượng sử dụng create object r_dis, và gọi phương thức sử dụng r_dis->display_name().
class employee definition.
public section.
methods display_name.
data name type c.
endclass.
class employee implementation.
method display_name.
"code for the method comes here
endmethod.
endclass.
start_of_selection.
data r_dis type ref to employee.
create object r_dis.
r_dis->display_name().
Note:
ABAP hỗ trợ hai mô hình lập trình: thủ tục và hướng đối tượng. Lập trình HĐT dựa vào
khái niệm lớp. Dữ liệu và phương thức trong chương trình HĐT được liên kết với nhau
và phụ thuộc vào lớp mà bạn định nghĩa chúng.
Bạn định nghĩa thành phần: thuộc tính, sự kiện, phương thức của lớp trong các vùng:
public, protected, private.
Phương thức nhận dữ liệu từ chương trình, xử lý dữ liệu và trả về kết xuất cho chương
trình.
Sự kiện được rút trích dựa vào điều kiện. Khi một sự kiện được rút trích, khối chương
trình gọi event handers sẽ được thực thi.
http://ecvin.net
Http://ecvin.net
Khi bạn định nghĩa hoặc cài đặt một lớp, bạn có thể gọi các phương thức của lớp bằng
cách khởi tạo lớp.
2. Đặc tính của các đối tượng:
a. Đặc tính của các đối tượng:
Các đối tượng ABAP cung cấp nhiều đặc tính như: kế thừa, đóng gói, đa hình. Các đặc
tính này cho phép bạn cài đặt các ngữ cảnh phức tạp mà không cần các đoạn mã dài.
Hơn nữa nó cho phép bạn cài đặt dữ liệu bảo mật.
Các lớp con kế thừa các thành phần: phương thức, sự kiện, thuộc tính. Ví dụ: lớp con
"boeing" và "airbus" kế thừa các thuộc tính của lớp cha "airplane".
Lớp con có thể truy cập các thành phần public và protected của cha. Hơn nữa ngoài các
thành phần của lớp cha, lớp con có thể tạo thành phần riêng của nó.
Tính đóng gói đảm bảo dữ liệu của đối tượng không được truy cập bên ngoài lớp. Ví dụ:
nếu bạn định nghĩa phương thức "fuel_efficiency" trong lớp "vehicle", lớp con "car" và
"truck" có thể truy cập phương thức. Tuy nhiên, cài đặt chi tiết việc tính toán bị dấu đối
với lớp con.
Bạn định nghĩa thuộc tính, phương thức, sự kiện trong vùng public, protected, private
của lớp dựa vào loại truy cập mà bạn muốn cho phép. Ví dụ: nếu bạn định nghĩa phương
thức private trong lớp, chỉ lớp đó mới có thể truy cập phương thức.
http://ecvin.net
Http://ecvin.net
Đa hình cho phép bạn cài đặt một phương thức theo nhiều cách. Nó cho phép một
phương thức tạo ra nhiều loại kết xuất khác nhau khi nhiều lớp con gọi nó.
Ví dụ: bạn định nghĩa một phương thức "total_fare" để tính toán tiền máy bay dựa vào
khoảng cách du lịch. Có hai lớp "business" và "economy" sử dụng cùng một phương
thức tính tiền. Tuy nhiên cài đặt thì khác nhau trong hai lớp.
b. Cài đặc tính kế thừa:
Định nghĩa lớp con, sử dụng từ khóa inheriting trong câu lệnh class:
class subclass definition inheriting from superclass.
statements.
endclass.
Giả sử bạn định nghĩa phương thức "total_stock" trong vùng protected của lớp
"raw_material". Ngoài ra, còn tạo lớp con "lcd_screen" kế thừa nó.
class raw_material definition.
protected section.
data stock type n.
methods : total_stock redefinition.
endclass.
class raw_material implementation.
http://ecvin.net
Http://ecvin.net
"code to implement the method comes here
endclass.
class lcd_screen definition inheriting from raw_material.
endclass.
Nếu bạn muốn lớp con truy cập phương thức của lớp cha, bạn cần tạo một đối tượng của
lớp con trong vùng start-of-selection của chương trình chính.
class raw_material definition.
protected section.
data stock type n.
methods : total_stock redefinition.
endclass.
class raw_material implementation.
"code to implement the method comes here
endclass.
class lcd_screen definition inheriting from raw_material.
endclass.
start-of-selection.
data r_stock type ref to lcd_screen.
create object r_stock.
Do kế thừa cho phép đối tượng "r_stock" của lớp con truy cập phương thức
"total_stock" của lớp cha.
start-of-selection.
data r_stock type ref to lcd_screen.
create object r_stock.
r_stock->total_stock( );
c. Cài đặt tính đóng gói:
Thay vì định nghĩa các thành phần trong lớp, bạn có thể cài đặt tính đóng gói bằng
interface - là các lớp đặc biệt không chứa phần cài đặt. Sau đó bạn có thể định nghĩa các
phương thức, sự kiện, thuộc tính trong một giao diện và cài đặt chúng trong các lớp
khác.
http://ecvin.net
Http://ecvin.net
Tất cả các lớp trong chương trình có thể truy cập các thành phần được định nghĩa trong
interface. Do đó interface giúp bạn tạo nhiều chương trình phức tạp.
Sử dụng câu lệnh interface để định nghĩa interface:
interface interface name.
" statements to define components.
endinterface.
Khi bạn muốn truy cập các thành phần của một interface trong một lớp, bạn cần định
nghĩa interface trong lớp bằng câu lệnh interface.
interface interface name.
interface employee.
data name(15) type c.
methods display_name.
endinterface.
class managers defnition.
protected section.
interfaces employee.
endclass.
http://ecvin.net
Http://ecvin.net
class managers implementation.
method display_name.
*code of the method comes here
endmethod.
endclass.
Định nghĩa lại phương thức trong lớp con sử dụng từ khoá redefinition trong câu lệnh
methods.
methods method name redefinition.
Ví dụ:
class products definition inheriting from company.
methods display_attributes redefinition.
Giả sử bạn định nghĩa phương thức "fuel_needed" trong lớp "vehicle". Phương thức tính
toán lượng nhiên liệu mà phương tiện cần để đi du lịch một khoảng cách xác định.
Bạn giả sử lượng nhiên liệu là 1/10 của khoảng cách.
class vehicle definition.
public section.
methods : fuel_needed importing im_distance type i.
data distance type i.
fuel type i.
endclass.
class vehicle implementation.
method fuel_needed.
distance = im_distance.
fuel = distance / 10.
write : total fuel needed = ', fuel.
endmethod.
endclasss.
Bạn muốn định nghĩa lớp con "car" và "truck" sử dụng phương thức "fuel_needed" để
hiển thị lượng nhiên liệu mà xe hơi và xe tải cần. Giả sử fuel của xe hơi là
1/15*distance, xe tải là 1/5*distance.
http://ecvin.net
Http://ecvin.net
Bạn muốn phương thức "fuel_needed" tạo ra hai kết quả khác nhau khi "car" và "truck"
gọi nó. Do đó bạn cần định nghĩa lại phương thức trong cả hai lớp con. Đầu tiên định
nghĩa lớp "car".
class car definition inheriting from vehicle.
public section.
methods : fuel_needed redefinition.
endclasss.
class car implementation.
method fuel_needed.
distance = im_distance.
fuel = distance / 15.
write : / 'total fuel needed for a car is:', fuel.
endmethod.
endclasss.
*---------------------------------------------
class truck definition inheriting from vehicle.
public section.
methods : fuel_needed redefinition.
endclass.
class truck implementation.
method fuel_needed.
distance = im_distance.
fuel = distance / 5.
write : / 'total fuel needed for a truck is:', fuel.
endmethod.
endclass.
Định nghĩa các biến của lớp con, tạo đối tượng cho cả hai lớp trong vùng start-of-
selection.
data r_car type ref to car.
data r_truck type ref to truck.
data fuel type i.
http://ecvin.net
Http://ecvin.net
parameter r_dis type i.
start-of-selection.
create object r_car.
create object r_truck.
r_car->fuel_needed( im_distance = r_dis ).
r_truck->fuel_needed ( im_distance = r_dis ).
3. Ví dụ sử dụng lớp trong ABAP:
Định nghĩa lớp "air_fare" chứa phương thức và thuộc tính public.
report z_Airplane_Fare.
class air_fare definition.
"code for the class comes here
endclass.
Định nghĩa phương thức "display_fare". Phương thức tính toán tiền dựa vào khoảng
cách du lịch nó nhận từ chương trình chính.
class air_fare definition.
methods display_fare importing im_distance type i.
data distacne type i.
data fare type i.
endclass.
class air_fare implementation.
method display_fare.
distance = im_distance.
fare = distance * 10.
endmethod.
endclass.
Định nghĩa hai lớp con "business" và "economy" để truy cập vào component của lớp
cha "air_fare".
class business definition inheriting from air_fare.
public section.
endclass.
class economy definition inheriting from air_fare.
public section.
http://ecvin.net
Http://ecvin.net
endclass.
Sau khi định nghĩa hai lớp con, bạn cài đặt chúng. Bạn muốn sử dụng lại phương thức
"display_fare" hiển thị tiền khác cho cùng khoảng cách khi lớp con "business" và
"economy" gọi phương thức trong chương trình.
class business definition inheriting from air_fare.
public section.
methods display_fare redefinition.
endclass.
class business implementation.
method display_fare.
distance = im_distance.
fare = distance * 50.
write : / 'The fare for business class is:', fare.
endmethod.
endclass.
class economy definition inheriting from air_fare.
public section.
methods display_fare redefinition.
endclass.
class economy implementation.
method display_fare.
distance = im_distance.
fare = distance * 30.
write : / 'The fare for business class is:', fare.
endmethod.
endclass.
Bạn muốn gọi phương thức "display_fare" trong chương trình để hiển thị tiền dựa vào
khoảng cách mà người dùng chỉ định. Bạn cần định nghĩa một biến "r_business" của lớp
"business" và tạo đối tượng tham chiếu đến phương thức.
Để định nghĩa biến, bạn sử dụng type ref to business và tạo đối tượng bằng create object
r_business.
http://ecvin.net
Http://ecvin.net
data r_business type ref to business.
data r_ economy type ref to economy.
data fare type i.
parameter r_dis type i.
start-of-selection.
create object r_business.
create object r_economy.
r_business-> display_fare(im_distance = r_dis ).
r_economy -> display_fare(im_distance = r_dis ).
ABAP Fundamentals
II. Giới thiệu ABAP:
1. ABAP và Workbench:
a. Giới thiệu ABAP:
ABAP là ngôn ngữ lập trình thế hệ thứ tư của SAP (fourth generation language), tất cả
module của SAP R/3 - Sales and Distribution (SD), Materials Management (MM),
Financial Accounting (FI), và Production Planing and Control (PP) đều được viết bằng
ABAP.
Tất cả module đều chứa nhiều giao dịch. Giao dịch cho phép bạn tạo, thay đổi hoặc hiển
thị thông tin được lưu trong CSDL.
b. Chương trình ABAP:
Khi thực thi một giao dịch trong SAP R/3, một chương trình ABAP sẽ chạy phía dưới.
http://ecvin.net
Http://ecvin.net
Chương trình rút trích thông tin liên quan từ CSDL dựa vào tham số được xác định cho
giao dịch và hiển thị kết xuất. Mỗi màn hình bạn thấy trong SAP R/3 được tạo bằng
chương trình ABAP.
Có hai loại chương trình ABAP là report và dialog.
Có hai loại report:
Loại report truyền thống chỉ rút trích thông tin từ CSDL và hiển thị kết xuất ra màn
hình.
Trong khi interactive report sẽ giao tiếp với người dùng trên màn hình kết xuất để bạn
sắp xếp và in thông tin được chọn và điều khiển số trường trên màn hình kết xuất.
http://ecvin.net
Http://ecvin.net
Chương trình dialog chứa nhiều màn hình cho phép bạn thao tác với thông tin trên màn
hình kết xuất. Sử dụng chương trình này, màn hình kết xuất có thể chứa trường nhập
liệu, nút nhấn và nhiều vùng có thể cuộn khác.
Giả sử bạn muốn thay đổi thông tin liên lạc của khách hàng. Trong trường hợp này, bạn
xác định customer code trên màn hình đầu tiên. Màn hình kế tiếp sẽ hiển thị thông tin
liên quan đến khách hàng được chỉ định. Bạn sửa thông tin liên lạc của khách hàng và
lưu nó. Thông tin này sẽ được cập nhật vào CSDL.
Trình thông dịch sẽ thông dịch chương trình ABAP, report và dialog. Trình thông dịch là
http://ecvin.net
Http://ecvin.net
một chương trình thực thi một chương trình khác. Trình thông dịch sẽ đọc từng dòng
code. Nếu có lỗi như lỗi cấu trúc thì trình thông dịch sẽ báo cáo số thứ tự của dòng mà
lỗi xảy ra và không đọc dòng mã kế tiếp.
Khi chương trình ABAP được thực thi, đối tượng runtime của chương trình sẽ tự động
được tạo. Đối tượng runtime được gọi sẽ hiển thị kết quả của chương trình. Nếu bạn
thay đổi chương trình, đối tượng runtime sẽ tự động được phát sinh vào lần kế tiếp bạn
thực thi chương trình.
Dialog program: cho phép bạn thao tác thông tin.
Traditional report program: cho phép bạn chỉ xem thông tin.
Interactive report program: cho phép bạn sắp xếp thông tin.
c. Thành phần của chương trình ABAP:
+ source code
+ attribute
+ text elements
+ documentation
+ variants
1. Attribute: thuộc tính chương trình
2. Documentation: giúp developer hiểu luồng chương trình
3. Source code: là tập hợp các hướng dẫn chỉ định trong chương trình
http://ecvin.net
Http://ecvin.net
4. Text element: mô tả ngắn trong chương trình
d. ABAP Workbench:
ABAP Workbench là môi trường phát triển mà SAP R/3 cung cấp. Sử dụng ABAP
Workbench, bạn có thể:
+ tạo, sửa và kiểm tra chương trình
+ tạo giao diện người dùng
+ tạo và truy cập CSDL
+ tạo Web service.
Để truy cập vào ABAP Workbench, nhấp đôi vào Tools -> ABAP Workbench ->
Overview -> SE80 -> Object Navigator.
ABAP là ngôn ngữ lập trình của SAP cho phép bạn tùy chỉnh các module đang tồn tại
trong SAP R/3.
Có hai loại chương trình: report và dialog. Chương trình report có hai loại: traditional
report rút trích thông tin từ CSDL và hiển thị kết xuất lên màn hình, interactive report
cho phép giao tiếp nhiều hơn traditional report. Dialog report giúp thao tác thông tin
được hiển thị trên màn hình kết xuất.
2. Các công cụ trong Workbench:
a. Công cụ phát triển (Development tool):
Ứng dụng SAP R/3 chứa các chương trình được viết bằng ngôn ngữ ABAP. ABAP
Workbench là môi trường cung cấp các công cụ để:
+ viết và sửa chương trình ABAP
+ thiết kế màn hình, menu bar, toolbar
+ test và debug chương trình ABAP
+ theo dõi phiên bản chương trình
ABAP Workbench chứa các công cụ:
+ debugging
+ development
+ navigation
+ organizing
http://ecvin.net
Http://ecvin.net
Menu Painter là công cụ để thiết kế giao diện người dùng.
b. Công cụ định vị (Navigation tool):
Công cụ định vị cho phép bạn sửa và lưu các đối tượng được tạo. Ví dụ: bạn đã viết một
chương trình thiết kế màn hình bằng công cụ Screen Painter. Sử dụng công cụ định vị
bạn có thể sửa và lưu chương trình trong ABAP Editor mà không cần Screen Painter.
Có bốn công cụ navigation trong ABAP Workbench:
http://ecvin.net
Http://ecvin.net
1. Application Hierachy: cho phép xem các thành phần của SAP R/3 cung cấp cho
module Human Resource.
2. Data Browser: xóa dữ liệu từ một dòng tồn tại trong table.
3. Object Navigator: sửa chương trình được viết cho thành phần screen từ ABAP
workbench.
4. Repository Information System: tìm bảng được lưu trong SAP R/3.
c. Công cụ dò lỗi (Debugging tool):
Các công cụ dò lỗi có trong ABAP Workbench:
d. Công cụ sắp xếp (Organizing tool):
Các công cụ sắp xếp có trong ABAP Workbench là:
+ Transport System
http://ecvin.net
Http://ecvin.net
+ Workbench Organizer
e. Truy cập vào các công cụ trong Workbench:
Bạn có thể truy cập vào ABAP Workbench bằng hai cách: sử dụng transaction code
hoặc SAP menu.
Để truy cập vào công cụ Data Browser sử dụng transaction code, gõ SE16 trong
Command field trên thanh công cụ chuẩn và nhấn Enter (sử dụng màn hình ‘Data
Browser, Initial Screen’, bạn có thể xem và sửa dữ liệu được lưu trong các bảng). Hoặc
sử dụng menu: Tools -> ABAP Workbench -> Overview -> SE16 -> Data Browser.
ABAP Workbench là môi trường lập trình đưa ra công cụ phát triển, định vị, dò lỗi, tổ
chức để tạo và bảo trì ứng dụng SAP R/3. Sử dụng các công cụ phát triển: ABAP Data
Dictionary, ABAP Editor, Function Builder, Menu Painter, Screen Painter để tạo và sửa
chương trình. Sử dụng công cụ định vị: Application Hierarchy, Data Browser, Object
Navigator và Repository Information System để định vị chương trình ABAP. Sử dụng
công cụ dò lỗi: On Line Debugger, Run Time Analysis, SQL Trace và System Log để
tìm vị trí lỗi trong chương trình và điều chỉnh chúng. Sử dụng công cụ tổ chức:
Transport System và Workbench Organizer để tránh tạo nhiều loại đối tượng trùng nhau
và chuyển chương trình từ server này đến server khác. Bạn có thể truy cập vào công cụ
ABAP Workbench bằng transaction code hoặc menu.
3. Từ điển dữ liệu (Data Dictionary):
a. Tổng quan về từ điển dữ liệu:
ABAP Dictionary cho phép bạn định nghĩa các đối tượng dữ liệu bao gồm: table, view,
structure. ABAP Dictionary là một trình chứa các định nghĩa cho các đối tượng dữ liệu
mà bạn tạo trong SAP R/3.
Trước khi tạo đối tượng trong SAP R/3, bạn cần định nghĩa cấu trúc của đối tượng. Ví
dụ: trước khi tạo table, bạn cần định nghĩa table bằng cách mô tả cấu trúc của nó trong
ABAP Dictionary. Cấu trúc table chứa các thành phần như trường, khóa ngoại, chỉ mục.
Khi bạn sửa định nghĩa của đối tượng trong ABAP Dictionary, định nghĩa được sửa
được tự động áp dụng cho đối tượng sử dụng nó. Điều này đảm bảo tính toàn vẹn dữ
liệu.
http://ecvin.net
Http://ecvin.net
Giả sử bạn định nghĩa cấu trúc bảng ZCustomer. Bảng có trường CName. Chiều dài của
trường được thiết lập là 15 ký tự.
b. Các đối tượng trong ABAP Dictionary:
Các đối tượng ABAP Dictionary cơ bản: table, data element và domain.
Trong SAP R/3, dữ liệu được lưu trong các bảng. Một bảng là một đối tượng nhiều
chiều và chứa nhiều dòng nhiều cột. Mỗi bảng có một tên duy nhất, có từ Z đứng trước.
Một cột trong bảng biểu diễn một trường và một dòng biểu diễn một bảng ghi (record).
Mỗi trường trong bảng có các đặc tính:
+ đặc tính kỹ thuật (technical characteristic): loại dữ liệu, chiều dài và giá trị thập
phân.
+ mô tả (short description): mô tả mục đích của trường
+ nhãn (field label): xác định tiêu đề cho trường
+ tài liệu (documentation): trợ giúp cho trường
Bạn có thể cung cấp các đặc tính của trường trong định nghĩa bảng, hoặc bạn có thể
định nghĩa data element và gán nó cho một trường => tái sử dụng cho một vài bảng có
cùng trường.
Có 6 đối tượng được tạo trong ABAP Dictionary:
http://ecvin.net
Http://ecvin.net
1. Data element: chứa đặc tính của trường.
2. Type group: kiểu dữ liệu người dùng tự định nghĩa.
3. Domain: định nghĩa dãy giá trị.
4. Search help: hiển thị giá trị nhập cho một trường.
ABAP Dictionary được tích hợp với ABAP Workbench và chứa định nghĩa cho các đối
tượng được tạo trong SAP R/3. Tất cả chương trình runtime đều tham chiếu đến ABAP
Dictionary để thu thập thông tin. ABAP Dictionary đảm bảo dữ liệu thống nhất và toàn
vẹn.
Các đối tượng ABAP Dictionary bao gồm: table, view, data element, structure, table
type, lock object, search help và online help.
Sử dụng công cụ Run Time Analysis để cải tiến tốc độ chương trình, gõ SE30 trong
trường Command và nhấn Enter.
/******************************************************************/
1. Table trong ABAP
a. Giới thiệu table:
ABAP Dictionary giúp bạn tạo table, bạn có thể tạo 3 loại table sử dụng ABAP
Dictionary.
http://ecvin.net
Http://ecvin.net
Hông giống như transparent table, pooled table và cluster table không được sử dụng để
lưu dữ liệu trong SAP R/3. Pooled table được sử dụng để lưu dữ liệu điều khiển: chuỗi
màn hình hoặc dữ liệu tạm. Cluster table được sử dụng để lưu văn bản giống như tài
liệu.
1. Cluster table: kết nối dữ liệu lại với nhau từ một vài bảng lớn có các trường chung.
2. Pooled table: liên kết các dữ liệu từ một số lớn các bảng nhỏ.
3. Transparent table: lưu dữ liệu của ứng dụng.
Để tạo bảng trong CSDL, bạn cần tạo định nghĩa của nó gọi là table object trong ABAP
Dictionary.
Sau khi bạn tạo định nghĩa table trong ABAP Dictionary chứa: trường, khoá ngoại, thiết
lập kỹ thuật, chỉ mục thì bạn cần kích hoạt nó. Bảng vật lý trong CSDL được tạo khi
bạn kích hoạt định nghĩa table trong ABAP Dictionary.
1. Foreign key: liên kết các trường trong bảng này đến các trường trong bảng khác.
2. Index: rút trích trường chỉ định của bảng và sắp xếp dữ liệu.
3. Table field: định nghĩa kiểu dữ liệu và chiều dài của trường trong bảng.
4. Technical setting: ước tính yêu cầu lưu trữ của một bảng.
b. Tạo Domain và Data Element trong ABAP:
http://ecvin.net
Http://ecvin.net
Bạn có thể định nghĩa các đặc tính kỹ thuật của data element trực tiếp trong ABAP
Dictionary hoặc gán một domain cho nó.
Domain là một đối tượng có các đặc tính:
+ kiểu dữ liệu
+ chiều dài
+ chiều dài thập phân
Các đặc tính này tương ứng với các đặc tính kỹ thuật của data element.
Ví dụ: giả sử bạn tạo một bảng gọi là zemployee có các trường: first, middle, last. Để
định nghĩa các trường trong bảng này, bạn có thể tạo một domain gọi là zname. Domain
này có kiểu dữ liệu là "char" và chiều dài là 30.
http://ecvin.net
Http://ecvin.net
Kế tiếp bạn định nghĩa 3 data element gọi là zfirst, zmiddle và zlast. Bạn có thể gán
domain ‘zname’ cho các data element này để định nghĩa các đặc tính kỹ thuật của
chúng. Hơn nữa, bạn cần thêm mô tả ngắn, nhãn, tài liệu cho mỗi data element.
Cuối cùng, định nghĩa 3 trường trong bảng zemployee: First, Middle và Last. Gán data
element ‘zfirst’, ‘zmiddle’ và ‘zlast’ cho các trường first, middle và last.
Bây giờ zemployee có 3 trường có mô tả, nhãn và tài liệu khác nhưng cùng kiểu dữ liệu
http://ecvin.net
Http://ecvin.net
"char" và chiều dài là 30.
Để truy cập vào ABAP Dictionary: gõ SE11 trong trường Command trên thanh công cụ
chuẩn và nhấn Enter.
Tạo domain ‘zguide’ bằng cách chọn tùy chọn Domain, gõ zguide trong trường Domain
và nhấn Create.
Gõ ‘Tour guides’ trong trường ‘Short Description’, gõ char trong trường ‘Data type’ và
nhấn Enter, gõ 25 trong trường ‘No. characters’ và nhấn Enter => Domain - Save => gõ
tên package, nhấn nút Save trong hộp thoại ‘Create Object Directory Entry’ => nhấn nút
Activate để kích hoạt domain.
http://ecvin.net
Http://ecvin.net
Một domain cũng cho phép bạn giới hạn các giá trị được nhập vào một trường dựa vào
một bảng. Bạn có thể làm điều này bằng cách gán value table cho domain.
Ví dụ: domain zport tham chiếu đến trường nhập vào mã máy bay. Bạn muốn người
dùng chỉ nhập vào các giá mã hợp lệ.
Giả sử zcode là một bảng chứa danh sách các mã máy bay. Nếu bạn gán zcode là value
table cho domain ‘zcode’, thì bất kỳ giá trị được nhập vào trong trường tham chiếu đến
domain ‘zport’ sẽ được kiểm tra dựa vào bảng zcode.
Giả sử bạn tạo một domain zport. Mở tab ‘Value range’ trên màn hình ‘Dictionary:
Maintain Domain’. Để gán bảng zcode là value table cho domain này, gõ zcode trong
trường ‘Value table’ và nhấn Enter.
Bạn tạo domain gọi là zmaterials. Domain cần có mô tả là ‘Material types’. Domain cho
phép trường chỉ chấp nhận 15 ký tự. Domain nên kiểm tra các giá trị được nhập vào
trong trường dựa vào bảng ztypes. Bạn cần gán package ‘$TMP’ cho domain.
Gõ ‘Material types’ trong trường ‘Short Description’, char trong trường ‘Data type’, 15
trong trường ‘No. characters’ và nhấn tab ‘Value range’. Trên trang ‘Value range’, gõ
vào ztypes trong trường ‘Value table’ và nhấn Enter. Sau đó nhấn Domain - Save. Trong
hộp thoại ‘Create Object Directory Entry’, gõ $TMP trong trường Package và nhấn
Save. Kế tiếp bạn nhấn Activate.
http://ecvin.net
Http://ecvin.net
Tạo data element:
Bây giờ bạn có thể sử dụng domain ‘zguide’ để tạo data element gọi là zguide_first.
Data element này sẽ lưu các đặc tính của các trường cần nhập vào tên của người hướng
dẫn.
Tạo data element từ ABAP Dictionary bằng cách chọn tùy chọn ‘Data type’, gõ
zguide_first trong trường ‘Data type’ và nhấn Create -> chọn tùy chọn ‘Data element’
trong hộp thoại ‘Create Type ZGUIDE_FIRST’ -> nhấn nút Continue.
Màn hình ‘Dictionary: Maintain Data Element’ xuất hiện, tab ‘Data Type’ trên màn hình
này được mở mặc định. Gõ ‘Tour guide's first name’ trong trường ‘Short Description’.
Gán domain ‘zguide’ cho data element bằng cách gõ zguide trong trường Domain và
nhấn Enter.
Thiết lập tài liệu: nhấp Goto - Documentation - Status -> chọn tùy chọn (trong ví dụ này
chọn tùy chọn ‘Object requires documentation’). Sau khi lưu documentation status, bạn
có thể thêm tài liệu vào data element. Tài liệu này được hiển thị khi người dùng làm
việc trên trường được gán data element này, nhấn F1 để tìm trợ giúp liên quan đến
trường.
Để thêm tài liệu vào data element, nhấn vào nút Documentation trên thanh công cụ ứng
http://ecvin.net
Http://ecvin.net
dụng => màn hình ‘Change Data element: ZGUIDE_FIRST Language EN’ xuất hiện.
Bạn có thể gõ vào tài liệu trong các trường trống trên màn hình này => nhấn nút
Activate.
Giả sử bạn tạo data element gọi là zguide_last sử dụng domain ‘zguide’. Mô tả của data
element là "Tour guide's last name.". Trên màn hình ‘ABAP Dictionary: Initial Screen’
chọn tùy chọn ‘Data type’, gõ zguide_last trong trường ‘Data type’, và nhấn Create.
Trong hộp thoại ‘Create Type ZGUIDE_LAST’, nhấn Continue. Trên màn hình
‘Dictionary: Maintain Data Element’, gõ ‘guide's last name’ trong trường ‘Short
Description’. Kế tiếp gõ zguide trong trường Domain và nhấn Enter.
Ghi chú:
Data element được sử dụng để lưu các đặc tính của trường. Domain được sử dụng để
lưu các đặc tính kỹ thuật của data element. Để tạo domain, bạn cần cung cấp mô tả và
gán nó một kiểu dữ liệu, chiều dài và chiều dài thập phân. Khi lưu domain, bạn cần gán
cho nó một package. Sau khi domain được lưu, bạn cần kích hoạt nó.
Để tạo data element sử dụng domain, đầu tiên bạn cần xác định mô tả cho data element
và sau đó gán domain cần thiết cho nó. Kế tiếp bạn cần xác định nhãn cho data element.
Khi lưu data element, bạn có thể gán nó một package. Bạn cũng cần xác định một
documentation status cho data element, nếu cần bạn có thể cung cấp documentation
text. Sau khi lưu data element và tạo tài liệu, bạn cần kích hoạt nó.
c. Tạo bảng:
Sử dụng ABAP Dicitonary để tạo table trong SAP R/3. Để tạo table, đầu tiên bạn cần
tạo đối tượng table của nó gọi là định nghĩa table trong ABAP Dictionary. Đối tượng
được tạo độc lập với CSDL. Khi bạn kích hoạt đối tượng này, table sẽ được tạo trong
CSDL.
Các công việc chính khi tạo đối tượng table:
+ tạo các trường
+ gán khóa ngoại cho trường nếu cần
+ nâng cấp (maintain) các thiết lập kỹ thuật của bảng
Trường của bảng có thể được tạo bằng các data element đang tồn tại. Data element lưu
các đặc trưng riêng của các trường. Domain định nghĩa các đặc tính kỹ thuật trong data
http://ecvin.net
Http://ecvin.net
element.
Giả sử bạn muốn tạo bảng gọi là ztourguide lưu dữ liệu gồm ‘employee name’, ‘first
name’, ‘last name’, ‘location of tour guide’.
Khi ‘ABAP Dictionary: Initial Screen’ được mở, tạo bảng ztourguide bằng cách gõ
ztourguide trong trường ‘Database table’ và nhấn Create.
Bạn cần gán một ‘delivery class’ cho bảng để điều khiển cách xử lý dữ liệu khi nó đ ược
sao chép, cập nhật hoặc trao đổi giữa các hệ thống SAP. Một vài delivery class là: A, C,
L, S.
A: bảng này lưu dữ liệu giao dịch và master. C: bảng lưu dữ liệu được sử dụng để điều
chỉnh hệ thống SAP. L: bảng lưu dữ liệu tạm. S: bảng hệ thống được sử dụng trong SAP
R/3.
Trong ví dụ này, bạn có thể gán delivery class ‘A’ cho bảng (vì bảng lưu dữ liệu giao
dịch) bằng cách gõ A trong trường ‘Delivery Class’.
Sau khi chọn delivery class bạn có thể tạo các truờng trong bảng bằng tab ‘Fields’.
Giả sử bạn cần thêm một trường Room_types cho bảng zhotel. Bạn muốn tạo trường
này sử dụng data element ‘zrooms’. Trường này là khóa chính trong bảng zhotel.
Trên tab ‘Field’, trên màn hình ‘Dictionary: Maintain Table’, gõ ‘Room types’ trong
dòng đầu tiên trong cột Field. Sau đó nhấn checkbox tương ứng trong cột Key. Kế tiếp
bạn gõ zrooms trong dòng đầu tiên của cột ‘Data element’, và sau đó nhấn Enter.
http://ecvin.net
Http://ecvin.net
Gán khóa ngoại:
Khóa ngoại được sử dụng để liên kết trường trong bảng này với khóa chính trong bảng
khác. Liên kết này sẽ đảm bảo dữ liệu thống nhất giữa các bảng.
Điều này có nghĩa là dữ liệu được nhập vào trường khóa ngoại của bảng có thể được
kiểm tra dựa vào trường khóa chính của bảng khác.
Khóa chính liên kết đến khóa ngoại được gọi là check field. Bảng mà khóa chính của nó
liên kết đến khóa ngoại được gọi là check table.
Giả sử bạn muốn đảm bảo người dùng chỉ có thể nhập vào employee code có giá trị
trong trường Employee_code của bảng ztourguige.
Để làm điều này, bạn có thể tạo trường khóa ngoại Employee_code, giá trị trong trường
này sẽ được kiểm tra dựa vào khóa chính (mã hợp lệ) của bảng zemployeecode.
Để tạo khóa ngoại Employee_code, đầu tiên chọn nó và nhấn vào nút ‘Foreign key’ trên
tab ‘Fields’.
http://ecvin.net
Http://ecvin.net
=> hộp thoại ‘Create Foreign Key ZTOURGUIDE-EMPLOYEE_CODE’ hiển thị. Hộp
thoại sẽ giúp bạn định nghĩa quan hệ khóa ngoại.
Sau khi chỉ định tên check table, bạn có thể để hệ thống SAP đưa ra check field thích
hợp của bảng zemployeecode để liên kết với khóa ngoại của bảng ztourguide bằng cách
nhấn nút ‘Generate proposal’ => chấp nhận gợi ý bằng cách nhấn nút Copy => Table -
Save, gõ tên package cho đối tượng table => Save. Sau khi bảng được lưu, bạn có thể
nâng cấp các thiết lập kỹ thuật cho nó.
Nâng cấp các thiết lập kỹ thuật:
Có các thiết lập kỹ thuật quan trọng cho bảng:
Để nâng cấp các thiết lập kỹ thuật của bảng, nhấn vào nút ‘Technical Settings’ trên
thanh công cụ ứng dụng.
Giả sử dữ liệu trong bảng này sẽ được sử dụng như dữ liệu giao dịch. Bạn có thể gán
data class ‘APPL1’ cho bảng.
Sau khi cung cấp data class, bạn cần chọn size category cho bảng. Giả sử bạn mong đợi
bảng này lưu từ 0 đến 40,000 record. Trong trường hợp này, bạn có thể gán size
category ‘0’ cho bảng này.
http://ecvin.net
Http://ecvin.net
Lưu các thiết lập kỹ thuật bằng cách nhấn Settings - Save. Sau khi lưu các thiết lập kỹ
thuật, bạn có thể quay trở lại màn hình ‘Dictionary: Maintain Table’ bằng cách nhấn nút
Back trên thanh công cụ chuẩn => Activate. Bảng ztourguide được kích hoạt và được
tạo trong CSDL. Bây giờ bạn có thể nhập dữ liệu vào bảng này.
Chi chú:
Bạn có thể sử dụng ABAP Dictionary để tạo bảng, đầu tiên cần cung cấp mô tả và gán
delivery class. Kế tiếp bạn cần tạo các trường cho bảng. Bạn có thể sử dụng data
element tồn tại để tạo các trường.
Nếu bạn cần kiểm tra các giá trị được nhập vào trong trường của 1 bảng dựa vào khóa
chính của bảng khác, bạn có thể định nghĩa quan hệ khóa ngoại. Sau khi định nghĩa
khóa ngoại, bạn có thể lưu bảng.
Sau khi lưu bảng, bạn có thể nâng cấp các thiết lập kỹ thuật cho bảng bao gồm: data
class, size category, buffering và logging. Sau khi bạn lưu các thiết lập này, bạn có thể
kích hoạt bảng.
ABAP Programming II
http://ecvin.net
Http://ecvin.net
1. Tạo chương trình dialog
a. Giới thiệu chương trình dialog:
Chương trình report rút trích thông tin từ CSDL và hiển thị kết xuất ra màn hình mà
không cần thay đổi dữ liệu. Nếu bạn muốn thay đổi dữ liệu được lưu trong CSDL, bạn
có thể sử dụng chương trình dialog.
Để làm điều này, bạn cần thiết kế screen và GUI status và kết hợp chúng vào chương
trình dialog. Bởi vì khi bạn thực thi một chương trình dialog, màn hình và GUI status sẽ
xuất hiện. Screen chấp nhận nhập liệu từ người dùng và GUI status được coi như các
thành phần của chương trình dialog. Chương trình dialog còn được gọi là chương trình
module pool.
Screen chứa nhiều phần tử (element) như trường nhập liệu, nút nhấn, checkbox, nút
radio, và thanh cuộn. Thiết kế màn hình bằng công cụ Screen Painter.
GUI status chứa thanh menu, công cụ chuẩn, công cụ ứng dụng và các phím tắt
(function key). Thiết kế GUI status bằng công cụ Menu Painter.
http://ecvin.net
Http://ecvin.net
Sau khi kết hợp các thành phần vào chương trình dialog, bạn cần chỉ định source code
cho mỗi phần tử của screen và GUI status trong chương trình dialog.
Ví dụ: bạn định nghĩa nút Back bằng công cụ Menu Painter. Bạn gắn nút Back vào
chương trình. Khi bạn thực thi chương trình, nút Back sẽ xuất hiện trên màn hình. Tuy
nhiên hông có gì xảy ra khi bạn nhấn vào nút Back. Như thế nên bạn cần chỉ định mã
cho nút Back, khi nhấn vào nút Back thì sẽ chuyển đến màn hình trước sau khi bạn lập
trình cho nút Back.
Screen và GUI status được tạo độc lập với chương trình. Điều này có nghĩa là sau khi
thiết kế màn hình và GUI status, bạn có thể kết hợp chúng vào nhiều chương trình
dialog khác. Khi bạn thực thi chương trình, các thành phần này sẽ xuất hiện trên màn
hình kết xuất.
Bạn có thể thực thi chương trình dialog chỉ bằng cách sử dụng transaction code. Bạn
không thể thực thi nó bằng SAP menu.
Khi bạn tạo chương trình dialog, bạn cần làm việc với nhiều thành phần như screen và
GUI status đồng thời. Vì vậy bạn cần sử dụng công cụ Object Navigator để quản lý
chương trình dialog và các thành phần của nó trong một giao tiếp mà không cần truy
cập các công cụ riêng của mỗi thành phần.
Bạn có thể truy cập vào công cụ Object Navigator bằng hai cách: transaction code hoặc
sử dụng SAP menu. Gõ SE80 trong trường Command trên thanh công cụ chuẩn và nhấn
Enter.
Màn hình Object Navigator được chia thành hai vùng: Tools và Navigator.
http://ecvin.net
Http://ecvin.net
Để tạo chương trình dialog ‘Zprog1’, nhấn vào Workbench – Edit object trong công cụ
Object Navigator. Trên màn hình Object Selection chọn tab ‘Program’, Gõ Zprog1 trong
trường Program và nhấn Create => nhấp Continue => gõ ‘Test program’ trong trường
Title, chọn loại chương trình là ‘Module pool’ => nhấp Continue => nhấpSave => gán
package cho chương trình (trong ví dụ này là gõ $TMP trong trường Package) và nhấp
Save => Program - Activate => Continue.
Sau khi kích hoạt chương trình dialog, bạn cần tạo transaction code để thực thi chương
trình. Transaction code giống như một liên kết giữa chương trình và màn hình. Bạn có
thể tạo transaction code bằng công cụ Repository Browser trong ABAP Workbench
hoặc sử dụng transaction code ‘SE93’.
Bạn muốn gán transaction code là ZM_007 để thực thi chương trình Zprog1. Để làm
điều này, gõ ZM_007 vào trường Transaction code và nhấn Transaction - Create => gõ
‘Transaction code for Zprog1’ trong trường ‘Short text’ và nhấn Continue => gõ
ZPROG1 trong trường Program và gõ 0100 trong trường ‘Screen number’.
http://ecvin.net
Http://ecvin.net
Chú ý: ‘SAP GUI for HTML’, ‘SAPGUI for Java’ và ‘SAPGUI for Windows’ nên được
chọn. Điều này đảm bảo rằng chương trình Zprog1 tương thích với nền Java và
Windows.
Sau đó nhấn Transaction code – Save => gõ $TMP trong trường Package và nhấn Save.
Sau khi lưu transaction code, bạn có thể chạy chương trình bằng cách gõ ZM_007 trong
trường Command trên thanh công cụ chuẩn và nhấn Enter.
b. Tạo screen và GUI status:
Sau khi tạo chương trình dialog, bạn cần tạo screen. Screen là loại hộp thoại phổ biến
nhất được sử dụng trong chương trình ABAP. Screen giống như một kết nối giữa người
dùng và chương trình dialog.
Ví dụ: khi bạn thực thi chương trình dialog, screen xuất hiện. Bạn chỉ định các tham số
trên screen, chương trình dialog sẽ rút trích các thông tin từ screen, xử lý nhập liệu và
hiển thị kết xuất lên screen.
http://ecvin.net
Http://ecvin.net
Một screen chứa nhiều thành phần:
+ attribute
+ layout
+ field attribute
+ flow logic
Bạn có thể tạo screen bằng công cụ Screen Painter. Bạn có thể triệu gọi công cụ này
bằng 3 cách:
+ sử dụng công cụ Object Nagigator
+ sử dụng transaction code
+ sử dụng SAP menu
Để tạo được một screen, bạn cần:
+ định nghĩa thuộc tính
+ chọn phần tử và đặt chúng vào screen
+ chỉ định các thuộc tính của các phần tử
Tạo màn hình chứa các trường: ‘Airline carrier’, ‘Flight number’, ‘Flight fare’ và
‘Departure date’. Bạn có thể sử dụng transaction code ‘SE51’ để triệu gọi công cụ
Screen Painter.
http://ecvin.net
Http://ecvin.net
Gõ tên chương trình là Zprog1, số màn hình là 0100. Giả sử bạn muốn định nghĩa các
thuộc tính, chọn tùy chọn Attributes => Screen - Create => gõ ‘Display flight details’ và
‘0200’ trong trường ‘Short description’ và ‘Next screen’.
Bạn cần tạo hai screen: screen đầu tiên để nhận ‘employee ID’, screen thứ hai có số là
0200 sẽ lấy tất cả các chi tiết liên quan đến employee => gõ ‘Validating Employee IDs’
trong trường ‘Short description’ và 0200 trong trường ‘Next Screen’ => nhấn Enter.
Sau khi định nghĩa thuộc tính, bạn cần thiết kế layout. Chọn text box, push button,
checkbox và radio button và đặt chúng vào màn hình. Để làm điều này, nhấn Goto -
Layout => màn hình ‘Screen Painter: Change Screen ZPROG1 0100’ xuất hiện => nhấn
T trên pane trái, nhấp vào trong box trên screen, nhấp và gõ ‘Airline carrier’ trong
trường Text, nhấp và gõ AC trong trường Name và nhấn Enter.
http://ecvin.net
Http://ecvin.net
Giả sử bạn muốn thêm input field bên cạnh text field ‘Airline carrier’, nhấp biểu tượng
Input/Output trên pane trái => nhấp vào box trên màn hình => nhấp vào trường Text và
nhấn spacebar => gõ ACI trong trường Name và nhấn Enter.
Giả sử bạn muốn trường ‘Flight fare’ không được sửa, chọn input/output field ‘Flight
fare’ và nhấp Goto - Secondary window - Attributes => chọn tab Program => xóa
checkbox ‘Input field’. Bạn muốn text box ‘Departure date’ chỉ chấp nhận các ngày có
định dạng hợp lệ, chọn input/output text box ‘Departure date’ và nhấp Goto - Secondary
window – Attributes => trên tab ‘Dict’, nhấp list box ‘Format’ và chọn ‘DATS Date
yyymmdd’ (tương tự, để đảm bảo text box chỉ nhận các ký tự, bạn có thể chọn kiểu dữ
liệu ‘CHAR Character string, fixed length’) => Screen – Activate => nhấp Continue =>
Screen – Save.
http://ecvin.net
Http://ecvin.net
Giao diện người dùng chứa thanh menu, công cụ chuẩn, công cụ ứng dụng và phím tắt
được gọi là ‘GUI status’.
Giả sử bạn muốn tạo GUI status cho screen chứa các trường ‘Airline carrier’, ‘Flight
number’, ‘Flight fare’ và ‘Departure date’. Bạn muốn chỉ nút Save và Back đang kích
hoạt trên thanh công cụ chuẩn và biểu tượng Display trên thanh công cụ ứng dụng.
Tạo GUI status bằng công cụ Menu Painter. Công cụ này là một trong các công cụ của
ABAP Workbench. Tương tự như Screen Painter, bạn có thể triệu gọi nó theo 3 cách.
http://ecvin.net
Http://ecvin.net
Gõ transaction code ‘SE41’ để triệu gọi công cụ Menu Painter.
Chương trình tên là ZPROG1 và GUI status tên là ZGUI được gõ trong trường Program
và Status trên cửa sổ ‘Menu Painter: Initial Screen’ => User interface - Create.
Gõ ‘GUI status for Zprog1 program’ trong trường ‘Short text’ => click Continue. Sử
dụng màn hình ‘Maintain Status ZGUI of Interface ZPROG1’, bạn có thể tạo thanh
menu, thanh công cụ chuẩn, thanh công cụ ứng dụng và phím tắt.
Bây giờ bạn có thể thêm biểu tượng Display trên thanh công cụ ứng dụng. Trước khi
thêm bạn cần:
+ tạo function text cho biểu tượng xuất hiện giống như tool tip khi bạn di chuyển
chuột lên nó.
+ gán biểu tượng cho function text.
+ gán phím tắt cho biểu tượng.
http://ecvin.net
Http://ecvin.net
Giả sử bạn muốn chữ Display hiển thị khi di chuyển chuột lên biểu tượng Display, nhấp
Expand, nhấp và gõ Display trong ô đầu tiên và nhấn Enter.
http://ecvin.net
Http://ecvin.net
Tạo nút Save và Back trên thanh công cụ chuẩn, nhấp Expand, nhấp và gõ Save, Back
trong text box phía trên biểu tượng Save và Back, sau đó nhấn Enter.
http://ecvin.net
Http://ecvin.net
Bây giờ bạn có thể kích hoạt GUI status, nhấn User interface – Activate => Continue =>
User Interface – Save.
c. Định nghĩa Flow logic với ABAP:
Sau khi định nghĩa screen và GUI status, bạn định nghĩa flow logic của screen. Flow
logic của screen xác định các hành động trong quá trình xử lý screen.
Không giống như chương trình ABAP, bạn định nghĩa flow logic của screen bằng trình
soạn thảo ‘Flow logic’ - tương tự như công cụ ABAP Editor.
Để truy cập vào trình soạn thảo ‘Flow logic’, bạn chọn tùy chọn ‘Flow logic’ trên
‘Screen Painter: Initial Screen’ của công cụ Screen Painter.
Khi bạn định nghĩa flow logic, bạn cần phải viết code trong một số sự kiện. Một sự kiện
là một hành động xảy ra trong suốt quá trình xử lý screen. Bạn cũng có thể tạo chương
trình ABAP, gắn nó vào sự kiện, thay vì viết code trực tiếp trong sự kiện. Làm như thế
sẽ tăng thêm tính dễ đọc và giảm nhiều code phức tạp khi định nghĩa flow logic của
screen.
http://ecvin.net
Http://ecvin.net
Khi định nghĩa flow logic bạn cần làm việc với các sự kiện:
+ Sự kiện PROCESS BEFORE OUTPUT (PBO) được gọi trước khi màn hình được
tải.
+ Sự kiện PROCESS AFTER INPUT (PAI) được gọi sau khi bạn giao tiếp với màn
hình.
+ Sự kiện PROCESS ON HELP-REQUEST (POH) được gọi khi bạn nhấn F1 cho 1
trường trên màn hình. Trong SAP R/3, khi bạn xem tài liệu trợ giúp cho từng trường,
bạn cần nhấn F1.
+ Sự kiện PROCESS ON VALUE-REQUEST (POV) được gọi khi bạn nhấn F4 trên
trường. Trong SAP R/3, khi bạn muốn xem danh sách các giá trị nhập cho trường, bạn
cần nhấn F4.
Khi định nghĩa flow logic cho screen, bạn cần sử dụng các từ khóa bên trong flow logic.
Từ khóa cho phép bạn thực thi một công việc xác định. Ví dụ: gọi màn hình khởi tạo
của chương trình, sử dụng từ khóa call.
Ngoài từ khóa call, bạn có thể sử dụng các từ khóa khác khi bạn định nghĩa flow logic
cho một screen.
Chương trình include là chương trình không thể được thực thi độc lập. Để thực thi
chương trình include, bạn cần gọi chúng trong chương trình khác bằng câu lệnh
http://ecvin.net
Http://ecvin.net
INCLUDE.
Các mẫu tự của chương trình include thể hiện loại include. Chương trình include có bốn
loại:
1. Form: danh sách các giá trị nhập cho 1 trường
2. Output: chỉ định chuỗi xuất hiện trên title bar trước khi người dùng thấy màn hình
3. Top: gọi màn hình khởi tạo của chương trình dialog
4. Input: theo dõi giao tiếp của người dùng xảy ra trên màn hình
Chương trình include ‘Zprog1_O01’ gắn với sự kiện PBO. Chương trình include
‘Zprog1_I01’ gắn với sự kiện PAI. Cuối cùng chương trình ‘Zprog1_F01’ gắn với sự
kiện POH và POV.
Bạn sử dụng từ khóa case để đảm bảo công việc thích hợp được thực thi khi bạn nhấn
vào nút Back trên màn hình.
http://ecvin.net
Http://ecvin.net
Bạn sử dụng module ‘Z_AIRDES’ để đảm bảo tài liệu trợ giúp xuất hiện khi bạn đặt
con trỏ trong trường và nhấn F1.
Ghi chú: Sự kiện là hành động xảy ra trong khi xử lý screen. Sự kiện gắn với một screen
là PROCESS BEFORE OUTPUT (PBO), PROCESS AFTER INPUT (PAI), PROCESS
ON HELP_REQUEST (POH) và PROCESS ON VALUE-REQUEST (POV).
Bạn có thể sử dụng các từ khóa để gọi chương trình ABAP khi một sự kiện xảy ra. Các
từ khóa bao gồm call, module, case và if.
Bạn sử dụng chương trình include để quản lý và nâng tính dễ đọc cho chương trình khi
định nghĩa flow logic. Chương trình include là form, input, output và top.
Bài tập:
Gõ SE80 trong trường Command trên thanh công cụ và nhấn Enter để truy cập vào công
cụ Object Nagigator.
Chọn loại chương trình là ‘Module pool’ trong list box ‘Type’ => Continue => nhấp
Save => gõ $TMP trong trường Package, nhấn Save. Sau đó nhấp Program - Activate.
Cuối cùng nhấp Continue.
http://ecvin.net
Http://ecvin.net
Sau khi lưu và kích hoạt chương trình dialog, bạn có thể thiết kế screen. Transaction
code để truy cập vào công cụ Screen Painter là SE51.
Gõ ‘Capturing Employee Details’ trong trường ‘Short description’, gõ 200 vào trường
‘Next Screen’ => Enter.
Màn hình ‘Screen Painter: Change Screen ZFIRST 0100’ được mở => nhấp biểu tượng
Input/Output trên pane trái => nhấp vào box trên màn hình => nhấp và nhấn phím
spacebar trong trường Text và gõ INPUT_NAME trong trường Name, sau đó nhấn
Enter.
Giả sử bạn muốn trường nhập liệu chỉ chấp nhận các ký tự. Chọn ‘CHAR character
string, fixed length’ trong list box ‘Format’.
Thiết kế GUI status: nhấp Expand kế bên ‘Function Keys’. Nhấp, gõ Save và Back
trong text box phía trên biểu tượng Save và Back => User interface - Activate => User
interface - Save.
http://ecvin.net
Http://ecvin.net
Sau khi thiết kế screen và GUI status, bạn cần định nghĩa flow logic của screen. Giả sử
bạn tạo chương trình module ‘STATUS_0100’ chứa mã thể hiện chuỗi ‘Easy Nomad
Limited’ trên title bar của màn hình ‘Easy Nomad Limited - Employee Tracking
System’. Bạn muốn gọi chương trình module này bên trong sự kiện PBO => sử dụng từ
khóa module:
Giả sử bạn tạo hai module: STATUS_0100 và USER_COMMAND_0100 chứa mã thể
hiện customized menu bar trước khi người dùng thấy màn hình. Chương trình module
‘USER_COMMAND’ chứa mã theo dõi tất cả giao tiếp của người dùng xảy ra trên màn
hình. Sử dụng sự kiện PROCESS BEFORE OUTPUT để thực thi chương trình
STATUS_0100 và sử dụng sự kiện PROCESS AFTER INPUT để thực thi chương trình
USER_COMMAND_0100.
1. In ấn trong ABAP
a. Tạo SAPscript form:
SAPscript là công cụ giúp bạn tạo, quản lý và in ấn văn bản trong SAP R/3.
Các phần tử định nghĩa cấu trúc của form:
+ pages
+ windows
+ paragraph formats
+ character formats
http://ecvin.net
Http://ecvin.net
+ text elements
Layout của trang là một form được phân chia bởi nhiều cửa sổ theo nhu cầu của bạn và
cách bạn muốn đặt các cửa sổ này vào trang.
Ví dụ: Trang purchase order có các cửa sổ sau:
+ cửa sổ tiêu đề hiển thị tên và địa chỉ công ty
+ cửa sổ địa chỉ hiển thị tên, địa chỉ người bán
+ cửa sổ chính hiển thị chi tiết cả sản phẩm theo thứ tự
Form kết hợp với chương trình print và SAPscript composer để in văn bản. Chương
trình print là một chương trình ứng dụng có cấu trúc được thiết kế bằng form. Nó khởi
tạo form, rút trích dữ liệu từ CSDL cần đặt vào form và cuối cùng là in. Composer
chuẩn bị kết xuất cho nhiều loại máy in. Nó lấy dữ liệu từ chương trình print đặt nó
trong form, và gửi tài liệu cho thiết bị in.
http://ecvin.net
Http://ecvin.net
Bạn tạo SAPscript form bằng công cụ Form Painter. Để truy cập vào công cụ Form
Painter, bạn thực hiện các bước sau:
+ gõ SE17 trong trường Command trên thanh công cụ chuẩn
+ nhấn Enter
Màn hình ‘Form Painter: Request’ cho phép bạn tạo form mới. Sau khi bạn tạo form
mới, bạn có thể định nghĩa layout của nó và nội dung.
1. Form: định nghĩa cấu trúc tài liệu
2. Composer: gửi kết xuất của tài liệu cho thiết bị in
http://ecvin.net
Http://ecvin.net
3. Print Program: khởi tạo và kết thúc việc in ấn
Form ‘ZSTORE_01’ có hai cửa sổ: một cái hiển thị địa chỉ kho hàng, một cái hiển thị
danh sách các vật liệu có trong kho.
Dữ liệu các vật liệu được lưu trong bảng ZAWARD_11 trong CSDL. Bạn sẽ sử dụng
text element - liên kết đến chương trình print để định nghĩa cách lấy dữ liệu từ bảng
ZAWARD_11 hiển thị lên form.
Tạo form ZSTORE_01 bằng cách gõ ZSTORE_01 trong trường FORM và nhấn Create.
Sau khi chỉ định mô tả cho form, thêm trang bằng cách nhấn Pages, gõ P1 trong trường
Page và nhấn Enter, gõ ‘Page 1’ trong trường Description và nhấn Enter.
http://ecvin.net
Http://ecvin.net
Tạo cửa sổ sử dụng trong form, nhấn Windows => cửa sổ Main được thêm mặc định
cho form.
Giả sử bạn cần thêm một cửa sổ gọi là W1 để hiển thị địa chỉ của kho hàng, nhấn Edit -
Create Element, gõ W1 vào trường Window, gõ Address trong trường Description =>
nhấn Continue.
Cửa sổ W1 được thêm vào form:
http://ecvin.net
Http://ecvin.net
Sau khi định nghĩa các cửa sổ cần thiết, bạn cần đặt các cửa sổ đó vào trang mà bạn tạo,
nhấn vào ‘Page Windows’ => trang P1 được chọn mặc định trên màn hình.
Thêm cửa sổ vào trang, nhấn Edit - Create Element => hộp thoại ‘Form: Change Page
Windows: STORE_01’ hiển thị các cửa sổ bạn cần thêm vào trang.
http://ecvin.net
Http://ecvin.net
Để thêm cửa sổ vào trang, chọn cửa sổ W1 từ danh sách, nhấn nút Choose.
Sau khi thêm, bạn cần chỉ định chỗ đặt cửa sổ trên trang. Bạn cũng có thể xác định kích
cở của của nó. Giả sử cửa sổ W1 cách biên trái, phải 2 centimeter. Gõ ‘2’ vào trường
‘Left Magin’, ‘2’ vào trường ‘Upper margin’.
http://ecvin.net
Http://ecvin.net
Kích cở của cửa sổ được xác định bởi chiều rộng và cao. Giả sử kích cở của cửa sổ là
10x4 centimeter, gõ ‘10’ vào trường ‘Window width’, ‘4’ vào trường ‘Window height’.
Bây giờ cửa sổ W1 đã được thêm vào trang P1, làm tương tự cho cửa sổ Main. Sau khi
tạo layout, bạn cần thêm paragraph và character format để định dạng văn bản trong
form.
Để thêm paragraph, nhấn ‘Paragraph Formats’, giả sử bạn cần thêm paragraph định
dạng văn bản có font ‘Courier’, cỡ 12. Bạn muốn gọi nó là PA. Thực hiện điều này bằng
cách gõ PA trong trường Paragraph và nhấn Enter => gõ ‘Uses Courier font’ trong
trường Descript => nhấn Font.
Để định nghĩa font cho paragraph là Courier, gõ Courier trong trường Family. Định
nghĩa kích cỡ của font là 12, gõ 12 vào trường ‘Font Size’ => Enter.
http://ecvin.net
Http://ecvin.net
Bạn làm tương tự để thêm paragraph khác gọi là PB sử dụng font ‘Courier’ có kích cỡ
14.
Để thêm định dạng ký tự, nhấn vào Character Formats. Giả sử bạn cần thêm character
format gọi là CH có font ‘Courier’, cỡ 14, chữ đậm, thì gõ CH trong trường ‘Char.
Format’ và nhấn Enter.
Sau khi định nghĩa layout và định dạng form ‘ZSTORE_01’, bạn cần định nghĩa text
element cho form. Text element lưu thành phần của văn bản sẽ được hiển thị trong
window trên form. Trong form này, bạn cần tạo text element cho cửa sổ Main và cửa sổ
W1.
Để tạo các text element này, bạn quay lại màn hình ‘Form: Change Windows:
ZSTORE_01’ bằng cách nhấn Windows.
http://ecvin.net
Http://ecvin.net
Giả sử bạn cần tạo text element cho cửa sổ Main, nhấp đôi vào cửa sổ Main trong danh
sách các cửa sổ và nhấn Edit - Text Elements => màn hình ‘Window MAIN’ được mở,
màn hình hiển thị PC Editor (trình soạn thảo văn bản trong SAPscript). Bạn sẽ tạo text
element cho cửa sổ Main bằng trình soạn thảo PC. Text element sẽ được sử dụng để tạo
danh sách các chi tiết vật liệu có trong kho hàng.
Các text element cần cho cửa sổ Window:
+ introduction
+ columns
+ material_list
Để tạo text element, nhấn nút Insert Command:
http://ecvin.net
Http://ecvin.net
Để tạo text element introduction, chọn tùy chọn Text Element, gõ introduction trong
trường Text Element, nhấn Enter.
Text element được thêm vào trình soạn thảo PC:
Giả sử gõ ‘Award Sportswear: Materials availabel in the warehouse’ trong trình soạn
thảo PC làm câu giới thiệu cho danh sách.
http://ecvin.net
Http://ecvin.net
Bạn cần định dạng, chọn câu, nhấn mũi tên trỏ xuống trong list box ‘Parag.Formats’ và
chọn PB.
Định dạng sẽ thay đổi như sau:
Giả sử các từ ‘Award Sportswear’ trong câu giới thiệu cần có định dạng CH. Để làm
điều này, chọn ‘Award Sportswear’ trong câu, nhấn mũi tên hướng xuống trong list box
‘Char.Formats’ và nhấn CH.
Sau khi tạo xong text element cho cửa sổ MAIN, bạn cần quay lại màn hình ‘Form:
Change Windows: ZSTORE_01’.
Nhấn nút Back:
http://ecvin.net
Http://ecvin.net
Trên màn hình ‘Form: Change Windows: ZSTORE_01’, chọn cửa sổ W1 trừ danh sách
cửa sổ, sau đó nhấn Edit - Text elements để thêm văn bản vào cửa sổ W1.
Giả sử bạn gõ ‘Award Sportswear, 906 North Main Street, Los Angeles’ làm văn bản
cho cửa sổ W1 trong trình soạn thảo PC.
Sau đó nhấn nút Back trên thanh công cụ chuẩn để trả về màn hình ‘Form: Change
Windows: ZSTORE_01’ => nhấn vào Goto - Header để cập nhật các thiết lập cơ bản.
Để cập nhật, nhấn ‘Basic Settings’ => gõ P1 trong trường ‘First page’ để chỉ định trang
P1 là trang đầu tiên của form.
http://ecvin.net
Http://ecvin.net
Gõ PA trong trường ‘Default paragr.’ để chỉ định PA là định dạng mặc định cho form =>
bây giờ bạn có thể lưu và kích hoạt form.
Ghi chú:
SAPscript giúp bạn tạo và in ấn tài liệu văn bản trong SAP R/3. Layout và nội dung của
văn bản được định nghĩa trong SAPscript form.
Để tạo layout của SAPscript form, đầu tiên bạn thêm các trang. Sau đó tạo cửa sổ hoặc
text area. Sau khi tạo cửa sổ bạn đặt chúng vào trang.
Sau khi tạo layout của form, bạn tạo định dạng đoạn văn và định dạng ký tự mà bạn cần
sử dụng trong nội dung của form. Nội dung của form được định nghĩa trong text
element. Bạn cần tạo text element cho mỗi cửa sổ trong form.
Sau khi định nghĩa layout và nội dung, bạn cập nhật các thiết lập cơ bản của nó và sau
đó lưu, kích hoạt form.
b. In SAPscript:
Chương trình print là chương trình ABAP cho phép bạn in tài liệu, với cấu trúc trong
SAPscript form.
http://ecvin.net
Http://ecvin.net
Chương trình print:
+ lấy dữ liệu đặt vào form
+ khởi tạo việc in
+ ghi dữ liệu vào text element của form
+ kết thúc việc in
Giả sử bạn cần in một form gọi là Form_A. Form này chứa layout và text element cho
tài liệu. Bạn cần rút trích dữ liệu từ bảng N để hiển thị trong các text element của
Form_A.
Đầu tiên chương trình print sẽ rút trích dữ liệu từ bảng B. Sau đó chương trình in sẽ
khởi tạo việc in ấn, chọn thiết bị in. Kế tiếp nó sẽ ghi dữ liệu được rút trích từ bảng B
vào các text element của Form_A. Cuối cùng là kết thúc tiến trình in.
http://ecvin.net
Http://ecvin.net
Công việc đầu tiên là rút trích dữ liệu từ CSDL, để rút trích chương trình print cần sử
dụng internal table.
DATA: BEGIN OF internal_table_name OCCURS n,
field 1 LIKE database_table_name-field1,
field 2 LIKE database_table_name-field2,
END OF internal_table_name.
Sau đó sử dụng câu lệnh SELECT để lấy dữ liệu từ table và đặt vào internal table:
SELECT database_table_name-field1
database_table_name-field2
FROM database_table_name
INTO TABLE internal_table_name.
Sau khi rút trích dữ liệu, chương trình print cần sử dụng các SAPscript function module
để điều khiển việc in ấn. Các SAPscript function module quan trọng nhất:
+ OPEN_FORM
+ WRITE_FORM
+ CLOSE_FORM
Để gọi một function module bạn sử dụng CALL FUNCTION:
CALL FUNCTION 'function_module_name'.
Chú ý: Trong chương trình print, bạn cần gọi function module ‘OPEN FORM’ trước khi
http://ecvin.net
Http://ecvin.net
gọi bất kỳ function module nào khác.
Function module ‘OPEN_FORM’ khởi tạo việc in ấn sử dụng các tham số kết xuất. Các
tham số kết xuất quan trọng nhất của function module ‘OPEN_FORM’:
+ DEVICE: định danh thiết bị in, ví dụ: DEVICE = 'PRINTER'
+ FORM: định danh form cần in, ví dụ: FORM = 'FORM_A'
Ví dụ:
CALL FUNTION 'OPEN_FORM'
EXPORTING
DEVICE = 'DEVICE parameter_value'
FORM = 'FORM parameter_value'
Sau khi bạn gọi function module ‘OPEN_FORM’, bạn cần gọi function module
‘WRITE_FORM’ để ghi văn bản từ text element vào cửa sổ trên form.
CALL FUNCTION 'WRITE_FORM'.
Sử dụng tham số ELEMENT để định danh text element bạn muốn ghi vào cửa sổ bạn
chỉ định trong tham số WINDOW. Ví dụ: ELEMENT = 'LIST_A' chỉ định LIST_A là
text element cần được ghi vào cửa sổ được chỉ định trong tham số WINDOW.
Tham số WINDOW để chỉ định cửa sổ mà bạn ghi text element được chỉ định trong
tham số ELEMENT. Ví dụ: WINDOW = 'MAIN' chỉ định cửa sổ MAIN nơi mà bạn
muốn viết text element được chỉ định trong tham số ELEMENT:
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'element parameter_value'
WINDOW = 'window parameter_value'.
Sau khi viết text element trong form, bạn kết thúc việc in bằng function module
‘CLOSE_FORM’:
CALL FUNCTION 'CLOSE_FORM'.
Giả sử bạn cần in form ‘ZSTORE_01’, form này liệt kê chi tiết các vật liệu có trong kho
hàng. Để in form bạn cần tạo chương trình ZSTORE_01_PRINT.
http://ecvin.net
Http://ecvin.net
Để tạo chương trình print ZSTORE_01_PRINT, bạn mở ABAP Editor. Form
‘ZSTORE_01’ hiển thị danh sách vật liệu. Dữ liệu được hiển thị trong danh sách này là
các trường CODE, NAME, QTY của bảng ZAWARD_11. Để rút trích dữ liệu, bạn tạo
internal table gọi là ITAB bằng câu lệnh DATA.
DATA : BEGIN OF ITAB OCCURS 0,
CODE LIKE ZAWARD_11-CODE,
NAME LIKE ZAWARD_11-NAME,
QTY LIKE ZAWARD_11-QTY,
END OF ITAB.
Sau khi tạo cấu trúc bảng ITAB, bạn sử dụng câu lệnh SELECT để lấy dữ liệu từ bảng
ZAWARD_11 và đặt dữ liệu này trong vào bảng ITAB.
SELECT ZAWARD_11-CODE
ZAWARD_11-NAME
ZAWARD_11-QTY
FROM ZAWARD_11
INTO TABLE ITAB.
Sau khi rút trích dữ liệu từ bảng ZAWARD_11, bạn cần gọi function module để khởi tạo
việc in ấn:
CALL FUNTION 'OPEN_FORM'.
http://ecvin.net
Http://ecvin.net
Trong function module này, bạn cần sử dụng tham số DEVICE để định danh printer là
thiết bị in.
CALL FUNTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'.
Trong function module này, bạn cũng sử dụng tham số FORM để định danh form cần
in:
CALL FUNTION 'OPEN_FORM'
EXPORTING
DEVICE = 'PRINTER'
FORM = 'ZSTORE_01'.
Sau đó, bạn có thể gọi function module WRITE_FORM để ghi văn bảng từ text element
vào form. Trong trường hợp này, dữ liệu từ bảng ITAB cần được ghi vào text element
‘MATERIAL_LIST’. Do đó bạn sử dụng câu lệnh LOOP AT trước khi gọi function
module ‘WRITE_FORM’.
LOOP AT ITAB.
CALL FUNCTION 'WRITE_FORM'.
Trong ví dụ này bạn cần ghi text element ‘MATERIAL_LIST’ vào cửa sổ MAIN của
form. Sử dụng tham số kết xuất ELEMENT của fuction module ‘WRITE_FORM’ để
ghi text element ‘MATERIAL_LIST’.
LOOP AT ITAB.
CALL FUNCTION 'WRITE_FORM'
ELEMENT = 'MATERIAL_LIST'.
Text element cần được ghi trong cửa sổ MAIN của form, bạn sử dụng tham số kết xuất
WINDOW của function module ‘WRITE_FORM’.
LOOP AT ITAB.
CALL FUNCTION 'WRITE_FORM'
ELEMENT = 'MATERIAL_LIST'
WINDOW = 'MAIN'.
ENDLOOP.
Cuối cùng gọi function module CLOSE_FORM để đóng việc in ấn.
http://ecvin.net
Http://ecvin.net
Để thực thi chương trình, nhấn nút Direct processing:
Hộp thoại Print xuất hiện, bạn có thể in form bằng hộp thoại này:
Để xem trước bảng in, nhấn Print Preview:
http://ecvin.net
Http://ecvin.net
Ghi chú:
Chương trình print là chương trình ABAP, cho phép in ấn tài liệu, mà cấu trúc được
thiết kế trong form. Chương trình print đầu tiên sẽ rút trích dữ liệu cần thiết đặt vào
form. Sau khi khởi tạo việc in ấn, nó ghi text element vào form. Cuối cùng là đóng việc
in ấn.
Để rút trích dữ liệu, bạn cần định nghĩa internal table trong chương trình print. Sau khi
định nghĩa internal table, bạn cần sử dụng SAPscript function module để điều khiển
việc in. Bạn sử dụng function module ‘OPEN_FORM’ để khởi tạo việc in. Sử dụng
function module ‘WRITE_FORM’ để ghi văn bản từ text element vào trong form. Đóng
việc in bằng function module CLOSE_FORM.
c. Sử dụng Smart Form trong ABAP:
Smart Form là phiên bản nâng cao của SAPscript form. Tương tự SAPscript form, bạn
có thể sử dụng Smart Form để tạo cấu trúc của tài liệu cần in. Bạn có thể in một Smart
Form trên máy in hoặc phát sinh tài liệu HTML, fax hoặc email.
Smart Form cung cấp các đặc tính quan trọng:
http://ecvin.net
Http://ecvin.net
1. Routines: là khối xử lý như tính toán subtotal và total dựa vào 1 trường
2. Smart Styles: cho phép bạn định nghĩa character format và paragraph format. Sử
dụng Style Builder để tạo và sửa chữa Smart Styles
3. Tools: Bạn có thể sử dụng công cụ đồ họa được tích hợp với Form Builder để định
nghĩa các thuộc tính của Smart Forms. Ví dụ: bạn có thể sử dụng Form Painter để thiết
kế layout của form
4. Windows: xác định định dạng của form. Ví dụ bạn có thể đặt cửa sổ chứa địa chỉ của
khách hàng vào form đặt hàng
5. Interactive Web Forms: Web Form là kết xuất HTML của form, được xem trên web
browser. Interactive Web Form là form cho phép bạn giao tiếp bằng các phần tử nhập.
Bạn có thể sử dụng Interactive Web Form để giao tiếp với các ứng dụng Internet
Khi tạo form, bạn cần thực hiện 2 hành động:
+ thiết kế form
+ rút trích dữ liệu ứng dụng vào form
Thiết kế một form thực hiện 4 công việc:
http://ecvin.net
Http://ecvin.net
Khi tạo định dạng cho đoạn văn và ký tự:
+ đầu tiên bạn cần tạo Smart Style sẽ chứa định dạng
+ sau đó bạn chỉ định các thiết lập cho định dạng
+ sau đó sử dụng định dạng trong Smart Form
Để tạo định dạng, bạn cần mở ‘SAP Smart Form: Initial Screen’ bằng transaction code
"smartforms":
Sử dụng ‘SAP Smart Form: Initial Screen’, bạn có thể tạo Smart Style để tạo định dạng
cho đoạn văn và ký tự. Chọn tùy chọn Style, gõ tên Smart Style là ZStyle1 trong text
http://ecvin.net
Http://ecvin.net
box, nhấn SmartStyles - Create và nhấn Continue.
Khi tạo định dạng cho đoạn văn, bạn có thể xác định 4 loại thiết lập:
Giả sử bạn tạo định dạng đoạn văn P1, nhấp đôi vào Paragraph Formats, nhấn Edit -
Create Code, gõ P1 và nhấn Enter.
Chỉ định các thiết lập:
http://ecvin.net
Http://ecvin.net
Tạo định dạng ký tự có hai loại thiết lập:
Chỉ định thiết lập chuẩn cho định dạng ký tự C1:
http://ecvin.net
Http://ecvin.net
Giả sử bạn tạo ‘Smart Form ZFMM001_PURCHASE_ORDER’ bằng Smart Form -
Purchase Order. Bây giờ bạn áp dụng các định dạng được định nghĩa trong Smart Style
‘Style1’. Để làm điều này, đầu tiên bạn mở Smart Form từ ‘SAP Smart Forms: Initial
Screen’ bằng cách gõ tên form trong text box với tùy chọn Form và nhấn Smart Forms -
Change.
Trên màn hình ‘SAP Form Builder: Change Form ZFMM001_PURCHASE_ORDER’
http://ecvin.net
Http://ecvin.net
bạn có thể gắn Smart Style ‘ZStyle1’ vào Smart Form. Nhấn tab ‘Output Options’ trên
trang ‘Form Form Attributes’, chọn ZStyle1 từ combo box ‘Style’ và nhấn Copy.
Trong form ‘ZFMM001_PURCHASE_ORDER’, bạn muốn chữ ‘Vendor Address’ có
định dạng đoạn văn P1, hơn nữa bạn muốn định dạng ký tự C1 có chữ màu đỏ. Để làm
điều này, nhấp đôi vào ‘VENDOR Header’ trong cây phân cấp phần tử form:
Chọn P1 từ list box ‘Paragraph Formats’ trên tab ‘General Attribue’, chọn ‘Vendor
Addres’s trong trình soạn thảo văn bản, chọn C1 từ list box ‘Character Formats’.
http://ecvin.net
Http://ecvin.net
Sau khi rút trích tên của function module gắn với Smart Form của bạn, bạn thực thi nó
bằng câu lệnh call function.
Mã để in Smart Form:
report ZPurchase_Order .
parameters: PO_number(20) type n . " accept PO number from user
data : m_name type RS38L_FNAM . " variable to store the
" name of the function module of the Smart Form
" ZFMM001_PURCHASE_ORDER
" Now define an internal table to store PO information
" from the PO database table
data: begin of itab_PO occurs 0,
Number LIKE PO-Number,
Vendor_Code like PO-Vendor_Code,
Ven_Add LIKE PO-Ven_Add,
Date like PO-Date,
Amount like PO-Amount
http://ecvin.net
Http://ecvin.net
end of itab_PO .
" fetch data of the PO number that the user specified
" from the PO table into the internal table
select Number Vendor_Code Ven_Add Date Amount
from PO into table itab_PO
where PO-Number = PO_Number .
" retrieve the name of the function module of the Smart Form
" ZFMM001_PURCHASE_ORDER
call function 'SSF_FUNCTION_MODULE_NAME'
exporting
formname = 'ZFMM001_PURCHASE_ORDER'
importing
m_name = fm_name .
" Now execute the function module
call function fm_name
" pass data of the table itab_PO to the function module
" through its tables parameter
tables
itab_PO .
Giả sử bạn tạo chương trình report hiển thị form đặt hàng. Để làm điều này, bạn sử dụng
Smart Form "ZSales_Order". Bạn sử dụng function module
‘SSF_FUNCTION_MODULE_NAME’ để rút trích tên của Smart Form, sau đó sử dụng
biến sf_fm_name để gọi function module gắn với Smart Form.
http://ecvin.net
Http://ecvin.net
Bài tập
Từ màn hình ‘Form: Change: Header Painter: ZBROCADERO_PO’, tạo định dạng
đoạn văn P1 canh giữa bằng cách gõ P1 trong trường Paragraph, nhấn Enter, chọn
BLOCK từ list box ‘Alignment’ và nhấn Cont.
Sau khi tạo định dạng đoạn văn P1, bạn muốn cửa sổ ‘Terms and Conditions’ trong from
ZBROCADERO_PO sử dụng định dạng P1, chọn ‘P1 Block Alighed’ từ list box ‘Parag.
Formats’.
http://ecvin.net
Http://ecvin.net
Sau khi định dạng đoạn văn P1 cho form ‘ZBROCADERO_PO’, bạn in form. Bạn cần
tạo chương trình ZPO_PRINT_PRG cho form ‘ZBROCADERO_PO’, sau đó rút trích
thông tin liên quan đến tất cả đơn đặt hàng từ bảng broc_po vào internal table
‘itab_broc_po’:
Sau khi in form ‘ZBROCADERO_PO’, giả sử bạn muốn tạo định dạng ký tự cho các
ghi chú trong form ‘ZBROCADERO_SALES’ bằng Smart Styles:
http://ecvin.net
Http://ecvin.net
Sau khi định dạng ký tự C1 cho form ‘ZBROCADERO_SALES’, bạn muốn sử dụng
form trong chương trình report để in nó. Bạn cần tạo chương trình report
‘ZSales_Order’ cho form ‘ZBROCADERO_SALES’. Sau đó sử dụng function module
‘SSF_FUNCTION_MODULE_NAME’ và chuyển tên form ‘ZBROCADERO_SALES’
cho function module để rút trích tên function module của form.
In form bằng Smart Forms:
Sử dụng SAPscript, bạn định dạng đoạn văn trên form ‘ZBROCADERO_PO’ bằng định
dạng P1. Sau đó bạn tạo chương trình print ‘ZPRO_PRINT_PRG’ để in form. Kế tiếp
bạn tạo định dạng C1 trong Smart Style ‘ZSALES_STYLE’ và áp dụng định dạng đến
Smart Form ‘ZBROCADERO_SALES’. Cuối cùng bạn tạo chương trình print
‘ZSales_Order’ để in Smart Form.
http://ecvin.net