openplanning

Hướng dẫn và ví dụ Oracle APEX Dynamic Action

  1. Giới thiệu
  2. Chuẩn bị ví dụ
  3. Ví dụ với Dynamic Action - Change
  4. Ví dụ với Dynamic Action - Enable/Disable
  5. Ví dụ với Dynamic Action - Set Values sử dụng SQL Statement
  6. Ví dụ với Dynamic Action - Set Values sử dụng PL/SQL
  7. Ví dụ với Dynamic Action - Button

1. Giới thiệu

Tài liệu được viết dựa trên:
  • Oracle APEX 5

2. Chuẩn bị ví dụ

Bạn cần thêm cột BONUS vào bảng EMP nếu nó chưa tồn tại:
-- Add/modify columns
alter table EMP add BONUS number;
Tạo một trang trắng (blank page) với mã số 300.
Tạo một Region chứa các tham số.
  • !
Nhập vào thông tin cho Item mới tạo:
Identification:
  • Name: P300_PARAM_EMPNO
  • Type: Select List

List of Values:
  • Type: SQL Query
  • SQL Query: Select Ename, Empno From Emp
Tạo tiếp một Region khác.
Nhập vào:
Identification:
  • Title: Emp Form Region
  • Type: Static Content
Tạo một vài Item cho Region này.
Sét đặt các thuộc tính cho Item:
No
Item
Label
Source
(Type= Database Column)
1
P300_EMPNO
Empno
EMPNO
2
P300_ENAME
Ename
ENAME
3
P300_JOB
Job
JOB
4
P300_MGR
Manager
MGR
5
P300_HIREDATE
Hiredate
HIREDATE
6
P300_SAL
Salary
SAL
7
P300_COMM
Commission
COMM
8
P300_BONUS
Bonus
BONUS
9
P300_DEPTNO
Deptno
DEPTNO
Trước khi trang web được trả lại (rendering) dữ liệu cần được gán vào các Item, bạn cần tạo một Process trong Pre-Rendering/After Header để làm việc này.
Nhập vào:
Identification:
  • Name: Fetch EMP Row
  • Type: Automatic Row Fetch

Setting:
  • Table Name: EMP
  • Primary Key Column: EMPNO
  • Primary Key Item: P300_EMPNO

P300_EMPNO được truyền vào giá trị từ bên ngoài, Process "Fetch EMP Row" sẽ truy vấn bảng EMP với EMPNO = :P300_EMPNO tại thời điểm trước khi trang được trả về (rendering), và gán giá trị vào các Item khác.

Khi bạn chạy trang web, nó chưa có dữ liệu nguyên nhân là :P300_EMPNO có giá trị null (Không có giá trị truyền vào cho nó từ bên ngoài).
Sửa lại các Item hiển thị.
P300_JOB
Identification:
  • Name: P300_JOB
  • Type: Select List
List of Values:
  • Type: Static Values
  • Static values: STATIC:CLERK;CLERK,SALESMAN;SALESMAN,PRESIDENT;PRESIDENT,MANAGER;MANAGER,ANALYST;ANALYST
P300_MGR:
Identification
  • Name: P300_MGR
  • Type: Select List

List of Values
  • Type: SQL Query
  • SQL Query: Select ename d, empno r from emp where job in ('MANAGER', 'PRESIDENT')
P300_HIREDATE
Identification
  • Name: P300_HIREDATE
  • Type: Date Picker
P300_DEPTNO
Identification
  • Name: P300_DEPTNO
  • Type: Select List
List of Values
  • Type: SQL Query
  • SQL Query: Select Dname,Deptno From Dept
Chạy trang web:

3. Ví dụ với Dynamic Action - Change

Tạo mới một Dynamic Action cho item P300_PARAM_EMPNO, khi bạn thay đổi giá trị của P300_PARAM_EMPNO, Dynamic Action này sẽ submit trang web.
Dynamic Action đã được tạo ra:
Identification
  • Name: Change EMPNO Param
When
  • Even: Change
  • Selection Type: Item(s)
Khi các điều kiện của "Dynamic Action" được đáp ứng mệnh đề trong "TRUE" của nó sẽ được thực thi, ngược lại mệnh để "FALSE" sẽ được thực thi.
Tạo một Branch (Nhánh rẽ), để sau khi Submit sẽ chuyển tới một trang nào đó (Trong trường hợp này là trang hiện tại).
Sau khi Submit, yêu cầu sẽ chuyển tới trang mã số 300 (trang hiện tại của bạn), đồng thời sét đặt giá trị cho :P300_EMPNO bởi :P300_PARAM_EMPNO
Save và chạy lại trang web của bạn.
Nguyên tắc hoạt động:

4. Ví dụ với Dynamic Action - Enable/Disable

Với các nhân viên kinh doanh, ngoài lương họ sẽ nhận được hoa hồng (commission), như vậy khi bạn thay đổi tên công việc (JOB) của một nhân viên, nếu JOB = 'SALESMAN' thì item COMM phải cho phép nhập (enable), ngược lại bạn cần vô hiệu hóa (disable) item COMM.

Tạo một Dynamic Action cho item JOB:
Đặt tên cho Dynamic Action mới tạo là "Change JOB".
Identification
  • Name: Change JOB

When
  • Even: Change
  • Select Type: Item(s)
  • Item(s): P300_JOB
  • Condition: equal to
  • Value: SALES
Xử lý khi P300_JOB = 'SALESMAN':
Ngược lại, P300_JOB không bằng 'SALESMAN', mệnh đề trong FALSE sẽ được thực thi.
Chạy lại trang web của bạn:

5. Ví dụ với Dynamic Action - Set Values sử dụng SQL Statement

Tạo thêm 2 item:
Identification:
  • Name: P300_LOCATION
  • Type: Display Only
Label
  • Label: Location
Settings:
  • Save Sesion State: NO
Source
  • Type: Null
Identification:
  • Name: P300_NUM_EMPLOYEES
  • Type: Display Only
Label
  • Label: Location
Settings:
  • Save Sesion State: NO
Source
  • Type: Null

Chú ý: 2 item P300_LOCATION, và P300_NUM_EMPLOYEES là các item không dựa trên cột của bảng, giá trị của nó được tính toán tại thời điểm "Page Load" vì vậy bạn cần đặt "Save Session State = NO".

Tạo Dynamic Action cho P300_DEPTNO, khi bạn thay đổi phòng ban của nhân viên, Dynamic Action này sẽ tính toán lại ví trí và số lượng nhân viên của phòng ban mới và gán giá trị vào cho 2 item P300_LOCATIONP300_NUM_EMPLOYEES.
Đây là câu lệnh SQL truy vấn vị trí (location) và số nhân viên có trong phòng ban mới:
Select d.Loc Location
      ,Count(e.Empno) Num_Employees
From   Dept d
      ,Emp  e
Where  d.Deptno = e.Deptno(+)
And    d.Deptno = :P300_Deptno
Group  By d.Loc
Identification
  • Action: Set Value
Settings
  • Set type: SQL Statement
  • SQL Statement: .....
  • Page Items to Submit: P300_DEPTNO
Affected Elements
  • Selection Type: Item(s)
  • Item(s): P300_LOCATION, P300_NUM_EMPLOYEES
Chạy lại trang web của bạn:

6. Ví dụ với Dynamic Action - Set Values sử dụng PL/SQL

Trong ví dụ mô phỏng việc tính thưởng cho một nhân viên, tiền thưởng (BONUS) được tính bằng hệ số thưởng nhân với lương của nhân viên, khi trang web được tải lên giá trị của item BONUS sẽ được tính toán bởi PL/SQL.
Tạo một Dynamic Action chạy tại thời điểm trang được tải lên (Page load).
  • !
Tính thưởng:
Declare
   v_Multiplier Number;
Begin
 
   -- Xác định hệ số thưởng dựa trên công việc.
   Case :P300_Job
      When 'CLERK' Then
         v_Multiplier := 0.1;
      When 'ANALYST' Then
         v_Multiplier := 0.2;
      When 'SALESMAN' Then
         v_Multiplier := 0.3;
      When 'MANAGER' Then
         v_Multiplier := 0.4;
      When 'PRESIDENT' Then
         v_Multiplier := 0.5;
      Else
         v_Multiplier := 0;
   End Case;
 
   -- Trả về tiền thưởng được tính bởi hệ số thưởng
   -- nhân với tiền lương.
   Return :P300_Sal * v_Multiplier;
End;
Chạy lại trang web của bạn:

7. Ví dụ với Dynamic Action - Button

Trong ví dụ này, bạn sẽ tạo một Dynamic Action cho Button. Khi button này bị nhấn, các thay đổi trên form sẽ được lưu lại. Đồng thời Button này sẽ bị vô hiệu hóa (disabled) trong khi trang đang được refresh.
Identification:
  • Button Name: APPLY_CHANGE
  • Type: Apply change
Behavior:
  • Action: Submit Page
  • Database Action: SQL UPDATE action
Tạo Proccess để xử lý việc update dữ liệu.
Identification:
  • Name: Process ROW of EMP
  • Type: Automatic ROW Processing (DML)
Settings
  • Table Name: EMP
  • Primary Key Column: EMPNO
  • Primary Key Item: P300_EMPNO
  • Supported Operation: Update
  • TODO