Telefon Nummer suchen ...

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Telefon Nummer suchen ...

Beitrag von AUGE_OHR »

hi,

Jeder hat wohl in einer Datenbank irgendwo auch Telefon Nummern.

Wenn ich nun mehrere FELDer mit Telefon Nummer habe muss ich
die nach-einander durchsuchen ...

vielleicht liegt es ja auch an meinem Datenbank Design. Ich verwende
meistens Type "C", auch bei Telefon Nummern obwohl es ja Nummern
sind (in Deutschland) ...

jemand eine "geniale" Idee wie man das "besser" lösen könnte ?

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Moin,

um "C" wird man wohl auch nicht herumkommen. Irgendwie sollte/möchte man ja auch die Vorwahl von der Hauptnummer trennen, außer man macht dafür auch noch getrennte Felder.

Wie suchst Du denn?
Satz 1 Feld1 Feld2
Satz 2 Feld1 Feld2

Oder erst alle Feld1 und dann alle Feld2 usw?

Hast Du überall einen Index drauf?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

zumindest unsere Vorwahl fängt mit einer 0 an, also muss es genauso wie PLZ ein C Feld sein. Wie wäre es mit einem Index auf eine Funktion, die die Blanks, -, / () etc. entfernt und dann auf feste Länge bringt (das muss sein). Oder meintest du mehrer Telefonnummernfelder pro Datensatz ?

Eventuell geht da was mit den selbstgebauten Indexen von 1.90 ?
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
... um "C" wird man wohl auch nicht herumkommen
yup ... bei einem VAL(TelNo.) "fehlt" dann die "0" der Vorwahl ...
Wie suchst Du denn?
jede Tel.No. hat einen "normalen" Index, alo mit SEEK()
Wie wäre es mit einem Index auf eine Funktion, die die Blanks, -, / () etc. entfernt und dann auf feste Länge bringt (das muss sein)
yup darauf bin ich gestern Nacht auch gekommen ... zusammen mit
OrdWildSeek("*"+cTelNo+"*") durchsuche ich jetzt "alle FELD"er und
gebe die per Listbox aus.

Einziger "Nachteil" : bei "C" 10 pro Tel.No kann man "nur" 25 (x10)
FELDer in einen Index TAG aufnehmen.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jimmy,

Wieviele Telefonfelder hast du denn ?
Wenns nicht anders geht und so viele Felder je Datensatz vorhanden sind, würde ich die DBF aufteilen:

Angenommen du hast eine Kundendatei:

ID // eindeutige Kundennummer
... // sonstige Felder
Tel1
Tel2
Tel3
etc.

würde ich aufteilen auf eine Steuerdatei:

ID // eindeutige Kundennummer
... // sonstige Felder

und eine Telefonnummerndatei:

ID // eindeutige Verknüpfung zu Hauptdatei
Tel // hier nun einen normalen Index drauf falls linksbünding gesucht werden soll oder ordwildseek für teiltelefonnummern ...

In dieser Datei stehen dann von 0 bis XXXX Telefonnummern, die alle zu einem Steuersatz gehören.

-> Kein Ärger mit Telefonnummern Begrenzung (ich wollte aber 30 ...)
-> Telefonfeld kann auch 15 Zeichen enthalten
-> Jede Telefonnummer kennt seinen Kunden
-> Ein Count und man weiß wieviele Telefonnummern ein Kunde hat.
etc.[/code]
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Wieviele Telefonfelder hast du denn ?
naja jetzt sind es 8 + 8 Vorwahl ...
brandelh hat geschrieben: Wenns nicht anders geht und so viele Felder je Datensatz vorhanden sind, würde ich die DBF aufteilen:
ja ... wenn man die 255 in Indexkey überschreitet wird man das wohl
machen müssen ...

Aber nun noch was anderes :

Ala "Windows" wird über STRG-F die "suche" aktiviert. Dann kann ich
in das (STATIC) SLE meinen Suchbegriff eintippen. Wie aber mache
ich ein "F3", also "weitersuchen" ?

Code: Alles auswählen


STATIC cSuch := ""

FUNCTION STRG_F_SUCHEN()
...
   // reinit cSuch
   cSuch := SPACE(10)
   @ x,y GET cSuch PICTURE "@K 9999999999"
   READ
   ORDWILDSEEK("*"+ALLTRIM(cSuch)+"*")
   IF FOUND()
....

FUNCTION F3_WEITER
   // wurde schon STRG_F_SUCHEN aktviert ?
   IF STRG_F_SUCHEN_HAVE_PRESSED

       IF .NOT. EMPTY(cSuch)
           ORDWILDSEEK()
mir ist nicht klar ob ORDWILDSEEK() ohne Parameter nun noch mit
dem "alten" cSuch arbeitet oder nicht und wie ich "prüfen" kann ob
STRG_F_SUCHEN vor F3 "aktiviert" wurde (evtl Suchbegriff geändert ?)

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
merke Dir doch einfach in einer Variablen, ob die Taste gedrückt wurde.
Bei Programmstart initialisierst Du sie mit .F. und in Deiner Funktion STRG_F_SUCHEN() mit .T. (zumindest wenn ein Suchbegriff eingegeben und gesucht wurde).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jimmi,

ich habe jetzt kein Handbuch hier (und auch keinen Compiler) aber STRG+F gibt einen Tastencode und F3 einen anderen schau mal in der inkey.ch nach (bei VIO, sonst appevent.ch oder so ähnlich)

Meines Wissens arbeitet OrdWildSeek() immer ab der aktuellen DBF Position, also nicht wie das normale seek, sondern eher wie DBLOCATE m it REST=.t. ... kann es hier aber nicht prüfen.
Gruß
Hubert
Daniel

Beitrag von Daniel »

brandelh hat geschrieben: Meines Wissens arbeitet OrdWildSeek() immer ab der aktuellen DBF Position, also nicht wie das normale seek, sondern eher wie DBLOCATE m it REST=.t. ... kann es hier aber nicht prüfen.
So verstehe ich die Doku auch, dass OrdWildSeek() ab der aktuellen Position mit dem vorherigen Suchbegriff weitersucht.

Aber ich würde den Suchbegriff auch in einer Variable ablegen, dann kannst du prüfen, ob er nicht leer ist. Also muss vorher bereits gesucht worden sein.

Die Tel-Nrn speichere ich jeweils ohne Blanks und andere Zeichen (aber in Char-Feld), zur Anzeige kann man sie immer noch wieder auftrennen, oder?

Frage:
Könnte man denn mehrere Felder hintereinander schnell durchsuchen, wenn alle zusammen nicht länger als 256 Z. sind?
Eventuell geht da was mit den selbstgebauten Indexen von 1.90 ?

Wo finde ich denn etwas darüber?

Ich denke, es ist eine gute Idee von dir, Hubert, eine Referenzdatei einzusetzen. Wenn nur der Aufwand der Nachführung nicht wäre...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

die selbstgebauten Indexe erstellt man mit INDEX ... CUSTOM. Die Indexschlüssel muß man dann mit OrdKeyAdd() hinzufügen, wobei hierbei der Indexbegriff ausgewertet wird. Um mehrere Schlüssel pro Satz aufnehmen zu können, müsste die Indexroutine eine Funktion aufrufen, die sich das letzte Feld merkt und jeweils das nächste zurückliefert. Beim Abfragen später jedoch nur nach einem Schlüssel sucht. Nicht ganz einfach.

ICH würde über eine Normalisierung der Daten nachdenken und die vielen Telefonfelder je Satz in eine eigene Telefonfelddatei auslagern, wobei eine Kennung die Art der Telefonnummer speichern könnte:

Hauptdatei: KundNr, .... , TelPrivat, TelGesch, TelHandy etc.
->
Hauptdatei: KundNr, ....
Telefondat: KundNr, Art, TelNr
-> ART = 1 = privat, 2 = Gesch., 3=Handy ... oder wie auch immer.
-> Index auf KundNr+Art
-> Index auf TelNr
Eine schnelle Suche wäre jetzt möglich auf:

1. KundNR => alle Nummern eines Kunden
2. KundNR+Art => alle Nummern eines Kunden einer Art
3. TelNr => eine Telefonnummer oder mehrere mit gleicher Vorwahl ...
Gruß
Hubert
Antworten