AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Locate findet nix

Ein Thema von wurzelsepp1 · begonnen am 19. Mär 2019 · letzter Beitrag vom 26. Mär 2019
Antwort Antwort
Seite 1 von 2  1 2      
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#1

AW: Locate findet nix

  Alt 20. Mär 2019, 17:58
IBQuery benutzen
Starting With benutzen
Index auf das Feld IP setzen

PS:
Was passiert, wenn du mal den vollständigen Feldinhalt suchst,
dann auch ohne das foPartialKey.[/QUOTE]

Also das habe ich nu probiert und er findet auch das nicht - trotzdem ein passender Datensatz vorhanen ist.

Das Feld in der Datenbank ist vom Typ char und länger als der Suchstring. Könnte der Fehler in einer unterschiedlichen Stringbehandlung liegen?
Muss ich evtl. nach etwas Anderem (z.B. folgenden Leerzeichen) suchen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Locate findet nix

  Alt 20. Mär 2019, 19:09
Hallo,
hast du Starting With probiert?
Heiko
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Locate findet nix

  Alt 20. Mär 2019, 19:10
Hallo,
Zitat:
trotzdem ein passender Datensatz vorhanen ist
Wohl eher nicht.
Kann es sein, dass der Datensatz mit Leerzeichen gespeichert wurde?
Heiko
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#4

AW: Locate findet nix

  Alt 20. Mär 2019, 20:40
Hallo,
Zitat:
trotzdem ein passender Datensatz vorhanen ist
Wohl eher nicht.
Kann es sein, dass der Datensatz mit Leerzeichen gespeichert wurde?
Die Datenbank wurde aus einer Textdatei (csv) als bulk insert gefüllt. Ich glaube jetzt nicht, dass die Funktion da extra Leerzeichen eingefügt hat ..
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#5

AW: Locate findet nix

  Alt 20. Mär 2019, 21:42
Ich glaube jetzt nicht, dass die Funktion da extra Leerzeichen eingefügt hat ..
Das sollte keine Glaubensfrage, sondern eine Wissensfrage sein.

Gerade bei CSV und Bulk-Insert kann es passieren, dass Daten mit fester Länge in eine Datenbank eingefügt werden, Sprich: Zeichenfolgen werden mit Leerzeichen bis zur Maximallänge der entsprechenden Spalte aufgefüllt.

Nehmen wir an, die Spalte IP sei vom Typ VarChar(15) für z. B. die IP 111.111.111.111. Wenn nun in dieser Spalte die IP 1.2.3.4 steht, werden 8 Leerzeichen angefügt.

Führe bitte mal (sinngemäß) folgendes SQL aus:select * from tabelle where trim(ip) <> ip Da sollte, wenn keine Leerzeichen angefügt wurden, eine leere Ergebnismenge rauskomen, wenn nicht, weißt Du, dass beim Bulk-Insert Leerzeichen an die Daten angehängt wurden.

Locate wird von mir oft benutzt, das von Dir beschriebene Problem ist da bisher noch nicht aufgetreten und ich kann es auch nicht nachvollziehen.

Zeig' und doch bitte mal alle SQLs, die Du bisher ausprobiert hast und deren Ergebnisse.

T.Locate('IP', '1.2.3', [lopart.. ist irgendwie gut und schön, aber wie sieht der Quelltext dazu aus. Also z. B. das Selectstatement, das T-wasauchimmerdasgenauist zugewiesen wurde.

Kannst Du uns bitte mal den Quelltext von einem Beispielprogramm zur Verfügung stellen, in dem der Fehler reproduzierbar ist?
Oder mal 'nen kurzen Ausschnitt aus des CSV (soweit möglich oder anonymisierte Beispieldaten), damit wir etwas genauer sehen können, worüber hier gerade geredet wird.
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#6

AW: Locate findet nix

  Alt 20. Mär 2019, 22:06
Ich glaube jetzt nicht, dass die Funktion da extra Leerzeichen eingefügt hat ..
Das sollte keine Glaubensfrage, sondern eine Wissensfrage sein.

Gerade bei CSV und Bulk-Insert kann es passieren, dass Daten mit fester Länge in eine Datenbank eingefügt werden, Sprich: Zeichenfolgen werden mit Leerzeichen bis zur Maximallänge der entsprechenden Spalte aufgefüllt.

Nehmen wir an, die Spalte IP sei vom Typ VarChar(15) für z. B. die IP 111.111.111.111. Wenn nun in dieser Spalte die IP 1.2.3.4 steht, werden 8 Leerzeichen angefügt.

Führe bitte mal (sinngemäß) folgendes SQL aus:select * from tabelle where trim(ip) <> ip Da sollte, wenn keine Leerzeichen angefügt wurden, eine leere Ergebnismenge rauskomen, wenn nicht, weißt Du, dass beim Bulk-Insert Leerzeichen an die Daten angehängt wurden.

Locate wird von mir oft benutzt, das von Dir beschriebene Problem ist da bisher noch nicht aufgetreten und ich kann es auch nicht nachvollziehen.

Zeig' und doch bitte mal alle SQLs, die Du bisher ausprobiert hast und deren Ergebnisse.
Also:

select * from "TABLE" where "IP_IDX" starting with '1.0.72'
Liefert: nix

select * from "IP2GEOID"
Liefert: alles

select * from "IP2GEOID" where "IP_IDX" like '%1.0.72%'
Liefert alle Satensätze in denen der Suchstring vorkommt

Frage die bleibt:
Warum funktioniert "starting with" nicht?
und: Wie geht man mit den offenbar angefügten Leerzeichen bei der Teilstringsuche um?

Und: IB scheint die Funktion trim() nicht zu kennen. Da gibt's eine entsprechende Fehlermeldung "Function unknown".

Der Source zu dem Delphi-Test ist tatsächlich so kurz und enthält nichts weiter. Die Suchdaten werden (zu Testzwecken) als Konstante übergeben:

IBTable.Locate('ip_idx', '1.0.72', []);
oder eben
IBTable.Locate('ip_idx', '1.0.72', [loPartialKey]);

Zuvor wird lediglich der Tabellenname und die Datenbankverbindung übergeben.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Locate findet nix

  Alt 21. Mär 2019, 04:43
Hallo,
wenn Select * geht,
dann hole dir doch den ersten Datensatz mal in eine String-Variable und sie dir den Inhalt an.

Und gib uns mal das DDL der Tabelle,
also, wie sie erzeugt worden ist. inclusive der CharSets
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Locate findet nix

  Alt 21. Mär 2019, 08:28

Also:

select * from "TABLE" where "IP_IDX" starting with '1.0.72'
Liefert: nix

select * from "IP2GEOID"
Liefert: alles

select * from "IP2GEOID" where "IP_IDX" like '%1.0.72%'
Liefert alle Satensätze in denen der Suchstring vorkommt

Frage die bleibt:
Warum funktioniert "starting with" nicht?
und: Wie geht man mit den offenbar angefügten Leerzeichen bei der Teilstringsuche um?
Zitat:
Warum funktioniert "starting with" nicht?
ist eine nteressante Formulierung. Nur weil das erhaltene Ergebnis nicht das erwartete ist, heißt das ja nicht, daß die Funktion fehlerhaft ist.
Erste Regel bei Datenbankabfragen wenn das Ergebnis nicht meinen Erwartungen entspricht, gibt es die gesuchten Daten überhaupt an diesem Ort?
(Nee ist klar, wenn es sie gäbe, gäb es ja auch das erwartete Ergebnis)
Also wo ist der Unterschied zwischen den gesuchten und den vorhandenen Daten.

Gruß
K-H
Das
select * from "TABLE" where "IP_IDX" starting with '1.0.72' und
select * from "IP2GEOID" where "IP_IDX" like '%1.0.72%' vollkommen unterschiedlich sind sollte klar sein, es handelt sich also wohl um einen Flüchtigkeitsfehler.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#9

AW: Locate findet nix

  Alt 21. Mär 2019, 09:23
Zuvor wird lediglich der Tabellenname und die Datenbankverbindung übergeben.
Das will ich aber auch sehen!
Delphi-Quellcode:
try
  IBTable.Close;
  IBTable.TableName := 'IP2GEOID';
  IBTable.Open;
  if IBTable.Locate('ip_idx', '1.0.72', [loPartialKey]) then begin
    ShowMessage(Format('gefunden wurde: %s',[IBTable.FieldByName('ip_idx').AsString]));
  end else begin
    ShowMessage(Format('nicht gefunden, RecNo = %d, RecordCount = %d, aktuelle IP = %s',
                       [IBTable.RecNo, IBTable.RecordCount, IBTable.FieldByName('ip_idx').AsString]));
  end;
except
  on e : Exception MessageDlg(e.Message,mtError,[mbOk],0);
end;
Geht das? Kommt dabei irgendwas raus? Und wenn ja, was?

Und was liefert select * from IP2GEOID where IP_IDX starting with '1.0.72' ?


Hast Du die IBTable mal mit 'ner TDataSource verbunden und die mit 'nem TDBGrid, um zu sehen, was zur Laufzeit des Programmes da so in der Tabelle enthalten ist? Kann, auch wenn's für das Programm letztlich nicht erforderlich ist, beim Test schonmal recht hilfreich sein.
  Mit Zitat antworten Zitat
wurzelsepp1

Registriert seit: 9. Dez 2012
107 Beiträge
 
Delphi 3 Professional
 
#10

AW: Locate findet nix

  Alt 20. Mär 2019, 20:37
Hallo,
hast du Starting With probiert?
Noch nicht .. ich hatte noch auf eine Idee zur Wiederbelebung der Locate-Methose gehofft ..

Kann "Starting With" im Index suchen?
Das müsste nämlich sehr schnell gehen, da die Suche etwa sekündlich ausgeführt wird ..
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:09 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