Обновляемая интерактивная сетка на основе нескольких таблиц - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть 3 таблицы: Employees, Locations и EmpLocation

  • Сотрудники хранят данные сотрудников с Employee_ID в качестве первичного ключа,
  • Locations хранит данные о местоположении с 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

Но в этом случае можно ли будет сделать сетку обновляемой, так как задействованы две таблицы?

1 Ответ

0 голосов
/ 18 сентября 2018

Я бы сказал, что да, но вы должны избавиться от автоматической обработки строк (созданной 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;       
...