Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
1-1086426640
Maxud
2004-06-05 13:10
2004.06.20
Ошибка при проверке типа


1-1086755177
Softal
2004-06-09 08:26
2004.06.20
Treeview


11-1075311112
TEmp_Name
2004-01-28 20:31
2004.06.20
RegKeySetBinary


1-1086322949
korvin
2004-06-04 08:22
2004.06.20
Вывод отчёта нестандартной ширины


14-1086114076
ИМХО
2004-06-01 22:21
2004.06.20
Вопрос по США: Мазуту, Алексу Коншину и другим американцам