Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DevExpress Summe (https://www.delphipraxis.net/137457-devexpress-summe.html)

yamaha007 21. Jul 2009 09:00


DevExpress Summe
 
Hallo,

ich möchte im DevExpress Grid in der Gruppenfusszeile bei jeder neuen Berechnung die Ausgabe formatieren.

Die Spalte ist in hh:mm formatiert.
Die Summe wird aber dez ausgegeben.

Jetzt möchte ich bei jeder Änderung(Neuberechnung) den Wert formatieren und dann überschreiben.

Welches Ereignis nehme ich?
DataController.SummaryFooterSummaryItems.OnSummary ?

Wie wird der Wert ausgelesen und dann überschrieben ?


Benutze Delphi 7

Danke schon mal - Lothar

Bebe 21. Jul 2009 09:20

Re: DevExpress Summe
 
Hallo,

wenn du dir ein Footer erstellst, dann nimm doch das Event GetText vom Summary-Item

als Beispiel ...

Delphi-Quellcode:
TcxGridDBDataController.TcxDataSummary.FooterSummary.Items[0].GetText(Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean; var AText: string)
Den Wert entnimmst du von AValue, den du dann bei AText formatiert darstellen kannst. Ich hoffe du kannst damit etwas anfangen.

Gruß
Matze

yamaha007 21. Jul 2009 11:16

Re: DevExpress Summe
 
Hi, das klappt. Danke schon mal.

So kann ich die Fusszeilensumme formatieren.

Was ich allerdings noch brauche ist die GRUPPENfusszeilensumme.

D.h. ich ziehe eine Spalte nach oben um danach zu gruppieren.

z.B. Name

Dann blende ich die Gruppenfusszeile ein und dann die Summe.

Dann habe ich ein SummeFeld unter jeder Gruppierung.

Das müsste ich ebenfalls formatieren.

Grüsse Lothar

Bebe 21. Jul 2009 12:00

Re: DevExpress Summe
 
Den Footer kannst schon im Designer Mode einschalten.

Vom TableView die Optionview.Footer auf True stellen. Wenn du da schon bist, dann bitte für die Gruppensummen den Groupfooter auf gfVisibleWhenExpanded oder gfAlwaysVisible
Sonst mußt du sie immer erst einschalten.

Für die Gruppensummen wieder in die Summary gehen, aber diesmal zu den Groups. Dort stellst du die Gruppensummen ein. Zuerst mußt du eine Gruppe erstellen und danach ein Item. Nur noch vom Item die Spalte zuweisen, wo die Summe dargestellt werden soll. (Name soll ja gruppiert werden, die Spalte also nicht). Als Kind skCount einstellen. Unten siehst du zwei Frames Unlinked und Linked Columns.
Dort mußt du die Spalte mit dem Namen zuweisen. Also bei Linked Columns sollte das Feld stehen, was summiert werden soll.
Dann sollte es so sein wie du es möchtest.

Gruß
Matze

yamaha007 21. Jul 2009 12:46

Re: DevExpress Summe
 
Hi,

müsste man schon im Quellcode machen, denn das Gruppieren ist ja flexibel.

Ich müsste mitbekommen das eine Gruppenfusssumme angezeigt wird und dann formatieren.

Ist warscheinlich schwer zu verstehen.Oder ich versteh es nicht.Kann auch sein.

Die Spalte die summiert wird kenn ich, die ist fest.Nur wenn die summiert wird möcht ich foratieren.

Nur wie gruppiert wird weiss ich nicht.

Deshalb bräuchte ich das Ereignis das gruppiert wurde und eine Summe angezeigt wird.

Dann müsste man das Feld abfragen, umformatieren und neu zuweisen.

Aber schon mal danke - Lothar

Bebe 21. Jul 2009 13:38

Re: DevExpress Summe
 
Möchtest du nur die Gruppierung in Code machen oder ist die Gruppierung schon vorhanden und es soll nur im Code formatiert werden?

Erstens ist schon schwieriger, aber das Event OnGetText ist das was du suchst. Bei zweitens ist es ein bißchen einfacher, natürlich auch wieder OnGetText. Wie du eine Gruppe erstellst habe ich ja beschrieben. (Die soll ja fest sein, oder?)

Eine Spalte im Designer Mode kannst du gruppieren wenn du direkt in der Spalte (z. B. TcxGridDBColumn o. ä.) den Groupindex von -1 auf 0 änderst (abhängig wieviel Gruppen du erstellst hast), dann Visible auf False stellen, sonst siehst du die gruppierte Spalte auch im Grid und nicht nur in der Gruppierungsbox.

Gruß
Matze

yamaha007 21. Jul 2009 13:53

Re: DevExpress Summe
 
Zitat:

Zitat von Bebe
Möchtest du nur die Gruppierung in Code machen oder ist die Gruppierung schon vorhanden und es soll nur im Code formatiert werden?

Grid wird vom Anwender zur Laufzeit gruppiert - ist nicht vorgegeben.

Nur die Formatierung der Spalte Summe(Zeit) von Float in hh:mm ist vorgegeben.

Wenn jetzt nach z. B. Name, id o.a. gruppiert wird und die Gruppenfusszeile + Summe eingeblendet wird (Laufzeit)
dann wird die Summe anstatt 01:35 als 95,00 angezeigt. Das müsste dann formatiert werden.

Hoffe ist so klarer.Auf jeden Fall danke für deine Hilfe und deine Geduld.Hab das Programm mit dem Grid erst vor kurzem übernommen
und fische noch sehr im Trüben.

Grüsse Lothar

Bebe 21. Jul 2009 16:18

Re: DevExpress Summe
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hoffe ich habe dich richtig verstanden ...

Ich habe mal ein kleines Beispiel erstellt. Jedoch habe ich alle Groups und Items schon angelegt, dadurch habe ich jetzt das geforderte Event und kann formatieren.

Es sind keine Gruppierung vorgegeben, du kannst ausser der Zeit-Spalten alles gruppieren. Im Footer der Gruppe siehst du das formatierte Ergebnis. Stellvertretend für viele Event habe ich nur ein Event GetText angelegt und im OI bei OnGetText zugewiesen. Siehe Bild im Anhang.

Mit der rechten Maustaste kannst du jetzt auf der Caption der Spalte das Zusatzmenü öffnen. Dort kannst du die Gruppierung auswählen, auch mehrfach Gruppierungen sind erlaubt.

Gruß
Matze

PS Kein Problem :)

Edit : neues Beispiel Projekt hochgeladen - jetzt ohne Skins bei Uses ...

yamaha007 22. Jul 2009 14:35

Re: DevExpress Summe
 
Hi, habs ausprobiert und funktioniert bis auf eine Einschränkung sehr gut.

Vielen Dank schon mal :bounce2:

Wenn ich es richtig verstanden habe muss ich alle Spalten nach denen gruppiert werden kann im OI zuweisen.Ist machbar.

Das was nicht funktioniert ist wenn man nach dem Aufruf die Summe in der Gruppenfußzeile mit der rechten Maustaste aus und dann wieder einblendet.

Dann ist die Formatierung nicht mehr da :gruebel:

Ist auf jeden Fall ne Herausforderung dieses Grid mit all seinen Möglichkeiten. :pale:

Bebe 22. Jul 2009 15:43

Re: DevExpress Summe
 
Du hast recht, das ist ja doof.... Ich melde mich wieder

Gruß
Matze

Bebe 23. Jul 2009 07:20

Re: DevExpress Summe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt aber .... :-D


Ab jetzt brauchst du keine Gruppe mehr vorgeben, d. h. ob du die Summarys änderst oder löscht wird immer bei einer Summe (skSum) die formatierte Zeit angezeigt.

Dazu brauchst du wieder meine Prozedure GetText und das Event vom Grid [Tableview].DataController.SummaryDefaultGroup.SummaryItems.O nSummary. Sobald eine Gruppierungsfunktion angezeigt werden soll wird das Event aufgerufen. Dabei prüfe ich ob es die korrekten Spalten sind (Es wird bei jeder Spalte in jedem Record ausgelöst).Dann ob es eine Footer ist und die Gruppierungsfunktion skSum. Wenn das der Fall ist, dann verbinde ich vom SummaryItem das Event OnGetText mit der Prozedure GetText. Diese Event wird nach der Summary Berechnung aufgerufen.

Einen kleinen Tipp habe ich noch. Hast du die Help Dateien runtergeladen, mir haben sie (fast) immer geholfen. Hier in diesem Fall aber nicht :wink: , dafür aber DevExpress Support, der ist sehr gut.

Der Eintrag war das was wir brauchten .... DevExpress Eintrag Q212225

Gruß
Matthias


Delphi-Quellcode:
procedure TForm1.cxGridDBTV1DataControllerSummaryDefaultGroupSummaryItemsSummary(
  ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
  var OutArguments: TcxSummaryEventOutArguments);
var
  AItem: TcxGridTableSummaryItem;
  AValue: Variant;
begin
  AItem := TcxGridTableSummaryItem(Arguments.SummaryItem);

  // Prüfe ob es die gewünschte Spalte ist
  if (AItem.Column = cxGridDBColZeit1) or (AItem.Column = cxGridDBColZeit2) or
    (AItem.Column = cxGridDBColZeit3) then
  begin
    // Bedingung : es ist ein Footer und soll die Summe angezeigt werden
    if (AItem.Position = spFooter) and (AItem.Kind = skSum) then
      // Event OnGetText einschalten
      AItem.OnGetText := GetText
    else
    begin
      // Event OnGetText ausschalten und Exit
      AItem.OnGetText := nil;
      Exit;
    end;
    //Entnehme die Werte aus der korrekten Spalte
      if AItem.Column = cxGridDBColZeit1 then
        AValue := cxGridDBTV1.DataController.Values[
          Arguments.RecordIndex, cxGridDBColZeit1.Index]
      else if AItem.Column = cxGridDBColZeit2 then
        AValue := cxGridDBTV1.DataController.Values[
          Arguments.RecordIndex, cxGridDBColZeit2.Index]
      else if AItem.Column = cxGridDBColZeit3 then
        AValue := cxGridDBTV1.DataController.Values[
          Arguments.RecordIndex, cxGridDBColZeit3.Index];

      // Nachfolgende Abfrage auskommentiert, da weiterhin gerechnet wird.
      // Nur wenn man bestimmte Datensätze berechnet haben möchte
      // könnte man die DS filtern und in SummaryValue addieren.

      //nur als Beispiel

      // if not VarIsNull(AValue) then
      // begin
      //  OutArguments.SummaryValue := AValue + OutArguments.SummaryValue;
      //  OutArguments.Done := true;
      // end;

  end;
end;

procedure TForm1.GetText(Sender: TcxDataSummaryItem; const AValue: Variant;
  AIsFooter: Boolean; var AText: string);
begin
  if AValue <> Null then
    AText := FormatDateTime('hh:mm', AValue);
end;

yamaha007 23. Jul 2009 08:23

Re: DevExpress Summe
 
Hi, vielen vielen Dank. Funktioniert - wie gewünscht. :corky:


:hi: bis demnächst.

Bebe 23. Jul 2009 08:34

Re: DevExpress Summe
 
Das freut mich ... :)

Bis dann
Gruß
Matthias

nindri 5. Okt 2009 15:41

Re: DevExpress Summe
 
Hallo alle zusammen,

ich belebe das Thema wieder zum Leben...

Bei mir klappt das alles nicht so wie es bei mir sein soll.

Entweder habe ich es einfach nicht verstanden oder habe ein anderes Problem.

Ich möchte ein Colum was folgendes Format hat: "Time Edit" - "tfHourMin"

Unter Summary habe ich dann das Column ausgesucht das entsprechende FiueldName ausgewählt und als Kind skSum gesetzt, aber komischer weise kann mein Grid nur "Max, Min und Count" bei Summ passiert einfach nichts wisst ihr woran es liegen könnte?

Einmal hat er irgendwie eine Summe "addiert", aber da kam dann ein Datum und dann eine falsche Zeit raus.

Soweit ich es richtig verstanden habe, kann DevExpress bzw. Allgemein kann die Zeit nicht addiert werden, wie kann ich für das einzelne lösen?

Vielen Dank für eure hilfe

Bebe 5. Okt 2009 16:38

Re: DevExpress Summe
 
Herzlich Willkommen (dass ich das mal als erster sage ... Cool) :-D

Ich denke dein Problem ist das Datenbankfeld, das wird vom Typ DateTime sein.
Stelle es um auf Float, was letzendlich ein DateTime Field ja ist, dann hast du den Durchschnitt, sowie die Summe als Auswahl. Die Column zeigst du als TimeEdit an (+ tfHourMin).

Das sollte klappen.

Gruß
Matze

nindri 5. Okt 2009 22:27

Re: DevExpress Summe
 
Vielen Dank.

Aber leider kommt folgendes Problem:

die Zeitzen sind z.B. alle auf "0" und mein Grid hat als "Summe" 31 und wenn ich dann z.B. als Zeit 01:22 angebe dann rechnet er das auch ganz komisch zusammen nicht so wie als "Zeit".
Hoffentlich habe ich das jetzt gut genug erklärt.

Bebe 6. Okt 2009 05:27

Re: DevExpress Summe
 
Hallo,

nach meiner Meinung ist nur scheinbar überall der Wert 0, ansonsten würde das Grid nicht die Summe 31 anzeigen. Überschreibe mal alle Wert der Spalte mit 0.

Das mit der Gruppensumme ist korrekt, die mußt du bei der Ausgabe natürlich formatieren, da das Grid sonst die Summe in Float anzeigt, es orientiert sich an den Typ vom DB Feld, was ja Float ist.
Versuche es mal mit OnGetText

Zitat:

Zitat von Bebe
Hallo,

wenn du dir ein Footer erstellst, dann nimm doch das Event GetText vom Summary-Item

als Beispiel ...

Delphi-Quellcode:
TcxGridDBDataController.TcxDataSummary.FooterSummary.Items[0].GetText(Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean; var AText: string)
Den Wert entnimmst du von AValue, den du dann bei AText formatiert darstellen kannst. Ich hoffe du kannst damit etwas anfangen.

Gruß
Matze

und natürlich den Code, die Formatierung vielleicht noch ändern.

Delphi-Quellcode:
  if AValue <> Null then
    AText := FormatDateTime('hh:mm', AValue);

nindri 6. Okt 2009 08:37

Re: DevExpress Summe
 
hmm soweit ich es richtig verstanden habe muss ich nur folgendes machen:

Delphi-Quellcode:
procedure TfrmStundenMA.cxGrid1DBBandedTableView1TcxGridDBDataControllerTcxDataSummaryFooterSummaryItems0GetText(
  Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean;
  var AText: string);
begin

    if AValue <> Null then
      AText := FormatDateTime('hh:mm', AValue);
end;
Also beim Ergebnis "OnGetText" wird geprüft, ob der Wert "nicht NULL" ist und dann wird im Footer das Format in 'hh:mm' geändert und als "AValue" gespcihert?

Bei mir kommen immernoch die komischen Zahlen raus also statt ca. 8 Stunden sagt mein Grid im Footer 0,89 oder so.

ini Dateien habe ich natürlich auch gelöscht danach.


Vielen Dank

nindri 6. Okt 2009 09:07

Re: DevExpress Summe
 
mit den Beispielprojekten habe ich dieselben Probleme, wenn ich z.B. von "Zeit1" die Summe berechnen lasse kommt 0,16 raus statt.... ca.98 oder so hmm

nindri 6. Okt 2009 14:59

Re: DevExpress Summe
 
Ok Problem gelöst, ich habe einfach in MySQL die Stunde - Minute errechnet und dann unter OnGetText anzeigen lassen.

Vielen Dank für die Hilfe :)

Bebe 6. Okt 2009 18:36

Re: DevExpress Summe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Auch wenn du es schon gelöst hast, hier nur noch ein paar Worte.

Zitat:

Also beim Ergebnis "OnGetText" wird geprüft, ob der Wert "nicht NULL" ist und dann wird im Footer das Format in 'hh:mm' geändert und als "AValue" gespeichert?
Die Variabel Value ist ein Variant und Text ein String, daher mußt du die Null Werte abfangen, weil ein String nie Null sein darf, sondern nur Leer (ala ''). Null Werte können ja vorkommen, da dieses Event OnGetText in jeder Zelle ausgeführt wird (von oben nach unten - eben die ganze Spalte, wo das Event wirksam ist)

In dem Projekt was du ansprichst ging es um die Fusszeile einer Gruppe, nicht aber um die Fusszeile des Grids. Ausserdem war das Problem das nur bei fkSum die Formatierung korrekt angezeigt werden soll, nächste Problem war das dynamische Verhalten. Sobald du den Footer aus.- und wieder einschaltest geht die Formatierung verloren. Deshalb der Umweg über das DefaultGroupSummaryItems Event. Wo geprüft wird ob es die korrekte Spalte ist und der Typ der Fusszeile fkSum.

Ich habe mal das Projekt ein bisserle geändert. Dort funktioniert alles wie du möchtest. Was du jetzt noch benötigst ist das Event FooterSummaryItems beide Events findest du im Tableview vom Grid unter DataController.Summary.

Schaue dir mal das Projekt an. Hier ein paar Details.

Spalten vom Grid :
Zeit1 : DB Feld = Float Gridanzeige = CalcEdit => nicht ok, da überall Zahlenwerte und im Footer auch
Zeit2 : DB Feld = Float Gridanzeige = TimeEdit => nicht ok, da Zahlenwerte im Footer, sonst im Grid OK
Zeit3 : DB Feld = Float Gridanzeige = TimeEdit => eigentlich ok, da formatierter Footer, jedoch nach ein.- und ausschalten des Footer nicht mehr vorhanden
EchteZeit : DB Feld = DateTime Gridanzeige = TimeEdit => nicht ok, da keine Summe im Footer möglich
Fehlerfrei : DB Feld = Float Gridanzeige = TimeEdit => alles OK (die Formatierung bleibt erhalten, ausschließlich bei fkSum, bei allen anderen Footertypen wird das Format nicht geändert)

Gruß
Matze

nindri 8. Okt 2009 14:19

Re: DevExpress Summe
 
Ok jetzt habe ich es mit deinem BeispielProjekt verstanden

Ich glaube deine Lösung ist einfacher bzw. besser als meine, da meine extra eine Query braucht und einen längeren Quellcode hat mal schauen, ob ich deine Lösung noch benutze...

Vielen Dank für deine Hilfe :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 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