【问题标题】:Updatable Interactive Grid based on multiple tables基于多个表的可更新交互式网格
【发布时间】:2018-09-18 13:09:09
【问题描述】:

我有 3 个表:Employees、Locations 和 EmpLocation

  • Employees 以 Employee_ID 作为主键存储员工数据,
  • Lo​​cations 使用 Location_ID 存储位置数据。
  • EmpLocation 存储 Employee_ID 和 Location_ID。每个员工可以有多个位置。

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

我使用了以下查询:

SELECT el.Employee_ID, el.Location_ID
FROM EmpLocations el

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

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

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

【问题讨论】:

    标签: oracle-apex oracle-apex-5.1


    【解决方案1】:

    我会说是的,但是您应该摆脱 自动行处理(默认情况下由 Apex 创建)并编写自己的 PL/SQL 代码来执行插入/更新。类似于视图上的替代触发器。

    此外,出于更新目的(如果您允许的话),请包含 ROWID 伪列。

    代码(未经测试)如下所示:

    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;       
    

    【讨论】:

    • 所以我只删除 APEX 创建的进程? apex$row_status = 'C' 是什么?
    • 删除它,或者将条件设置为“从不”(这样它就不会执行)。 “C”代表“创建”,“U”代表“更新”,“D”代表“删除”。更多信息在这里:docs.oracle.com/database/121/HTMDB/concept_sub.htm#CHDBDHIF
    • 您好,这可以用表格报告吗?我有 2 个通过 id 列连接的表,需要将它们显示为一个报告,并且表单会进行多次处理。我不想寻求视图和触发器,因此想要一个与处理相关的解决方案。我在这个线程上也有这个问题,以防你看看:stackoverflow.com/questions/65791574/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2020-10-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多