Tạo, Sửa và Xóa dữ liệu sử dụng ADF Form trong ADF BC

1- Mục tiêu của bài học

Trong bài học này tôi hướng dẫn bạn tạo một ứng dụng ADF Fusion cho phép hiển thị dữ liệu trên ADF Form, với Row Navigation (Điều hướng các dòng bản ghi). ADF Form cho phép bạn thêm, và sửa dữ liệu của một bản ghi, xóa bản ghi.
Đây là hình ảnh của ứng dụng:

2- Tạo ứng dụng

Trước hết bạn cần tạo một ứng dụng ADF Fusion với các thiết lập cơ bản sau:
  1. Tạo ứng dụng "ADF Fusion Web Application".
  2. Kết nối vào một cơ sở dữ liệu.
  3. Tạo Application Module.
  4. Tạo các Entity Object.
  5. Tạo các View Object mặc định.
Bạn có thể xem hướng dẫn dưới đây:
Sau các bước ở trên bạn có một ứng dụng như hình minh họa dưới đây:

3- Tạo LOV View Object

Khi bạn tạo mới một nhân viên (Bảng EMPLOYEES) bạn cần phải lựa chọn phòng ban (Bảng DEPARTMENTS) cho nhân viên này thông qua một ComboBox, ListBox, LOV (List Of Values),..
Bạn cần tạo ra các LOV View Object, chúng sẽ được sử dụng trong nhiều chức năng của ứng dụng.
Trên JDeveloper chọn:
  • File/New/From Gallery...
    • >> Bussiness Tier/ADF Bussiness Components/View Object
Nhập vào:
  • Package: org.o7planning.adf.model.lovviews
  • Name: LOVDepartments
Select Dep.Department_Id
      ,Dep.Department_Name
      ,Loc.City
From   Departments Dep
      ,Locations   Loc
Where  Dep.Location_Id = Loc.Location_Id(+)
Order By Dep.Department_Name
View Object ( LOVDepartments) đã được tạo ra:

LOVJobs

Tương tự, tạo tiếp một LOV View Object khác có tên LOVJobs:
Select j.Job_Id
      ,j.Job_Title
From   Jobs j
Order By j.Job_Title
Next .. Next ... Next

4- Tạo View Object (V01Employees)

Trên JDeveloper chọn:
  • File/New/From Gallery...
    • >> Bussiness Tier/ADF Bussiness Components/View Object
Đăng ký V01Employees với Application Module:
Sau khi đăng ký V01Employees đã được nhìn thấy trên Data Controls.

5- Tạo các gợi ý cho giao diện người dùng (UI Hints)

Khi bạn thiết kế giao diện một trang web. Ví dụ V01Employees có 11 thuộc tính (attribute), nó tương đương 11 cột trong bảng của database. Công cụ của ADF Sẽ giúp bạn tạo ra ADF Form (Form để nhập dữ liệu).
Bạn cần tạo ra các gợi ý (Hint) cho ADF Tool (Công cụ của ADF).
Mở V01Employees ( View Object):

Tạo UI Hints cho thuộc tính DepartmentId.

Chọn thuộc tính DepartmentId (DepartmentId attribute) và tạo mới "List Of Values" cho nó.
Chọn LOVDepartments ( LOV View Object) mà bạn đã tạo ra ở các bước trên.
Ở đây tôi thiết lập để hiển thị cột DepartmentId theo kiểu ComboBox. Nếu bạn muốn hiển thị DepartmentId theo kiểu LOV (List Of Values) bạn có thể tham khảo trong một hướng dẫn khác dưới đây:
Chuyển sang TAB: UI Hints.

Tạo UI Hints cho thuộc tính JobId

Test V01Employees sử dụng Oracle ADF Model Tester:

6- Tạo View - emp

Mở adf-config.xml và kéo thả đối tượng View vào.
Nhấn kép chuột vào emp (View) trên adf-config.xml để tạo ra một trang tương ứng.
Tìm kiếm với từ khóa "deco" và kéo thả đối tượng "Decorative Box (ADF Faces.Layout)" vào màn hình emp.jsf.

7- Tạo ADF Form

Kéo thả V01Employees1 (View Object) từ Data Controls vào vùng Center của emp.jsf, và chọn ADF Form, như hình minh họa dưới đây:
OK, Lúc này bạn có thể chạy ứng dụng. Chọn emp (View) trên adf-config.xml và nhấn Run hoặc F11.

8- Submit & Commit

ADF tạo cho bạn nút "Submit" để submit trang web, nhưng dữ liệu chưa được "Commit". Vì vậy không có gì thay đổi về mặt dữ liệu tại cơ sở dữ liệu.
Khi người dùng nhấn vào nút "Submit" dữ liệu được cập nhập vào View Object, và không có thay đổi gì tại cơ sở dữ liệu.
Để tạo ra các thay đổi ở mức cơ sở dữ liệu, bạn cần phải thực thi chức năng Commit. Bạn có 2 cách để làm việc này:
  1. Cách 1: Gọi Commit mỗi khi Submit.
  2. Cách 2: Tạo nút Commit.

Cách 1: Gọi Commit mỗi khi Submit.

Gọi chức năng Commit khi người dùng nhấn vào nút Submit.
Trên cửa sổ emp.jsf chuyển sang TAB Bindings, Nhấn biểu tượng để thêm một "Binding".
Trên cửa sổ emp.jsf chuyển về TAB - Design, Chọn nút "Submit" và thay đổi giá trị cho thuộc tính ActionListener:
  • AcionListener = #{bindings.Commit.execute}

Cách 2: Tạo nút Commit

Mỗi lần bạn thay đổi một bản ghi, và nhấn Submit, các thay đổi sẽ được cập nhập vào View Object. Cuối cùng nhấn Commit để cập nhập tất cả các bản ghi có thay đổi vào cơ sở dữ liệu.
Kéo thả đối tượng "Commit" từ "Data Controls" vào cửa sổ emp.jsf để tạo ra một "ADF Button":

9- Gán giá trị cho cột từ Sequence khi tạo bản ghi

Khi bạn tạo mới một bản ghi cho bảng EMPLOYEES, cột EMPLOYEE_ID sẽ được gán giá trị từ sequence - EMPLOYEES_SEQ. Bạn cần nói với ADF điều đó bằng cách cấu hình trên Entity Object ( Employees).
Mở Entity Object: Employees
Thuộc tính (attribute) EmployeeId hiện tại đang có kiểu Integer, bạn hãy đổi thành kiểu Number (Như hình minh họa dưới đây):
Bạn cần tạo ra một lớp tương ứng với Employees (Entity Object).
Lớp EmployeesImpl đã được tạo ra.
Java sẽ gọi phương thức EmployeesImpl.create(AttributeList) để tạo một bản ghi EMPLOYEE. Vì vậy tại phương thức này bạn cần lấy giá trị từ Sequence để gán vào cho cột EMPLOYEE_ID.
Thêm đoạn code sau vào lớp EmployeesImpl:
** EmpoyeesImpl **
import oracle.jbo.server.SequenceImpl;

// ....

protected Number getNextSequenceValue(String sequenceName) {
    SequenceImpl seq = new SequenceImpl(sequenceName, getDBTransaction());
    return seq.getSequenceNumber();
}


/**
* Add attribute defaulting logic in this method.
* @param attributeList list of attribute names/values to initialize the row
*/
protected void create(AttributeList attributeList) {
    super.create(attributeList);

    // Set value for Empno        
    this.setEmployeeId(this.getNextSequenceValue("EMPLOYEES_SEQ"));
}

10- Tạo mới bản ghi

Ở trên bạn đã tạo một ADF Form cho phép sửa đổi các bản ghi. Trong phần tiếp theo này bạn cần tạo mới một bản ghi.
Bạn cần kéo thả một trong 2 toán tử "Create" hoặc "CreateInsert" từ "Data Controls" vào cửa sổ thiết kế ( emp.jsf) để tạo ra một ADF Button.

Create vs CreateInsert

Điều gì xẩy ra khi bạn sử dụng toán tử "Create"?
** Create **
// Tạo một row (dòng) mới cho View Object
Row newRow = yourViewObject.createRow();

// Đánh dấu nó là "initialized", không phải new
newRow.setNewRowState(Row.STATUS_INITIALIZED);
Điều gì xẩy ra khi bạn sử dụng toán tử "CreateInsert"?
** CreateInsert **
// Tạo một row (dòng) mới cho View Object
Row newRow = yourViewObject.createRow();

// Đánh dấu nó là "initialized", không phải new
newRow.setNewRowState(Row.STATUS_INITIALIZED);


// Trèn row mới vào rowset mặc định của View Object.
yourViewObject.insertRow(newRow);

 
Kéo thả đối tượng "CreateInsert" vào cửa sổ emp.jsf để tạo một "ADF Button".
Chạy lại trang web của bạn:
Khi người dùng nhấn vào nút "CreateInsert", một dòng dữ liệu (row) được tạo ra và được trèn vào "RowSet" của View Object. Người dùng nhập vào các thông tin, và nhấn Submit, các thay đổi được cập nhập vào View Object. Sẽ không có bản ghi nào được tạo ra tại database cho tới khi Commit được gọi.
  • Bạn có thể xem thêm giải thích tại mục "Submit & Commit" ở phía trên.

11- Xóa bản ghi

Kéo thả đối tượng "Delete" từ "Data Controls" vào cửa sổ thiết kế của emp.jsf để tạo một "ADF Button":
Khi người dùng nhấn vào nút "Delete", dòng dữ liệu (row) hiện tại sẽ bị xóa bỏ khỏi "RowSet" của View Object, điều đó có nghĩa bản ghi chưa thực sự bị xóa khỏi database. Nó chỉ bị xóa bỏ khỏi database khi Commit được gọi.
  • Bạn có thể xem thêm giải thích tại mục "Submit & Commit" ở phía trên.
Chạy lại trang web của bạn:

Xem thêm các chuyên mục: