:: Visual Foxpro, Foxpro for DOS
Поиск по номеру телефона, новая головная боль...
ZenTigra
Автор

Сообщений: 514
Дата регистрации: 03.12.2004
В таблице клиентов есть поле - номер телефона, оно символьное, изначально оно было чисто информационное, тому никаких проверок в его заполнении не было.
Но возникла потребность поиска по номеру телефона, подскажите как безболезненно можно это реализовать
Вот несколько примеров занесения в это поле:
(066) 99-99-999
(066) 99 99 999
066 99-999-999
0569 23-233

На ум приходит только конвертировать его в числовое поле, и отображать его по шаблону...

PS.Поиск будет осуществляться посредством SQL запроса



Исправлено 1 раз(а). Последнее : ZenTigra, 31.10.17 15:41
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
Mitjay

Сообщений: 387
Откуда: Саратов
Дата регистрации: 01.01.2005
CREATE CURSOR cc (phone c(15))
INSERT INTO cc VALUES ("(066) 99-99-999 ")
INSERT INTO cc VALUES (" (066) 99 99 999 ")
INSERT INTO cc VALUES ("066 99-999-999")
INSERT INTO cc VALUES ("0569 23-233")
SELECT phone, PADR(CHRTRAN(phone, CHRTRAN(phone, "0123456789", ""), ""), 15) FROM cc



Исправлено 1 раз(а). Последнее : Mitjay, 31.10.17 15:55
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В числовое не надо, а вот убрать всё кроме чисел из строки (Дмитрий показал как) - будет приемлемо. Потом уж искать - скорее всего придётся применять LIKE, т.к. наверняка помимо номеров с кодом будут и номера без кода...

Если же станет задача "нормализации" данных в таблице и выявления ошибок (например слишком длинный или короткий номер, неверный код оператора/города, просто телефон без кода - и надо дописать какой-то "умолчательный" код), то там без хитрой логики и вспомогательных справочников не обойтись...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не надо преобразовывать в число (тем более 10 цифр в Integer не влезают). Код города (066) не всегда вводят, бывает также добавляют код страны (например, +7 или +38), бывает добавляют 8 - "код межгорода". Можно попробовать искать заданый телефон, как последовательность цифр в конце номера телефона в таблице.
m.x = "12345" && искомый номер
m.n = 'CHRTRAN(phone, CHRTRAN(phone, "0123456789", ""), "")' && выражение номера, приведенное к "только цифры"
LOCATE FOR RIGHT(&n, LEN(m.x))=m.x && собственно поиск. Макрос не нужен - он здесь просто для сокращения записи
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
Сергей Филиппов

Сообщений: 260
Откуда: Hannover
Дата регистрации: 05.10.2000
"Вы не подскажете номер его телефона?"
- "Простите я не помню"
"Ну хотя бы примерно..."
С.Д. Довлатов


------------------
В действительности всё не так, как на самом деле...
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Чей номер он забыл?...
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
Каратаев

Сообщений: 3974
Откуда: Алматы
Дата регистрации: 04.12.2001
Немного поздновато, но всё-же... У меня была такая же засада... Сначала постарался привести все номера к единому формату.
Вот выдрал у себя:
А потом поиск уже вот так работает:
LOCAL lcTlfStr
m.lcTlfStr = This.Parent.Text4.Value
* в строке может быть несколько телефонов, разделённых запятой...
* проверяем на валидность
LOCAL lnKvoTelef, z
m.lnKvoTelef = GETWORDCOUNT(m.lcTlfStr,',')
FOR m.z = 1 TO m.lnKvoTelef
cTelefon = GETWORDNUM(m.lcTlfStr, m.z, ',')
* раскладываем на возможные варианты для поиска
cTel1 = GETWORDNUM(cTelefon, 2, ' ')
cTel2 = STRTRAN(cTel1,'-',' ')
cTel3 = STRTRAN(cTel1,'-')
* поиск совпадений в поле telefon_
LOCATE FOR (AT(cTel1, telefon_)>0 OR AT(cTel2, telefon_)>0) OR AT(cTel3, telefon_)>0
IF FOUND()
* здесь обработка
ENDIF
ENDFOR


------------------
Никогда не бывает настолько плохо, чтобы не могло быть еще хуже.
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
а regexp уже отменили?


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Поиск по номеру телефона, новая головная боль...
sphinx

Сообщений: 31166
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Foxtrot
а regexp уже отменили?а regexp уже отменили?

"Хуже, когда не знал и забыл."


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 15 Владимир Максимов  (Гостей: 14)

© 2000-2024 Fox Club 
Яндекс.Метрика