![]() |
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 |
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.
|
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. |
AW: In Stringgrid mit Currency - Werten rechnen
Zitat:
|
AW: In Stringgrid mit Currency - Werten rechnen
Zitat:
|
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. |
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:
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 ;-)
// In irgendeinen ButtonClick oder sonstwo:
begin Label1.Caption := SummiereSpalte(1, StringGrid); end; |
AW: In Stringgrid mit Currency - Werten rechnen
Zitat:
außer du gibt bei StrToFloat auch das passende FormatSetting mit an. |
AW: In Stringgrid mit Currency - Werten rechnen
Das Stringgrid lade ich aus einer SQLite3 Datenbank.
hier ein Ausschnitt aus dem Code:
Delphi-Quellcode:
Was ich aber gern zusätzlich möchte, ist die Berechnung von dem im Stringgrid geladenen Werten
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; 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 |
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 12:56 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-2025 by Thomas Breitkreuz