Zeiten aus einem DBGrid zusammenrechnen
-
Jetzt mal abgesehen ob es sich um Zeiten oder ganz normalen Zahlen handelt, wie berechne ich die Summe aus allen Werten einer Spalt? Mal angenommen es wären nur Zahlen!
-
Hallo
Berechnet die Summer der Zahlen der ersten Spalte
int Sum = 0; for (int Row = StringGrid->FixedRows; Row < StringGrid->RowCount; Row++) Sum += StrToIntDef(StringGrid->Cells[0][Row], 0);bis bald
akari
-
Und wenn ich nicht aus der ersten Spalten sonder aus der Spalte die "Dauer" heißt die Summe haben will?
-
dan suchst du statt in der erten spalte, in der spalte die "Dauer" heisst.
etwas hirn anstrengen darf schon sein.
überlege mal wo in akaris-Code die Spalte angegeben wird.
und dan überlege mal, wie du herausfindest welche spalte "Dauer" heisst
-
1. Dauer ist auch bloß eine Zahl.
Hier mußt Du aber aufpassen was 6,50 darstellt -> 6 Std 50 Minuten oder 6,50 Std, also 6 Std 30 min.
I.d.R. Werden Dauern als Industrieminuten (Basis 100) angeben, also 6,50 Std so daß Du "ganz normal" rechnen (ohne Konvertierung) kannst.
Falls nicht mußt Du halt die Minuten abtrennen, dann 50/60*100 nehmen (Umrechnung auf neue Basis) und die Minuten gesondert zusammenrechnen.2. Akaris Methode ist eine C-Methode.
Schneller ist <<select sum(Spalte) from Tabelle >> also direkt auf DB-Ebene.<<select sum(floor(Spalte) + ((spalte-floor(spalte))/60*100)) from Tabelle>> wäre dann die DB-Abfrage mit Umrechnung der Minuten auf 100er Basis.
-
Ich habe das jetzt so probiert:
Query1->Active=false; Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("select sum(Dauer) from Tabelle"); Query1->Active=true; Query1->Open();Ich denke mal das dies falsch ist. Jedefalls stürzt das Programm ohne Fehlermeldung ab sobald ich den Quelltext ausführ.
-
Aua. Aua. Aua.
Du solltest im Select schon Deine Spalte für die Dauer sowie den Namen Deiner Tabelle angeben!
-
if(Query1->Active); Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("select sum('Hier steht Deine Spalte') from 'Deine Tabelle' where 'Deine Einschränkung'"); Query1->Open();Close setzt Active automatisch auf false. Open setzt Active auf true.
-
Für wie blöde haltet ihr mich? Ich habe die Spalte und die Tabelle zugewiesen, nur ich habe es nicht in meinen Quelltext gepostet. Aber bitte hier noch einemal:
Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("select sum (Dauer) from Störungen"); Query1->Open();Geht aber wie gesagt nicht. Also bitte noch einmal, was ist falsch?
-
Welche Datenbank benutzt Du? Ggf. ist die Syntax für die Funktion Sum eine andere. Diese Syntax ist für MS-SQL-Server.
Welches Format hat die Spalte Dauer? Die Funktion Sum setzt numerische Werte voraus.
Umlaute in Tabellennamen bzw. in Spaltennamen -> Da hab ich zumindest mit Centura schon große Schwierigkeiten (Fehler) gehabt. Deshalb benuzte ich nur A-Z,0-9 in Spalten- & Tabellennamen.Zur Fehlereingrenzung wären zusätzliche Informationen sehr hilfreich.
-
Meine Datenbank ist eine MS Access Datenbank und die Spalte "Dauer" ist als Text formatiert. in der Datenbank befinden sich nur zahlen.
-
Access ist zwar aus dem Hause Microsoft, nutzt jedoch eine andere SQL-Syntax als MS-SQL-SERVER.
Sum ist korrekt, d.h. auch in MS-Jet-SQL gleiche Syntax.
Datentyp <<Text>> ist nicht geeignet zur Summierung. Das sollte ein numericher Datentyp sein. Es spielt keine Rolle, daß da bloß Zahlen drin stehen.
<<Text>> ist nicht geeignet für eine implizite Umwandlung, noch nicht einmal in MS-SQL-Server.Schau Dir die Access-Hilfe Teil MS-Jet SQL Referenz. Dort findest Du alles, was Du wissen mußt -> Datentypen, reservierte Wörter, Vgl MS-Jet-SQL <-> MS-SQL-Server.
Access ist nicht wirklich eine Datenbank, eher ein Spielzeug.

-
Und das heißt jetzt? Kann ich mit miener Datenbank diesen Quelllcode verwenden oder nicht?
-
Und noch was anderes, wenn der Quellcode funktionieren würde
Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("select sum (Dauer) from Störungen"); Query1->Open();wie gebe ich dann das Ergebnis von "sum" in einem Edit Feld aus???
-
der Fehler muss wo anders liegen, da ich das mit einer Text-Spalte gerade erfolgreich getestet habe. Die Frage ist wie sehen die Zahlen wirklich in der Tabelle aus. Erfolgreich getestet habe ich Integerzahlen und 1,2 oder 1.2. Zeiten in Form von 15:00:00 oder Dateumswerte gehen so allerdings nicht. Da müßte man die werte entsprechend casten.
Ausserdem empfehle ich die Benutzung des Debuggers, denn ich kann mir nicht vorstellen das das Programm ganz ohne Fehlermeldung aufgibt.zu deiner 2. Frage:
Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("select sum(Dauer) as Dauer from Störungen"); Query1->Open(); Edit1->Text = Query1->FieldByName("Dauer")->AsString;
-
Gemeint habe ich, Du sollst bitte explizit, also per Anweisung, konvertieren;
entweder die Datenspalte selbst oder die Werte.Cast gibt es bei MS-Jet-SQL nicht, lediglich Convert (zumindest laut Hilfe).
Die Anweisung mit Konvertierung der Datenwerte in der Abfrage könnte wie folgt aussehen.
select sum(convert(decimal(15,2),Dauer)) as 'Dauer' from Störungen
Statt Datentyp Decimal könntest Du aber auch Float oder Real nehmen. Integer,smallint und tinyint sollten es eher nicht sein.
Die Konvertierung funktioniert natürlich nur, wenn die Daten konvertiert werden können. Schon 1.000,00 wird dabei als VarChar interpretiert und ist damit nicht konvertierbar.
Da ich nicht mit Access arbeiten mag, habe ich das in 1-2 Min in der Access-Hilfe unter genau den Stichworten recherchiert, die ich Dir gestern geliefert habe.
