Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Locate findet nix (https://www.delphipraxis.net/200095-locate-findet-nix.html)

Delphi.Narium 21. Mär 2019 09:23

AW: Locate findet nix
 
Zitat:

Zitat von wurzelsepp1 (Beitrag 1428208)
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
SQL-Code:
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.

hoika 21. Mär 2019 09:29

AW: Locate findet nix
 
Hallo,
wir warten wohl erst mal auf weitere Infos.
Ich z.B. warte auf das Ergebnis des Select * -> in String-Variable

Zitat:

Kann "Starting With" im Index suchen?
Ja, kann es, es wird der (Asc) Index benutzt.

wurzelsepp1 24. Mär 2019 22:29

AW: Locate findet nix
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1428245)
Zitat:

Zitat von wurzelsepp1 (Beitrag 1428208)
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
SQL-Code:
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.

Also, das Codebeispiel liefert natürlich den Nicht-gefunden-Dialog und der Zeigt auf den ersten Datensatz der Tabelle. Sollte der auf den letzten zeigen?

Das SQL-Query in deinem Beispiel liefert nichts. Bei den SQL-Abfragen kriege ich nur Daten wenn ich keine Klausel angebe oder aber einen Platzhalter vorn und hinten, also "like '%1.2.3%'"

Noch ein Nachtrag:
Ich habe die Idee mit dem DBGrid mal eingebaut. Die Tabelle, in der Loacate suchen soll, wird nicht bewegt. Daher auch die Anzeige in den Dialogfeld für Recno. Unklar ist mir, warum Recordcount einen Phantasiewert anzeigt. Wenn ich durch das dbgrid scrolle, nimmt dieser Wert auch mal einen Wert um die 100 an. Die Anzahl der Datensätze liegt aber bei 4 Mio ..

hoika 25. Mär 2019 04:57

AW: Locate findet nix
 
Hallo,
und was ist mit meiner Frage? Wie ist denn nun der genaue Wert des Feldes?

RecordCount ist die Anzahl der intern (lokal) geladenen Datensätze.
Willst Du die Anzahl in der DB, musst du FetchAll in den Optionen setzen.
Dann werden ALLE Datensätze lokal geladen und dabei fleißig gezählt.

Jasocul 25. Mär 2019 06:31

AW: Locate findet nix
 
Zitat:

Zitat von wurzelsepp1 (Beitrag 1428596)
Das SQL-Query in deinem Beispiel liefert nichts. Bei den SQL-Abfragen kriege ich nur Daten wenn ich keine Klausel angebe oder aber einen Platzhalter vorn und hinten, also "like '%1.2.3%'"

Mit anderen Worten, es steht vor und hinter dem Suchbegriff irgendetwas. Vermutlich Leerzeichen.
Ein Locate (mit loPartialKey) arbeitet meines Wissens nur korrekt, wenn der Suchbegriff am Anfang steht. Das ist aber hier ganz offensichtlich nicht der Fall. Daher kann das Locate auch nicht das gewünschte Ergebnis liefern. Die Daten sind schlicht falsch aufgebaut.

mkinzler 25. Mär 2019 08:00

AW: Locate findet nix
 
Zitat:

Mit anderen Worten, es steht vor und hinter dem Suchbegriff irgendetwas. Vermutlich Leerzeichen.
Diese Vermutung haben wir gegenüber ihm ja schon mehrmals geäussert und auch beschrieben, wie er das Problem lösen kann. Er glaubt uns aber anscheinend nicht.

Jasocul 25. Mär 2019 08:12

AW: Locate findet nix
 
Richtig, aber jetzt hat er sogar selbst den Beweise geliefert.
Deswegen habe ich das nochmal so deutlich geschrieben.:wink:

Delphi.Narium 25. Mär 2019 08:27

AW: Locate findet nix
 
Delphi-Quellcode:
var
  i : Integer;
  k : Integer;
  sl : TStringList;
begin
  sl := TStringList.Create;
  for i := 1 to 10 do begin
    for k := 0 to IBTable.FieldCount - 1 do begin
      sl.Add(Format('%s: >>>%s<<<',[IBTable.Fields[k].FieldName, IBTable.Fields[k].AsString]));
    end;
    IBTable.Next;
    If IBTable.EoF then break;
  end;
  sl.SaveToFile('Tabellenausgabe.txt');
  sl.Free;
end;
Ungetestet, nur hingedaddelt.

Bitte mal in irgendeine Routine, auf 'nen ButtonClick oder so reinbauen, ausführen und das Ergebnis in der Textdatei hier posten oder analysieren.

Zwischen dem Inhalt einer Spalte und den >>> bzw. <<< sollten keine Leerzeichen oder sonstigen "kryptischen" Zeichen sein, sondern nur der reine Spalteninhalt. Ist dem nicht so, dann musst Du die Einleseroutine für die Daten überprüfen oder die Daten entsprechend in der Datenbank korrigieren.

Eine IP sollte in der Textdatei in der Form zu finden sein:
Code:
ip_idx: >>>1.2.3.4<<<
Jegliche andere Ausgabe weist auf Fehler in den Daten hin bzw. die Daten liegen in der Tabelle in anderer Form vor als erwartet,

hoika 25. Mär 2019 08:31

AW: Locate findet nix
 
Hallo,

Zitat:

Richtig, aber jetzt hat er sogar selbst den Beweise geliefert.
korrekt

Zitat:

Das SQL-Query in deinem Beispiel liefert nichts. Bei den SQL-Abfragen kriege ich nur Daten wenn ich keine Klausel angebe oder aber einen Platzhalter vorn und hinten, also "like '%1.2.3%'"
Jetzt müsste der TE (Thread-Ersteller) auch mal die vorgeschlagenen Sachen durchführen und die Ergebnisse posten.

wurzelsepp1 25. Mär 2019 09:31

AW: Locate findet nix
 
Zitat:

Zitat von mkinzler (Beitrag 1428613)
Zitat:

Mit anderen Worten, es steht vor und hinter dem Suchbegriff irgendetwas. Vermutlich Leerzeichen.
Diese Vermutung haben wir gegenüber ihm ja schon mehrmals geäussert und auch beschrieben, wie er das Problem lösen kann. Er glaubt uns aber anscheinend nicht.

Moin Jungs,

Nur zur Klarstellung: Ich glaube euch alles und bin auchnsehr dankbar für eure Unterstützung. Da ich seit fastb20 Jahren nix mehr mitbDelphi gemacht habe, bin ich - zugegeben - nicht mehr auf dem neuesten Stand. :)

Also zur Sache:

Ich kann in meinem SQL Tool nach einem Query auf die Gesamtdaten keine Zeichen am Anfang der Daten erkennen. Nur am Ende der Daten sindmvermeintlich Leerzeichen.
Deshalb konnte ich die These, dass da etwas am Anfang steht, nicht nachvollziehen.

Ichnwerde jetzt dem Vorschlag aufgreifen und dienDaten in einenTextdatei ausgeben und das Ergebnis hier nochmal posten.

Gibt es beinDelphinevtl. Andere Stringbehandlungs Probleme, wie in anderen Sprachen üblich, die zun den Problemen führen könnten?
In der Datenbank sind meine Suchfelder vom Typ vachchar und char. Beide liefern aber die selben Suchergebnisse (keine).

Danke euch & einen sonnigen Montag! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 3 von 5     123 45      

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