Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   In Stringgrid mit Currency - Werten rechnen (https://www.delphipraxis.net/209758-stringgrid-mit-currency-werten-rechnen.html)

jmich 17. Jan 2022 18:39

Delphi-Version: 11 Alexandria

In Stringgrid mit Currency - Werten rechnen
 
Hi Leute,

habe mal wieder ein kleines Problem.
Ich möchte eine Stringgrid-Spalte (Zellen) alle Currency addieren.
Werte in Spalte X z.B.
zeile 1 100,00 €
zeile 2 150,56 €
.
.
zeile 8 100,00 €
Das Ergebnis soll in einem Label aus gegeben werden.
label1.caption =(CurrToStrF(ergbnis,ffCurrency,2))

Mein Problem ist, wenn ich die Spalte so mit den Format z.B. 100,00 € addiere habe kein Ergebnis bzw. 0,00
Wenn ich im Stringgrid Float-Werte einlese und später als Floatwerte (100,00) addiere habe ich
ein Ergebnis z.B. 350,00.
Möchte aber in rein Currency rechnen.
Komme hier eben nicht weiter.
Welchen Denkfehler mache ich?

Gruß Jmich

DeddyH 17. Jan 2022 19:09

AW: In Stringgrid mit Currency - Werten rechnen
 
IMHO ist der größte Fehler, eine visuelle Komponente als Datenspeicher zu missbrauchen. Definiere Dir eine geeignete Struktur/Klasse/whatever, rechne darin und benutze das Grid lediglich, um die Daten dann anzuzeigen. Ob Du da noch ein Euro-Zeichen dranhängst oder nicht, spielt dann für die Berechnungen keine Rolle mehr.

Blup 17. Jan 2022 22:35

AW: In Stringgrid mit Currency - Werten rechnen
 
Dein eigentliches Problem liegt doch darin die Strings aus dem Grid in das Currency-Format umzuwandeln.
Zeig uns doch mal den Code wo du das machst.

haentschman 18. Jan 2022 07:51

AW: In Stringgrid mit Currency - Werten rechnen
 
Zitat:

Dein eigentliches Problem liegt doch darin
...nö. Die DeddyH schon sagte...Trennung Anzeige und Daten! :warn: Da erledigt sich das von allein...:zwinker:

Blup 18. Jan 2022 09:15

AW: In Stringgrid mit Currency - Werten rechnen
 
Zitat:

Zitat von haentschman (Beitrag 1500797)
Zitat:

Dein eigentliches Problem liegt doch darin
...nö. Die DeddyH schon sagte...Trennung Anzeige und Daten! :warn: Da erledigt sich das von allein...:zwinker:

Selbstverständlich ist das ein besseres Konzept. Aber obwohl man in einer professionellen komplexen Anwendung kaum ein Stringgrid verwenden würde, hatt dieses für Prototypen oder für Übungszwecke durchaus seine Daseinsberechtigung.

himitsu 18. Jan 2022 09:23

AW: In Stringgrid mit Currency - Werten rechnen
 
Nichts gegen das DBGrid ... es ging nur darum, die Anzeige (Grid) und die Daten (Quelle) zu trennen
und da eben mit der Quelle zu rechnen, anstatt mit dem "View".

Ansonsten mußt du eben fehleranfällig versuchen aus den Anzeigedaten wieder Werte (Currency) zu machen und mit Jenen zu rechnen.

Delphi.Narium 18. Jan 2022 15:15

AW: In Stringgrid mit Currency - Werten rechnen
 
Auch wenn es ein unglücklicher Weg ist (siehe vorherige Kommentare zu Unterschied Datenhaltung / Datenanzeige)

Was muss aus 100,00 € entfernt werden, um eine "berechenbare" Zahl daraus zu machen?
Delphi-Quellcode:
function MachStringZuZahl(AZahl : String) : Float;
begin
  AZahl := AnsiReplaceText(AZahl,'€',''); // Eurozeichen wegmachen.
  AZahl := AnsiReplaceText(AZahl,'.',''); // Tausenderpunkt entfernen.
  AZahl := AnsiReplaceText(AZahl,',','.'); // Dezimalkomma in Dezimalpunkt ändern.
  AZahl := Trim(AZahl);                   // Führende und folgende Leerzeichen entfernen.
  Result := StrToFloat(AZahl); // Hoffen wir, dass die Konvertierung in eine Zahl nun klappt.
end;
Delphi-Quellcode:
function SummiereSpalte(iSpalte : Integer; sg : TStringGrid) : String;
var
  fSumme : Float;
  i     : Integer;
begin
  fSumme := 0;
  for i := 1 to sg.Rows - 1 do begin
    fSumme := fSumme + MachStringZuZahl(sg.Cells[iSpalte,i]);
  end;
  Result := CurrToStrF(fSumme,ffCurrency,2);
end;
Delphi-Quellcode:
// In irgendeinen ButtonClick oder sonstwo:
begin
  Label1.Caption := SummiereSpalte(1, StringGrid);
end;
Und nein, das ist weder schön noch sinnvoll, könnte aber trotzdem so in der Art funktionieren. Ist halt nur hingedaddelt und eher als Beispiel für "So macht man das besser nicht!" gedacht ;-)

himitsu 18. Jan 2022 16:16

AW: In Stringgrid mit Currency - Werten rechnen
 
Zitat:

Dezimalkomma in Dezimalpunkt ändern.
mit StrToFloat wird das dann wohl auch nur noch im englischen Windows funktionieren,

außer du gibt bei StrToFloat auch das passende FormatSetting mit an.

jmich 20. Jan 2022 21:31

AW: In Stringgrid mit Currency - Werten rechnen
 
Das Stringgrid lade ich aus einer SQLite3 Datenbank.
hier ein Ausschnitt aus dem Code:

Delphi-Quellcode:
   sgrid_rechnungsdetail.RowCount := 2;
   for l := sgrid_rechnungsdetail.FixedRows to sgrid_rechnungsdetail.RowCount - 1 do
        sgrid_rechnungsdetail.Rows[l].Clear();

  LiteConnection_rechng.Database := ExtractFilePath(Application.ExeName)+'Rechnungen/'+sg_rechng_uebersicht.Cells[2,sg_rechng_uebersicht.Row]+'.db';
  LiteConnection_rechng.Connected := True;
  try
   liteQuery_rechng.SQL.Text := 'SELECT * from data WHERE Position ';
        liteQuery_rechng.Open;

    while not liteQuery_rechng.Eof do
       begin
         for n := sgrid_rechnungsdetail.FixedRows to sgrid_rechnungsdetail.RowCount - 1 do
         i := n;
          sgrid_rechnungsdetail.Cells[2,i]:= liteQuery_rechng.FieldByName('Position').AsString;
          sgrid_rechnungsdetail.Cells[3,i]:= liteQuery_rechng.FieldByName('LVtext').AsString;
          sgrid_rechnungsdetail.Cells[4,i]:= liteQuery_rechng.FieldByName('Anzahl').AsString;
          sgrid_rechnungsdetail.Cells[5,i]:= liteQuery_rechng.FieldByName('Einheit').AsString;
          sgrid_rechnungsdetail.Cells[6,i]:= CurrToStrF(liteQuery_rechng.FieldByName('Epreis').AsCurrency,ffCurrency,2);
          sgrid_rechnungsdetail.Cells[7,i]:= CurrToStrF(liteQuery_rechng.FieldByName('Gesamt').AsCurrency,ffCurrency,2);

         liteQuery_rechng.Next;
         sgrid_rechnungsdetail.RowCount := sgrid_rechnungsdetail.RowCount +1;
       end;
   finally
       sgrid_rechnungsdetail.RowCount := sgrid_rechnungsdetail.RowCount -1;
  end;


 // Gesamtsumme

     try
        liteQuery_rechng.SQL.Text := ' SELECT SUM(Gesamt) As Gesamt from data WHERE Position ';
        liteQuery_rechng.Open;
     finally
       lbl_rechngd_brutto.Caption := CurrToStrF(liteQuery_rechng.FieldByName('Gesamt').AsCurrency,ffCurrency,2);
     end;


   // EPreis Summe
     try
       liteQuery_rechng.SQL.Text := ' SELECT SUM(Epreis) As Epreis from data WHERE Position ';
       liteQuery_rechng.Open;
     finally
       lbl_rechngd_netto.Caption := CurrToStrF(liteQuery_rechng.FieldByName('Epreis').AsCurrency,ffCurrency,2);
     end;
Was ich aber gern zusätzlich möchte, ist die Berechnung von dem im Stringgrid geladenen Werten
unabhängig der Summenberechnung über die Query-SQL-Text. Die Werte aus SQL-Datenbank werden im Stringgrid
im Currency-Format angezeigt (z.B. 100,00 €).
Wie kann ich trotzdem mit den Werten im Stringgrid rechnen.
Oder soll ich ganz auf Currency verzichten und nur in Float Farmat rechnen?

Gruß Jmich

DeddyH 21. Jan 2022 11:42

AW: In Stringgrid mit Currency - Werten rechnen
 
Summier doch einfach die Werte auf, sobald Du sie aus der Datenbank ausliest. Das ist weniger fehleranfällig und umständlich, als erst das Grid zu befüllen und anschließend über die String-Repräsentation zu iterieren.
Delphi-Quellcode:
var
  lGesamtsumme: Currency;
begin
  lGesamtsumme := 0;
  ...
  while not liteQuery_rechng.Eof do
    begin
      ...
      lGesamtSumme := lGesamtSumme + liteQuery_rechng.FieldByName('Epreis').AsCurrency;
      ...
    end;
  // Und hier jetzt den Wert in einem Label oder wo auch immer darstellen
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Seite 1 von 2  1 2      

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