Brian Dunning's FileMaker Custom Functions

Modulo10recursive ( SeedNumber )

Calculates the Checksum for Swiss ESR/BESR

  Average rating: 4.3 (39 votes) Log in to vote

Daniel Wilhelm   Daniel Wilhelm
Datasol Wilhelm
http://www.datasol.ch

Share on Facebook Share on Twitter

  Sample input:
010000559800
  Sample output:
8

  Function definition: (Copy & paste into FileMaker's Edit Custom Function window)

Returns the Modulo10recursive checksum of a number as used for the swiss ESR / BESR

 

Comments

Christoph Kaufmann   Christoph Kaufmann, CLK.ch
Mar 11, 2009
Sehr sorgfältig ausgearbeitet, und das Problem, an dem ich gescheitert bin, ist genial gelöst: wie kriegt man die Formel dazu, beim ersten Durchgang etwas anders zu machen als bei allen späteren?

Mit zwei Let-Funktion, verbunden mit &, wobei die erste immer "", also nichts als Resultat bringt, aber für die zweite Variablen definiert:

Let([
$Startlength = Length ( SeedNumber ) ;
$Restlength = Length ( $Rest) ] ;"")

wobei $rest an dieser Stelle noch gar nicht existiert, so dass Length($rest) zwangsläufig 0 gibt. Bei jedem rekursiven Aufruf wird hingegen $rest zum neuen Parameter, also der "Seednumber", so dass die Frage zu Beginn der zweiten, "echten" Let-Function

If(
$Startlength > $Restlength ;

Beim ersten Aufruf immer richtig, bei allen späteren immer falsch wird.
 
Jacques Menu   Jacques Menu, Crissier
Aug 8, 2011
Hello,

I'm new to FM plug-in development.

I guess the above sample is not written in FM's own scripting language.

Is that so?

Thanks for you help!

Regards,
 
Tim Griffith   Tim Griffith
Mar 9, 2013
The variables are German Language words, but the structure is Filemaker. I believe 'nächstezeile' is equivalent to 'row' (as in an array)
 
Daniel Wilhelm   Daniel Wilhelm, Datasol Wilhelm
Mar 10, 2013
Hi Tim

Yes, you are right.

Zeile X = Row X
nächstezeile = nextrow
rest = what is left over for the next calculation

Greetings

Dani
 
Christoph L. Kaufmann   Christoph L. Kaufmann, Zollikofen, Switzerland
Apr 25, 2013
Same thing without $-variables. Needs two more parameters, though.
Sample Modulo10 ("30115642" ; 1 ; 0 ) = 8
/*
Name der Funktion:
Modulo10
Parameter:
Ziffern - die Ziffernfolge, zu der die Püfziffer ermittelt werden soll
Start1 - beim Aufruf 1 eingeben (Position der aktuell untersuchten Ziffer)
Start0 - bei Start 0 eingeben (Uebertragungswert für den aktuellen Durchlauf)

Abwandlung der CF Modulo10Rekursiv von Datasol Wilhelm vom 15. Mai 2007 (herzlichen Dank)
hier ohne $-Variablen, weil Armin Eggingers CrossCheck die immer anmeckert.
*/

Let ( [

ziffern = Filter ( Ziffern ; "1234567890" ) ;
pos = Start1 ;
ueber = Start0 ;

menge = Length ( ziffern ) ;

z0 = "09468271350" ; // erste Zahl für Reihe 0, 10. Zahl für Reihe 9, letzte Zahl ist Prüfziffer
z1 = "94682713509" ;
z2 = "46827135098" ;
z3 = "68271350947" ;
z4 = "82713509466" ;
z5 = "27135094685" ;
z6 = "71350946824" ;
z7 = "13509468273" ;
z8 = "35094682712" ;
z9 = "50946827131" ;

reihe = Case (
ueber = 0 ; z0 ;
ueber = 1 ; z1 ;
ueber = 2 ; z2 ;
ueber = 3 ; z3 ;
ueber = 4 ; z4 ;
ueber = 5 ; z5 ;
ueber = 6 ; z6 ;
ueber = 7 ; z7 ;
ueber = 8 ; z8 ;
ueber = 9 ; z9 ;
"" ) ;

spalte = If ( pos ≤ menge ; Middle ( ziffern; pos ; 1 ) ; 10 ) ; // bis zur letzten Position die entsprechende Spalte nehmen, danach die Prüfziffer, die steckt in der 11.
 
Christoph L. Kaufmann   Christoph L. Kaufmann, Zollikofen, Switzerland
Apr 25, 2013
Modulo10 continued (sorry, had Java Script disabled, message got truncated):

// bis zur letzten Position die entsprechende Spalte nehmen, danach die Prüfziffer, die steckt in der 11. Spalte (wir nehmen die 10, wir unten mit "spalte+1" rechnen).

uebertrag = Middle ( reihe ; spalte + 1 ; 1 )

] ;

If ( pos ≤ menge ; // bis zur letzten Position

Modulo10 ( ziffern ; pos + 1 ; uebertrag ) ; // mit der ermittelten Uebertragungsziffer weiterfahren
 
// sonst haben wir die Prüfziffer erhalten

uebertrag
)
)
 
Wolfgang   Wolfgang, Bern
Jul 13, 2016
Hallo Christoph

Ich habe versucht das ganze in eine eigene Funktion zu wandeln mit FM15 bin aber an zwei Dingen gescheitert.

1. ziffern = Filter ( Ziffern ; "1234567890" ) ; -> kommt die Rückmeldung falscher Parameter, muss ich Ziffern in "Ziffern" setzen damit es stimmt?
2. Modulo10 ( ziffern ; pos + 1 ; uebertrag ) -> Kommt immer beim Semikolon dass es zuviele Parameter geben soll.

Kannst du mir hier bitte weiterhelfen, wäre mega cool.
 

Log in to post comments.

 

Note: these functions are not guaranteed or supported by BrianDunning.com. Please contact the individual developer with any questions or problems.

Under construction. Email me your wish list for improvements.