![]() |
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib
Grid mit gruppierter Darstellung
Hallo liebe Delphi-Kollegen,
mir fehlt vielleicht auch einfach nur die richtige Formulierung um bei der Forensuche das richtige Ergebnis zu bekommen oder ich habs überlesen - jedenfalls möchte ich folgendes realisieren: Ich hole mir aus zwei Tabellen meiner Datenbank Ergebnismengen. Beide Tabellen miteinander Verknüpft. Aus Tabelle A hole ich mir Name und ID. Aus Tabelle B Länge, Breite, Höhe etc. mit Bezug auf die ID aus Tabelle A. Das ganze möchte ich dann "gruppiert" in einer DBGrid oder eben einer entsprechenden Komponente wie folgt dargestellt haben:
Delphi-Quellcode:
Wie kann man solch eine Darstellung am einfachsten umsetzen?
+ "Testobjekt A"
- Länge - Breite - Höhe - Länge - Breite - Höhe + "Testobjekt B" - Länge - Breite - Höhe + "Testobjekt C" - Länge - Breite - Höhe - Länge - Breite - Höhe - Länge - Breite - Höhe |
Re: Grid mit gruppierter Darstellung
Hallo,
DBGrid Dann musst du dir den SQL-Befehl schon so zusammenbauen -> Case, Stored Procedure DBGrid / TClientDataSet Dort könnte man eine Tabelle so anlegen, wie sie im DBGrid angezeigt wird Die füllst du dann "per Hand" StringGrid Hier kannst du das Einfügen selber machen Ich mache bei den Gruppen immer Name-Spalte [Gruppe1] Inhalt 1 Inhalt 2 // Leerzeile [Gruppe2] Heiko |
Re: Grid mit gruppierter Darstellung
Wenn's Geld kosten darf:
![]() ![]() |
Re: Grid mit gruppierter Darstellung
Zitat:
|
Re: Grid mit gruppierter Darstellung
Hallo,
eine freie Komponente ist z.B. das SMDBGrid ( ![]() Mike |
Re: Grid mit gruppierter Darstellung
Zitat:
![]() Das fällt zwar nicht in die Kategorie "am einfachsten" bietet aber fast alle Möglichkeiten |
Re: Grid mit gruppierter Darstellung
OK, danke für die Tipps. Ich werde mich mal damit auseinandersetzen und mich ggf. wieder melden, wenn ich Probleme habe... :zwinker:
NetSonic |
Re: Grid mit gruppierter Darstellung
Hall0,
Zitat:
Und bitte nicht auf die Galerie verweisen. Oder meinst du die TreeView/ListView Kombination, das wäre in der Tat sowas wie Grouping. Heiko |
Re: Grid mit gruppierter Darstellung
@Mike: Kannst Du mir das kurz Hilfestellung zwecks Gruppierung geben? Ich habe die Komponente bereits installiert und auch in mein Programm eingebunden. Die "normalen" Daten werden auch angezeigt. Aber wo muss ich jetzt ansetzen??? Ich habe zwar die Eigenschaft "Grouping" gefunden, aber was muss ich dann im Feld "Expression" eingeben??? :gruebel:
NetSonic |
Re: Grid mit gruppierter Darstellung
Zitat:
Du hast ja sicher eine Query-Komponente. Dort mußt Du die SELECT-Anweisung so erweitern:
SQL-Code:
Zur Erklärung: Du mußt die SQL-Anweisung mit einer 'UNION' "verdoppeln". Dabei darf das zweite SELECT nur einen Datensatz pro Gruppe ergeben, deshalb das 'DISTINCT' unbedingt angeben. In jedem SELECT muß noch ein Kennzeichen angegeben werden (ich habe das als 'flag' bezeichnet). Alle Gruppenzeilen bekommen als 'flag' den Wert 1 und alle Datenzeilen zur Gruppe den Wert 2. Mit ORDER BY läßt sich das dann noch sortieren.
SELECT *, 2 as flag
FROM tabelle WHERE (bedingung) UNION ALL SELECT DISTINCT *, 1 as flag FROM tabelle WHERE (bedingung) ORDER BY feldname, flag Dann legt Du in der Eigenschaft 'Grouping' einen Eintrag an und trägst bei Expression 'flag' ein. Für das Event 'OnExpression' trägst Du folgenden Code ein:
Delphi-Quellcode:
Zur Erklärung: Im Parameter 'Expression' wird der Eintrag aus der Grouping-Eigenschaft übergeben (automatisch). Im Parameter 'Text' übergibst Du einfach das, was in der Gruppenzeile stehen soll.
if (Query1.FieldByName(Expression).AsInteger = 1)
then begin Value := True; Text := 'Gruppenüberschrift: ' + Query1.FieldByName('feldname').AsString; end; Die Ausgabe der Gruppenzeile kannst bzw. mußt Du im Event 'OnDrawGroupingCell' steuern:
Delphi-Quellcode:
Zur Erklärung: In meinem Test wird die Gruppenzeile rechtsbündig ausgegeben. Offensichtlich wird dafür die Einstellung der ersten Spalte des Grids übernommen. Ich habe deshalb das Zeichnen selbst übernommen und die Gruppenzeile linksbündig angezeigt.
DefaultDrawing := False;
ACanvas.Brush.Color := Group.Color; ACanvas.Font.Assign(Group.Font); ACanvas.FillRect(CellRect); CellRect.Left := CellRect.Left + 4; CellRect.Top := CellRect.Top + 2; DrawText(ACanvas.Handle, PChar(Text), Length(Text), CellRect, DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX or DT_VCENTER) Mehr habe ich erst mal nicht getestet, da ich für meine Gruppierung noch nicht so weit bin. Es geht vielleicht auch noch etwas einfacher, aber als Anfang sollte es erst mal reichen. Mike |
Re: Grid mit gruppierter Darstellung
Jetzt habe ich da mehr ein SQL-technisches Problem...
Ich frage meine beiden Tabellen (Bestellverwaltung) bisher wie folgt ab:
SQL-Code:
In "tblorder" steht der Bestellvorgang, in "tblpos" die entsprechenden Positionen...
SELECT
tblorder."ID", tblorder."BestDatum", tblorder."Lieferant", tblpos."ArtikelNummer", tblpos."ArtikelName", tblpos."EK", tblpos."VK", tblpos."Anzahl" FROM public.tblorder, public.tblpos WHERE tblorder."ID" = tblpos."ID" Wie muss ich diese Abfrage jetzt umstellen, damit ich das mit den "flags" hinbekomme? Irgendwie hats da bei mir noch nicht "klick" gemacht! |
Re: Grid mit gruppierter Darstellung
Versuch mal folgendes (für eine Gruppierung nach "Lieferant"):
SQL-Code:
SELECT
tblorder."ID", tblorder."BestDatum", tblorder."Lieferant", tblpos."ArtikelNummer", tblpos."ArtikelName", tblpos."EK", tblpos."VK", tblpos."Anzahl", 2 as flag FROM public.tblorder, public.tblpos WHERE tblorder."ID" = tblpos."ID" UNION ALL SELECT DISTINCT tblorder."ID", tblorder."BestDatum", tblorder."Lieferant", tblpos."ArtikelNummer", tblpos."ArtikelName", tblpos."EK", tblpos."VK", tblpos."Anzahl", 1 as flag FROM public.tblorder, public.tblpos WHERE tblorder."ID" = tblpos."ID" ORDER BY tblorder."Lieferant", flag |
Re: Grid mit gruppierter Darstellung
Das sieht ganz gut aus, allerdings schmeißt mir PostgreSQL immer als Fehler "fehlender Eintrag in FROM-Klausel für Tabelle tblorder"!
Es gibt für diesen Fehler zwar ein "Workaround", weil man ihn in der Konfiguration unterdrücken kann, aber das kann es ja wohl auch nicht sein. Es muss ja einen Grund dafür geben... :gruebel: |
Re: Grid mit gruppierter Darstellung
Zitat:
Mit PostgreSQL kenne ich mich nicht aus. Das SQL sieht für mich aber erst mal gut aus. Kommt der Fehler denn erst seit der Änderung ? |
Re: Grid mit gruppierter Darstellung
Ja das Grid funktioniert! :thumb:
Allerdings nur mit der alten Abfrage. Er zeichnet mir aber die Gruppierung usw. Das ist alles "schön". Nur diese Sache mit dem aktuellen SQL-Statement raubt mir gerade den Nerv... Ich komme aber ja auch nicht um "UNION" herum, oder? Alles mit einem "SELECT" über beide Tabellen wäre toll, nur dann nützen mir die "flags" wiederum nichts. :wall: EDIT: Ohne "UNION" und beim select von nur einer Tabelle, kommt dieser Fehler nicht. |
Re: Grid mit gruppierter Darstellung
Zitat:
Wenn ich die Funktionsweise des Grids richtig deute, braucht das Grid für die Darstellung der Gruppenzeile einen Datensatz extra. Dieser Datensatz wird mit der UNION möglich gemacht. Zur Unterscheidung wird dann das 'flag' verwendet. Wenn Du also einen zusätzlichen (Gruppen-)Datensatz ohne UNION erzeugen kannst, müßte es auch ohne UNION gehen. Möglicherweise kommt PostgreSQL nicht mit dem UNION ALL klar. Vielleicht gibt es hier andere Möglichkeiten. Nachtrag: Evtl. kann das auch am SELECT DISTINCT liegen. |
Re: Grid mit gruppierter Darstellung
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
Aber gut ich bin mal nicht so ... siehe Anhang. Das ist ein VirtualStringTree. |
Re: Grid mit gruppierter Darstellung
Liste der Anhänge anzeigen (Anzahl: 1)
Es funktioniert jetzt mit dieser Abfrage:
SQL-Code:
Allerdings zeigt mir die SMDBGrid die Felder "ArtikelNummer", "ArtikelName", "EK" und "VK" jetzt als (MEMO) an?!?!
SELECT DISTINCT
tblorder."ID", tblorder."OrderDate", tblorder."Lieferant", 'a' AS "ArtikelNummer", 'a' AS "ArtikelName", 'a' AS "EK", 'a' AS "VK", 1 as "flag" FROM tblorder, tblpos WHERE tblpos."OrderID" = tblorder."OrderID" UNION ALL SELECT DISTINCT tblorder."OrderID", tblorder_pos."OrderDate", 'a' AS "Lieferant", tblorder_pos."ArtikelNummer", tblorder_pos."ArtikelName", tblorder_pos."EK", tblorder_pos."VK", 2 as "flag" FROM tblorder, tblpos WHERE tblpos."OrderID" = tblorder."OrderID" ORDER BY "OrderID", "flag" Es handelt sich aber um "varchar" Felder in der Datenbank. Kann man da etwas einstellen bzw. verändern? Wobei dieses Problem erst aufgetreten ist, nachdem die SQL-Anweisung entsprechend verändert wurde... Habe mal einen Screenshot angehangen: |
Re: Grid mit gruppierter Darstellung
Zitat:
Da Du die Reihenfolge der SELECTS getauscht hast, werden wahrscheinlich die Datentypen des ersten SELECTs für die Gridspalten verwendet. Eventuell mußt Du die Datentypen mit CAST in einen Datentyp zwingen. In meinem Testprogramm liefert mir das Query 538 Datensätze (inkl. der Gruppensätze). Das Scrollen geht in normaler Geschwindigkeit. Mike |
Re: Grid mit gruppierter Darstellung
Zitat:
Ich hab "mal eben" die Reihenfolge geändert und... "tadaaaa" - jetzt zeigt er mir wieder alle Informationen korrekt an. Du hast mit Deinem Tipp also mal wieder den Nagel auf den Kopf getroffen. :thumb: Danke dafür! :dp: |
Re: Grid mit gruppierter Darstellung
Danke. Dann kann ich ja jetzt auf die Autobahn: Stau, ich komme ...
|
Re: Grid mit gruppierter Darstellung
Jetzt ist es leider noch so, das die SMDBGrid tierisch beim scrollen flackert. Und zwar nur die von Hand gezeichneten Zeilen, der Gruppierung. HAb schon mit DoubleBuffered versucht, das zu beheben - hilft aber leider nicht.
Diesen Code nutze ich im "DrawGroupingCell"-Ereignis:
Delphi-Quellcode:
Wie kann man das verbessern? Wie bekomme ich dieses "lästige" Flackern weg?
procedure TfrmOrderManagement.SMDBGridDrawGroupingCell(Sender: TObject;
ACanvas: TCanvas; CellRect: TRect; Group: TSMGrouping; Text: string; var DefaultDrawing: Boolean); begin DefaultDrawing := False; ACanvas.Brush.Color := clBlack; ACanvas.Font.Color := clWhite; ACanvas.FillRect(CellRect); CellRect.Left := CellRect.Left + 4; CellRect.Top := CellRect.Top + 2; DrawText(ACanvas.Handle, PChar(Text), Length(Text), CellRect, DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX or DT_VCENTER); end; |
Re: Grid mit gruppierter Darstellung
So, da bin ich wieder.
Beim Scrollen habe ich kein Flackern. 'DoubleBuffered' habe ich aber auch gesetzt. Kannst Du prüfen, ob beim Scrollen die Datenquelle aktualisiert wird ? Ich hatte so was mal bei einem Query mit berechneten Feldern. Da hat auch das ganze Grid geflackert. In meinem Testprogramm flackert das Grid (nur Gruppenzeilen) aber beim Ändern der Formgröße. Das könnte ich evtl. aber abfangen und das Grid mit DisableControls bzw. EnableControls 'ruhig stellen'. Muß ich mal noch probieren. Mike |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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 by Thomas Breitkreuz