0

Zahlenformat ISBN und andere spezielle

Gibt es eine Möglichkeit spezielle Zahlenformate, zum Beispiel ISBN oder andere spezielle Zahlenformate wie Sozialversicherungsnummer etc zu speichern? Ich will die ISBN Nummer in der Literaturdatenbank als reine Zahlabspeichern, damit ich die Eingabe kontrollieren kann. Denn eine Literaturdatenbank mit falsch eingegebenen ISBN-Nummer nützt nichts.

24 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Markus, meinst du so eine Art Feldmaske, bei der für jede Position vorgegeben ist, welche Art von Zeichen man dort eintippen kann? Sowas gibt es in Ninox leider nicht (ist allerdings als Change Request angefragt).

     

    Man kann die Ziffern der ISBN natürlich gleich in ein Feld vom Typ Zahl eingeben. Oder mit Bindestrichen in ein Textfeld und zur Prüfung dann in einen numerischen Werte umwandeln:

     

    number(replace(ISBN, "-", ""))

     

    Oder geht es um eine Kontrolle anhand der Prüfziffer? Das könnte man bspw. mit einem Funktionsfeld machen (oder auf dem Mac auch als Trigger mit alert() statt styled()):

     

    let myISBN := replace(ISBN, "-", "");
    let myPZ := number(substr(myISBN, length(myISBN) - 1, 1));
    let xSum := 0;
    let ySum := 0;
    for x from 0 to 11 step 2 do
        let xZiffer := number(substr(myISBN, x, 1));
        xSum := xSum + xZiffer
    end;
    for y from 1 to 12 step 2 do
        let yZiffer := number(substr(myISBN, y, 1)) * 3;
        ySum := ySum + yZiffer
    end;
    let mySum := xSum + ySum;
    let myMod := ceil(mySum / 10) * 10;
    let myChk := if myMod = 10 then 0 else myMod - mySum end;
    let myCol := if myChk = myPZ then "Green" else "Red" end;
    styled(text(myChk), myCol)

     

    Wie immer gilt: Nach bestem Wissen und Gewissen, aber ohne Gewähr.

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi, kannst Du mal schreiben, was genau Du "kontrollieren" willst? Dann ist es besser möglich mitzudenken, was Du dafür brauchst. Vielleicht gibt es einen Turnaround dafür. Zahlenfelder gehen nur mit Präfix und Einheit. Bindestriche lassen sich nicht eintragen. Jedenfalls soweit ich weiß. Du wirst also mit Textfeldern oder Funktionsfeldern arbeiten müssen, dann ist es Text. Aber Du willst ja auch nicht ISBN Nummern addieren ;-), also damit rechnen. Mirko

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen Dank Der Copytexter. Ja es geht darum die Prüfziffer zu errechnen und daraus die richtige Eingabe zu kontrollieren. Vielen Dank für den Code. Aber ich verstehe den Code noch nicht ganz. Ist myISBN als Variable für meinen Feldnamen zu verstehen?

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ja, ich bin für das Skript davon ausgegangen, dass es ein Textfeld namens ISBN mit selbiger als Inhalt gibt. Das erschien mir am wahrscheinlichsten, denn wie Mirko richtig sagte: Die ISBN generell als Zahl zu speichern, macht im Grunde wenig Sinn, weil man ja keine mathematischen Operationen damit durchführt. In ein Textfeld könnte man bei physisch greifbaren Titeln übrigens außerdem auch den Barcode einlesen.

     

    In der ersten Code-Zeile übernehme ich also den Inhalt des Textfeldes ISBN in die Variable myISBN und entferne dabei ggf. vorhandene Bindestriche. In der zweiten Zeile lese ich das letzte Zeichen mit der Prüfziffer aus, um es später (vorletzte Zeile) mit dem errechneten Wert vergleichen zu können.

     

    Dann erfolgt die eigentliche Berechnung der Prüfziffer. Wie gesagt: Ohne Gewähr, aber mit einer Handvoll getesteter ISBN hat's funktioniert.

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Markus, 

    Du hast zwar schon eine Lösung, hier ist aber noch meine dazu. Du benötigst ein Textfeld „ISBN“ und ein Berechnungsfeld z.B. „Check“. 

    Im Textfeld die Nummer ohne Bindestriche einfügen, oder meinem Code noch die Replacevariante vom Copytexter hinzufügen. Dann im Berechnungsfeld den Code einfügen:

     

    let A := number(sum(for G in range(1, 13, 2) do

    number(item(ISBN, G)) * 3

    end));

    let B := number(sum(for U in range(0, 13, 2) do

    item(ISBN, U)

    end));

    if last(for P in range(0, 3) do

    item(text(A + B), P)

    end) = 0 then

    true

    else

    false

    end

     

    Er nutzt die Formel für die Prüfzifferberechnung, addiert diese hinzu und checkt, ob am Ende eine 0 steht. Dann ist das Ergebnis korrekt. Korrekterweise wird die Prüfziffer bestimmt indem nur die ersten 12 Ziffern verrechnet werden und beim Ergebnis die letzte Ziffer von 10 subtrahiert wird, was die Prüfziffer ergibt. Aber so müsste es reichen für Deine Zwecke und ich hatte Spass beim Knobeln.

    Mirko

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter

    Ich habe Deine Funktion zum laufen gebracht. Aber nur als separate Funktion die dann die Farbe von grün auf rot wechselt und den Wert 0 anzeigt. Es ist mir aber nicht gelungen den Code in das Feld ISBN einzufügen (nach Änderungen folgende Script ausführen). Den Alert habe ich in der Dokumentation gefunden, aber der Code 

    alert("Falsche ISBN Nummer!")

    (unten an deinen Code angefügt führt nun immer zu der Checkbox mit der Fehlermeldung ob nun der Wert richtig oder falsch ist. Ich habe da stundenlang versucht mit allen möglichen Varianten ohne Erfolg. 

    Den Scannercode habe ich auch gefunden. Ebenfalls erfolglos habe ich ihn als Funktion eingefügt. Die Kamera wird nicht gestartet.

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Mirko

    Ich habe deine Funktion zum laufen gebracht, allerdings ist mir nicht gelungen, den den Code von Copytexter voranzustellen:

    number(replace(ISBN, "-", ""))

    Ich habe da verschiedene Varianten ausprobiert und in der Referenz nachgeschlagen. Ich glaube da habe ich grundsätzliches nicht verstanden.

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Euch beiden Copytexter und Mirko vielen herzlichen Dank für Eure Mühe. Aber ich bin glaube bin mit der Programmiersprache noch nicht soweit für solche Codes. In Excel war das vor einigen Jahren eine Sache von einer Stunde und dann hatte ich eine taugliche Formel. Ich werde nach einer Pause mal wieder versuchen.

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Markus, ich meinte so:

    let X := replace(ISBN, "-", "");
    let A := number(sum(for G in range(1, 13, 2) do
    number(item(X, G)) * 3
    end));
    let B := number(sum(for U in range(0, 13, 2) do
    item(X, U)
    end));
    if last(for P in range(0, 3) do
    item(text(A + B), P)
    end) = 0 then
    true
    else
    false
    end

    Im Feld "Check", oder wie Du es auch nennen willst in den Einstellungen unter "Feld nur anzeigen, wenn" trägst Du Check=false ein, damit kommt die Anzeige nur, wenn es eine falsche Nummer ist. Mirko

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Markus, die bisherigen Code-Vorschläge und -Fragmente waren sehr allgemein, weil ja keine genauen Informationen zu deiner Konstellation vorlagen. Der Code-Block, den ich oben gepostet habe, war auch als Vorschlag für ein Funktionsfeld gedacht. Weil das - im Gegensatz zu alert() - so in jeder Konstellation auf jeder Plattform funktionieren sollte. Ein Texfeld mit der ISBN und ein Funktionsfeld ('Prüfziffer') mit oben stehendem Code - mehr ist nicht erforderlich, um das überhaupt erst mal zu testen.

    NX_ISBN-Pruefziffer1

    Wenn man statt des Funktionsfeldes dann bspw. lieber eine Meldung per alert() hätte, dann muss man den Code und die Vorgehensweise halt entsprechend anpassen. Für die Variante mit alert() würde man den Code nicht in einem Funktionsfeld, sondern leicht abgewandelt als Trigger "Nach Änderung" im Textfeld 'ISBN' ausführen. Ändern würden sich (bei meinem Code) aber nur die beiden letzten Zeilen, in der das Ergebnis abgefragt und eine entsprechende Aktion ausgelöst wird:

     

    [...]
    if myChk != myPZ then
        alert("Falsche ISB-Nummer!")
    end

     

    Alles andere, also die eigentliche, mathematische Berechnung der Prüfziffer, bleibt geich. Mirkos Code ist da programmiertechnisch sogar cleverer, effizienter. Dafür etwas schwieriger zu lesen und anzupassen. Aber er, also Mirko, hilft dir sicher auch bei der Anpassung auf ein alert().

     

    Du musst nur konkret danach fragen.

     

    PS: Das Problem mit alert() ist, dass es im Web nicht mit Triggern und Funktionsfeldern funktioniert (nur mit Schaltflächen). Voraussetzung wäre also, dass du mit der Mac-App arbeitest. Dort geht es.

     

    PPS: Das "number(replace(ISBN, ...))" war lediglich ein Beispiel dafür, wie man eine als String vorliegende ISBN in eine Zahl konvertieren könnte. Ohne konkreten Bezug. Für die Berechnung der Prüfziffer brauchst du diese Formel nicht.

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen Dank Mirko und Copytexter. Ich habe mich jetzt für die Lösung von Copytexter entschieden mit dem grün/roten Prüfzifferfeld und vorerst, solange ich die Datenbank lokal betreibe, auch mit der Alert-Funktion. Daraus habe ich dann mal versucht mit Hilfe der NX Sprachreferenz einen Code zu entwickeln der für die alte ISBN10 geht. Da bin ich aber an mindestens zwei Orten gescheitert:

    let myISBN := replace(ISBN10, "-", "");
    let myPZ := number(substr(myISBN, length(myISBN) - 1, 1));
    let xSum := 0;
    let ySum := 0;
    for x from 1 to 9 step 1 do
    let xZiffer := number(substr(myISBN, x, 1));
    xSum := xSum * xZiffer
    end;
    let ySum := xSum / 11;
    let yRound := floor(xSum / 11);
    let yRest := ySum - yRound;
    let myChk := if yRest = 10 then "X" else yRest end;
    let myCol := if myChk = myPZ then "Green" else "Red" end;
    styled(text(myChk), myCol)

    In Zeile 12 geht die "X" nicht. Ich habe da einfach provisorisch die Zahl 100 statt "X" eingegeben um testen zu können. Es hat dann aber immer noch nicht funktioniert:

    In Zeile 5 und 6 bin ich nochmals gescheitert, weil ich offenbar die Funktion zur Ermittlung der Stelle nicht richtig verstanden habe. Kann mir da jemand auf die Sprünge helfen? 

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Mirko, deine Lösung habe ich auch zum laufen gebracht. Aber ich habe die Funktion nicht verstanden. Wie generieren sich die Variablen G, U und P? Ich meine ich habe nirgends eine Definition mit Let G oder so gefunden. Vielen Dank.

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hi, Markus. G, U und P sind die "Laufindexe" der for-Schleifen. Es sind quasi nur "Platzhalter" und frei benennbar. Ich nehme für Variablen (let) und Schleifen (for..range und for...select) gern Großbuchstaben - eine Marotte von mir. Ich kann sie so besser auseinanderhalten und und es ist weniger Code. Es kann auch Probleme bringen, wenn die Benennung dadurch nicht eindeutig ist. Also, es waren zwei Variablen im Spiel A und B und 3 Laufindexe G, U und P. Übrigens benutzt Du in dem oben stehenden Code auch eine for-Schleife und hast sie "x" genannt ist nur anders deklariert als "range". Viel Spass noch mit Deinem Projekt. Mirko

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Markus, bei der ISBN-10 wird die Prüfziffer halt ganz anders berechnet. Im Grunde sogar einfacher, weil alle Ziffern nach demselben Schema verarbeitet werden. Leider hat Ninox keine Rest-Funktion, den muss man selbst berechnen (Zeilen 8 und 9). Weitere Besonderheit ist das mögliche "X" als römische 10. Man vergleicht am Ende also nicht Zahlen, sondern Zeichen (Zeilen 10/11). So sollte es mit der Berechnung klappen:

     

    let myISBN := replace(ISBN10, "-", "");
    let myPZ := substr(myISBN, length(myISBN) - 1, 1);
    let xSum := 0;
    for x from 1 to 10 do
        let xZiffer := number(substr(myISBN, x - 1, 1));
        xSum := xSum + xZiffer * x
    end;
    let myGanzzahl := floor(xSum / 11);
    let myRest := xSum - myGanzzahl * 11;
    let myChk := if myRest = 10 then "X" else text(myRest) end;
    let myCol := if myChk = myPZ then "Green" else "Red" end;
    styled(text(myChk), myCol)

     

    Anmerkungen:
    Den "step"-Wert in der for-Schleife hattest du richtig auf 1 geändert. Da 1 aber der Standardwert ist, kann man ihn auch weglassen.
    Der "from"-Wert in der "for"-Schleife ist inklusive, der "to"-Wert exklusive. "from 1 to 10" zählt also von 1 bis 9.
    Die Zählung der Positionen bei substr() beginnt immer bei 0.

     

    Um den X-Wert auch gleich als Multiplikator für jede Ziffer nutzen zu können, habe ich "from 1 to 10" angegeben und subtrahiere beim substr() immer die 1.

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Nur vollständigkeitshalber: Ninox hat die Rest-Funktion. Heißt modulo und ist hier verstekt https://ninox.com/de/manual/berechnung/berechnungen-und-formeln

    Bildschirmfoto 2020-05-21 um 20.31.02

    Leo

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Aaah, das Prozentzeichen, stimmt - jetzt, wo du's sagst ... *vordiestirnklatsch*

     

    Das hatte ich total vergessen (wie so vieles). Danke für die Erinnerung!

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen Dank für Eure wertvollen Imputs. :-)

    Nun habe ich die beiden Lösungen verheiratet, das heisst ein Feld ISBN (für 10 oder 13 stellig) erstellt und dann die beiden Codes verbunden. Ich habe dazu alle Variablen umgeschrieben, damit sie eindeutig werden, dabei habe ich das Feld ISBN im ersten Teil auf die Variable myISBN13 getauft und dann im zweiten Teil das Feld auf myISBN10 umgetauft. Am Schluss habe ich dann mit einer if then els Abfrage die PZ mit der Berechnung verglichen. Und das funktioniert tatsächlich :-)

    let myISBN13 := replace(ISBN, "-", "");
    let myPZ13 := number(substr(myISBN13, length(myISBN13) - 1, 1));
    let xSum13 := 0;
    let ySum13 := 0;
    for x from 0 to 11 step 2 do
    let xZiffer := number(substr(myISBN13, x, 1));
    xSum13 := xSum13 + xZiffer
    end;
    for y from 1 to 12 step 2 do
    let yZiffer13 := number(substr(myISBN13, y, 1)) * 3;
    ySum13 := ySum13 + yZiffer13
    end;
    let mySum13 := xSum13 + ySum13;
    let myMod13 := ceil(mySum13 / 10) * 10;
    let myChk13 := if myMod13 = 10 then 0 else myMod13 - mySum13 end;
    let myRes13 := if myChk13 = myPZ13 then "true" else "false" end;
    let myISBN10 := replace(ISBN, "-", "");
    let myPZ10 := substr(myISBN10, length(myISBN10) - 1, 1);
    let xSum10 := 0;
    for x from 1 to 10 do
    let xZiffer10 := number(substr(myISBN10, x - 1, 1));
    xSum10 := xSum10 + xZiffer10 * x
    end;
    let myGanzzahl10 := floor(xSum10 / 11);
    let myRest10 := xSum10 - myGanzzahl10 * 11;
    let myChk10 := if myRest10 = 10 then "X" else text(myRest10) end;
    let myRes10 := if myChk10 = myPZ10 then "true" else "false" end;
    let myCol := if myRes10 or myRes13 = "true" then
    "Green"
    else
    "Red"
    end;
    styled(text(myChk10), myCol)

    Ok ein kleiner Schönheitsfehler ist noch geblieben: Das Feld zeigt jetzt nur die PZ von der 10-stelligen ISBN richtig an. Aber das dürfte zu einer früheren Tageszeit leicht sein. Mit ein einer handvoll 10er und 13er Nummer habe ich mal getestet. Ob es dann immer stimmt weiss ich nicht. Auf einen Fehler scheint sie recht stabil zu sein, auf zwei Fehler Ziffer +PZ) jedoch nicht.

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Sorry jetzt habe ich bemerkt, dass ich die falsche Version einkopiert habe:

    Die funktioniert wie oben beschrieben.

    let myISBN13 := replace(ISBN, "-", "");
    let myPZ13 := number(substr(myISBN13, length(myISBN13) - 1, 1));
    let xSum13 := 0;
    let ySum13 := 0;
    for x from 0 to 11 step 2 do
    let xZiffer := number(substr(myISBN13, x, 1));
    xSum13 := xSum13 + xZiffer
    end;
    for y from 1 to 12 step 2 do
    let yZiffer13 := number(substr(myISBN13, y, 1)) * 3;
    ySum13 := ySum13 + yZiffer13
    end;
    let mySum13 := xSum13 + ySum13;
    let myMod13 := ceil(mySum13 / 10) * 10;
    let myChk13 := if myMod13 = 10 then 0 else myMod13 - mySum13 end;
    let myRes13 := if myChk13 = myPZ13 then 1 else 0 end;
    let myISBN10 := replace(ISBN, "-", "");
    let myPZ10 := substr(myISBN10, length(myISBN10) - 1, 1);
    let xSum10 := 0;
    for x from 1 to 10 do
    let xZiffer10 := number(substr(myISBN10, x - 1, 1));
    xSum10 := xSum10 + xZiffer10 * x
    end;
    let myGanzzahl10 := floor(xSum10 / 11);
    let myRest10 := xSum10 - myGanzzahl10 * 11;
    let myChk10 := if myRest10 = 10 then "X" else text(myRest10) end;
    let myRes10 := if myChk10 = myPZ10 then 1 else 0 end;
    let myCol := if myRes10 or myRes13 = 1 then
    "Green"
    else
    "Red"
    end;
    styled(text(myChk10), myCol)

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Respekt, dass du versuchst, das Skript selbst anzupassen. Nur so lernt man's ja ... ;)

     

    Ich interpretiere den Code so, dass du nur ein Feld für die ISBN hast und dort, wie's gerade kommt, entweder die 10- oder die 13-stellige einträgst. Ist das richtig? Wenn ja, würde ich etwas anders vorgehen: Zuerst anhand der Länge ermitteln, um welchen ISBN-Typ es sich handelt und dann die entsprechende Berechnung ausführen:

     

    if ISBN then
        let myISBN := replace(ISBN, "-", "");
        let myPZ := number(substr(myISBN, length(myISBN) - 1, 1));
        if length(myISBN) = 10 then
            "********************************************************";
            " BERECHNUNG ISBN 10 ";
            "********************************************************";
            let xSum := 0;
            for x from 1 to 10 do
                let xZiffer := number(substr(myISBN, x - 1, 1));
                xSum := xSum + xZiffer * x
            end;
            let myGanzzahl := floor(xSum / 11);
            let myRest := xSum - myGanzzahl * 11;
            let myChk := if myRest = 10 then "X" else text(myRest) end;
            let myCol := if myChk = myPZ then "Green" else "Red" end;
            styled(text(myChk), myCol)
        else
            "********************************************************";
            " BERECHNUNG ISBN 13 ";
            "********************************************************";
            let xSum := 0;
            let ySum := 0;
            for x from 0 to 11 step 2 do
                let xZiffer := number(substr(myISBN, x, 1));
                xSum := xSum + xZiffer
            end;
            for y from 1 to 12 step 2 do
                let yZiffer := number(substr(myISBN, y, 1)) * 3;
                ySum := ySum + yZiffer
            end;
            let mySum := xSum + ySum;
            let myMod := ceil(mySum / 10) * 10;
            let myChk := if myMod = 10 then 0 else myMod - mySum end;
            let myCol := if myChk = myPZ then "Green" else "Red" end;
            styled(text(myChk), myCol)
        end
    end

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    hi Markus, hi Copytexter. Ein tolles Projekt von Euch, woraus ich viel gelernt habe. Sehr cool und danke. Es wäre auch gut geeignet in den Praxisbeispielen der Ninox-Referenz zu stehen. Nur mal so gesagt. Danke Leo für den Hinweis auf die Moduloberechnung. Das habe ich wohl überlesen. Mirko

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Mirko, dein Code zu Berechnung der Prüfziffer ist programmiertechnisch wie gesagt sogar besser, kompakter als meiner. Ehre, wem Ehre gebührt. Ich bin in den weiteren Erläuterungen nur bei meinem Code geblieben, weil er für den Einstieg wahrscheinlich etwas besser lesbar ist und ich nichts durcheinanderbringen wollte.

     

    Was die Referenz betrifft: Zufälligerweise wurde gerade vor zehn Minuten eine neue Version der Referenz-DB ins Webinar-Team eingestellt. Sie wurde von Uwe G. um die Möglichkeit ergänzt, die Beschreibungstexte in verschiedenen Sprachen abzulegen und heißt jetzt "0001_Reference_ML". Inhaltlich hat sich sonst nichts geändert. Diese ISBN-Geschichte ist ja schon recht speziell, aber du kannst sie gerne bei den Praxisbeispielen eintragen. So, wie du es für richtig hältst.

     

    Und wer Lust hat, darf sich natürlich auch gerne an den Übersetzungen beteiligen. ;)

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter, ja mir liegt am eigenen Lernen sehr viel. Danke für deine Verbesserung. Das sieht nun schon sehr viel aufgerühmter aus und löst auch das Problem mit den PZ. Ich habe bei Testen noch herausgefunden, dass die ISBN10 Nummern mit X am Schluss zwar richtig ausgegeben werden aber die falsche Farbe ergeben. Darum habe ich die drittletzte Zeile mit einem or X ergänzt.

    let myCol := if myChk = myPZ or "X" then "Green" else "Red" end;

     

    Beste Grüsse Markus

    • mirko3
    • vor 4 Jahren
    • Gemeldet - anzeigen

    @Markus: leider rechnet dein Code die 13stelligen ISBN nicht korrekt, es gab einige Fehler bei meinen Proben. Falls du ihn, so wie hier veröffentlicht in Benutzung hast, dann wäre eine Korrektur nötig.

    @Copytexter: funktioniert perfekt bis auf rotes „X“, was ja Markus schon geschrieben hat.

    Vielleicht ist ja auch schon alles korrigiert und funktioniert prächtig, trotzdem hier noch meine Version und nur der Vollständigkeit halber, die auf der Plausibilitätsrechnung der ISBN (50 Fälle) beruht, also alle 10 oder 13 stelligen ISBN einbezieht und deren Ergebnis „0“ ergeben muß. Das macht es möglich, dass man das Feld verstecken kann und nur dann angezeigt bekommt, wenn das Ergebnis !=0 ist. Tricky war die Einbindung der 10er Ziffern mit X, deshalb die verschachtelten „if“. Danke an Copytexter für replace und length und an Leo für modulo und Markus für die Aufgabe. Ich wollte es nur abschliessen für den unwahrscheinlichen Fall, dass jemand noch mal ISBN-Nummer checken will ;-)

    Mirko

    Feld 1: Textfeld: "ISBN"

    Feld 2: Funktionsfeld "Check", Beschriftungsposition: versteckt, Feld nur anzeigen, wenn: Check = "❗", Stil Textbox: fett, groß

    Check_false

    let X := replace(ISBN, "-", "");
    let Z := for Q in range(0, 10) do
    item(X, Q)
    end;
    if if length(X) = 10 then
    if last(Z) = "X" then
    (sum(for U in range(0, 9) do
    number(item(X, U)) * (U + 1)
    end) + 100) % 11
    else
    sum(for U in range(0, 10) do
    number(item(X, U)) * (U + 1)
    end) % 11
    end
    else
    let A := number(sum(for G in range(1, 13, 2) do
    number(item(X, G)) * 3
    end));
    let B := number(sum(for U in range(0, 13, 2) do
    item(X, U)
    end));
    (A + B) % 10
    end != 0 then
    "❗"
    end

    Und hier noch für die, die ISBN frühstücken, die Berechnung der Prüfziffer.

    let X := replace(ISBN, "-", "");
    let Y := if length(X) = 10 then
    sum(for U in range(0, 9) do
    number(item(ISBN, U)) * (U + 1)
    end) % 11
    else
    let A := number(sum(for G in range(1, 12, 2) do
    number(item(X, G)) * 3
    end));
    let B := number(sum(for U in range(0, 12, 2) do
    item(X, U)
    end));
    (10 - (A + B) % 10) % 10
    end;
    if Y = 10 then "X" else text(Y) end

    • Markus_Gehrig
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen Dank, Mirko, für deinen wertvollen Hinweis. Beste Grüsse Markus