SAP ABAP - Điền các bảng nội bộ
Trong các bảng nội bộ, việc điền bao gồm các tính năng như lựa chọn, chèn và nối thêm. Chương này tập trung vào các câu lệnh INSERT và APPEND.
Tuyên bố INSERT
Câu lệnh INSERT được sử dụng để chèn một dòng hoặc một nhóm dòng vào một bảng nội bộ.
Sau đây là cú pháp để thêm một dòng vào bảng nội bộ:
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
Trong cú pháp này, câu lệnh INSERT sẽ chèn một dòng mới trong bảng nội bộ Internal_tab. Một dòng mới có thể được chèn bằng cách sử dụng biểu thức work_area_itab INTO trước tham số internal_tab. Khi biểu thức INTO work_area_itab được sử dụng, dòng mới được lấy từ vùng làm việc work_area_itab và được chèn vào bảng internal_tab. Tuy nhiên, khi biểu thức INTO work_area_itab không được sử dụng để chèn một dòng, dòng đó được lấy từ dòng tiêu đề của bảng internal_tab.
Khi một dòng mới được chèn vào bảng nội bộ bằng cách sử dụng mệnh đề INDEX, số chỉ mục của các dòng sau dòng được chèn sẽ tăng lên 1. Nếu bảng nội bộ chứa <index_num> - 1 dòng, dòng mới được thêm vào cuối bảng. Khi hệ thống SAP thêm thành công một dòng vào bảng nội bộ, biến SY-SUBRC được đặt thành 0.
Thí dụ
Sau đây là một chương trình mẫu sử dụng câu lệnh insert.
REPORT ZCUSLIST1.
DATA: BEGIN OF itable1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF itable1.
DO 4 TIMES.
itable1-F1 = sy-index.
APPEND itable1.
ENDDO.
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
LOOP AT itable1 Where F1 ≥ 3.
itable1-F1 = -78.
INSERT itable1.
ENDLOOP.
Skip.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
Đoạn mã trên tạo ra kết quả sau:
1
96-
2
3
4
1
96-
2
78-
3
78-
4
Trong ví dụ trên, vòng lặp DO nối 4 hàng chứa các số từ 1 đến 4 vào đó. Thành phần dòng tiêu đề itable1-F1 đã được gán giá trị -96. Câu lệnh Insert chèn dòng tiêu đề dưới dạng hàng mới vào phần nội dung trước hàng 3. Hàng 3 hiện có trở thành hàng 4 sau phần chèn. Câu lệnh LOOP AT truy xuất những hàng từ bảng nội bộ có giá trị F1 lớn hơn hoặc bằng 3. Trước mỗi hàng, câu lệnh Insert chèn một hàng mới từ dòng tiêu đề của nó. Trước khi chèn, thành phần F1 đã được thay đổi thành chứa -78.
Sau khi mỗi câu lệnh chèn được thực hiện, hệ thống lập chỉ mục lại tất cả các hàng bên dưới câu lệnh được chèn. Điều này giới thiệu chi phí khi bạn chèn các hàng gần đầu một bảng lớn bên trong. Nếu bạn cần chèn một khối hàng vào một bảng lớn bên trong, hãy chuẩn bị một bảng khác có các hàng sẽ được chèn và sử dụng dòng chèn để thay thế.
Khi chèn một hàng mới bên trong itable1 bên trong vòng lặp tại itable1, nó không ảnh hưởng ngay đến bảng nội bộ. Nó thực sự có hiệu lực trong lần vượt qua vòng lặp tiếp theo. Trong khi chèn một hàng sau hàng hiện tại, bảng được lập chỉ mục lại tại ENDLOOP. Sy-tabix được tăng dần và vòng lặp tiếp theo xử lý hàng mà sy-tabix trỏ đến. Ví dụ: nếu bạn đang ở trong lần vượt qua vòng lặp thứ hai và bạn chèn một bản ghi trước hàng 3. Khi endloop được thực thi, hàng mới sẽ trở thành hàng 3 và hàng 3 cũ trở thành hàng 4, v.v. Sy-tabix được tăng thêm 1 và lần vượt qua vòng lặp tiếp theo sẽ xử lý bản ghi mới được chèn vào.
Tuyên bố APPEND
Câu lệnh APPEND được sử dụng để thêm một hàng hoặc dòng vào bảng nội bộ hiện có. Câu lệnh này sao chép một dòng duy nhất từ một vùng làm việc và chèn nó vào sau dòng hiện có cuối cùng trong bảng nội bộ. Vùng làm việc có thể là một dòng tiêu đề hoặc bất kỳ chuỗi trường nào khác có cùng cấu trúc như một dòng của bảng nội bộ. Sau đây là cú pháp của câu lệnh APPEND được sử dụng để nối thêm một dòng trong bảng nội bộ:
APPEND <record_for_itab> TO <internal_tab>.
Trong cú pháp này, biểu thức <record_for_itab> có thể được biểu diễn bằng vùng làm việc <work_area_itab>, có thể chuyển đổi thành kiểu dòng hoặc bằng mệnh đề DÒNG BAN ĐẦU. Nếu người dùng sử dụng vùng làm việc <work_area_itab>, hệ thống SAP sẽ thêm một dòng mới vào bảng nội bộ của <internal_tab> và điền vào nó với nội dung của vùng làm việc. Mệnh đề INITIAL LINE thêm một dòng trống chứa giá trị ban đầu cho mỗi trường của cấu trúc bảng. Sau mỗi câu lệnh APPEND, biến SY-TABIX chứa số chỉ mục của dòng nối thêm.
Việc nối các dòng vào bảng tiêu chuẩn và được sắp xếp bằng khóa không phải duy nhất sẽ hoạt động bất kể các dòng có cùng khóa đã tồn tại trong bảng hay chưa. Nói cách khác, các mục nhập trùng lặp có thể xảy ra. Tuy nhiên, lỗi thời gian chạy xảy ra nếu người dùng cố gắng thêm một mục nhập trùng lặp vào bảng được sắp xếp bằng một khóa duy nhất hoặc nếu người dùng vi phạm thứ tự sắp xếp của bảng đã sắp xếp bằng cách nối các dòng vào bảng đó.
Thí dụ
REPORT ZCUSLIST1.
DATA: BEGIN OF linv Occurs 0,
Name(20) TYPE C,
ID_Number TYPE I,
END OF linv.
DATA table1 LIKE TABLE OF linv.
linv-Name = 'Melissa'.
linv-ID_Number = 105467.
APPEND linv TO table1.
LOOP AT table1 INTO linv.
Write: / linv-name, linv-ID_Number.
ENDLOOP.
Đoạn mã trên tạo ra kết quả sau:
Melissa 105467