Globale Funktion: In der Cloud funktioniert sie, auf dem Mac nicht
Ninox Profile

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.

 

FiBu_GlobalFunk1_Cloud

 

FiBu_GlobalFunk1_Mac


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.

Ninox Profile

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)

Ninox Profile

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.

Ninox Profile

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')

---

Ninox Profile

 tippfehler:

GetBelegNr(BelArt : text,BNrStart : number,BelDatNum : number) do

Ninox Profile

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!

 

Ninox Profile

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:

FiBu_GlobalFunk1_Mac_Success

 

Ninox ohne Leo wäre wie Autofahren ohne Navi: Es geht, dauert aber länger.

Ninox Profile

"Ninox ohne Leo wäre wie Autofahren ohne Navi: Es geht, dauert aber länger."

 

Das kann ich nur unterschreiben!

Ninox Profile

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. ;)

 

Ninox Profile

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?

1 2
Antworten