+1 800 256 3608 (toll-free in North America) or +49 7531 9060-10| service@combit.com

Funktion zur Umwandlung zusammengesetzter Ausdrücke?

Hallo zusammen,

ich bin auf der Suche nach einer L+L-Funktion, die innerhalb eines Templates gültige Ausdrücke, die als Zeichenkette vorliegen, umwandelt bzw. ausführt.
GetValue(“Wert” + Var1) liefert ja z.B. den Wert der Variablen “Wert3”, wenn Var1=“3” oder Var1=3 ist.
Hat man nun aber eine Variable Var2, in der der Text
“Wert” + Var1
steht (inkl. der Anführungszeichen) und man würde GetValue(Var2) schreiben, so geht das nicht mehr, weil die Zeichenkette in Var2 als Zeichenkette angesehen wird und nicht interpretiert wird. Das war jetzt nur ein einfaches Beispiel mit verketteten Zeichenfolgen. Wünschen würde ich mir das aber für ganze Ausdrücke mit allen möglichen Funktionen.
Gibt es dafür eine Funktion, die solche Strings auswertet als wenn Sie im Editor-Fenster stünden (siehe unten)? Ich hätte erwartet, dass Evaluate() das macht, aber hier werden anscheinend nur Rechnungen ausgeführt.

Im Bild ist nochmal zu sehen, wie das bei mir aktuell aussieht^.
Als Achsenbeschriftung ist eine Variable CONFIG.d1.xAxis.Title eingefügt, die den unten angezeigten Text enthält, der sich aus einer Zeichenkette und dem Inhalt einer anderen Variablen zusammensetzen soll.

Besten Dank im Voraus
Chris

Wenn man die Funktionen Getvalue() und Evaluate() wie folgt verschachtelt:

Evaluate(GetValue("Var2"))

bekommt man die Zeichenkette mit dem Variablennamen Wert1 oder Wert3. Ein weiteres GetValue() liefert den Wert von Wert1 oder Wert2

GetValue(Evaluate(GetValue("Var2")))

Wichtig sind die " " im inneren GetValue() damit die Zeichenkette von Var2 interpretiert wird.

2 Likes

Eventuell reicht sogar ein “einfaches”

Evaluate(Evaluate(CONFIG.d1.xAxis.Title))

Die erste Stufe berechnet dabei den Inhalt des Feldes CONFIG.d1.xAxis.Title, die zweite interpretiert ihn dann als Formel

Das funktioniert bei mir leider nicht. Die von Uwe Brieschke vorgeschlagene Evaluate/GetValue-Kombination schon.

Damit geht es schon. Allerdings ist für mich nicht verständlich, warum GetValue(“Var2”) etwas anderes liefert als Var2 alleine. Wo ist der Unterschied zu

Evaluate(Var2)

???

Interessante Frage :wink: - auch warum “meine” Lösung nicht funktioniert. Ich werde mir das morgen einmal genauer ansehen, es sei denn @Uwe_Brieschke zaubert die Antwort aus dem Ärmel :slight_smile: .

Da sind sie auf einen gut versteckten Fehler gestoßen. Evaluate() hat zum Zeitpunkt des Ladens den Ausdrucksbaum gecached. Zu diesem Zeitpunkt werden aber aus Performancegründen noch nicht die echten Inhalte der Variablen ausgelesen. Daher war der Ausdrucksbaum im Cache dann falsch, wurde aber zur Druckzeit nicht mehr aktualisiert. Klingt kompliziert - ist es auch :smile:.

Der Workaround, Evaluate("Var2") zu verwenden funktioniert, weil in diesem Falle nicht der Inhalt von Var2 sondern der String "Var2"gecached wird.

Mein Testcode ist:

LL.Variables.Add("Var1", "3");
LL.Variables.Add("Var2", "'Wert'+Var1");
LL.Variables.Add("Wert3", "Hallo");

Damit liefert Evaluate(Var2) jetzt neu dieses Ergebnis:

image

und die Verschachtelung dann wie von mir gestern erwartet:

image

Der Fix wird ab dem Servicepack 24.002 enthalten sein, Sie können aber gerne Kontakt mit dem Support aufnehmen und einen Hotfix erhalten. Ansonsten können Sie auch mit dem Workaround weiterarbeiten, dieser wird auch nach dem Patch so funktionieren. Vielen Dank für den Hinweis!

Hallo Herr Bartlau,

Hier ist wohl GetValue("Var2") gemeint, oder?

Wenn das Problem gefixt ist, wäre für mich wohl ein einfaches Evaluate()schon ausreichend, da ich aktuell nur an einem Verketten von Ausdrücken interessiert bin. Das zweite Evaluate() braucht man ja nur, falls der verkettete Ausdruck abermals als Variable oder Funktion ausgewertet werden soll.

Der Hotfix müsste vermutlich vom Ersteller unserer Reporting-Software eingepflegt werden, oder? Ich bin hier Enduser und kann wohl nicht einfach irgendeine DLL austauschen oder so.

Trotzdem vielen Dank für das Verfolgen des Problems und die Lösung.

Chris

An sich sollte beides funktionieren, so war es zumindest in meinem Test.

Ja, so ist es - Sie können sich ja bei der Anfrage dort auf diesen Thread beziehen.

Hallo,

ich muss das Thema leider nochmal aufwärmen.
Mittlerweile benutze ich den Template Editor in Version 25, d.h. ein Teil des ursprünglich genannten Problems dürfte durch das Update gelöst sein.

Nun habe ich allerdings folgendes Problem:
Ich habe ein Feld (nennen wir es VarArr). Dieses enthält die Namen von Variablen als Strings, also z.B. "Var1", …, "Var10"

Nun möchte ich in einer Tabellenspalte die Werte(!) der Variablen Var1, …, Var10 darstellen.

Dies ist möglich mit Evaluate(VarArr) (so werden die Einträge von VarArr korrekt ausgewertet)
Verwendet man aber stattdessen Evaluate(GetValue("VarArr")), so wird nur der Wert von Var1 in der Tabelle angezeigt, dieser dafür aber 10-mal.

Der Grund, warum ich den ersten Ausdruck nicht verwenden kann, liegt daran, dass nicht sicher ist, ob VarArr existiert. Eine Abfrage mit Exists("VarArr") bringt nichts, da der Ausdruck Evaluate(VarArr) im negativ-Falle ungültig ist. Die Variante mit GetValue wäre gültig, liefert aber eben nicht das Gewünschte. Offenbar ist VarArr nicht das Gleiche wie GetValue("VarArr"). Nach meinem Verständnis müsste beides ja ein Feld von Variablennamen sein und Evaluate() daraus ein Feld von Variablenwerten machen.

Wo ist der Denkfehler und was kann man dagegen machen?

Hallo Herr Wißpeintner,

kurz für mein Verständnis: Was ist ein Negativ-Fall, welcher bei Evaluate(VarArr) ungültig wäre? Ich würde gerne versuchen das Verhalten intern zu reproduzieren, sodass wir uns das Thema nochmals genauer anschauen können, an den Inhalten fehlt es leider aber :slight_smile:

Besten Dank!

Guten Morgen,
mit Negativ-Fall meinte ich den Fall, dass Exists("VarArr") eben false ist. Somit kann ich den Ausdruck Evaluate(VarArr) nicht verwenden, weil das gleich einen Fehler schmeißt.

Ich kann also ein Konstrukt wie

Cond(Exists("VarArr"), Evaluate(VarArr), Null())

nicht verwenden, wenn es VarArr nicht geben sollte.

Hallo Herr Wißpeintner,

vielen Dank für Ihre Geduld. Ehrlich gesagt, sind wir uns nicht so sicher, ob wir die Anforderung genau verstanden haben. Vielleicht sehen wir auch einfach den Wald vor lauter Bäumen nicht :wink: Daher haben wir für Sie im Anhang ein Sample (bitte “.txt” der Dateiendung entfernen), mit welchen wir versucht haben das Szenario abzubilden. Könnten Sie sich dies bitte einmal anschauen und ggf. so manipulieren, so dass auch wir den Wald finden :evergreen_tree: :sweat_smile:

Grüße vom Bodensee
Christian Rauchfuß

WindowsFormsApp6.zip.txt (553,0 KB)

© combit GmbH