Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DBGrid Datensätze doppelt angezeigt / Sybase (https://www.delphipraxis.net/161919-dbgrid-datensaetze-doppelt-angezeigt-sybase.html)

bluesky70 27. Jul 2011 12:38

Datenbank: Sybase SQL Anywhere • Version: 12 • Zugriff über: ODBC/BDE

DBGrid Datensätze doppelt angezeigt / Sybase
 
Hallo,

ich habe folgendes Problem:

Ich benutze in Delphi 7 ein DBGrid in Verbindung mit einer Sybase
SQL-Anywhere Datenbank. Das Problem ist, daß unter bestimmten Umständen
einige Datensätze doppelt bzw. mehrfach im Datengitter angezeigt werden.

In der Tabelle, eine TTable-Komponente, die zurückgeliefert wird über
den ODBC-Treiber, scheinen die Datensätze aber korrekterweise nur einmal
zu sein.

Das Problem scheint nur dann aufzutreten, wenn die Sortierung der Daten
nicht nach dem Primärschlüssel der Tabelle in der Sybase
Datenbank sondern nach einem anderen Index ist.
Wenn man im Datengitter scrollt ist die Anzeige auch oft wieder
plötzlich korrekt.

Hat jemand eine Idee, was das sein kann? Liegt das am DBGrid, daß dieses
an der TTable irgendwie vorbei arbeitet?

Vielen Dank für Hinweise.

Grüße

Andy

sx2008 30. Jul 2011 03:19

AW: DBGrid Datensätze doppelt angezeigt / Sybase
 
Zitat:

Zitat von bluesky70 (Beitrag 1113813)
In der Tabelle, eine TTable-Komponente, die zurückgeliefert wird über
den ODBC-Treiber, scheinen die Datensätze aber korrekterweise nur einmal
zu sein.

Bist du da sicher?
Ich würde mir dazu eine Procedure schreiben, die die Daten als CSV in eine Datei rausschreibt
dann kann du in aller Ruhe kontrollieren ob das stimmt.
So ganz grob als Anregung:
Delphi-Quellcode:
// TTable oder TQuery sowie eine TStringliste übergeben
// danach Stringliste mit SaveToFile() speichern
procedure DumpDatasetAsCSV(ds:TDataset; list:Strings);
var
  i : Integer;
  s : string;
begin
  ds.First;
  while not ds.Eof do
  begin
    s := '';
    for i := 0 to ds.Fields.Count-1 do
    begin
      if i <> 0 then
        s := s + '|';
      s := s + ds.Fields[i].AsString;
    en;
    list.Add(s);
    ds.next;
  end;
end;
Zitat:

Zitat von bluesky70 (Beitrag 1113813)
Das Problem scheint nur dann aufzutreten, wenn die Sortierung der Daten
nicht nach dem Primärschlüssel der Tabelle in der Sybase
Datenbank sondern nach einem anderen Index ist.

Verwendest du denn kein SQL um deine Daten zu sortieren?
Ich frage das weil du oben ja geschrieben hast du würdest TTable verwenden.

bluesky70 1. Aug 2011 16:48

AW: DBGrid Datensätze doppelt angezeigt / Sybase
 
Hallo sx2008,

danke schon mal für deine Antwort.

Ja ich kann inzwischen ganz sicher sagen, daß die Datensätze in der Datenbank und damit der TTable nur einmal vorhanden sind. Wenn ich die Daten wie von Dir beschrieben in eine CSV schrieben lasse, dann sind die da nur einmal drin.

Es scheint wirklich ein Problem in der Kombination einer TTable mit dem TDBGrid zu sein. Irgendwie kommt das TDBGrid nicht mit der Darstellung der Datensätze klar, siehe auch den Hinweis mit dem scrollen.

Wie gesagt es scheint immer zu funktionieren, wenn die TTable nach einem eindeutigen Index sortiert ins (Indexfieldnames). Auch taucht es bei mehrdeutigen Indizes nicht immer auf.

Ich hoffe es gibt noch Hilfe.

Vielen Dank und Grüße

Andy

FredlFesl 1. Aug 2011 16:54

AW: DBGrid Datensätze doppelt angezeigt / Sybase
 
Ich hatte das Problem bei MSSQL 6.5, welches auf (Code)Basis von Sybase entwickelt wurde.
Prüfe doch mal (=googeln), ob das ein known feature ist.

sx2008 1. Aug 2011 18:11

AW: DBGrid Datensätze doppelt angezeigt / Sybase
 
Hat die Tabelle einen (eindeutigen) Primärschlüssel?
Falls nicht, wäre das die Ursache der Probleme.
Grundsätzlich sollte jede Tabelle in einer relationalen Datenbank einen Primärschlüssel haben.

PS:
Ups - das steht doch schon im 1. Betrag.
Ok, damit das DBGrid richtig funktioniert müssen folgende Bedingungen erfüllt sein:
1.) eindeutiger PK vorhanden
2.) Treiberschicht muss der VCL den Namen des PK-Feldes mitteilen
3.) und davon abhängig muss die Mehode GotoBookmark() funktionieren

Könnte also ein Problem des Treibers sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz