![]() |
AW: Telefonnummer in Datenbank Finden
Zumachen nicht vergessen...
|
AW: Telefonnummer in Datenbank Finden
Zitat:
Hier mal ein Link dazu. ![]() Der alte Firebird hatte damals kaum Date/Time Funktionen im Angebot. Dafür hatte ich für einen Kunden die halben Delphi DateUtils per DLL als UDF bereitgestellt. Du kannst Dir also einfach eine Firebird "Addin" DLL in Delphi schreiben, die Dir Folgendes ermöglicht:
Code:
"NormalizedPhoneNumber" ist eine Delphi Funktion, die per DLL bereitgestellt wird und etwa so aussehen könnte:
SELECT
* FROM KONTAKTE K WHERE NormalizedPhoneNumber(K.Telefon) = '04040404040404040';
Delphi-Quellcode:
function NormalizedPhoneNumber(const aTelefonnummer:WideString):WideString;
var t:String; begin t := StringReplace(aTelefonnummer,'+','00'); t := RemoveNoneNumericCharsFromString(t); result := t; end; |
AW: Telefonnummer in Datenbank Finden
Die implizite "(0)" nicht vergessen zu entfernen,
wenn keine Landesvorwahl vorhanden, dann diese hinzufügen usw. |
AW: Telefonnummer in Datenbank Finden
Geht das auch für Linux?
|
AW: Telefonnummer in Datenbank Finden
Kann ich nicht sagen. Hatte bisher nur Windows Firebird Server in den Fingern.
|
AW: Telefonnummer in Datenbank Finden
In Firebird zumindest seit der 2.x ' er Version kann man die meisten UDF' s durch SP' s ersetzen.
Code:
Ich führe immer ein Feld mit (Bsp. nummer$, welches nur die Ziffern enthält.
create or alter procedure nur_ziffern (
wert varchar(80) returns ( result varchar(80)) as declare variable laenge smallint$; declare variable pos smallint$; declare variable zeichen char1$; begin laenge = char_length(:wert); if (:laenge > 0) then begin pos = 1; while (:pos <= :laenge) do begin zeichen = substring(:wert from :pos for 1); if (:zeichen in ('0','1','2','3','4','5','6','7','8','9')) then result = coalesce(:result, '')||:zeichen; pos = :pos + 1; end end suspend; end Dieses wird über einen Trigger aktuell gehalten:
Code:
Das Feld ist indexiert und wird für die Suche benutzt.
CREATE OR ALTER TRIGGER TELEFON_BUI1 FOR TELEFON
ACTIVE BEFORE INSERT OR UPDATE POSITION 1 as begin execute procedure nur_ziffern(new.nummer) returning_values new.nummer$; end Frank |
AW: Telefonnummer in Datenbank Finden
Das sieht sehr gut aus. Werde ich gleich mal in die Tat umsetzten.
|
AW: Telefonnummer in Datenbank Finden
Anbei die Funktionierende Lösung dank einer Procedure:
Code:
Und mit diesem select ist auch kein zweites Feld nötig:
CREATE PROCEDURE STRTOINT(
STRINGWERT VARCHAR(80) CHARACTER SET ISO8859_1 COLLATE ISO8859_1) RETURNS( RESULT VARCHAR(80) CHARACTER SET ISO8859_1 COLLATE ISO8859_1) AS DECLARE VARIABLE laenge INTEGER; DECLARE VARIABLE pos INTEGER; DECLARE VARIABLE zeichen CHAR(1); BEGIN /* Procedure body */ laenge = char_length(:STRINGWERT); if (:laenge > 0) then begin pos = 1; while (:pos <= :laenge) do begin zeichen = substring(:STRINGWERT from :pos for 1); if (:zeichen in ('0','1','2','3','4','5','6','7','8','9')) then result = coalesce(:result, '')||:zeichen; pos = :pos + 1; end end SUSPEND; END;
Code:
Ich hab natürlich einige Datenbank-Reads aber es hält sich in unter einer Sekunde.
select *
from ANSPR a where (select result from STRTOINT(a.TEL)) = '0123456' Evtl. muss ich mit den Landesvorwahlen tricksen bzw. muss ich mal testen wie gut das mit einem like '%0123456' funktioniert, wenn ich vorher im Delphi-Code die Landesvorwahlen immer raus nehme. Nochmals vielen Dank! |
AW: Telefonnummer in Datenbank Finden
Zitat:
|
AW: Telefonnummer in Datenbank Finden
Was soll's, er hat verkorkste Daten, eine Möglichkeit so zu tun als sei alles in Ordnung, also geht's weiter so.
![]() Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz