Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: jens1979 am 11.01.04 - 20:32:16
-
Hallo mal wieder,
wünsche erstmal allen ein gesundes neues Jahr.
Mein Problem diesmal ist das ich eine Eingabe mittels einer Prüfziffernberechnung auf Tippfehler testen muss. Hierzu ist es notwendig das ich diese Eingabe (ist eine Zahl) in Ihre einzelnen stelle zwerlege, und zwar von hinten nach vorn.
D.h. wenn die Eingabe bespielsweise 522368 ist muss ich diese in 6 einzelvariablen zerlegen. Also Variable1=8, 2=6, 3=3, 4=2, 5=2 und Variable6=5.
Das zweite Problem hieran ist das die eingegeben Zahlen nicht immer gleichlang sind. Die Eingabe kann 2 bis 10 stellig sein.
Falls jemand eine Idee hat wie ich die Zahl auseinanderpflücken kann wäre ich für Tipps sehr dankbar, am liebsten wäre es mir wenn das irgendwie in der Formelsprache möglich ist weil ich dann da mit der Berechnung der Prüfziffer keine Probleme mehr hätte.
Danke schonmal im Vorraus
Jens
-
Mit @Length kannst Du schon mal eine Fallunterscheidung (@If....) machen.
Eine Möglichkeit wäre es, mit @Left und @Right zu arbeiten, bringt Dich wohl zum Ziel, wenn auch nicht sehr elegant.
Beispiel, wenn Du die 3. Ziffer von Rechts haben willst:
_DritteStelleVonHinten := @Left(@Right( DEINFELD; 3); 1)
Das wird zwar dann eine lange Formel (Unterscheidungen mit @If(@Length....) und dann noch einzelne Variablen belegen, aber so geht das mit Sicherheit.
hth,
Matthias
-
sowas in der Art hatte ich schon probiert mit @middle, hatte irgendwie net so funktioniert wie ich wollte aber ich teste das gleich nochmal aus.
Danke erstmal
Jens
-
Ach ja, und schau Dir mal die Bedingungen in der Designerhilfe an.
Evtl. musst Du den Feldwert (der wohl eine Zahl ist) mit @Text in Text umwandeln, das Ergebnis dann wieder mit @TextToNumber zurückwandeln.....
-
Anscheinend mach ich irgendwas falsch.
Wenn ich ne Variablen Definition innerhalb des @If mache bekomme ich die Fehlermeldung " := darf nur am Anfang eines Ausdrucks stehen: ':=' ".
Was könnt ich falsch machen?
Habs jetzt einfach mal mit
laenge := @Lenght(pruefziffer);
@If(laenge=10; _pz := @left(@right(pruefziffer;1);1););
probiert.
Jens
-
Zuweisungen innerhalb des @if geht erst in ND6
_pz:=@If(laenge=10;@left(@right(pruefziffer;1);1))
-
das mit ND6 hatte ich irgendwie befürchtet. gibts noch ne andere möglichkeit?
-
Eh, ich hab Dir doch hingeschrieben, wie man das macht, da musst Du vielleicht die Werte noch ein wenig ändern.
-
Tschuldigung ... für die Frage hatte Semeaphoros Antwort net richtig gelesen .... sorry ... wer des lesen mächtig ist und dies auch tut ist klar im vorteil. :-\
-
am liebsten wäre es mir wenn das irgendwie in der Formelsprache möglich ist weil ich dann da mit der Berechnung der Prüfziffer keine Probleme mehr hätte.
wo sit denn das Problem, wenn du das nicht mit Formel machst, sondern mit Script?
Ich glaube, dass bei diesem Problem Formelsprache denkbar ungeeignet ist (zumidest in R5)
-
und jetzt hab ich wieder was gelernt, nämlich dass Zuweisungen ( also ":=" ) innerhalb @If's in R6 geht, cool 8)
-
Ja, Thomas, das denke ich auch, in ND6 könnte man noch was machen mit Schlaifen in Formeln, aber in R5 ist das doch wesentlich einfacher in Script.
-
Mein Hauptproblem ist das ich grad vor 1-2 Monaten angefangen habe mir ein bissel Script reinzuprügeln.
Im Klartext heist das wenn ich es in Script mache muss ich euch wieder auf die Nerven gehen und davor wollt ich euch verschonen ;D
-
jip.
Wird sonst ein kilometerlange Formel.
@If(
@Length(FELD) = 10;
@Do(
.......
.......
.......
.......
.......
.......
.......)
qLength(FELD) = 9;
@Do(.......
.......
.......
.......
.......)
usw.
-
Wenn mir allerdings jemand sagen kann wie ich die Zahl im scrip auseinandergeplügt bekomme kann ich natürlich auch das probieren ... da lern ich wenigsten wieder was bei ... also was was script betrift.
Jens
P.S. Erstmal danke für die rege Beteiligung
-
Mein Hauptproblem ist das ich grad vor 1-2 Monaten angefangen habe mir ein bissel Script reinzuprügeln.
Im Klartext heist das wenn ich es in Script mache muss ich euch wieder auf die Nerven gehen und davor wollt ich euch verschonen ;D
das ist eigentlich keine große Sache.
du schreibst erst mal in "Prosaform", was du tun möchtest (den Agorithmus) und dann übersetzt du es in Script und die Forenbesucher helfen dir bei der Übersetzung.
-
Okay dann mach ich das mal. Hier also die 'Prosaform' :)
Meine Zahl ist eine Kontonummer. Diese kann von 2 bis 10 Stellen lang sein. Hierbei ist immer die letzte Stelle die Prüfziffer. Die 6 Ziffern davor werden zur Berchnung benötigt, wenn die Kontonummer kürzer als 7 Zeichen (also die Prüfziffer plus die 6 Berechnungsziffern) ist brauche ich nur die Stellen die vorhanden sind zur Berechnung.
Okay nun zur Berechnung: Wie gesagt die letzte Stelle ist die Prüfziffer, die brauche ich also erst ganz am Schluss die 2. Stelle von hinten wird mit 2 multipliziert, die 3. von hinten mit 3, die 4. mit 4, die 5. mit 5, die 6. mit 6 und die 7. von hinten mit 7. Jedes dieser Produkte wird nun addiert.
Das Ergebniss der Adition wird durch 11 (bei dieser Prüfziffernkontrolle immer durch 11 weil der Modulus auf 11 liegt) geteilt. Hierbei ist aber das Ergebniss der Division unwichtig sondern der Rest, d.h. ich muss eine Division mit Rest machen (in der Formelsprache @modulo, glaub ich).
Im letzten Schritt wird der Rest von 11 (Modulus ---> also auch wieder immer 11) subtrahiert. Das Ergebniss ist die Prüfziffer, dieses muss also mit der letzten Stelle der Kontonummer übereinstimmen.
Ein Beispiel:
KD.-Nr.: 1 5 8 4 2 1 9
Gewichtung: 7 6 5 4 3 2 P ---> P=Prüfziffer
-------------------------------------------
Produkt: 7 30 40 16 6 2
Die Summe des Produktes ist 101
101:11 = 9 Rest 2
Prüfziffer = 11-2 (Also Modulus geteilt durch den Rest)
Prüfziffer = 9
Sollte einmal Rest 0 bei einer Berechnung auftauchen so ist die Prüfziffer automatisch auch 0 genauso wie bei Rest 1.
Ich hoffe ich hab das jetzt ganz gut erklärt. Ich würde ja vieleicht sogar die Rechnung allein hinbekommen (außer wahrscheinlisch die Division mit Rest) aber für den Ansatz fehlt mir jegliche Idee.
Danke schonmal
Jens
-
also die Problembeschreibung ist fast schon sensationell.
Damit kann man was anfangen.
Ich bin leider nicht mehr ganz so wach und versuch morgen wieder zu helfen, vielleicht gibts noch fittere Menschen hier, die den Anfang machen
(übrigens ist das jetzt keine schwache Ausrede, ich bin echt am Ende)
-
@Thomas
hey kein Grund das du dich da irgendwie entschuldigst oder so. Die Hilfe hier ist wahnsinn. Und wenn ich noch drei Tage brauch bis ich es irgendwie mit eurer Hilfe hinbekomme ist das immer noch ungefähr 2 Wochen kürzer als das ich es selber hinbiege.
Danke erstmal und Gute Nacht
-
So ich hab jetzt noch mal ein bissel mit @Formula geschrieben ... bis auf das auseinandernehmen der Zahl klappt alles (hab jetzt einfach 10 Felder gemacht und geb die Zahl schon getrennt ein). Aber vieleicht hilft ja die @Formula beim umsetzen in LS.
Jens
-
Hier eine Lösung in LotusScript - die Formel musst Du ggf. an den Kontext anpassen (diese Formel ist bspw. für einen Button):
Das Ergebnis steht in der Variablen "pruefziffer". Der Wert zur Berechnung wird aus dem Feld "KontoNr" geholt. Das muss ein Textfeld sein.
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim kontonr As String
Dim laenge As Integer
Dim zahl As Integer
Dim i As Integer
Dim summe As Integer
Dim modulo_erg As Integer
Dim pruefziffer As Integer
Set ws = New NotesUIWorkspace
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
kontonr = Cstr( doc.KontoNr(0) )
laenge = Len( kontonr )
summe = 0
For i = 2 To laenge
zahl = Cint( Mid( kontonr, laenge - i + 1, 1 ) )
summe = summe + zahl * i
Next
modulo_erg = summe Mod 11
If modulo_erg <= 1 Then
pruefziffer = 0
Else
pruefziffer = 11 - modulo_erg
End If
Andreas
-
ah, sehr schön.
nur die Anforderung
Hierbei ist immer die letzte Stelle die Prüfziffer. Die 6 Ziffern davor werden zur Berchnung benötigt, wenn die Kontonummer kürzer als 7 Zeichen (also die Prüfziffer plus die 6 Berechnungsziffern) ist brauche ich nur die Stellen die vorhanden sind zur Berechnung.
ist noch nicht mit eingebaut
Wenn ich das richtig sehe, dann könntest du prüfen, wie lang die Nummer ist und wenn sie > 7 ist, dann einfach die überflüssigen Zahlen abschneiden
ungefähr so
...
kontonr = Cstr( doc.KontoNr(0) )
If Len(kontonr) > 7 then
kontonr = right(kontonr, 7)
End if
laenge = Len( kontonr )
...
-
@Thomas:
Meine Formel geht auch für kürzere Kontonummern. Deine Formel geht von mehr als 7 Stellen aus.
Andreas
-
ich habe das so verstanden, dass die Zahl 2-10 stellig sein kann.
Aber nur die letzten 7 Stellen werden zur Berechnung benötigt, wenn die Zahl kleiner als 7 Stellen ist, dann werden alle Stellen zur Berechnung verwendet.
Deswegen dachte ich, dass man eine Zahl, die größer ist als 7 Stellen, kürzen muss, denn sonst würden mit deinem Algorithmus mehr als 7 Stellen zur Berechnung verwendet, was evtl ein falsches Ergebnis liefern könnte.
-
Ich habe es mir nochmal genau durchgelesen - es kann in der Tat sein, dass nur die letzten 7 Zahlen herangezogen werden sollen. Dann muss Dein Code noch verwendet werden:
Dim ws As NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim kontonr As String
Dim laenge As Integer
Dim zahl As Integer
Dim i As Integer
Dim summe As Integer
Dim modulo_erg As Integer
Dim pruefziffer As Integer
Set ws = New NotesUIWorkspace
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
kontonr = Cstr( doc.KontoNr(0) )
If Len(kontonr) > 7 then
kontonr = Right$(kontonr, 7)
End if
laenge = Len( kontonr )
summe = 0
For i = 2 To laenge
zahl = Cint( Mid( kontonr, laenge - i + 1, 1 ) )
summe = summe + zahl * i
Next
modulo_erg = summe Mod 11
If modulo_erg <= 1 Then
pruefziffer = 0
Else
pruefziffer = 11 - modulo_erg
End If
Andreas
Die ersten 3 Stellen sind dann wohl die Filialbezeichnung oder so was in der Art.
-
Hallo erstmal wieder.
Mit der Filialbezeichnung haben die stellen nix zu tun. Es ist einfach in Deutschland so das Kontonummern mind. 2 und max. 10 Stellen haben dürfen (Vorgabe von der LZB). Für jedes Bankeninstitut gibt es eine eigene Prüfziffernberechnung. Bei manchen Banken werden hierbei mind. 2 und max. 9 Stellen berechnet, bei anderen max. 5 und in diesem Fall eben max. 6 Stellen, wobei die letzte immer die Prüfziffer ist.
Hier noch ein anderes Bsp. die KTO 2020 z.B. Hierbei handelt es sich um eine 0 als Prüfziffer und nur 3 Stellen zur Berechnung.
D.h. 2 0 2 0
4 3 2 P
-----------
8+0+4=12
12:11=1 Rest 1
11-Rest1=10
10 = Prüfziffer 0
Ich hoffe das ich das damit nochmal ganz gut beschreiben konnte.
Ich Dank euch auf jeden Fall erstmal für die Mühe die Ihr euch macht und werd nachher gleich mal probieren obs so klappt.
CYA Jens
-
Die Formel sollte dann das richtige tun.
Andreas
-
Hab die Formel grad mal probiert und ein bissel abgewandelt (auf meine Feldnamen und so) und muss sagen ... SUPER, funktioniert 100%ig. Und das beste ist ich glaube sogar verstanden zu haben was passiert.
Werd mir jetzt nochmal in aller Ruhe den Code zu Gemüte führen und ggf. nochmal nachfragen wenn ich irgendeinen Zusammenhang nicht verstehe.
Danke erstmal.
Jens