Formel gesucht

Vielleicht kann mir ja jemand weiterhelfen:

Man kennt ja LET aktRechnNr=aktRechnNr + 1

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!

Hallo blake.

Versuchs hiermit.

Gehe in die Eigenschaften … - Variablen

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.

UNGEPRÜFT!

UNGEPRÜFT: DAAANKE!!!

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?

KLASSE!

Klappt auf Anhieb. Brauch ich gar nicht bis Samstag warten…

Ja, das solltest Du mal machen.

Systemsteuerung > Datum und Uhrzeit >

Nimm’ den “01.” Tag.

Der z.B. in der Zukunft liegt.

Klicke dort auf Übernehmen.

Klicke dort auf OK.

Wiederhole das Ganze mit dem “24.” Tag.

Erzeuge für den 01. eine neue Auftragsnummer.

Siehe in den Eigenschaften, ob dort “01…” gesetzt wurde.

Erzeuge auch mal noch 1 - 2 Nummern - die müssen von vorne beginnen und fortlaufen.

Erzeuge für den 24. eine neue Auftragsnummer.

Siehe in den Eigenschaften, ob dort “24…” gesetzt wurde.

Erzeuge noch 1 - 2 Nummern - die müssen von vorne beginnen und fortlaufen.

Nochmals vielen Dank, klappt Seit einer Woche bestens.

Also jetzt zeigt sich doch ein Problem:

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.

Hallo blake.

Kurz zu Deiner Frage:

Die Formel (“Feldeigenschaften…”) ist korrekt.

Jedoch gehe bitte in die “Eigenschaften” und setze dort die Variable “Tag” von bisher Typ “Datum” auf neu Typ “Text”.

Starte den Rechner neu!

Warum sollte denn nach einer Änderung der Datenbank gleich der ganze Rechner neugestartet werden?

Hallo glucose.

Weil ich mir nicht 100%ig sicher bin, ob auch ohne Neustart alles korrekt gesetzt wird.

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.

Beenden und Neustart hat genügt;-)

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?

Hallo blake.

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.

Nochmals Danke.

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 SUBSTRING(DAYOFYEAR(SYSDATE) != …

Mahlzeit blake.

Ja, das klappt auch.

Du könntest dazu diese angepasste Formel nutzen:

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”

Uff.

Danke.