124
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. http://ecvin.net

A Bap Courses line

Embed Size (px)

DESCRIPTION

Test for

Citation preview

Page 1: 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

Page 2: A Bap Courses line

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

Page 3: A Bap Courses line

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

Page 4: A Bap Courses line

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

Page 5: A Bap Courses line

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

Page 6: A Bap Courses line

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

Page 7: A Bap Courses line

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

Page 8: A Bap Courses line

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

Page 9: A Bap Courses line

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

Page 10: A Bap Courses line

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

Page 11: A Bap Courses line

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

Page 12: A Bap Courses line

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

Page 13: A Bap Courses line

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

Page 14: A Bap Courses line

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

Page 15: A Bap Courses line

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

Page 16: A Bap Courses line

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

Page 17: A Bap Courses line

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

Page 18: A Bap Courses line

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

Page 19: A Bap Courses line

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

Page 20: A Bap Courses line

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

Page 21: A Bap Courses line

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

Page 22: A Bap Courses line

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

Page 23: A Bap Courses line

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

Page 24: A Bap Courses line

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

Page 25: A Bap Courses line

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

Page 26: A Bap Courses line

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

Page 27: A Bap Courses line

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

Page 28: A Bap Courses line

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

Page 29: A Bap Courses line

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

Page 30: A Bap Courses line

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

Page 31: A Bap Courses line

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

Page 32: A Bap Courses line

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

Page 33: A Bap Courses line

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

Page 34: A Bap Courses line

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

Page 35: A Bap Courses line

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

Page 36: A Bap Courses line

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

Page 37: A Bap Courses line

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

Page 38: A Bap Courses line

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

Page 39: A Bap Courses line

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

Page 40: A Bap Courses line

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

Page 41: A Bap Courses line

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

Page 42: A Bap Courses line

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

Page 43: A Bap Courses line

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

Page 44: A Bap Courses line

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

Page 45: A Bap Courses line

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

Page 46: A Bap Courses line

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

Page 47: A Bap Courses line

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

Page 48: A Bap Courses line

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

Page 49: A Bap Courses line

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

Page 50: A Bap Courses line

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

Page 51: A Bap Courses line

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

Page 52: A Bap Courses line

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

Page 53: A Bap Courses line

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

Page 54: A Bap Courses line

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

Page 55: A Bap Courses line

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

Page 56: A Bap Courses line

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

Page 57: A Bap Courses line

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

Page 58: A Bap Courses line

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

Page 59: A Bap Courses line

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

Page 60: A Bap Courses line

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

Page 61: A Bap Courses line

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

Page 62: A Bap Courses line

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

Page 63: A Bap Courses line

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

Page 64: A Bap Courses line

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

Page 65: A Bap Courses line

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

Page 66: A Bap Courses line

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

Page 67: A Bap Courses line

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

Page 68: A Bap Courses line

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

Page 69: A Bap Courses line

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

Page 70: A Bap Courses line

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

Page 71: A Bap Courses line

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

Page 72: A Bap Courses line

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

Page 73: A Bap Courses line

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

Page 74: A Bap Courses line

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

Page 75: A Bap Courses line

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

Page 76: A Bap Courses line

Http://ecvin.net

http://ecvin.net

Page 77: A Bap Courses line

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

Page 78: A Bap Courses line

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

Page 79: A Bap Courses line

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

Page 80: A Bap Courses line

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

Page 81: A Bap Courses line

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

Page 82: A Bap Courses line

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

Page 83: A Bap Courses line

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

Page 84: A Bap Courses line

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

Page 85: A Bap Courses line

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

Page 86: A Bap Courses line

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

Page 87: A Bap Courses line

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

Page 88: A Bap Courses line

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

Page 89: A Bap Courses line

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

Page 90: A Bap Courses line

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

Page 91: A Bap Courses line

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

Page 92: A Bap Courses line

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

Page 93: A Bap Courses line

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

Page 94: A Bap Courses line

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

Page 95: A Bap Courses line

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

Page 96: A Bap Courses line

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

Page 97: A Bap Courses line

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

Page 98: A Bap Courses line

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

Page 99: A Bap Courses line

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

Page 100: A Bap Courses line

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

Page 101: A Bap Courses line

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

Page 102: A Bap Courses line

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

Page 103: A Bap Courses line

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

Page 104: A Bap Courses line

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

Page 105: A Bap Courses line

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

Page 106: A Bap Courses line

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

Page 107: A Bap Courses line

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

Page 108: A Bap Courses line

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

Page 109: A Bap Courses line

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

Page 110: A Bap Courses line

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

Page 111: A Bap Courses line

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

Page 112: A Bap Courses line

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

Page 113: A Bap Courses line

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

Page 114: A Bap Courses line

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