Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   String mit Bedingung auswerten (https://www.delphipraxis.net/191435-string-mit-bedingung-auswerten.html)

ioster 16. Jan 2017 11:02

String mit Bedingung auswerten
 
Hallo,

ich suche nach einer Möglichkeit, eine Zeichenkette mit einer Formel auch als booleschen Ausdruck prüfen zu können. Hintergrund ist die Einschränkung einer Funktion, die nur bei Einhaltung einer Bedingung ausgeführt werden soll. Die Bedingung soll vom Anwender definiert und in einer Datenbank gespeichert werden.

Ich nutze schon einen MathParser, der mir bei der Umrechnung von Formeln hilft, die in ähnlicher Weise in meinen Anwendungen hinterlegt werden können. Dabei ersetze ich immer erst Platzhalter für Feldinhalte und schicke die Zeichenkette durch die mathematische Bearbeitung. Allerdings bekomme ich nur numerische Werte aus der Routine zurückgeliefert und ich möchte auch nicht das Risiko eingehen, die Routine selber um die Umsetzung der booleschen Wertigkeit zu ergänzen. Es sei denn, die Lösung wäre trivial und am Ende der Funktion umzusetzen. Ansonsten tendiere ich zu einer zweiten Funktion.

Allgemein fehlt mir aber der funktionelle Ansatz. Vielleicht stehe ich auch nur auf dem Schlauch und brauche eine kleine Eingebung von außen.

Damit meine Frage etwas leichter verständlich ist, hier ein Beispiel für eine solche Zeichenkette:

"[Bestand] + [Bestellung] - [Auftrag] > 0"

Die Platzhalter für den Lagerbestand, die bestellte und durch Auftrag reservierte Menge wird von mir durch einen Parser mit reellen numerischen Werten gefüllt, so dass es z.B. anschließend so aussieht:

"30 + 50 - 20 > 0"

Mit meinem MathParser komme ich bei einer solchen Konstellation nicht weiter. Der könnte den Wert bei "30 + 50 - 20" korrekt ermitteln, aber mit größer, kleiner, gleich usw. ins Rotieren kommen. Die Funktion darf nicht auf mathematische Ausdrücke reduziert werden. Genauso kann dort auch ein Ausdruck wie "[Name] <> 'MEIER'" als Bedingung definiert sein, der in "'MÜLLER' <> 'MEIER'" aufgedröselt sein könnte.

Wenn jemand eine Idee hat, wie das Problem gelöst werden kann, wäre ich für Infos dankbar. Sollte es irgendwo eine entsprechende Library geben, wäre das besonders hilfreich.

Danke im voraus.

Ingo

sakura 16. Jan 2017 11:08

AW: String mit Bedingung auswerten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe momentan keine Zeit und kann Dir jetzt auch nicht sagen, ob der Parser von damals mit solchen Bedingungen klar kam, allerdings ließe sich das recht leicht implementieren. Eine Demo ist dabei. Schau einfach mal rein.

...:cat:...

rokli 16. Jan 2017 12:07

AW: String mit Bedingung auswerten
 
Hallo,

ich würde die Eingabeparameter erst auf numerisch / nicht numerisch (Dezimalsystem!) prüfen, um dann anschließend auf 2 Arten weiter zu arbeiten.

Fall 1: numerisch; hier ist es doch relativ einfach, da die Zeichen (+ - * / < < <>) direkt ausgewertet werden können.

Fall 2: nicht numerisch; Rechenoperationen funktionieren nicht und die Vergleichsoperatoren kannst Du wie gewohnt verwenden ->

Delphi-Quellcode:
   if 'Perter' > 'Zacharias' then
      ShowMessage('Peter ist größer Zacharias')
   else
      ShowMessage('Peter ist nicht größer Zacharias');

   if 'Perter' <= 'Zacharias' then
      ShowMessage('Peter ist kleiner gleich Zacharias')
   else
      ShowMessage('Peter ist nicht kleiner Zacharias');
Vielleicht hilft`s ja schon!

Gruß
Rolf

a.def 16. Jan 2017 12:34

AW: String mit Bedingung auswerten
 
Zum prüfen ob ein String eine Nummer ist benutze ich immer gerne das hier

Delphi-Quellcode:
function IsNumeric(const aString: string; const bAcceptNegativeNumbers: Boolean = True): Boolean;
var
 bRes: Boolean;
begin
 bRes := StrToInt64Def(aString, 0) = StrToInt64Def(aString, 1);

 if bRes and (not bAcceptNegativeNumbers) and (StrToInt64(aString) < 0) then
  bRes := False;

 Result := bRes;
end;


IsNumeric('123'); // True
IsNumeric('-123'); // True
IsNumeric('-123', False); // False
IsNumeric('ABC'); // False

sakura 16. Jan 2017 12:52

AW: String mit Bedingung auswerten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe es geschafft, das Projekt mal fix anzupassen. Unterstützung für >, >=, <, und <= sind jetzt enthalten, siehe Math.Parser.Operators. Weitere kannst Du einfach hinzufügen.

Achtung, da das als Mathe-Berechnung gedacht ist, geben die Vergleiche 1 zurück, wenn diese passen, und 0 zurück, wenn nicht.

...:cat:...

Uwe Raabe 16. Jan 2017 12:53

AW: String mit Bedingung auswerten
 
Soll das mit Delphi 2007 laufen oder darf es auch etwas neuer sein?

ioster 16. Jan 2017 15:51

AW: String mit Bedingung auswerten
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1358947)
Soll das mit Delphi 2007 laufen oder darf es auch etwas neuer sein?

Ich bin leider bei dem Projekt an Delphi 2007 gebunden.

ioster 16. Jan 2017 15:55

AW: String mit Bedingung auswerten
 
Zitat:

Zitat von sakura (Beitrag 1358946)
Ich habe es geschafft, das Projekt mal fix anzupassen. Unterstützung für >, >=, <, und <= sind jetzt enthalten, siehe Math.Parser.Operators. Weitere kannst Du einfach hinzufügen.

Achtung, da das als Mathe-Berechnung gedacht ist, geben die Vergleiche 1 zurück, wenn diese passen, und 0 zurück, wenn nicht.

...:cat:...

0 und 1 als Rückgabewert ist nicht weiter schlimm, weil in der Regel eine Formel oder eine Bedingung übergeben würde. Ich muss mir das Projekt nachher oder morgen anschauen, ob es in meine Umgebung passt.

Vorab Danke!


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