У меня есть таблица где находятся данные о людях, которые утром отметились после прихода на работу и дата, время когда это было сделано. К этой таблице присоединена таблица контактов по полю имени. Необходимо создать фильтр, который будет отмечать людей, которые не были отмечены в указанный период времени.
Я создала фильтр с такими условиями:
1) фильтр Between, условие tbl_Attendance_Date, поле с датой прихода, между значениями периода времени.
2) фильтр сравнения, условие tbl_Contact.Name, которая присоединена к моей таблице не равна tbl_Attendance.Name
Фильтр не работает. Подскажите, пожалуйста, что можно придумать для такой задачи
Нравится
Елена,
для корректной работы фильтрации Вам необходимо создать фильтр типа 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
Выдает ошибку 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, включенный всегда по умолчанию. Пример - фильтр по счетам в разделе контакты:
Изменила фильтр таким образом:
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(Дата/Время)
Выдает ту же ошибку.
Если честно, но очень поняла идею с еще одним фильтром для связи. Таблица Contact присоединена к Attendance по полю Name, т.е. они уже связаны. Или этого не достаточно?
Елена,
попробуйте создать фильтр типа Exists вместо Subquery
В случае, если не удастся, пожалуйста, предоставьте сервисы tbl_Attandance, tbl_Contact и сервис запроса, в котором Вы пытаетесь реализовать фильтр.
создала вот что:
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 содержатся имена только тех кто отметился. А мне нужно получить имена не отмеченных.
И вот с логикой построения такого фильтра у меня проблемы=((
Галка у меня стоит, не в этом дело.
На экран мне выводятся те записи в табл 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])))
проблема с полем 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, тогда он автоматически попадет в фильтр:
хм... наверно я плохо объяснила в чем проблема. Дату я давно сделала.Вопрос в дубле имен.
Вот у меня есть такая табл:
Иванов Иван 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)