[Gelöst] String To Boolean Parser

13. Juli 2010 16:23

Hallo zusammen,

ich bitte um dringende Hilfe für folgende Herausforderung:

Es soll ein String in Navision abgefragt werden. Dazu folgendes Beispiel:
Formel (Typ:Text) = "%1>%2"
Feld 1 (Record=Purchase Receipt Line (121), Feld: Expected Receipt Date, Typ:Datum)
Feld 2 (Record=Purchase Receipt Line (121), Feld: Posting Date, Typ:Datum)

Der String wird aus den oben genannten Felder zusammengebaut in:
Stringvariable "14.07.2010>12.07.2010"

Im Anschluss soll der Text auf TRUE oder FALSE geprüft werden. In diesem Falle soll TRUE rauskommen und eine Verarbeitung starten.

Das ist der Ansatz. Jetzt die Herausforderung: Die Felder können individuell aus 3 versch. Tabellen ausgewählt werden, müssen allerdings vom gleichen Datentyp sein. Der Datentyp ist i.d.R ein Decimal, Code oder Date. Über das Feld "Formel" kann eine beliebige Formel eingegeben werden wie z.B. "(%1>%2)AND(%1<>0D)".
Dann werden die %1 bis %X durch die Inhalte der ausgewählten Felder ersetzt.
Am Ende ensteht immer ein String der geprüft werden soll.

Leider bin ich nicht fündig geworden, wie das in Navision umgesetzt werden kann. Eine Art Parser wie in C# oder C++ konnte ich nicht finden und im Standard konnte ich leider auch nichts ableiten.


Mir fällt spontan nur eine eigen geschriebene Funktion ein, die alle Eventualitäten abfängt und daraus einen Ausdruck baut, der abgefragt werden kann oder ein Boolean zurück liefert.

Hat jemand eine Idee wie das umgesetzt werden kann, oder bereits einen String to Boolean Parser geschrieben?

Vielen Dank für Eure Hilfe!
Zuletzt geändert von Navision_Link am 14. Juli 2010 13:13, insgesamt 1-mal geändert.

Re: String To Boolean Parser

14. Juli 2010 09:39

Nachtrag: Gibt es eventuell eine DLL die ich aus dem Programmcode ansprechen kann?

Also ich übergebe eine Textvariable mit der Abfrage und zurück kommt ein TRUE oder FALSE.
Hat das schon mal jemand gemacht?

Re: String To Boolean Parser

14. Juli 2010 10:01

Ja, aber das ist allerdings schon etwas länger her.

Also, wie war das .. :roll: .. : Enthält der Text keine Klammern, ist die Auswertung von links nach rechts relativ trivial.
Enthält der Text jedoch welche, musst du sie von innen nach außen auswerten. Du spaltest den Text rekursiv immer weiter auf, bis du zu einem eindeutig auswertbaren Ergebnis kommst, also einen Ausdruck, das von einer öffnenden und schließenden Klammer umgeben wird. Durch die ausgewerteten Rückgaben wird der endgültige Boolwert bestimmt.

Die grundsätzlichen Prüfungen (Klammern zählen, Anzahl öffnender und schließender Klammern vergleichen, unerlaubte Zeichen raus werfen etc.) ergeben sich von selbst.

Blöde dürfte in Nav nur werden, dass du den Datentyp wirkich vorher wissen musst. Denn aus einer 1 kannst du ja per Evaluate sowohl eine Zahl als auch ein Datum bekommen. Oder so gesagt: 0011 und 11 sind als Code verschieden, als Int jedoch gleich.

Re: String To Boolean Parser

14. Juli 2010 10:16

Vielen Dank für die Antwort.

Ich wollte mir das Leben leicht machen und habe ein bisschen geforscht. Dabei bin ich auf die Funktion "Boolean.Parse" in der mscorlib.dll gestoßen.
Die DLL hätte ich gerne im C/AL Code angesprochen, indem ich eine Automationvariable deklariere und die mscorlib.dll auswähle. Leider finde ich nicht die entsprechende Klasse unter der die Funktion aufrufbar ist.

Hier der MSDN Eintrag: http://msdn.microsoft.com/en-us/library ... parse.aspx
Ich habe die mscorlib.dll Version 2.0.

Die System ist leider nicht als Klasse verfügbar.

Vielen Dank schon mal.

Re: String To Boolean Parser

14. Juli 2010 10:58

Okay, leider kann ich dem nicht ganz folgen. Selbst wenn ich den String zerlege, vergleiche ich doch wieder einen String.

Es wäre toll, wenn hier ein kleines Codebeispiel abgebildet wird.

Vielen Dank.

Re: String To Boolean Parser

14. Juli 2010 11:43

Irgendwie so:
Nehmen wir an, wir testen (a>b)or(c>d).
Code:
Function EvalBoolValue(InputString: Text[255]):bool
Falls nur noch je eine öffnende und eine schließende Klammer: Auswerten und exit(True bzw. False)
Falls nicht: exit(EvalBoolValue(a>b) OR EvalBoolValue(c>d))

Typische Übungsaufgabe :-)

Du könntest dir aber auch 'Microsoft Script Control 1.0'.ScriptControl, Methode Eval ansehen. Scheint das zu können, was du suchst.

Re: String To Boolean Parser

14. Juli 2010 12:12

Vielen Dank für den Tipp.

Ich fand den 2. Vorschlag mit der Automation einfacher. Leider kann ich die Funtion Eval nicht aufrufen.
Hier mein Codeausschnitt:

msScriptControl ist vom Typ Automation und dem Subtyp 'Microsoft Script Control 1.0'.ScriptControl

CREATE(msScriptControl);

string := '1=1';
Message(Format(msScriptControl.Eval(string)));

string := '1<>1';
Message(Format(msScriptControl.Eval(string)));

CLEAR(msScriptControl);

Es erscheint folgende Fehlermeldung:

---------------------------
Microsoft Business Solutions-Navision
---------------------------
Diese Meldung ist für C/AL-Programmierer:

Der Aufruf zum Member Eval ist fehlgeschlagen. ScriptControl gab die folgende Meldung zurück:
The operation could not be completed because the script engine has not been initialized to a valid language.

---------------------------
OK
---------------------------

Wenn ich die Language nach dem CREATE setzen will, erscheint folgende Meldung:
Codeausschnitt:
msScriptControl.Language(Format(WINDOWSLANGUAGE));

Fehlermeldung:
---------------------------
Microsoft Business Solutions-Navision
---------------------------
Diese Meldung ist für C/AL-Programmierer:

Der Aufruf zum Member Language ist fehlgeschlagen. ScriptControl gab die folgende Meldung zurück:
A script engine for the specified language can not be created.

---------------------------
OK
---------------------------


Weiß jemand was ich falsch mache?

Vielen Dank.

Re: String To Boolean Parser

14. Juli 2010 12:19

Hihi. Da hat man mal eine an sich vernünftige Fehlermeldung aus einer Automation, und dann sowas. Gemeint ist die Programmiersprache :-)

Also ...
Code:
Name   DataType   Subtype   Length
Scr   Automation   'Microsoft Script Control 1.0'.ScriptControl   

CREATE(Scr);
Scr.Language := 'VBScript';

BoolText := '(#5/28/1993#>=#5/26/1993#)and(1<2)';
TestBool := Scr.Eval(Booltext);
clear(Scr);

Re: String To Boolean Parser

14. Juli 2010 12:21

Nachtrag:

Hier der Beispielcode wie es funktioniert:

CREATE(msScriptControl);

msScriptControl.Language('VBScript');

string := '1=1';
Message(Format(msScriptControl.Eval(string)));

string := '1<>1';
Message(Format(msScriptControl.Eval(string)));

CLEAR(msScriptControl);

Vielen Dank für die schnelle und tolle Unterstützung!