jetzt möchte ich den Schwierigskeitgrad steigern, weil ich Auftragsnummern vergebe und möchte, das die jeden Tag bei eins beginnt. Das Auftragsdatum kommt dann davor, Papyrus soll dann prüfen, ob das aktuelle Datum dem Beginn der Auftragsnummer entspricht, wenn nicht, dann soll es das aktuelle Datum + Auftragsnummer eintragen. Der erste Auftrag soll am 8.10.2007 also z.B. die Nummer 07100801 erhalten (YYMMDDXX)alternativ den Tag des Jahres (Day of Year)
Meine (nicht funktionierende) Formel (die Variable heisst aktAuftragsNr) dazu lautet:
IF LEFT(aktAuftragNr,6)=RIGHT(YEAR(CURDATE), 2) + STR(DAYOFYEAR(CURDATE)) THEN
LET aktAuftragsNr=aktAuftragsNr + 1 RETURN aktAuftragsNr
ELSE
LET aktAuftragsNr=RIGHT(YEAR(AuftragVom), 2) + STR(DAYOFYEAR(AuftragVom)) + 01 RETURN aktAuftragsNr
Klappt so nicht, ist mein Ansatz völlig falsch, geht das sowieso nicht hab ich mich verschrieben oder was kann sonst helfen? Wäre auch für ein machtvolles, fundiertes “Kannste vergessen” dankbar!
Lege dort die Variable “aktAuftragsNr” vom Typ “Ganze Zahl” an.
Trage im Feld “Wert” sagen wir “100” für den Zähler der aatum-codierten Auftragsnummer ein.
Lege dort eine Variable “Tag” vom Typ “Datum” an.
Trage im Feld “Wert” sagen wir “07” für den 7. Tag im Oktober des Jahres 2008 ein.
Die Formel gibst Du unter Feldeigenschaften - Lasche “Rechenfeld” ein.
IF SUBSTRING(SYSDATE, 1, 2) != Tag THEN LET Tag = SUBSTRING(SYSDATE, 1, 2) LET aktAuftragsNr = 101 ELSE LET aktAuftragsNr = aktAuftragsNr + 1 ENDIF RETURN RIGHT(SYSDATE, 10) + ‘/’ + STR(aktAuftragsNr)
Du erhälst eine fortlaufende Zahl innerhalb eines Tages nach dem Muster: TT.MM.JJJJ/xxx
Tipp:
Spiele unbedingt noch etwas mit der Systemsteuerung und prüfe, ob der Tag (die Variable) in den Eigenschaften korrekt aktualisiert wird, was sie eigentlich müsste.
Auch Danke für die schnelle Hilfe, das dauert jetzt bis Samstag, bis ichs ausprobieren kann, aber beim groben überlesen hab ich das Gefühl, das könnte klappen, melde mich dann, wenn ich mehr weiss! Eine Frage noch zum “spielen mit der Systemsteuerung”: Soll ich das Systemdatum zum prüfen ändern, oder ist damit was anderes gemeint?
Sagen wir mal, ich habe 10 Aufträge erzeugt, und habe Mittagspause. Wenn ich Papyrus nun beende und am selben Tag wieder starte, beginnt Papyrus wieder bei 1!
Das wundert mich umso mehr, da das bei der Rechnungsnummer ja auch nicht passiert. Kann man da an der Formel noch schrauben? Im Moment muss ich die Nummer von Hand im Bedienfeld UND bei Variable durch die aktuelle ersetzen.
Papyrus neu starten dürfte reichen. Schließlich verändert man nichts am Betriebssystem, sondern nur an der Datenbank. Wahrscheinlich reicht es sogar, nur die Datenbank zu schließen und wieder zu öffnen, ohne Papyrus selbst zu beenden.
Klappt jetzt wunderbar. Wenn ich jetzt wieder beende und Neu starte, zählt Papyrus korrekt weiter. Natürlich würde ich das jetzt gerne noch verstehen: Was hat sich jetzt genau geändert?
Deinem DB-Feld “Datum_Auftragsnummer” wurde der Datentyp “Text oder Zahl” zugewiesen.
In der Formel wird das Systemdatum mit SUBSTRING als eine normale Zeichenkette behandelt.
In den “Eigenschaften” wurde nun der Variblen “Tag” richtig der Datentyp “Text” zugewiesen.
Der bisherige Datentyp “Datum” für die Variable “Tag” war insofern nicht optimal, da beim Neustart des PCs offensichtlich eine Initialisierung des Datentyps “Datum” stattfindet. BASE registriert das wohl als eine Veränderung.
Mit Klick auf den Button “Neu” wird die Formel ebenfalls neu initialisiert und setzt den Zähler auf den Startwert.
Der Datentyp “Text” (oder auch “Text oder Zahl”) wird von diesem Verhalten nicht tangiert. Hier registriert BASE erst dann eine Veränderung, wenn das System sagt; Hallo, wir schreiben einen neuen Tag.
Jetzt würd ich gerne noch mal den Fachmann konsultieren:
Der jetzige Zustand der Formel ist:
IF SUBSTRING(SYSDATE, 1, 2) != VarTag THEN LET VarTag = SUBSTRING(SYSDATE, 1, 2) LET aktAuftragsNr = 1 ELSE LET aktAuftragsNr = aktAuftragsNr + 1 ENDIF RETURN RIGHT(SYSDATE, 2) + LEFT(SYSDATE, 2) + SUBSTRING(SYSDATE, 4, 2) + ‘·’ + STR(aktAuftragsNr)
Die Auftragsnummer für den 12. Kunden am 28.10. lautet demzufolge: 082810·12.
Um die etwas zu verkürzen, würde ich statt des Datums lieber DAYOFYEAR benutzen, das wäre dann 302·12. Klappt das mit DAYOFYEAR auch, oder bekomme ich Schwierigkeiten? Bevor ich mir das “running system” jetzt versaue: Wird das auch damit klappen, und wenn ja, wie sieht die Formel aus? Klappt das mit
IF DAYOFYEAR(SYSDATE) != Tag THEN LET Tag = DAYOFYEAR(SYSDATE) LET aktAuftragsNr = 1 ELSE LET aktAuftragsNr = aktAuftragsNr + 1 ENDIF RETURN STR(DAYOFYEAR(SYSDATE)) + ‘·’ + STR(aktAuftragsNr)
Sie bringt Dir heute, am Donnerstag, also den 303.Tag des Jahres 2008, diese 1. Auftragsnunmmer, getrennt durch ein Punktzeichen: “303 Punkt 1”