Фильтр по неотмеченным людям

У меня есть таблица где находятся данные о людях, которые утром отметились после прихода на работу и дата, время когда это было сделано. К этой таблице присоединена таблица контактов по полю имени. Необходимо создать фильтр, который будет отмечать людей, которые не были отмечены в указанный период времени.
Я создала фильтр с такими условиями:
1) фильтр Between, условие tbl_Attendance_Date, поле с датой прихода, между значениями периода времени.
2) фильтр сравнения, условие tbl_Contact.Name, которая присоединена к моей таблице не равна tbl_Attendance.Name

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

Нравится

23 комментария

Елена,

для корректной работы фильтрации Вам необходимо создать фильтр типа EXISTS.

Настройки фильтра:

FROM tbl_Contact

SELECT ID (tbl_Contact.ID)

WHERE
Compare Filter
tbl_Attendance.ContactID = tbl_Contact.ID

Between Filter
даты

Примеры фильтров EXISTS можно посмотреть в sq_Account.

Если Вам принципиально именно по имени, а не по идентификатору, необходимо создать дополнительный вложенный Exists фильтр, в котором для данного идентификатора будет производиться сравнение по имени.

Учтите также, что в ContactID нужно каким-то образом передавать значение. Т.е. Необходимо в скрипте выбирать ContactID и передавать идентификатор в фильтр либо вводить его вручную.

Создала такой фильтр NotMarkedIn:

FROM tbl_Contact As tbl_ContactAll

SELECT ID (tbl_ContactAll.ID)

WHERE
Compare Filter
ContactAll.ID <> tbl_Contact.ID

Between Filter
даты

tbl_Contact присоединена к моей табл по полю имени.
В окне отображения ставлю фильтр NotMarkedIn по умолчанию на DataGridView
В итоге идет фильтрация просто по дате.

таблица tbl_Contact содержит инфу только тех контактов, которые есть в табл Attendance, а мне нужно имена тех, которых нет, за определенный период.

Пробовала такой вариант:
Compare Filter
Contact.Name<>ValueSubquery

Select Name
From tbl_Attendance
Where Between Filter даты

Так же не работает

Необходимо установить

Compare Filter
Contact.Name = ValueSubquery

и установить в корне фильтра Exists параметр NOT

exists

Выдает ошибку Subquery returned more than 1 value

Сделала фильтр:

FilterSet NotMarkedIn (Not)
Compare Filter
Contact.Name=ValueSubquery
SELECT Name
FROM tbl_Attendance
WHERE tbl_Attendance.Day Between Parameter: StartDate(Дата/Время) И Parameter: EndDate(Дата/Время)

Елена, а какова у Вас структура таблицы tbl_Attendance? Какие поля там есть?

tbl_Attendance:
ID
Day (Дата/Время)
Name (строка Unicode)
R_H (Целое число)

+ в SelectQuery добавлено поле tbl_Contact ON Contact.Name=tbl_Attendance.Name

Елена,

у Вас на данный момент нет связи между таблицами в фильтрах должна быть связь по какому-нибудь полю. При существующей структуре должен быть дополнительный фильтр tbl_Contact.Name = tbl_Attendance.ContactName, включенный всегда по умолчанию. Пример - фильтр по счетам в разделе контакты:

filter

Изменила фильтр таким образом:

FilterSet NotMarkedIn (Not)

Compare Filter
Contact.Name=ValueSubquery
SELECT Name
FROM tbl_Contact As tbl_ContactAll
WHERE
tbl_ContactAll.ID=tbl_Contact.ID (включен)
Between Filter
tbl_Attendance.Day Between Parameter: StartDate(Дата/Время) И Parameter: EndDate(Дата/Время)

111

Выдает ту же ошибку.
Если честно, но очень поняла идею с еще одним фильтром для связи. Таблица Contact присоединена к Attendance по полю Name, т.е. они уже связаны. Или этого не достаточно?

Елена,

попробуйте создать фильтр типа Exists вместо Subquery

В случае, если не удастся, пожалуйста, предоставьте сервисы tbl_Attandance, tbl_Contact и сервис запроса, в котором Вы пытаетесь реализовать фильтр.

создала вот что:

11111

Compare Filter:
tbl_ContactAll.ID=tbl_Contact.ID

Between Filter
tbl_Attendance.Day Between Parameter: StartDate(Дата/Время) И Parameter: EndDate(Дата/Время)

Фильтр работает, но не совсем так как мне нужно. Выводит те записи, которые есть в Attandance, но нет в ContactAll. А мне нужно вот что
например у меня есть запись в Attandance:
Name Перепечай Елена
Day 17.10.2011
H_R 3

Больше записей за это число нет. Так вот при запуске фильтра по сегоднешней дате, мне должны выводится фамилии всех сотрудников, кроме меня
Иванов Иван 17.10.2011
Петров Сергей 17.10.2011 и т.д.

В табл Attendance содержатся имена только тех кто отметился. А мне нужно получить имена не отмеченных.
И вот с логикой построения такого фильтра у меня проблемы=((

Елена,

необходимо в фильтре EXISTS поставить галочку:

exists

Галка у меня стоит, не в этом дело.
На экран мне выводятся те записи в табл Attandance, которых нет в табл. ContactAll, а мне нужно наоборот + привязка к дате. Возможно у меня проблемы с выводом, так как могу вывести только поля таблицы Attandance.
Attandance не содержит всех записейContactAll, в ней есть лишь фамилии тех, кто отметился в определенный день, а мне нужно узнать кто из сотрудников не отметился в этот день.
Подскажите, как это правильно сделать?

Елена, есть ли у Вас возможность предоставить сервисы таблиц для анализа?

Необходимы tbl_Attandance, tbl_Contact и сервис запроса, в котором Вы пытаетесь реализовать фильтр.

А скажите, можно ли реализовать такой алгоритм:
Из таблицы Контактов выбираются люди, записи о которых нет в табл Посещения за определенный период. Полученные данные из Контактов выводятся на экран.
При этом датагрид у меня подвязан к табл Посещения, а надо чтобы при применении этого фильтра выводил данные из Контактов.

Елена, попробуйте еще раз.

Фильтр должен выглядеть следующим образом:

SELECT
	[tbl_Contact].[ID] AS [ID],
	[tbl_Contact].[Name] AS [Name]
FROM
	[dbo].[tbl_Contact] AS [tbl_Contact]
WHERE(NOT EXISTS 
	(SELECT
		[tbl_Attendance].[ID] AS [ID]
	FROM
		[dbo].[tbl_Attendance] AS [tbl_Attendance]
	WHERE([tbl_Contact].[ID] = [tbl_Attendance].[ContactID])))

01
02
03
04

проблема с полем ContactID, его нет в табл Attendance.
Создала другой запрос. Взяла таблицу Контактов и присоединила табл Посещение по полю имя. Написала такой фильтр:
Exists Filter (NOT EXISTS)
Select
tbl_Contact.Name AS ContactName
Where
DateTimeUserFilter: Подзапрос: tbl_Attendance.Date
CompateFilter: tbl_Contact.Name = tbl_Attendance.Name

Фильтр убирает записи с указанной датой, оставляет все остальное. все б хорошо, но! Так как в разные дни отмечаются одни и те же люди, данные дублируются, например

10.10.2011 Перепечай Елена
12.10.2011 Перепечай Елена и .т.д.

Так вот если применить этот фильтр на таблицу контактов и присоединенной табл. Посещения, продублированные имена все равно остануться, например

была таблица:

10.10.2011 Перепечай Елена
11.10.2011 Иванов Иван
12.10.2011 Пупкин Василий
12.10.2011 Перепечай Елена

После применения фильтра с параметром 10.10.2011
Иванов Иван
Пупкин Василий
Перепечай Елена

а должно быть только :
Иванов Иван
Пупкин Василий

Как возможно улучшить этот фильтр, чтобы убрать имена если их даты совпадают с значением фильтра ?

Елена, Вам необходимо будет добавить в данный фильтр еще один фильтр - по дате.

Для этого нужно создать параметр Date и передавать в него конкретное значение (сегодня, вчера и т.д.)

если честно, немного не поняла чем мне этот параметр поможет в фильтрации имен(

Дополнительный фильтр в WHERE фильтра EXISTS поможет выбрать только записи за определенный день. Соответственно, в результате в списке не будет дублирования, и у нас будет актуальная информация.

а как мне записать значение, выбранное в фильтре DateTimeUserFilter в параметр Date?

Елена,

его нужно создавать в нужной группе Exists, тогда он автоматически попадет в фильтр:

filter

хм... наверно я плохо объяснила в чем проблема. Дату я давно сделала.Вопрос в дубле имен.
Вот у меня есть такая табл:
Иванов Иван 10.10.2011
Петров Петр 11.10.2011
Пупкин Василий 12.10.2011
Иванов Иван 12.10.2011
Сидоров Николай 10.10.2011

Запуская фильтр по дате 10.10.2011, я получаю данные
Иванов Иван
Петров Петр
Пупкин Василий

Как видно Иванов снова вывелся в список так как он есть в таблице, но за другое число. Сидоров отмечен только за одно число, поэтому его в списке нет.
Насколько я понимаю после фильтрации по дате надо проверить вхождение имен (отмеченных по дате фильтрации) и исключить их из общего списка. Пробовала фильтров IN и просто сравнения, но все равно не получается.

Елена,

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

Это поможет разобраться, что именно не так в фильтре.

SELECT
         [tbl_Contact].[ID] AS [ID],
         [tbl_Contact].[Name] AS [Name]
FROM
         [dbo].[tbl_Contact] AS [tbl_Contact]
WHERE(NOT EXISTS 
         (SELECT
                 [tbl_Attendance].[ID] AS [ID]
         FROM
                 [dbo].[tbl_Attendance] AS [tbl_Attendance]
         WHERE([tbl_Contact].[Name] = [tbl_Attendance].[ContactName]) AND
         [tbl_Attendance].[Date] = :Date)
Показать все комментарии