Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Einfache Formeln in Tabellenfeldern (https://www.delphipraxis.net/158483-einfache-formeln-tabellenfeldern.html)

EarlyBird 19. Feb 2011 11:08


Einfache Formeln in Tabellenfeldern
 
Hallo,
Ich habe eine Tabelle mit 10 Feldern und ca. 5000Datensätze.
Alle Felder enthalten verschiedene Integer Werte.
Nun möchte ich dem User die Möglichkeit geben einfache Berechnungen mit diesen Feldern zu erstellen.
Genauer gesagt soll man eine einfache Formeln speichern können die dann immer wieder zur Berechnung genutzt wird.
z.B. User1 möchte folgende Formeln berechnen "erste Formel: (Feld1 + Feld2 + Feld8) / Feld3" und "zweite Formel: ((Feld5*Feld7) + Feld3) div 3"

Als Ausgabe möchte ich nun alle Felder der Tabelle in einem Grid ausgeben und zusätzlich die Ergebnisse der Berechnungen.
Wichtig ist das der User die Formeln selber erstellen kann und diese Formeln gespeichert werden können.
Es geht nicht um komplexe Formeln sondern um einfache Grundrechenfunktionen.

Mir fehlt noch der richtige Denkanstoß um das ganze Umzusetzen.
Wie habt Ihr so etwas gelöst?
Besten Dank für Eure Unterstützung
Gruß
EarlyBird

rollstuhlfahrer 19. Feb 2011 11:20

AW: User berechnungen
 
Du kannst der DB per SQL ja sagen, welche Ergebnisse sie dir liefern soll. Da SQL auch die Grundrechenarten unterstützt, musst du einfach nur deine Formel als weiteres Feld definieren und per SELECT abfragen. Also etwa so:
SQL-Code:
SELECT Feld1, Feld2, Feld3, Feld1 + Feld2 + Feld3 AS Ergebnis
FROM Zahlentabelle WHERE 1;
Bernhard

EarlyBird 19. Feb 2011 11:30

AW: Einfache Formeln in Tabellenfeldern
 
Danke für die schnelle Antwort.
Ich bekomme das mit der Abfrage schon hin.
Aber wie kann der User das Eingeben wenn das Programm läuft?
Oder meinst Du ich soll die kompletten Selectstatments speichern?

rollstuhlfahrer 19. Feb 2011 13:08

AW: Einfache Formeln in Tabellenfeldern
 
Du musst ja nur den Teil (bei mir jetzt) zwischen "Feld3," und dem "AS Ergebnis" speichern. Der Rest ist immer gleich. Vor dem Ausführen musst du das SQL-Statement noch zusammenbauen und zwar hast du das entweder per Parameter ('SELECT *, :p AS Ergebnis ...' und dann SQL.Params('p').AsString := 'Feld1 + Feld2'; ) oder aber normal ('Select *, ' + UserQuery + ' AS Ergebnis ...').

ACHTUNG: Du musst in allen Fällen noch für eine gewisse Grundsicherheit sorgen, da ansonsten der User dazu ermächtigt wird, per SQL-Injection dein Programm oder die Tabelle dahinter zu zerstören.

Bernhard

sx2008 19. Feb 2011 13:13

AW: Einfache Formeln in Tabellenfeldern
 
Formeln zur Laufzeit berechnen: Hier im Forum suchenMatheparser
So ein Parser in Verbindung mit einem Calculated Field das im Event OnCalcFields befüllt wird
würde dein Problem lösen.
Der Benutzer könnte die Formel zur Laufzeit ändern und das Ergebnis im DBGrid sehen.
Auf jeden Fall ist die Berechnung ohne SQL flexibler.

Die Frage wäre noch, ob es nicht klüger wäre das Dataset nach Excel zu exportieren,
um dem Benutzer so die Möglichkeit zu geben auch komplexe Berechnungen sowie
Visualisierung mit Diagrammen vorzunehmen.
Das hängt von der Zielgruppe (Privat, Verein, Kommerziell, Wissenschaftl.,...) ab.

rollstuhlfahrer 19. Feb 2011 13:18

AW: Einfache Formeln in Tabellenfeldern
 
Ja, es gibt immer mehrere Wege. Da ich (dort, wo ich das verwendet habe), auch noch über die Summe sortiert habe, blieb mir nichts anderes übrig, als die Berechnung vom DB-Server (über SQL) durchführen zu lassen.
Nutzt man einen Matheparser und erledigt das ganze im Programm dürfte das einen großen Geschwindigkeitsvorteil bringen, da nicht immer wieder alle 50.000 Datensätze geladen werden müssen und der Mathe-Parser eventuell mehr Funktionen bereitstellt, als der DB-Server per SQL. Eine Export-Funktion fände ich auch nicht schlecht (Excel beherrscht etwa um die 1000 - 1300 Funktionen).

Bernhard


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