Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Вниз

Table => Filter?   Найти похожие ветки 

 
Jet ©   (2004-05-27 17:25) [0]

Нужно составить следующий фильтр для таблицы:
Имеется таблица .dbf (FoxPro) с полем Fam, Name и т.д.
Ее нужно отфильтровать по первым пяти буквам фамилии и трем первым
буквам имени, т.е. если есть записи:

1 Иванов Петр
2 Иванова Петр
3 Ивашкин Петр
4 Ивашкин Пятр

То считать одинаковыми записи 1 и 2:
(Ивано)в (Пет)р
(Ивано)ва (Пет)р

Но разными 1,3,4:

(Ивано)в (Пет)р
(Ивашк)ин (Пет)р
(Ивашк)ин (Пят)р

или 2,3,4

(Ивано)ва (Пет)р
(Ивашк)ин (Пет)р
(Ивашк)ин (Пят)р

На выходе должно быть:

1 Иванов Петр
3 Ивашкин Петр
4 Ивашкин Пятр

или

2 Иванов Петр
3 Ивашкин Петр
4 Ивашкин Пятр

Т.е. фактически вывести уникальные записи по первым 5 буквам фамилии и
первым 3 буквам имени. Помогите кто знает.


 
Соловьев ©   (2004-05-27 17:29) [1]

событие OnFileterRecord:
Accept := <условие>;
пишешь вместо что в голову прийдет :)


 
Jet ©   (2004-05-27 17:33) [2]

А поподробнее по примеру можно пожалуйста?


 
Sandman25+1   (2004-05-27 17:33) [3]

Или
family like "ИВАНО%" and name like "ПЕТ%"


 
Jet ©   (2004-05-27 17:36) [4]

Так первые буквы не зивестны, если не взять запись. А сразу нельзя отфильтровать не используя буквы. К примеру :
AnsiLeftStr(Fam,5) <> AnsiLeftStr(Fam,5)
Что-то типа такого.


 
Соловьев ©   (2004-05-27 17:37) [5]


> family like "ИВАНО%" and name like "ПЕТ%"

телепат:)
я и не знал что у него ФИО рассписано :)


 
Соловьев ©   (2004-05-27 17:38) [6]


> Так первые буквы не зивестны, если не взять запись. А сразу
> нельзя отфильтровать не используя буквы. К примеру :
> AnsiLeftStr(Fam,5) <> AnsiLeftStr(Fam,5)
> Что-то типа такого.

в OnFilterRecord - фантазия безгранична :)


 
Sandman25+1   (2004-05-27 17:43) [7]

Перечитал первый пост. Что-то я не то отвечал...
Нужно что-то типа
select *
 from t t1
 where not exists
   (select 1
      from t t2
    where substr(t1.name, 1, 3) = substr(t2.name, 1, 3)
      and substr(t1.family, 1, 5) = substr(t2.family, 1, 5)
      and t2.id > t1.id
   )
Но скорость будет ужасная.
Зачем это все надо?


 
Vlad ©   (2004-05-27 17:47) [8]


> Sandman25+1   (27.05.04 17:43) [7]


> Зачем это все надо?

Похоже на лабораторную работу :-)

> Jet ©   (27.05.04 17:25)  

Если нужно именно фильтр, а не SQL, тогда Соловьев ©   (27.05.04 17:38) [6]
+
В Дельфи есть функция Copy, которая может вернуть тебе любой кусок строки.


 
Соловьев ©   (2004-05-27 17:48) [9]

Ах, блин, что-то я стал вообще не внимательным, действительно есть FIO
тогда

select *
from table
where family like :p1||"%" and name like :p2||"%"

где p1 и p2 - параметры заполняешь в проге


 
Jet ©   (2004-05-27 17:49) [10]

Мне нужно почистить большую базу ~200 метров
Просто там слишком много всяких Ивановых и т.д., у которых по ошибке набита какя-нибудь буква не так (дальше 5 буквы), а они в принципе одинаковы, вот и надо их "истребить" по записям..))))


 
Sandman25+1   (2004-05-27 17:51) [11]

[10] Jet ©   (27.05.04 17:49)

Это очень опасно. Так можно и Иванова с Ивановичем спутать.


 
Sandman25+1   (2004-05-27 17:52) [12]

[8] Vlad ©   (27.05.04 17:47)

Через фильтр очень сложно.

PS. Точнее, я совсем не представляю, как...


 
HSolo ©   (2004-05-27 17:53) [13]

>Jet ©   (27.05.04 17:49) [10]
А Вы уверены, что там нет какого-нибудь Ивановского или Иванопуло? У которого и после 5-й буквы все нормально?


 
Соловьев ©   (2004-05-27 17:54) [14]


> Мне нужно почистить большую базу ~200 метров
> Просто там слишком много всяких Ивановых и т.д., у которых
> по ошибке набита какя-нибудь буква не так (дальше 5 буквы),
> а они в принципе одинаковы, вот и надо их "истребить" по
> записям..))))

ооо, знакомая ситуация...
опасна и трудна...


 
Соловьев ©   (2004-05-27 17:56) [15]


>  они в принципе одинаковы

нету какого-то поля которое точно идентефицирует человека? код налоговой допустим? или паспорт? По имени и фамилии - опасно очень.


 
Jet ©   (2004-05-27 18:03) [16]

Начну сначала. Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра). Мне нужно было вывести все записи из большой таблицы, которых нет в маленькой. Я это сделал вложенным запросом:
SELECT * FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE
T2.Lname = T1.R08 and T2.Fname = ap.R09 and .... ) and T1.R17 <> "111" and ap.R17 <> "" and T1.R17 <> " " order by R18,R08");

Сделал я это. Сохранил все аккуратненько по разным текстовым файликам. А потом увидел, что есть например такое:

Иванов Иван Сергеевич
Ивановь Иван Сергеевич

Записи, согласитесь весьма одинаковы (ошибки набивщиков), и одна из них не нужна. Вот теперь и суть отфильтровать эти записи по ключу:
Фамилию по первым 5 буквам, имя по 3 буквам, отчество по 3 буквам + дата рождения из одной записи. Накроет конечно не всех, но очень неплохо сработает.

Других идентификационных данных нет..((


 
HSolo ©   (2004-05-27 18:03) [17]

Чистить таблицы "на автопилоте", без человека, это, по-моему, для любителей острых ощущений, вроде русской рулетки :)) Можно предоставить человеку сервис, что-нибудь вроде "отбор похожих записей" (по like, нечеткий поиск... по вкусу), но решение об удалении записи должен принимать человек, а не компьютер. По-моему, так (с) Винни-Пух.
А если на очищаемую таблицу кто-то ссылается - то нужен еще механизм перевешивания ссылок с удаляемой записи на правильную.


 
Jet ©   (2004-05-27 18:45) [18]

Начну сначала. Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра). Мне нужно было вывести все записи из большой таблицы, которых нет в маленькой. Я это сделал вложенным запросом:
SELECT * FROM T1 WHERE NOT EXISTS (SELECT * FROM T2 WHERE
T2.Lname = T1.R08 and T2.Fname = ap.R09 and .... ) and T1.R17 <> "111" and ap.R17 <> "" and T1.R17 <> " " order by R18,R08");

Сделал я это. Сохранил все аккуратненько по разным текстовым файликам. А потом увидел, что есть например такое:

Иванов Иван Сергеевич
Ивановь Иван Сергеевич

Записи, согласитесь весьма одинаковы (ошибки набивщиков), и одна из них не нужна. Вот теперь и суть отфильтровать эти записи по ключу:
Фамилию по первым 5 буквам, имя по 3 буквам, отчество по 3 буквам + дата рождения из одной записи. Накроет конечно не всех, но очень неплохо сработает.

Других идентификационных данных нет..((


 
Anatoly Podgoretsky ©   (2004-05-27 19:03) [19]

Jet ©   (27.05.04 18:45) [18]
Не факт, могут быть обе верные.
Предоставь право решать оператору, а ему выдай список


 
Jet ©   (2004-05-27 20:57) [20]

Может кто подкинет еще идею?
Спасибо.


 
Соловьев ©   (2004-05-28 09:56) [21]

ИМХР, изначально не правильно была заработана структура БД. Оператор не виноват, что разработчик не придумал PK(паспорт, код налоговой, код страхованитя и т.п.).  Было бы это ключевое поле - никто не смог бы ввести одного и того же человека дважды. И такие вопросы еще должны решатся на этапе проеткирования, а не в процессе работы проги.


 
Sergey13 ©   (2004-05-28 10:18) [22]

2Соловьев ©   (28.05.04 09:56) [21]
>... что разработчик не придумал PK(паспорт, код налоговой, код страхованитя и т.п.)
Только не ПК, а просто уникальность.

2Jet ©   (27.05.04 18:03) [16]
>Было у меня две базы. Одна большая (~200 метров), другая небольшая (~1 метра).
А больше таблиц никаких нет? Просто список физ.лиц.? Что то на эти записи ссылается? Ну там деньги или еще что? А то ведь можно одного нечаянно миллионером сделать, друго нищим. 8-)


 
Соловьев ©   (2004-05-28 10:19) [23]


> Только не ПК, а просто уникальность.

почему? можно и ПК


 
Anatoly Podgoretsky ©   (2004-05-28 10:35) [24]

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


 
Sergey13 ©   (2004-05-28 10:45) [25]

2Соловьев ©   (28.05.04 10:19) [23]
>почему? можно и ПК
Можно. Но не нужно, по моему глубокому убеждению. Ибо в этой стане практически нет устойчивых реквизитов. Меняться может все что угодно. 8-( Но это вопрос из другой оперы.


 
Соловьев ©   (2004-05-28 10:51) [26]


> Меняться может все что угодно. 8-( Но это вопрос из другой
> оперы.

Такой случай: был клиент и бул у него код например 3333333, все документы так и оформлялись, а потом например он сменил вид экономической деятельности и у него уже другой код, да вроде фамилия та же но - это уже другой клиент. поэтому когда будет менятся, надо заводить новую запись.
Хотя, наверное, лучше сделать суроганый ключ, а не естественный, но это тема для длинного спора...


 
Sergey13 ©   (2004-05-28 11:01) [27]

2Соловьев ©   (28.05.04 10:51) [26]
> да вроде фамилия та же но - это уже другой клиент. поэтому когда будет менятся, надо заводить новую запись.
Надо, кто спорит то? Это другой клиент. И старого оставить, с кодом 3333333. Если это критично для системы, то подумать как их логически объединять, если нет - то и так сойдет. 8-)
А паспорта... У меня в 39 лет уже второй (российский) у жены 3 или 4 (два раза замужем - причем второй раз удачно 8-)....

>но это тема для длинного спора...
Во-во... 8-)


 
Anatoly Podgoretsky ©   (2004-05-28 11:25) [28]

Соловьев ©   (28.05.04 10:51) [26]
Считай приведенный в вопросе пример как раз суррогатным ключом, поскольку там ничего естественного нет.
Суррогатные ключи обеспечивают только уникальность записи и ни как в данной ситуации не помогает, правда в данной ситуации ничего не поможет. Поскольку

Ивашкин Саша
Ивашкин Паша

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.032 c
4-1084300625
ipavels
2004-05-11 22:37
2004.06.20
Обновить конфигурацию оборудования


9-1077830655
spogi
2004-02-27 00:24
2004.06.20
sozdaniie i proverka


14-1086176191
Yanis
2004-06-02 15:36
2004.06.20
Assembler


14-1086001753
Gero
2004-05-31 15:09
2004.06.20
MP3 музыка


1-1086338634
SigalX
2004-06-04 12:43
2004.06.20
Installer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский