Globale Funktion: In der Cloud funktioniert sie, auf dem Mac nicht
Ahoi. Ich habe wieder mal ein Problem mit Inkompatibilitäten zwischen den Plattformen.
Es sollen automatisch Belegnummern generiert werden, und zwar nach einem bestimmten Schema, das an anderer Stelle angegeben werden kann. Im vorliegenden Beispiel sieht dieses Schema (BelegNrAufbau) so aus:
KK-JJMM-L3 (Bsp: ZE-1907-001)
Es könnte aber auch so aussehen: KK_JJ__-L4 (ZE19-0001). Oder so: ___JJMM_L5 (190700001). Das aber nur zum Verständnis, für das Problem ist es unerheblich, das tritt in allen Varianten gleichermaßen auf.
Da die Belegnummer an verschiedenen Stellen generiert werden soll, habe ich dafür eine im Grunde recht simple globale Funktion definiert:
function GetBelegNr(BelArt : text,BNrStart : number,BelDat : date) do
let BNrAufbau := first((select _Einstellungen).BelegNrAufbau);
let BNrBsp := "";
let BNrKK := substr(BNrAufbau, 0, 2);
let BNrT1 := substr(BNrAufbau, 2, 1);
let BNrJJ := substr(BNrAufbau, 3, 2);
let BNrWW := substr(BNrAufbau, 5, 2);
let BNrT2 := substr(BNrAufbau, 7, 1);
let BNrLN := substr(BNrAufbau, 9, 1);
if BNrKK != "__" then
BNrBsp := BNrBsp + BelArt
end;
if BNrT1 != "_" then
BNrBsp := BNrBsp + BNrT1
end;
if BNrJJ != "__" then
BNrBsp := BNrBsp + format(BelDat, "YY")
end;
if BNrWW != "__" then
BNrBsp := BNrBsp + switch BNrWW do
case "QQ":
"Q" + format(BelDat, "Q")
case "MM":
format(BelDat, "MM")
end
end;
if BNrT2 != "_" then
BNrBsp := BNrBsp + BNrT2
end;
let LfdNr := BNrStart + 1;
BNrBsp := BNrBsp + switch BNrLN do
case "3":
format(LfdNr, "000")
case "4":
format(LfdNr, "0000")
case "5":
format(LfdNr, "00000")
end;
BNrBsp
end
Der Aufruf der Funktion erfolgt in einem Berechnungsfeld:
let BelArt := 'Kürzel';
let BNrStart := 'Start bei Nr';
let BelDat := today();
let NextBNr := GetBelegNr(BelArt, BNrStart, BelDat);
styled(NextBNr, Farbe)
Ergebnis: In der Cloud-App funktioniert's, in der Mac-App nicht.
Hat jemand eine Idee, woran das liegen könnte? Und noch wichtiger: Wie sich das beheben/umgehen lässt? Bin für jeden sachdienlichen Hinweis dankbar.
13 Antworten
-
Hallo Copytexter,
befor ich mich mit dem code beschäftige... versuch bitte
function GetBelegNr(BelArt : text,BNrStart : number) do
let BelDat:=today();.........
und Aufruf ohne BelDat (wenn es immer heuties Datum ist)
-
Hallo Leo, danke für deinen Tipp. Ich habe es ausprobiert, und jetzt sieht das Ergebnis so aus:
-1907-001
Es wird also offenbar auch das Argument "BelArt" (2-stelliges Buchstabenkürzel aus Textfeld) nicht ausgewertet. Und was "BelDat" betrifft: Das ist normalerweise nicht "today()", sondern würde später aus einem Datumsfeld (Belegdatum) ausgelesen werden. Irgendwie muss ich das also auch mit übergeben.
-
Ok, dann für Datum die Variable in Funktion als number
---
GetBelegNr(BelArt : text,BNrStart : number,BelDatNum : date) do
BelDat:=date(BelDatNum)
---
und Aufruf:
---
....
let BelDatNum:=number(Datum)
let BelArt:=text('Kürzel')
---
-
tippfehler:
GetBelegNr(BelArt : text,BNrStart : number,BelDatNum : number) do
-
Dasselbe Ergebnis wie vorher: -1907-001.
Aaaber ...
Das hat mich darauf gebracht, das Datum testweise mal aus einem Datenfeld vom Typ 'Datum' auszulesen. Das funktioniert. Und es funktioniert auch mit "date(today())". Anscheinend geht die Mac-App mit "today()" irgendwie anders um als die Cloud-App. Seltsam, aber wenn man's weiß ...
Du hattest also wieder mal den richtigen Riecher. Es lag am Datumsformat. Da wäre ich ohne deinen Anstoß wahrscheinlich nicht so schnell drauf gekommen (wenn überhaupt). Vielen Dank!
-
Nochmal der Reihe nach, falls jemand mal ein ähnliches Problem hat: In der Mac-App wurde die mit 'today()' bestückte Variable 'BelDat' nicht korrekt als Datumswert interpretiert, was dazu führte, dass beim Funktionsaufruf auch die anderen Argumente 'BelArt' und 'BNrStart' nicht übernommen wurden. Die Änderung auf 'date(today())' hat das Problem gelöst.
Der Funktionsaufruf sieht jetzt so aus:
let BelArt := 'Kürzel';
let BNrStart := 'Start bei Nr';
let BelDat := date(today());
let NextBNr := GetBelegNr(BelArt, BNrStart, BelDat);
styled(NextBNr, Farbe)
Und das Ergebnis stimmt nun auch in der Mac-App:
Ninox ohne Leo wäre wie Autofahren ohne Navi: Es geht, dauert aber länger.
-
"Ninox ohne Leo wäre wie Autofahren ohne Navi: Es geht, dauert aber länger."
Das kann ich nur unterschreiben!
-
Ey, das gibt's doch gar nicht! Auf einmal funktioniert es nicht mehr. Ich hatte den Code der Funktion zum Testen dupliziert und 'GetBelegNr2' genannt. Da hat's funktioniert, siehe obigen Screenshot. Dann habe ich vorhin den vorherigen Kram gelöscht und die Funktion wieder in 'GetBelegNr' umbenannt. Sonst nix.
Himmelherrgottdonnerwetternochmal! Jetzt kann ich wieder von vorne anfangen!
PS: An der Aussage zu Leo ändert das natürlich nichts. ;)
-
Update: Jetzt wird's völlig abstrus: Ich hatte nach dem Auslesen des Belegnummern-Schemas einfach mal einen Dialog zur Anzeige des Wertes eingefügt:Und damit funktionierte es. Nahm ich den Dialog wieder raus, ging's nicht mehr.
Dann habe ich noch ein wenig weiter herumexperimentiert, u. a. das Script der Funktion dupliziert und jeweils ne Ziffer dahintergestellt. So habe ich jetzt drei Funktionen gleichen Inhalts untereinander. Und jetzt kommt's: Rufe ich die erste der drei Funktionen auf, egal, wie sie heißt, funktioniert's nicht. Steht die aufgerufene Funktion an zweiter oder drittel Stelle im Editor, dann geht's. Wirklich! Isso.
Spaßeshalber habe ich noch versucht, eine 2-Zeilen-Pseudo-Funktion vor der ersten "richtigen" zu platzieren. Lustigerweise gibt's dann wieder ein ganz anderes Ergebnis (ZA--). Mit zwei Funktionen geht es auch, es darf nur nicht die erste aufgerufen werden (hier: GetBelegNr2). Ich habe aktuell also tatsächlich zwei mal dieselbe Funktion untereinander stehen, aber nur die zweite (GetBelegNr) funktioniert:
function GetBelegNr2(BelArt : text,BNrStart : number,BelDat : date) do
let BNrAufbau := first((select _Einstellungen).BelegNrAufbau);
let BNrBsp := "";
[...]
BNrBsp
end;
function GetBelegNr(BelArt : text,BNrStart : number,BelDat : date) do
let BNrAufbau := first((select _Einstellungen).BelegNrAufbau);
let BNrBsp := "";
[...]
BNrBsp
end
Das aufrufende Script sieht so aus:
let BelArt := 'Kürzel';
let BNrStart := 'Start bei Nr';
let BelDat := today();
let NextBNr := GetBelegNr(BelArt, BNrStart, BelDat);
styled(NextBNr, Farbe)
So funktioniert es. Momentan.
Das soll einer verstehen. Versteht das einer?
-
Ich bin ja auch vor einiger Zeit über ein nicht nachvollziehbares Problem mit globalen Funktionen gestolpert, die von jetzt auf nachher nicht funktionierten - ich will ja nicht unken, aber ich fürchte da ist generell noch etwas im Argen.
-
Ja, ich erinnere mich dunkel. War das auch so verrückt? Gab's da irgendwelche Parallelen?
-
Verspätetes Hallo, die Kanaren haben mich die Tage etwas abgelenkt ;-)
Parallen gab's nicht wirklich, außer: die Codes gingen von einem auf den anderen Tag nicht mehr in der globalen Funktion, obwohl technisch in Ordnung. :-/
lg, Torsten
-
Dia Kanaren, natürlich. Schuld sind immer andere. ;)
Content aside
- vor 5 JahrenZuletzt aktiv
- 13Antworten
- 3416Ansichten