Neu exists(), getvalue(), evaluate() unbrauchbar

ybitl

Aktives Mitglied
9. September 2020
43
9
Hallo JTL,

viel Arbeit für umsonst.

Was in der Vorschau im Designer noch funktioniert hat, funktioniert bei der realen Ausgabe nicht mehr.

Mit exists("Variable") sollte eigentlich überprüft werden können, ob eine Variable existiert.
Falls ja, sollte diese mit getvalue("Variable") oder evaluate("Variable") verwendet werden können.

Das funktioniert jedoch nicht.
In der Designer-Vorschau ja, aber in der realen Ausgabe nicht.

Mit getvalue() geht garnichts.

Mit evaluate() geht es nur, wenn die Variable als vollständiger Text schon im Programmcode vorliegt.

Das Problem: exists("Variable") liefert scheinbar nur dann Wahr, wenn die Variable an anderer Stelle im Quellcode schon einmal direkt verwendet wurde.
Wenn die Variable aber schon einmal an anderer Stelle verwendet wurde, und damit eine fehlerfreie Ausführung des Quellcodes möglich war, ist an anderer Stelle die Überprüfung mit exists("Variable") und dann verwenden mit getvalue("Variable") überflüssig.
Evaluate("Variable") könnte man alternativ verwenden. Funktioniert aber auch nicht mehr, wenn die abzufragende Variable erst zur Laufzeit bestimmt wird.


Auftrag_2.0_Test_60.jpg

Anbei die Testvorlage, eine Auftragsvorlage.
 

Anhänge

  • Auftrag_Neue Vorlage 2.0_GlobaleVorgänge_Test.vlg
    18,8 KB · Aufrufe: 1
  • Gefällt mir
Reaktionen: Brummibaer

ybitl

Aktives Mitglied
9. September 2020
43
9
JTL_GetVar() ist nur geeignet zum Lesen von zuvor mit JTL_SetVar() gesetzten Variablen.
 

ybitl

Aktives Mitglied
9. September 2020
43
9
In einem anderen Forum habe ich diese mögliche Lösung gefunden:

LL.CheckUsedIdentifiers = false;

Wo und wie setzt man diese Variabel?

Vielen Dank.
 

Brummibaer

Aktives Mitglied
30. Dezember 2019
32
13
Hallo JTL,

viel Arbeit für umsonst.

Was in der Vorschau im Designer noch funktioniert hat, funktioniert bei der realen Ausgabe nicht mehr.

Mit exists("Variable") sollte eigentlich überprüft werden können, ob eine Variable existiert.
Falls ja, sollte diese mit getvalue("Variable") oder evaluate("Variable") verwendet werden können.

Das funktioniert jedoch nicht.
In der Designer-Vorschau ja, aber in der realen Ausgabe nicht.

Mit getvalue() geht garnichts.

Mit evaluate() geht es nur, wenn die Variable als vollständiger Text schon im Programmcode vorliegt.

Das Problem: exists("Variable") liefert scheinbar nur dann Wahr, wenn die Variable an anderer Stelle im Quellcode schon einmal direkt verwendet wurde.
Wenn die Variable aber schon einmal an anderer Stelle verwendet wurde, und damit eine fehlerfreie Ausführung des Quellcodes möglich war, ist an anderer Stelle die Überprüfung mit exists("Variable") und dann verwenden mit getvalue("Variable") überflüssig.
Evaluate("Variable") könnte man alternativ verwenden. Funktioniert aber auch nicht mehr, wenn die abzufragende Variable erst zur Laufzeit bestimmt wird.


Den Anhang 83926 betrachten

Anbei die Testvorlage, eine Auftragsvorlage.
Hallo ybitl:

Leider habe ich dieses Problem auch gerade feststellen müssen.
Und ich habe "getvalue()" schon in alle meine Vorlagen eingebaut, da es in der Vorlagenvorschau super funktionierte.

Ich hoffe jemand von JTL oder Servicepartner kann uns helfen, damit die Arbeit nicht umsonst war!

Liebe Grüße
 

Brummibaer

Aktives Mitglied
30. Dezember 2019
32
13
@Rico Giesler könntest du etwas dazu schreiben?
Ich bin immer sehr dankbar über deine Hilfestellungen.

Weiß du woran es liegt, dass die Variablen nur in der Vorschau funktionieren, aber nicht in der Praxis?
Vielen Dank im Voraus!
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
197
20
Hallo, sorry, dass ich das alte Thema wieder raushole, aber wir sind genau auf dem gleichen Problem gelandet.

Unser Plan: Einen Globalen Textbaustein für die Lieferadresse, den wir in Auftrag, Rechnung und Lieferschein verwenden können

Das Problem: Im Auftrag heisst die Variable Report.SalesOrderShipToAddress.Country und in der Rechnung Report.SalesOrder.SalesOrderShipToAddress.Country

Die Idee: Prüfen, ob die Variable existiert und dann entweder die eine oder die andere nehmen. Funktioniert in der Vorschau auch perfekt.

If(Exists("Report.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrder.SalesOrderShipToAddress.Country"))

Das Problem ist, dass wie oben genannt anscheinend beim Speichern der Vorlage nicht erkannt wird, dass wir die Variable Report.SalesOrderShipToAddress.Country im Template verwenden, sie deswegen gar nicht zur Verfügung steht und wenn wir dann die Rechnung/den Auftrag erstellen nichts angezeigt wird.
 

ergowebshop

Sehr aktives Mitglied
14. Januar 2022
147
32
Das Problem: Im Auftrag heisst die Variable Report.SalesOrderShipToAddress.Country und in der Rechnung Report.SalesOrder.SalesOrderShipToAddress.Country

Die Idee: Prüfen, ob die Variable existiert und dann entweder die eine oder die andere nehmen. Funktioniert in der Vorschau auch perfekt.

If(Exists("Report.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrder.SalesOrderShipToAddress.Country"))
Hallo.
In der Rechnung steht das Land der Lieferadresse eigentlich in Report.InvoiceShipToAddress.Country

Aber um bei dem Beispiel zu bleiben: hast du schon probiert ob es mit zwei If Prüfungen funktioniert?

If(Exists("Report.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrderShipToAddress.Country")) +
If(Exists("Report.SalesOrder.SalesOrderShipToAddress.Country"),GetValue("Report.SalesOrder.SalesOrderShipToAddress.Country"))
 

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
197
20
Wie genau die Variable heisst, ist egal. Das Problem ist, dass die Variable je nach Vorlage anders heißt und deswegen in einem Baustein, der in beiden Vorlagen verwendet werden soll eine if-Bedingung rein muss. Ich verstehe den Ansatz mit beiden If-Bedingungen nicht, die haben ja keinen Else-Parameter. Aber selbst wenn, das unterliegende Problem ist: Spreche ich die Variable direkt an, stützt die Vorlage in der die Variable nicht existiert ab. Spreche ich sie mit Exists() und GetValue() an, funktioniert es im Editor, aber in der echten Vorlage wird anscheindend die Variable nicht geladen (weil sie nirgendwo direkt angesprochen wird) und Exists() gibt false, bzw GetValue() leeren String zurück.

Es gibt also IMHO keine Möglichkeit eine Variable sicher anzusprechen, die in einer Vorlage existiert, aber in der anderen nicht.

Und es gibt keine Variable, die die Lieferadresse enthält und in jeder Vorlage vorhanden ist.
 

ergowebshop

Sehr aktives Mitglied
14. Januar 2022
147
32
Tja du schreibst es stürzt ab wenn eine Variable nicht existiert, wenn also "if a then a else b" abstürzt, wie soll es das else prüfen wenn es im if schon abbricht?
Der Ansatz war also "wenn a dann a" + "wenn b dann b" + "wenn c dann c", nicht zutreffende sollten weggelassen werden und das zutreffende funzt.

Anderer Vorschlag: hast du schon Benutzervariablen versucht? Da kannst du im Auftrag das Land einer Variablen zuweisen und in der Rechnung auch so wie es dort heißt.
Und in der Vorlage, egal wo du sie verwendest, schreibst du quasi nur "Lieferung nach @Land".
 

Anhänge

  • Auftrag.PNG
    Auftrag.PNG
    88,1 KB · Aufrufe: 3
  • Rechnung.PNG
    Rechnung.PNG
    39,8 KB · Aufrufe: 3

t.oster

Gut bekanntes Mitglied
4. Dezember 2013
197
20
Tja du schreibst es stürzt ab wenn eine Variable nicht existiert, wenn also "if a then a else b" abstürzt, wie soll es das else prüfen wenn es im if schon abbricht?
Der Ansatz war also "wenn a dann a" + "wenn b dann b" + "wenn c dann c", nicht zutreffende sollten weggelassen werden und das zutreffende funzt.

Anderer Vorschlag: hast du schon Benutzervariablen versucht? Da kannst du im Auftrag das Land einer Variablen zuweisen und in der Rechnung auch so wie es dort heißt.
Und in der Vorlage, egal wo du sie verwendest, schreibst du quasi nur "Lieferung nach @Land".
Wie gesagt, wenn a ist gar nicht möglich wenn man a literal schreibt, weil es dann abbricht. wenn exists("a") sollte gehen, geht aber nicht wegen cache.
Mit den Benutzervariablen ist eine Möglichkeit, allerdings habe ich noch nicht probiert ob die Variablen aus der Vorlage (zb Rechnung) im globalen Baustein sichtbar sind. Aber selbst wenn muss ich für jeden Vorlagentyp dann alle Variablen der Lieferadresse (Name, Vorname, Straße etc) anlegen. Dann ist es einfacher einen Baustein Lieferadresse-Rechnung und einen Baustein Lieferadresse-Auftrag anzulegen und den jeweiligen zu verwenden.

Totzdem bleibt die Aussage, dass eine Exists() Funktion die effektiv nicht funktionieren kann Quatsch ist und es schön wäre, wenn man die Möglichkeit hätte Variablen zu verwenden, die nicht in jeder Vorlage vorhanden sind.
 

ergowebshop

Sehr aktives Mitglied
14. Januar 2022
147
32
Benutzervariablen sind wirklich nur pro Vorlage und nicht global, ja da müsstest du alle Variablen anlegen, ist blöd.

Der Vorlageneditor ist ja allgemein keine JTL Entwicklung, die nutzen dafür nur List&Label von Combit und es sind dessen Funktionen exists(), getvalue(), evaluate() etc.

Was JTL da drum rum gebaut hat und was nicht, können wir hier echt nicht abschließend wissen. Es bleibt also wie es schon ybitl schrieb: unbrauchbar.
 

ybitl

Aktives Mitglied
9. September 2020
43
9
Ich bin da schon länger raus, JLT hat sich für uns als nicht brauchbar erwiesen hat.

Probiert es mal mit Evaluate():

cond( exists("Report.SalesOrderShipToAddress.Country"), evaluate("Report.SalesOrderShipToAddress.Country"), "")

Aber keine Garantie.

An JTL-Entwickler: Was spicht gegen "LL.CheckUsedIdentifiers = false;"?