基于多个表的可更新交互式网格

时间:2018-09-18 13:09:10

标签: oracle-apex oracle-apex-5.1

我有3个表:Employees,Locations和EmpLocation

  • Employees以Employee_ID作为主键存储员工数据,
  • 位置存储带有位置ID的位置数据。
  • EmpLocation存储Employee_ID和Location_ID。每个员工可以有多个位置。

我需要创建一个交互式网格,该网格将显示所有员工的数据,包括没有分配位置的员工的数据。 然后,用户需要有能力为那些将其设置为空的员工选择一个位置,并且还必须向任何员工添加其他位置。 我发现我需要的是可编辑网格中的两个选择列表。因此,可以通过选择员工和相应的位置来添加新行。

我使用以下查询:

SELECT el.Employee_ID, el.Location_ID
FROM EmpLocations el

然后,我将每一列都设为一个选择列表,其中第一列从Employees表中提取数据:

SELECT Employee_FName, Employee_ID FROM Employees

第二个-来自位置:

SELECT Location_Name, Location_ID FROM Locations

一切看起来都很不错,但是这样,我只能得到分配了至少一个地点的员工。我需要查看所有员工,以及是否给他们分配了任何位置(每个员工可以分配多个位置)。

因此我将网格的源查询更改为:

SELECT e.Employee_ID, el.Location_ID
FROM Employees e 
LEFT JOIN EmpLocations el ON e.Employee_ID=el.Employee_ID

但是在这种情况下,由于涉及两个表,是否有可能使网格可更新?

1 个答案:

答案 0 :(得分:0)

I'd say yes, but you should get rid of the automatic row processing (created by Apex, by default) and write your own PL/SQL code which would do inserting/updating. Something like an instead-of trigger on a view.

Also, for updating purposes (if you'll allow it), include the ROWID pseudocolumn.

Code (untested) would look like this:

begin 
  case when :apex$row_status = 'C' then 
         insert into emplocations (employee_id, location_id)
         values (:employee_id, :location_id);
       when :apex$row_status = 'U' then
         update emplocations set
           employee_id = :employee_id,
           location_id = :location_id
           where rowid = :rowid;
       end;
end;