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ấtnhư mong muốn.. Ngoài câu lệnh if, bạn có thể sử dụng câu lệnh case để thự
Trang 1ABAP Programming I
Trang 2ABAP 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ạntạ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 EasyAccess’ để 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ênbắt đầu là Y hoặc Z → nhấn Create
Trang 3Sử dụng cửa sổ ‘Program Attributes’ để xác định tiêu đề và các thuộc tính bao gồm loạichươ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ó
Trang 4Trườ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à đốitượ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
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ìnhthự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ồmchữ (literal) và hằng (constant)
Loại dữ liệu mà ABAP hỗ trợ:
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áckiểu dữ liệu này là cố định
Trang 51 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 trongvùng xác định dựa vào loại công việc mà câu lệnh thực hiện
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ủaselection 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ụ:
Trang 6select-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
Sử dụng câu lệnh clear để thiết lập lại giá trị cho một biến
clear variable name.
Trang 7add 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ốngadd, substract, divide và multiply, compute là câu lệnh đa năng cho phép bạn thực thinhiề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
Trang 8mộ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ấtnhư 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ìnhdự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
+ 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
Trang 9Ngoà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.
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ứclogical đúng
Trang 10while logical expression.
=> 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ươngtrì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 ofselection" 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
Trang 11counter = 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ểnvò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
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
Trang 12II 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
Selection screen là màn hình đầu tiên để bạn cung cấp các tiêu chí chọn (selectioncriteria) 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à outputscreen 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
Trang 13field1 (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 ABAPData 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
Trang 14Khi 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
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 trongselect 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ừ internaltable để 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
Trang 15Đọ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ồntại trong internal table Bạn có thể sửa header line và sử dụng câu lệnh modify để cậpnhậ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:
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ộtPO
Trang 16Report 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
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àointernal 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
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
Trang 17data: 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
Trang 18"assigning the total PO amount to the header line of itab_PO_header
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 dunginternal 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 mongmuố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ứamộ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 Trongquá trình thực thi của classical report, event block được chạy bởi môi trường thực thitrong 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 khithự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ìnhthực thi event block, khi câu lệnh thực thi subroutine được thấy, điều khiển đượcchuyển từ event block cho subroutine Sau khi thực thi các câu lệnh trong subroutine,
Trang 19điều khiển quay trở lại cho người gọi event block.
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ộtvà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ộtphầ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áccâ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ạncầ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
Trang 20parameters : charge type N.
data : begin of itab_billing occurs 0,
document_number like billing-document_number,
party like billing-party
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ụngevent 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
Trang 21select customer_code customer_name customer_amount_due
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àointernal table tốn nhiều thời gian vì phụ thuộc vào phạm vi ngày và số record được lấyrất lớn Do đó, bạn cần hiển thị message status trong khi tiến trình fetching đang thựchiện
selection document_number sale_person date amount
from into itab_sales from sales
message 'Fetching data ' Type 'S'
endselect
Trang 22Trong câu lệnh message, thay vì gõ message string mỗi lần, bạn có thể lưu messagestring 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 thanhcô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ệulâ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ủadò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ểnthị Bạn có thể điều khiển luồng bằng cách sử dụng processing block như event blockhoặc subroutine
Các sự kiện quan trọng trong classical report là initlization, at selection-screen, page, start-of-selection, end-of-page và end-of-page Bạn có thể làm cho classical reporttrả 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
Trang 23top-of-Ngoài processing block, bạn cũng có thể sử dụng message để điều khiển luồng thực thicủ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 trongquá 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ạimessage khác nhau như: A, E, I, S, W và X Bạn có thể định nghĩa message riêng củabạ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
Trang 24Bạ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ộtdanh 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ếtmộ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
"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
Trang 25sả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 Khingười dùng nhấn Shift+F12, danh sách thứ hai hiển thị chi tiết sản phẩm.
"create the secondary list displaying product details here
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
"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 danhsá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
Trang 26"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ườidù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ầnchuyển tên và giá trị từ danh sách cơ bản đến danh sách thứ hai trong suốt quá trìnhthự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ệnhphổ biến:
Trang 27trường asset_number được lưu trong vùng Hide Khi người dùng nhấp đôi một dòngtrong danh sách cơ bản, bạn muốn sử dụng giá trị của trường asset_number và internaltable "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
"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
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ảnphẩm họ mua Vào lúc runtime, nếu một người dùng chọn customer code, customername 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 ứngnhư đị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ảnphẩ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 đặttrong quá trình tương tác của người dùng
Trang 28data: f(20) type C,
v(10) type N
"basic list
select customer_code name product
into itab_Customer_Prod from Customer_Prod
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ủatrườ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ạoreport, đầu tiên bạn cần tạo 3 internal table - một là tạo basic list, hai là tạo haisecondary list
Trang 29Tạ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
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êucầ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
Trang 30select * 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 trongdanh 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), selection, end-of-selection Khối chương trình được thực thi tuần tự => mô hình lậptrình thủ tục
start-of-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ộctí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ượngcủ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ênkế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
Trang 31Phầ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
Trang 32class 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"
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ươngtrì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
Trang 33Phươ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âulệnh methods để định nghĩa phương thức trong một lớp Bạn cần xác định tên phươngthứ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ỉ
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
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óaexporting:
methods method name exporting variable type data type.
Ví dụ:
methods display_name exporting name(15) type c
Trang 34Định nghĩa phương thức "display_info" chỉ có lớp "employee" có thể truy cập:
class employee definition
methods get_attributes importing flight_num type c
data name type string
Trang 35data 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 đượcrú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.
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úttrí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ìnhbằng câu lệnh raise event
raise event event name.
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
Trang 36value 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
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íchevent nếu giá trị của product code là "pp0023" Khi event handler được rút trích, bạnmuốn gọi phương thức "define" để hiển thị product code
class products definition
Trang 37"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().
Ví dụ:
start-of-selection
data flight_num type ref to airplane
create object flight_num
Trang 38data 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àokhá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ươngtrì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ươngtrình gọi event handers sẽ được thực thi
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ằngcá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 đặctí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ácthành phần của lớp cha, lớp con có thể tạo thành phần riêng của nó
Trang 39Tí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 đốivớ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, privatecủ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ĩaphương thức private trong lớp, chỉ lớp đó mới có thể truy cập phương thức
Đ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ộtphươ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àokhoảng cách du lịch Có hai lớp "business" và "economy" sử dụng cùng một phươngthức tính tiền Tuy nhiên cài đặt thì khác nhau trong hai lớp
Trang 40b 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
"code to implement the method comes here