Доступ - ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ без использования UNION, поэтому набор записей можно обновлять

Если я использую UNION для набора записей подчиненной формы в Access, это не позволяет сделать этот набор записей обновляемым.

Проблема в том, что мне нужно обновить набор записей.

У меня есть две таблицы - одна - это список сотрудников (сотрудников). Другой — это запись о том, сколько тикетов закрыл каждый сотрудник за день. В результате эта таблица (INCTech) использует идентификатор сотрудника и дату в качестве общего первичного ключа, поскольку у каждого сотрудника может быть только одна запись для данной даты.

Я не могу использовать LEFT OUTER JOIN для получения полного списка сотрудников, потому что он исключит любого сотрудника, у которого есть запись в INCTech для даты, отличной от указанной. Это не работает:

SELECT INCTech.EmployeeID, INCTech.Assigned, INCTech.Closed, INCTech.Submitted,
INCTech.StillOpen, INCTech.TheDate, Employees.FirstName, Employees.LastName
FROM Employees LEFT JOIN INCTech ON Employees.EmployeeID = INCTech.EmployeeID
WHERE Employees.GroupID = 8 AND (INCTech.TheDate = #4/15/2011# OR 
INCTech.TheDate IS NULL)

Потому что, если у сотрудника есть запись на дату, отличную от 15.04.2011, он не соответствует ни одному из двух критериев даты: дата больше не NULL, но это также не заданная дата.

Мой запрос, который работает:

SELECT Employees.EmployeeID, Employees.FirstName, Employees.LastName,
Employees.FirstName & " " & Employees.LastName AS FullName, INCTech.TheDate,
INCTech.Assigned, INCTech.Closed, INCTech.Submitted, INCTech.StillOpen,
Employees.GroupID
FROM Employees
LEFT OUTER JOIN INCTech ON
Employees.EmployeeID=INCTech.EmployeeID 
WHERE (INCTech.TheDate)=Calendar.Value AND Employees.GroupID = ddlGroup.Value
UNION
SELECT Employees.EmployeeID, Employees.FirstName, Employees.LastName, 
Employees.FirstName & " " & Employees.LastName AS FullName, NULL AS TheDate, 
NULL AS Assigned, NULL AS Closed, NULL As Submitted, NULL As StillOpen, 
Employees.GroupID 
FROM Employees 
LEFT OUTER JOIN INCTech ON Employees.EmployeeID=INCTech.EmployeeID 
WHERE Employees.EmployeeID NOT IN 
(SELECT INCTech.EmployeeID FROM INCTech WHERE INCTech.TheDate=Calendar.Value) 
AND Employees.GroupID = ddlGroup.Value

Но поскольку для этого мне нужно использовать UNION, результирующий набор записей доступен только для чтения. Это не сработает — мне нужно иметь возможность изменять или добавлять данные для ежедневной записи каждого сотрудника.

Помощь!


person ClairelyClaire    schedule 27.04.2011    source источник


Ответы (3)


Создайте форму с этим запросом в качестве источника записи:

SELECT e.EmployeeID, Date() AS TheDate, e.LastName, e.FirstName
FROM Employees AS e
ORDER BY e.LastName, e.FirstName;

Добавьте к нему подчиненную форму, которая использует INCTech в качестве источника записи.

Используйте EmployeeID; TheDate в качестве дочерних полей ссылки и основных полей ссылки.

Выберите «Одиночная форма» в качестве представления подчиненной формы по умолчанию. Установите кнопки навигации = Нет. Установите для свойства Цикл значение Текущая запись.

Затем для любой записи сотрудника в основной форме ваша подчиненная форма будет отображать соответствующую строку INCTech (тот же сотрудник, та же дата), если она есть, или позволит вам добавить строку, если ее нет.

Но вы, вероятно, захотите отредактировать данные INCTech для дат, отличных от сегодняшнего дня. В этом случае вы можете добавить несвязанное текстовое поле в заголовок основной формы, скажем, txtWhichDate, и разрешить пользователю вводить значение даты. В этом случае вы можете настроить запрос основной формы так, чтобы он ссылался на значение текстового поля вместо Date().

SELECT e.EmployeeID, Forms!YourFormName!txtWhichDate AS TheDate, e.LastName, e.FirstName
FROM Employees AS e
ORDER BY e.LastName, e.FirstName;

Или вы можете добавить код в событие After Update txtWhichDate, чтобы обновить источник записи для соответствия.

person HansUp    schedule 27.04.2011

Я думаю, проблема в том, что ваше условие WHERE ограничивает результаты из таблицы INCTech теми записями, которые соответствуют Calendar.Value.

Что вы можете попробовать сделать, так это создать отдельный запрос для получения записей из INCTech и применить в запросе предложение WHERE INCTech.TheDate = Calendar.Value.

В своем основном запросе ссылайтесь на этот запрос вместо таблицы INCTech напрямую, используя LEFT JOIN.

Это должно вернуть записи из Employee и показать соответствующие сведения для каждой записи сотрудника, где есть совпадение в запросе на основе таблицы INCTech.

person Tim Lentine    schedule 27.04.2011

Вы не сможете включить несколько таблиц в набор записей и сделать его обновляемым. Ваша форма должна редактировать таблицу записей сотрудников и ссылаться на таблицу INCTech в качестве подчиненной формы.

В противном случае вы можете создать запрос для отображения всех ваших данных с объединениями и несколькими таблицами, но вам придется кодировать операторы обновления для обеих таблиц, которые будут выполняться при изменении строки. Вам нужно будет отфильтровать строку для обновления на основе идентификатора сотрудника, идентификатора сотрудника и даты или таблицы INCTech. Выполните поиск по обновлению нескольких таблиц в Access.

Это решит вашу главную проблему с запросом:

Select E.* 
  , I.TheDate
from Employees as E
Left Outer Join (
  Select * 
  from INCTech 
  Where TheDate = #4/15/2001#) as I
on E.EmployeeID = I.EmployeeID
person JeffO    schedule 27.04.2011