Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2010, 10:41   #1
Ivan_RIV
 
Регистрация: 17.03.2010
Сообщений: 7
По умолчанию Как удалить совпадающие записи из списка?

Здравствуйте! Подскажите пожалуйста, как доработать программу (Пример, скачанный в интернете) функцией удаления совпадающих по ФИО записей в списке, а так же записей, полученных в результате фильтрации, при этом совпадающие по ФИО записи, удаляются только из списка и должны оставаться в базе. Например, один человек по фамилии "Сидоров" записан дважды, но это не ошибка... При поиске по фамилии "Сидоров" выведется две записи одинаковых по ФИО (остальные данные могут быть другими), при активации функции в списке должна остаться одна запись вместо двух. Спасибо всем кто откликнулся!
Вложения
Тип файла: rar Пример.rar (81.1 Кб, 25 просмотров)
Ivan_RIV вне форума Ответить с цитированием
Старый 17.03.2010, 18:08   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Ivan_RIV.
"функцией удаления совпадающих по ФИО записей..удаляются только из списка и должны оставаться в базе.." - Вы хотели бы получить список уникальных значений?
Уникальные значения позволяет получить предикат DISTINCT:
select * from... - все значения
select distinct * from... - уникальные значения
Но в Вашем случае эти знания никак не пригодятся, т.к. список формируется с использованием поля Код_Ребенок, и хотя Вы не сделали его (это поле) ключевым и индексным, тип Счётчик подразумевает "уникальность".
"..удаляются только из списка.." - для каждого из "ребенков" поле Код_Ребенок является идентификатором в списке. И если я верно понял вопрос "как доработать программу..функцией..?" - ответ: это не возможно в принципе.
мнение: для того, что бы подобные вопросы не возникали в будущем, Вам стоит заняться изучением SQL.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 17.03.2010, 20:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Как всегда, Евгений Тесленко, безусловно прав!

Думаю, что Вы просто не понимаете, что Вы просите сделать!

Хотя, формально, с Вашей задачей легко справится такой запрос:
Код:
"SELECT MIN(Код_Ребенок), Фамилия, Имя, Отчество, ДатаРождения FROM Ребенок GROUP BY Фамилия, Имя, Отчество, ДатаРождения"
p.s. вместо MIN можно использоать MAX

p.p.s. ещё раз повторю — Евгений прав! А Вы из правильной программы пытаетесь сделать неверную...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2010, 08:02   #4
Ivan_RIV
 
Регистрация: 17.03.2010
Сообщений: 7
По умолчанию

Благодарю, всех кто откликнулся! Возможно я не правильно изложил вопрос.
Если отстраниться от буквального назначения программы (ФИО и дата рождения ученика) и если вместо даты рождения поставить другой атребут (поле), характеризующий ученика, например, "Дата отсутствия на уроке". Т.о. получится, что "Сидоров Сидор Сидорович" отсутствовал два раза и в базу он заносится два раза. Соответственно другие ученики могут так же отсутствовать несколько раз и тоже заноситься несколько раз. В базе будет теперь много записей и их можно будет сгрупировать по ФИО, т.е. введа ФИО получим, например, что "Сидоров Сидор Сидорович" встречается в базе два раза. Всего в базе 5 записей из них 2 записи это "Сидоров Сидор Сидорович", чтобы посчитать сколько учеников с разными фамилиями (список обучающихся в классе или школе детей) необходимо убрать совпадающие фамилии, то есть получиться должно 4 ученика. Если совпадает ФИО, то удаляется ФИО+все поля которые содержит запись ученика. Записи удаляются только из списка, но остаются в базе. Совпадения убираются, например, по нажатию кнопки или установки чекбокса, это не важно, как проще.
Как я понимаю, если поставить DISTINCT, то "Сидоров Сидор Сидорович" добавится все равно в базу, если он отсутствовал в разные дни. По поводу поля Код_ребенка, то его тип можно изменить, если это принципиально.
Ivan_RIV вне форума Ответить с цитированием
Старый 18.03.2010, 09:05   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Ivan_RIV, Вы можете и дальше продолжать выкладывать заявления "..Код_ребенка..тип можно изменить, если это принципиально...", результат останется нулевым.
Попытаюсь объяснить, сравните две таблицы возвращаемые запросами
первый вариант:
SELECT Фамилия, Имя, Отчество FROM Ребенок
вернет все записи (в образце пять строк)
SELECT DISTINCT Фамилия, Имя, Отчество FROM Ребенок
вернет уникальные записи (в образце четыре строки),
и второй вариант:
SELECT Код_Ребенок, Фамилия, Имя, Отчество FROM Ребенок
SELECT DISTINCT Код_Ребенок, Фамилия, Имя, Отчество FROM Ребенок
обе конструкции вернут все записи (строки) т.к. в них присутствует поле идентификатор - Код_Ребенок. Оно и есть "атребут (поле), характеризующий ученика.." (никак не "Сидоров Сидор Сидорович" и не "Дата отсутствия на уроке"), а т.к. оно участвует в конструкции кода :
..rs.FindFirst "[Код_Ребенок] = " & Str(Me!lst).., "избавляться" от него (изменять его тип) - неверное (бесполезное) занятие.
используя в качестве источника строк списка конструкцию подобную , список будет отображать уникальные записи, но работоспособности проект лишится.

Вам стоит заняться изучением SQL!!!
Евгений.

Последний раз редактировалось Teslenko_EA; 18.03.2010 в 09:09.
Teslenko_EA вне форума Ответить с цитированием
Старый 18.03.2010, 09:29   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вам стоит заняться изучением SQL!!!
скорее нужно для начала изучить, что такое нормальная форма, как проектируются структуры БД, а уж потом изучать SQL...

Цитата:
Т.о. получится, что "Сидоров Сидор Сидорович" отсутствовал два раза и в базу он заносится два раза.
должна быть таблица ваших детей/учеников...
в ней записи должны одназначно определяться КОДОМ (т.е. Сидоров Сидор Сидорович с кодом 1 и Сидор Сидор Сидорович с кодом 2 - это РАЗНЫЕ люди! (другой вопрос, как Вы их будете отличать, но это сути не меняет! - для программы это абсолютно разные сущности.
А таблица отсутствия на уроке - это ДРУГАЯ таблица, связанная с таблицей учеников реляционной связью!

короче, прежде чем программировать - надо разработать структуру БД.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2010, 10:46   #7
Ivan_RIV
 
Регистрация: 17.03.2010
Сообщений: 7
По умолчанию

Спасибо, за подробные ответы... Попробую переделать структуру базы... Мир не без добрых людей!
Ivan_RIV вне форума Ответить с цитированием
Старый 08.04.2010, 15:31   #8
Kingson
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 18
По умолчанию

Здравствуйте, кого не видел.
Меня заинтересовал этот вопрос, а именно применение Distinct'а.
Дело в том, что у меня была проблема, в таблице (TMP) попадались одинаковые записи и надо было оставить только одну из них.
Я сделал это, но очень громоздко.
Вот так было бы гораздо проще:
"INSERT INTO Таблица (Код) SELECT DISTINCT TMP.*, Вычислить_код(TMP.Поле) FROM TMP ORDER BY " & Поля
, где Поля - это полный перечень полей таблицы TMP через запятую.
Так вот этот запрос почему-то не работает и вставляет в Таблицу всю TMP целиком. Кто бы сказал почему?
Kingson вне форума Ответить с цитированием
Старый 08.04.2010, 16:17   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

distinct применяется ко всей выборке!
таким образом, у Вас выбираются несовпадающие значения полей из TMP + значение функции Вычислить_код(TMP.Поле)

хм... непонятно объяснил..
попробую ещё раз
вы выбираете значения полей из TMP + значение функции
пусть
select TMP.*, Вычислить_код(TMP.Поле)
вернёт набор
Код:
Поле1  Поле2 ВычКод
aaa       иии    111 
aaa       иии    122
aaa       bbb    111 
aaa       иии    122
bbb      bbb    111
тогда
select DISTINCT TMP.*, Вычислить_код(TMP.Поле)
вернёт набор
Код:
Поле1  Поле2 ВычКод
aaa       иии    111 
aaa       иии    122
aaa       bbb    111 
bbb      bbb    111
т.е. в результирующей выборке не будет двух ПОЛНОСТЬЮ (все поля учитываются) совпадающих строк.
и всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2010, 19:40   #10
Kingson
Пользователь
 
Регистрация: 12.12.2009
Сообщений: 18
По умолчанию

А как можно написать запрос, чтобы TMP.* учитывался при совпадении, а функция Вычислить_код не учитывалась. Или это надо делать в два запроса?
Kingson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить записи в форме Swatch Microsoft Office Access 2 22.02.2010 16:57
Не могу удалить записи. Хитрец БД в Delphi 13 02.02.2009 22:28
Удалить из строки S1 первую, последнюю, все подстроки совпадающие с S2 ТРОЯН=) Паскаль, Turbo Pascal, PascalABC.NET 1 10.12.2008 23:28
помогите удалить элемент из связанного списка kermit Помощь студентам 5 13.06.2008 10:14
Подскажите как программно удалить все записи Worms БД в Delphi 3 04.03.2008 16:30