|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.03.2010, 10:41 | #1 |
Регистрация: 17.03.2010
Сообщений: 7
|
Как удалить совпадающие записи из списка?
Здравствуйте! Подскажите пожалуйста, как доработать программу (Пример, скачанный в интернете) функцией удаления совпадающих по ФИО записей в списке, а так же записей, полученных в результате фильтрации, при этом совпадающие по ФИО записи, удаляются только из списка и должны оставаться в базе. Например, один человек по фамилии "Сидоров" записан дважды, но это не ошибка... При поиске по фамилии "Сидоров" выведется две записи одинаковых по ФИО (остальные данные могут быть другими), при активации функции в списке должна остаться одна запись вместо двух. Спасибо всем кто откликнулся!
|
17.03.2010, 18:08 | #2 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
Здравствуйте Ivan_RIV.
"функцией удаления совпадающих по ФИО записей..удаляются только из списка и должны оставаться в базе.." - Вы хотели бы получить список уникальных значений? Уникальные значения позволяет получить предикат DISTINCT: select * from... - все значения select distinct * from... - уникальные значения Но в Вашем случае эти знания никак не пригодятся, т.к. список формируется с использованием поля Код_Ребенок, и хотя Вы не сделали его (это поле) ключевым и индексным, тип Счётчик подразумевает "уникальность". "..удаляются только из списка.." - для каждого из "ребенков" поле Код_Ребенок является идентификатором в списке. И если я верно понял вопрос "как доработать программу..функцией..?" - ответ: это не возможно в принципе. мнение: для того, что бы подобные вопросы не возникали в будущем, Вам стоит заняться изучением SQL. Евгений. |
17.03.2010, 20:21 | #3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Как всегда, Евгений Тесленко, безусловно прав!
Думаю, что Вы просто не понимаете, что Вы просите сделать! Хотя, формально, с Вашей задачей легко справится такой запрос: Код:
p.p.s. ещё раз повторю — Евгений прав! А Вы из правильной программы пытаетесь сделать неверную... |
18.03.2010, 08:02 | #4 |
Регистрация: 17.03.2010
Сообщений: 7
|
Благодарю, всех кто откликнулся! Возможно я не правильно изложил вопрос.
Если отстраниться от буквального назначения программы (ФИО и дата рождения ученика) и если вместо даты рождения поставить другой атребут (поле), характеризующий ученика, например, "Дата отсутствия на уроке". Т.о. получится, что "Сидоров Сидор Сидорович" отсутствовал два раза и в базу он заносится два раза. Соответственно другие ученики могут так же отсутствовать несколько раз и тоже заноситься несколько раз. В базе будет теперь много записей и их можно будет сгрупировать по ФИО, т.е. введа ФИО получим, например, что "Сидоров Сидор Сидорович" встречается в базе два раза. Всего в базе 5 записей из них 2 записи это "Сидоров Сидор Сидорович", чтобы посчитать сколько учеников с разными фамилиями (список обучающихся в классе или школе детей) необходимо убрать совпадающие фамилии, то есть получиться должно 4 ученика. Если совпадает ФИО, то удаляется ФИО+все поля которые содержит запись ученика. Записи удаляются только из списка, но остаются в базе. Совпадения убираются, например, по нажатию кнопки или установки чекбокса, это не важно, как проще. Как я понимаю, если поставить DISTINCT, то "Сидоров Сидор Сидорович" добавится все равно в базу, если он отсутствовал в разные дни. По поводу поля Код_ребенка, то его тип можно изменить, если это принципиально. |
18.03.2010, 09:05 | #5 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
Ivan_RIV, Вы можете и дальше продолжать выкладывать заявления "..Код_ребенка..тип можно изменить, если это принципиально...", результат останется нулевым.
Попытаюсь объяснить, сравните две таблицы возвращаемые запросами первый вариант: 1а SELECT Фамилия, Имя, Отчество FROM Ребенок вернет все записи (в образце пять строк) 2а SELECT DISTINCT Фамилия, Имя, Отчество FROM Ребенок вернет уникальные записи (в образце четыре строки), и второй вариант: 1б SELECT Код_Ребенок, Фамилия, Имя, Отчество FROM Ребенок 2б SELECT DISTINCT Код_Ребенок, Фамилия, Имя, Отчество FROM Ребенок обе конструкции вернут все записи (строки) т.к. в них присутствует поле идентификатор - Код_Ребенок. Оно и есть "атребут (поле), характеризующий ученика.." (никак не "Сидоров Сидор Сидорович" и не "Дата отсутствия на уроке"), а т.к. оно участвует в конструкции кода : ..rs.FindFirst "[Код_Ребенок] = " & Str(Me!lst).., "избавляться" от него (изменять его тип) - неверное (бесполезное) занятие. используя в качестве источника строк списка конструкцию подобную 2а, список будет отображать уникальные записи, но работоспособности проект лишится. Вам стоит заняться изучением SQL!!! Евгений. Последний раз редактировалось Teslenko_EA; 18.03.2010 в 09:09. |
18.03.2010, 09:29 | #6 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
Цитата:
в ней записи должны одназначно определяться КОДОМ (т.е. Сидоров Сидор Сидорович с кодом 1 и Сидор Сидор Сидорович с кодом 2 - это РАЗНЫЕ люди! (другой вопрос, как Вы их будете отличать, но это сути не меняет! - для программы это абсолютно разные сущности. А таблица отсутствия на уроке - это ДРУГАЯ таблица, связанная с таблицей учеников реляционной связью! короче, прежде чем программировать - надо разработать структуру БД. |
||
18.03.2010, 10:46 | #7 |
Регистрация: 17.03.2010
Сообщений: 7
|
Спасибо, за подробные ответы... Попробую переделать структуру базы... Мир не без добрых людей!
|
08.04.2010, 15:31 | #8 |
Пользователь
Регистрация: 12.12.2009
Сообщений: 18
|
Здравствуйте, кого не видел.
Меня заинтересовал этот вопрос, а именно применение Distinct'а. Дело в том, что у меня была проблема, в таблице (TMP) попадались одинаковые записи и надо было оставить только одну из них. Я сделал это, но очень громоздко. Вот так было бы гораздо проще: "INSERT INTO Таблица (Код) SELECT DISTINCT TMP.*, Вычислить_код(TMP.Поле) FROM TMP ORDER BY " & Поля , где Поля - это полный перечень полей таблицы TMP через запятую. Так вот этот запрос почему-то не работает и вставляет в Таблицу всю TMP целиком. Кто бы сказал почему? |
08.04.2010, 16:17 | #9 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
distinct применяется ко всей выборке!
таким образом, у Вас выбираются несовпадающие значения полей из TMP + значение функции Вычислить_код(TMP.Поле) хм... непонятно объяснил.. попробую ещё раз вы выбираете значения полей из TMP + значение функции пусть select TMP.*, Вычислить_код(TMP.Поле) вернёт набор Код:
select DISTINCT TMP.*, Вычислить_код(TMP.Поле) вернёт набор Код:
и всё. |
08.04.2010, 19:40 | #10 |
Пользователь
Регистрация: 12.12.2009
Сообщений: 18
|
А как можно написать запрос, чтобы TMP.* учитывался при совпадении, а функция Вычислить_код не учитывалась. Или это надо делать в два запроса?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Удалить записи в форме | 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 |