AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

In Stringgrid mit Currency - Werten rechnen

Ein Thema von jmich · begonnen am 17. Jan 2022 · letzter Beitrag vom 21. Jan 2022
Antwort Antwort
Seite 1 von 2  1 2      
jmich

Registriert seit: 24. Dez 2007
40 Beiträge
 
#1

In Stringgrid mit Currency - Werten rechnen

  Alt 17. Jan 2022, 19:39
Delphi-Version: 11 Alexandria
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 17. Jan 2022, 20:09
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#3

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 17. Jan 2022, 23:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#4

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 18. Jan 2022, 08:51
Zitat:
Dein eigentliches Problem liegt doch darin
...nö. Die DeddyH schon sagte...Trennung Anzeige und Daten! Da erledigt sich das von allein...
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#5

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 18. Jan 2022, 10:15
Zitat:
Dein eigentliches Problem liegt doch darin
...nö. Die DeddyH schon sagte...Trennung Anzeige und Daten! Da erledigt sich das von allein...
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 18. Jan 2022, 10:23
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 18. Jan 2022, 16:15
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 18. Jan 2022, 17:16
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
jmich

Registriert seit: 24. Dez 2007
40 Beiträge
 
#9

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 20. Jan 2022, 22:31
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#10

AW: In Stringgrid mit Currency - Werten rechnen

  Alt 21. Jan 2022, 12:42
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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