Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Grid mit gruppierter Darstellung (https://www.delphipraxis.net/143937-grid-mit-gruppierter-darstellung.html)

NetSonic 26. Nov 2009 11:28

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:
+ "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
Wie kann man solch eine Darstellung am einfachsten umsetzen?

hoika 26. Nov 2009 11:42

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

KrasserChecker 26. Nov 2009 11:51

Re: Grid mit gruppierter Darstellung
 
Wenn's Geld kosten darf:
ExpressQuantumGrid Suite von Developer Express.
siehe Screenshot ganz unten auf der Seite

NetSonic 26. Nov 2009 12:00

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von KrasserChecker
Wenn's Geld kosten darf:
ExpressQuantumGrid Suite von Developer Express.
siehe Screenshot ganz unten auf der Seite

So wie auf dem Screenshot wäre natürlich traumhaft aber kann man das auch mit freien Komponenten realisieren? Geht sowas ner VirtualStringGrid??? Habe damit noch nie gearbeitet...

Mike_on_Tour 26. Nov 2009 12:37

Re: Grid mit gruppierter Darstellung
 
Hallo,

eine freie Komponente ist z.B. das SMDBGrid (SMDBGrid von Scalabium). Die Gruppierung von Daten ist zwar nicht groß dokumentiert, aber es funktioniert mit kleinen Tricks. Ich habe gerade mal einen kleinen Test gemacht, da ich die Gruppierung auch noch einsetzen will.

Mike

chaosben 26. Nov 2009 13:31

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von NetSonic
Geht sowas ner VirtualStringGrid???

Ganz nah dran. :) Ein VirtualStringTree macht das für lau.
Das fällt zwar nicht in die Kategorie "am einfachsten" bietet aber fast alle Möglichkeiten

NetSonic 26. Nov 2009 13:50

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

hoika 26. Nov 2009 13:59

Re: Grid mit gruppierter Darstellung
 
Hall0,

Zitat:

Ganz nah dran. Smile Ein VirtualStringTree macht das für lau.
Beweise, Screenshots ...
Und bitte nicht auf die Galerie verweisen.

Oder meinst du die TreeView/ListView Kombination,
das wäre in der Tat sowas wie Grouping.


Heiko

NetSonic 26. Nov 2009 14:15

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

Mike_on_Tour 26. Nov 2009 14:45

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von NetSonic
@Mike: Kannst Du mir das kurz Hilfestellung zwecks Gruppierung geben? ... Ich habe zwar die Eigenschaft "Grouping" gefunden, aber was muss ich dann im Feld "Expression" eingeben??? :gruebel:
NetSonic

OK, ich versuchs mal.

Du hast ja sicher eine Query-Komponente. Dort mußt Du die SELECT-Anweisung so erweitern:
SQL-Code:
SELECT *, 2 as flag
FROM tabelle
WHERE (bedingung)

UNION ALL

SELECT DISTINCT *, 1 as flag
FROM tabelle
WHERE (bedingung)

ORDER BY feldname, flag
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.

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:
if (Query1.FieldByName(Expression).AsInteger = 1)
  then begin
    Value := True;
    Text := 'Gruppenüberschrift: ' + Query1.FieldByName('feldname').AsString;
  end;
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.

Die Ausgabe der Gruppenzeile kannst bzw. mußt Du im Event 'OnDrawGroupingCell' steuern:
Delphi-Quellcode:
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)
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.

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

NetSonic 26. Nov 2009 15:27

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:
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"
In "tblorder" steht der Bestellvorgang, in "tblpos" die entsprechenden Positionen...
Wie muss ich diese Abfrage jetzt umstellen, damit ich das mit den "flags" hinbekomme?
Irgendwie hats da bei mir noch nicht "klick" gemacht!

Mike_on_Tour 26. Nov 2009 15:34

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

NetSonic 26. Nov 2009 15:55

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:

Mike_on_Tour 26. Nov 2009 16:03

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von NetSonic
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:

D.h., das Grid funktioniert. Gut gemacht. ;-)

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 ?

NetSonic 26. Nov 2009 16:10

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.

Mike_on_Tour 26. Nov 2009 16:38

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von NetSonic
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.

Also mit PostgreSQL kenne ich mich nicht aus. Da gibt es aber im Forum sicher auch Experten. Eventuell mal einen neuen Thread starten.

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.

chaosben 27. Nov 2009 05:39

Re: Grid mit gruppierter Darstellung
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von hoika
Beweise, Screenshots ...
Und bitte nicht auf die Galerie verweisen.

Du willst mich veralbern, oder?
Aber gut ich bin mal nicht so ... siehe Anhang. Das ist ein VirtualStringTree.

NetSonic 27. Nov 2009 12:03

Re: Grid mit gruppierter Darstellung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es funktioniert jetzt mit dieser Abfrage:

SQL-Code:
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"
Allerdings zeigt mir die SMDBGrid die Felder "ArtikelNummer", "ArtikelName", "EK" und "VK" jetzt als (MEMO) an?!?!
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:

Mike_on_Tour 27. Nov 2009 12:38

Re: Grid mit gruppierter Darstellung
 
Zitat:

Zitat von NetSonic
... Allerdings zeigt mir die SMDBGrid die Felder "ArtikelNummer", "ArtikelName", "EK" und "VK" jetzt als (MEMO) an?!?!
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 ...

Ich glaube nicht, daß Du im Grid etwas einstellen mußt. Ich stelle meine Datentypen, wenn überhaupt, in der Query-Komponente ein.

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

NetSonic 27. Nov 2009 12:50

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.
:wall:
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:

Mike_on_Tour 27. Nov 2009 12:59

Re: Grid mit gruppierter Darstellung
 
Danke. Dann kann ich ja jetzt auf die Autobahn: Stau, ich komme ...

NetSonic 27. Nov 2009 16:06

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:
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;
Wie kann man das verbessern? Wie bekomme ich dieses "lästige" Flackern weg?

Mike_on_Tour 30. Nov 2009 11:40

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 09:47 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