2009-06-26 18 views
1

Guten Morgen!So entfernen Sie doppelte Datensätze im Raster?

Was ist der beste Weg, doppelte Datensätze aus dem Grid-Steuerelement zu entfernen? Ich benutze Delphi 2009 und devEx quantumGrid Komponente.

Ich habe versucht, durchlaufen alle Datensätze und wenn ein doppelter Datensatz gefunden wird, dann fügen Sie es in die Liste und Filter auf Gitter anwenden. Ich fand das als zeitaufwendige Logik. Es gibt auch zwei Nachteile dieses Ansatzes.

[1] Wenn die doppelten Datensätze deutlich mehr sagen 10K-Datensätze dann dauert die Anwendung Filter viel Zeit, weil viele Einträge auszufiltern.

[2] Das Durchschleifen aller Datensätze ist zeitaufwendig für große Ergebnismengen wie 1M Zeilen.

Die SQL-Abfrage gibt mir eindeutige Zeilen zurück, aber wenn der Benutzer eine Spalte im Raster ausblendet, sieht es so aus, als ob es doppelte Datensätze gibt (intern sind sie unterschiedlich).

Gibt es eine andere Möglichkeit, dies zu tun?

Alle Ideen dazu sind sehr hilfreich!

Danke & Grüße, Pavan.

+1

Ich sah nur Ihre Bearbeitung. Dies ist möglicherweise keine gute Idee, je nachdem, was Sie mit den Daten machen. Insbesondere, wenn der Benutzer Daten bearbeiten und speichern darf, und nicht nur, um sie anzuzeigen, dann führt das Entfernen von Duplikaten zu Mehrdeutigkeiten: Woher weiß der Benutzer, welchen Datensatz er bearbeitet? –

+0

Es tut mir leid, dies ist ein Read-Only-Grid und nur zum Anzeigen der Ergebnisse verwendet. – Pavan

Antwort

0

Mit Tausenden von Zeilen würde ich ein zusätzliches Feld in die DB hinzufügen genannt sagen Sum oder Hash oder wenn Sie nicht der DB fügen Sie ein berechnetes Feld ändern können, wenn es sich um eine ClientDataSet ist aber das trägt Overhead bei Anzeigezeit

Berechnen Sie den Inhalt des Hash-Feldes mit etwas schnell und einfach wie eine Summe aller Zeichen in Ihrem Textfeld. Alle Betrogenen sind jetzt leicht zu identifizieren. Fügen Sie dieses Feld zu Ihren Unique oder Distinct Query-Parametern hinzu oder filtern Sie es heraus.

Nur eine Idee.

+0

Hallo Entschuldigung, ich war weg - aber es sieht so aus, als hättest du einen Weg gefunden, ein einzigartiges Tal zu erschaffen, um deine Strings darzustellen :) Ich hätte wahrscheinlich den Index der Zeichen in der Zeichenkette zusätzlich zum Zeichenwert benutzt . O.ä :) – Despatcher

0

Die Suche nach Duplikaten ist immer ein bisschen schwierig, aus den eben genannten Gründen. Der beste Weg, dies in diesem speziellen Fall zu tun, ist wahrscheinlich zu filtern, bevor die Daten das Gitter erreichen.

Wenn dieses Raster seine Datensätze aus einer Datenbank bezieht, versuchen Sie, Ihre SQL-Abfrage so zu optimieren, dass keine doppelten Datensätze zurückgegeben werden. (Das "distinct" -Schlüsselwort kann hier nützlich sein.) Der Datenbankserver kann normalerweise eine viel bessere Arbeit leisten, als Sie können.

Wenn nicht, dann laden Sie wahrscheinlich Ihre Ergebnismenge aus einer Art Objektliste. Versuchen Sie, die Liste zu filtern und doppelte Objekte vor zu filtern, die Sie in das Gitter laden. Dann ist es vorbei und Sie müssen das Gitter selbst nicht filtern. Dies ist viel weniger zeitaufwendig.

0

Ich habe mit DevExpress Quantum Grid seit einiger Zeit gearbeitet und ihre Unterstützung Form http://www.devexpress.com/Support/Center/ ist ausgezeichnet. Wenn Sie Fragen stellen, werden die Mitarbeiter von DevExpress Ihnen direkt antworten. Nachdem das gesagt wurde, habe ich eine schnelle Suche nach dir gemacht und einige relevante Artikel gefunden.

wie doppelte Zeilenwerte zu verbergen:http://www.devexpress.com/Support/Center/p/Q142379.aspx?searchtext=Duplicate+Rows&p=T1|P0|83

Highlight doppelte Datensätze in einem Raster:http://www.devexpress.com/Support/Center/p/Q98776.aspx

Leider sieht es so aus, wie Sie durch den Tisch, um Duplikat zu verstecken müssen iterieren Werte. Ich würde vorschlagen, dass Sie versuchen, die Daten zu bereinigen, bevor sie ins Grid gelangen. Idealerweise würden Sie den Code/sql aktualisieren, der die Daten erzeugt. Wenn dies nicht möglich ist, könnten Sie eine TcxCustomDataSource schreiben, die die Daten beim ersten Laden scrubbelt. Dies sollte eine bessere Leistung haben, da Sie die API des Rasters nicht verwenden, um auf die Daten zuzugreifen.

bearbeiten

ExpressQuantumGrid nicht automatisch Zeilen verbergen, wie Duplikate suchen, weil der Benutzer eine Spalte versteckt. Siehe: http://www.devexpress.com/Support/Center/p/Q205956.aspx?searchtext=Duplicate+Rows&p=T1|P0|83.

Poster

Zum Beispiel habe ich einen Datensatz, die zwei ID und TXT-Felder enthält. ID ist ein eindeutiges Feld und TXT-Feld kann doppelte Werte enthalten. Wenn der Datensatz mit dem Raster verbunden ist und alle Spalten sichtbar sind, sind die Datensätze eindeutig. Siehe image1.bmp. Aber wenn ich die ID-Spalte ausblenden, zeigt das Raster doppelte Zeilen. Siehe image2.bmp.

DevExpress-Team

Es tut mir leid, aber unsere ExpressQuantumGrid Suite nicht eine solche Funktionalität nicht unterstützt, da diese Aufgabe sehr spezifisch ist. Sie können es jedoch manuell implementieren.

+0

Hallo, wie schreibe ich TcxCustomDataController, um die Daten zu scrubben? – Pavan

+0

Mein Fehler, Sie müssten eine TcxCustomDataSource schreiben. Grundsätzlich erweitern Sie TcxCustomDataSource und überschreiben die Methoden GetRecordCount, GetValue, SetValue, InsertRecord, AppendRecord und DeleteRecord. Sie müssen sie nicht alle implementieren, wenn Ihre Quelle schreibgeschützt ist. In der Dokumentation wird erläutert, wie dies genauer ausgeführt wird. Viel Glück. –

1

Können Sie Ihr Dataset so ändern, dass es keine doppelten Datensätze zurückgibt? Normalerweise würde ich nur die Datensätze zurückgeben, die angezeigt werden sollen, anstatt unerwünschte Datensätze aus der Datenbank zurückzugeben und dann ein Datenbankraster zu verwenden, um zu versuchen, unerwünschte Datensätze zu unterdrücken.

Verwandte Themen