Jump to content

Abbruchbedingung über Zähler


---
 Share

Recommended Posts

Hallo, jetzt habe ich noch ein weiteres Problem, habe schon etliche Versuche hinter mir, aber bekomme es nicht hin. Ich vermute es ist ganz einfach. Habe folgenden Code programmiert. Funktioniert soweit. Jetzt hätte ich aber noch gerne eine zusätzliche Abbruchbedingung mit eingebaut. Ich hatte mir vorgestellt ein zweites "repeat... until" mit einzubauen und hier hochzuzählen bis auf 3 Durchläufe. Aus irgendwelchen Gründen funktioniert es aber nicht.
//Teilenummer muss dreistellig eingeben werde
repeat
Teilenummer=getRecordHead("partnbinc")    //Abfrage Teilenummer aus Protokollkopf
IstAnzahlDerZeichen = len(Teilenummer)		//Abfrage Länge der Teilenummer
SollAnzahlDerZeichen = 3							//Soll Länge der Teilenummer
if IstAnzahlDerZeichen >= SollAnzahlDerZeichen then 
message("Richtig")
else
message("Falsch")
setRecordHead("partnbinc",inquireText("Teilenummer muss dreistellig eingegeben werden, bitte richtig eingeben!"))  //Aufforderung zum schreiben der Teilenummer falls diese nicht dreistellig eingegeben wurde
endif
until len(Teilenummer) >= SollAnzahlDerZeichen
Hatte mir das so in dieser Art vorgestellt:

//Teilenummer muss dreistellig eingeben werde
repeat
Teilenummer=getRecordHead("partnbinc")    //Abfrage Teilenummer aus Protokollkopf
IstAnzahlDerZeichen = len(Teilenummer)		//Abfrage Länge der Teilenummer
SollAnzahlDerZeichen = 3							//Soll Länge der Teilenummer
if IstAnzahlDerZeichen >= SollAnzahlDerZeichen then 
message("Richtig")
i=0
else
repeat
i=i+1
message("Falsch")
setRecordHead("partnbinc",inquireText("Teilenummer muss dreistellig eingegeben werden, bitte richtig eingeben!"))  //Aufforderung zum schreiben der Teilenummer falls diese nicht dreistellig eingegeben wurde
until i==3
endif
until len(Teilenummer) >= SollAnzahlDerZeichen


Er zählt zwar hoch aber Beendet das ganze dann nicht. Ich vermute dass ein Logikfehler meinerseits dahinter steckt an welcher Stelle das ganze eingefügt werden muss. Wäre super wenn ich hier einen Tip erhalten könnte.
Link to comment
Share on other sites

Mich verwirrt bereits das ">=" in der IF-Abfrage. Müsste das nicht "<=" heißen? Die eingegebene Nummer soll ja (maximal?) dreistellig sein, wenn ich den Code richtig verstehe.

Das i=0 muss außerhalb der IF-Bedingung stehen (davor), sonst wird es nur ausgeführt, wenn der Teil vor dem else zutrifft. Das tut er aber ja gerade dann nicht, wenn der Zähler gebraucht wird (nämlich nach dem else). Also wird i eigentlich immer nur dann zu Null gesetzt, wenn es gar nicht benutzt wird (da dann else nicht zutrifft).

--> i=0 unmittelbar vor die IF-Anweisung verschieben

P.S.: Nur aus Interesse: Warum willst du dem Benutzer die "Falsch"-Meldung + Eingabeaufforderung per Zähler dreimal hintereinander um die Ohren hauen? Kriegt er das beim ersten Mal nicht hin? 🤣 (Scherz!)
Link to comment
Share on other sites

Hallo,

meiner Meinung nach funktioniert die 2. Variante nicht, da der Parameter i erst in der if Bedingung mit 0 belegt wird, das heißt wenn die Teilenummer beim ersten Durchlauf nicht die richtige Länge hat dann ist i = 9999 + 1 und kann dann somit nicht mehr 3 werden!
das i = 0 würde ich sogar vor dem ersten repeat einfügen ansonsten wird das dann ja immer wieder auf 0 zurückgesetzt.

Du kannst das Ganze auch noch vereinfachen wenn Du nur eine repeat Schleife verwendest und zum Schluss beide Bedingungen mit der "or" Funktion abfragst.

in etwa so:
//Teilenummer muss dreistellig eingeben werde
i=0
repeat
Teilenummer=getRecordHead("partnbinc")    //Abfrage Teilenummer aus Protokollkopf
IstAnzahlDerZeichen = len(Teilenummer)		//Abfrage Länge der Teilenummer
SollAnzahlDerZeichen = 3							//Soll Länge der Teilenummer

if IstAnzahlDerZeichen >= SollAnzahlDerZeichen then 
	message("Richtig")
else
	i=i+1
	message("Falsch")
	setRecordHead("partnbinc",inquireText("Teilenummer muss dreistellig eingegeben werden, bitte richtig eingeben!"))  //Aufforderung zum schreiben der Teilenummer falls diese nicht dreistellig eingegeben wurde
endif
until (len(Teilenummer) >= SollAnzahlDerZeichen) or (i == 3)
PS: Eine kleine Info, das der von dir gepostete PCM Code in eine Endlosschleife führt, wäre nett gewesen. 🤣

MfG Florian
Link to comment
Share on other sites

Hallo zusammen,

vielen dank vorab für die Unterstützung.
Ich hatte schon vermutet dass es "nur" mit der Position zu tun haben kann, bin aber selbst auf dem Schlauch gestanden.

Ich schreibe >= weil ich will dass die Nummer mindestens dreistellig ist. Falls doch mal ein Auftrag über 999 geht soll dass kein Hindernis sein.
Man glaubt nicht was in der Fertigung alles möglich ist, bisher haben sie es auf einfache Anweisung die Teilenummer doch bitte dreistellig einzugeben nicht hinbekommen, deshalb will ich das jetzt gleich "Idiotensicher" machen. 🤣

Mit der "or" Funktion hatte ich es auch versucht aber führte immer zu einer Fehlermeldung. Vermutlich lag es an der fehlenden Klammer. Werde ich gleich testen, und sorry für die Endlosschleife. 🤣

Gibt es eigentlich eine andere Möglichkeit aus so einer Endlosschleife wieder rauszukommen außer den harten Weg?
Link to comment
Share on other sites

Was für eine Fehlermeldung war das denn?

Ich muss nochmal auf meine Scherzfrage von oben zurückkommen: Die Variante von Florian ergibt für mich nicht nur wegen der anders plazierten Anweisung i=0 mehr Sinn, sondern auch, weil die Bedingung für die Wiederholung der "Falsch"-Meldung dort logischer ist. In deinem ersten (bzw. zweiten) Beispiel ganz oben würde nämlich diese Meldung ohne weitere Prüfung so oft wiederholt, bis der Zählerstand erreicht ist, und zwar auch dann, wenn die Nummer richtig eingegeben wurde. Ich glaube nicht, daß du das so beabsichtigt hast. Deswegen die Frage von mir 😉

Also falls nach wie vor ein Fehler kommt, poste einfach mal den Text. Das kann eigentlich nichts weltbewegendes sein.
Link to comment
Share on other sites

 Share

×
×
  • Create New...