Nummerierung Auftrag/Unterauftrag
Hallo, ich habe mir eine neue Datenbank erstellt in der ich meine Aufträge verwalte.
Die Nummerierung der 1. Tabelle "Aufträge" habe ich mit folgendem Code gelöst:
if not 'Auftrags-Nr.' then
let y := year(Datum);
let a := cnt(select 'Aufträge' where year(Datum) = y);
'Auftrags-Nr.' := "A-" + y + "/" + format(a, "00")
else
void
end
Nun habe ich eine 2. Tabelle "Unteraufträge" und möchte auch diese in Bezug auf die 1. Tabelle nummerieren.
Dabei sollte die Nummerierung bei jedem neuen Auftrag von Vorne beginnen.
Beispiel:
Auftrags-Nr.: A-2020/01
Unterauftrags-Nr.: A-2020/01/01, A-2020/02/01, A-2020/03/01, usw.
Ich bin mir sicher, es ist ganz einfach, aber irgendwie stehe ich total auf dem Schlauch, deshalb danke im Voraus für eure Hilfe.
Gruss Andreas
27 Antworten
-
Hallo Andreas,
ich würde mich nicht bei der Nummervergabe auf Anzahl der Datensätze verlassen. Wenn (aus welchem Grund auch immer) einer der Datensätze gelöscht wird, kriegt man automatisch die doppelte Nummervergabe. Mein Vorschlag für die Haupttabelle wäre:
---
let my := this;
if not 'Auftrags-Nr.' then
let myNr := max((select 'Aufträge')[Nr != my.Nr and year(Datum) = year(my.Datum)].number(last(split('Auftrags-Nr.', "/")))) + 1;
'Auftrags-Nr.' := year(Datum) + "/" + format(myNr, "00")
end
---
und für die Untertabelle:
---
let myAN := 'Aufträge'.'Auftrags-Nr.';
let myUN := max('Aufträge'.'Unteraufträge'.number(substr('Unterauftrags-Nr.:', 5, 2))) + 1;
'Unterauftrags-Nr.:' := first(split(myAN, "/")) + "/" + format(myUN, "00") + "/" + last(split(myAN, "/"))
---
Leo
-
Upps, habe deine "A-" vergessen:
---
let my := this;
if not 'Auftrags-Nr.' then
let myNr := max((select 'Aufträge')[Nr != my.Nr and year(Datum) = year(my.Datum)].number(last(split('Auftrags-Nr.', "/")))) + 1;
'Auftrags-Nr.' := "A-"+year(Datum) + "/" + format(myNr, "00")
end
---
Untertabele:
---
let myAN := 'Aufträge'.'Auftrags-Nr.';
let myUN := max('Aufträge'.'Unteraufträge'.number(substr('Unterauftrags-Nr.:', 7, 2))) + 1;
'Unterauftrags-Nr.:' := first(split(myAN, "/")) + "/" + format(myUN, "00") + "/" + last(split(myAN, "/"))
---
Leo
-
Danke Leo für deine schnelle Hilfe.
Ich habe deinen Code auch gleich getestet. Die Aufträge in der Hauptabelle werden wie gewünscht fortlaufend nummeriert, nur in der Tabelle Unteraufträge kommt bei jedem neuen Datensatz immer /01/ als Numerierung raus.
Andreas
-
Hallo Andreas,
hast du auch die Zweite Formel für die Untertabelle genommen?
---
let myAN := 'Aufträge'.'Auftrags-Nr.';
let myUN := max('Aufträge'.'Unteraufträge'.number(substr('Unterauftrags-Nr.:', 7, 2))) + 1;
'Unterauftrags-Nr.:' := first(split(myAN, "/")) + "/" + format(myUN, "00") + "/" + last(split(myAN, "/"))---
Leo
-
Ja, genau so, bei neuem Datensatz...:
---
let myAN := Auftrag.'Auftrags-Nr.';
let myUN := max(Auftrag.Unterauftrag.number(substr('Unterauftrags-Nr.', 7, 2))) + 1;
'Unterauftrags-Nr.' := first(split(myAN, "/")) + "/" + format(myUN, "00") + "/" + last(split(myAN, "/")) -
-
Es sieht so aus, als würde die Formel das Feld Auftrags-Nr.: der Haupttabelle nicht finden.
Versuch mal in der Untertabelle ein Funktionsfeld mit der Formel Auftrag.'Auftrags-Nr.' zu erstellen.
-
Auch das ändert nichts. Das Funktionsfeld mit der Funktion Auftrag.'Auftrags-Nr.' zeigt zwar die Auftragsnummer im Feld richtig an, aber die Unterauftragsnummer bleibt trotz Verweis auf dieses Feld immer gleich /01/
-
Vielleicht so?
let myAN := 'Aufträge'.'Auftrags-Nr';
let myUN := cnt('Aufträge'.'Unteraufträge');
'Unterauftrags-Nr' := myAN + "/" + format(myUN, "00")
-
Hmm,
bei mir funktioniert's:
Einzig,worauf ich noch tippen kann, die Kodierung der Schrägstriche. Versuch mal alle Schrägstriche zu Löschen und manuell mit der Tastatur einzufügen. Aber auch in der Auftragstabelle.
-
@der Copytexter,
nein, man möchte die Unterauftragsnummer an der zweiten Stelle haben
-
Und gegen cnt () habe ich bereits meine Bedenken ausgesprochen.
-
Ach so, erst Unterauftragsnr, dann Hauptauftragsnr. Sorry, das hatte ich übersehen. Zu meiner Ehrenrettung: Diese Reihenfolge ist aber auch sehr ungewöhnlich. ;)
-
Zuerst Auftragsnummer A-2020/01, dann Unterauftragsnummer A-2020/01/01 dann A-2020/01/02 usw.
-
Also doch so rum? A-2020/AN/UN? (AN = Auftragsnummer, UN = Unterauftragsnummer). Dann wie vorhin, nur mit max() statt cnt():
let myAN := 'Aufträge'.'Auftrags-Nr.';
let myUN := max('Aufträge'.'Unteraufträge'.number(substr('Unterauftrags-Nr.', 10, 2))) + 1;
'Unterauftrags-Nr.' := myAN + "/" + format(myUN, "00")
-
Danke für euren Einsatz, aber leider will es nicht klappen. Habe die Datenbank nochmal neu erstellt...jedoch immer das gleiche Ergebnis. Keine Ahnung was ich da falsch mache. Vielleicht mal drüber schlafen.
-
Stell die Datenbank doch mal zum Download auf einen Server oder ins Webinar-Team. Dann kann man mal reinschauen.
-
Ok, für mich war diese Aussage eindeutig:
---
Auftrags-Nr.: A-2020/01
Unterauftrags-Nr.: A-2020/01/01, A-2020/02/01, A-2020/03/01, usw.
---
habe mich auch gewundert, aber das ist das tolle bei Ninox - man kann auch Dinge umsetzen, welche unlogisch scheinen.
hier ist meine Version:
https://www.dropbox.com/s/h4i6cwn3k5x3fjb/Auftr%C3%A4ge.ninox?dl=0
Leo
-
Danke Leo für deine Version. Ich habe sie auch sofort getestet, aber leider immer mit dem geichem Ergebnis:
-
Ist das eine Mac-App?
-
Und damit ihr auch wirklich versteht was ich mit Auftrag und Unterauftrag meine hier ein Beispiel:
Ein Kunde möchte bei einem Schreiner seine komplette Wohnung einrichten lassen. Die Wohnugseinrichtug wäre dann für den Schreiner der Auftrag. Wohnzimmer, Schlafzimmer, Küche, usw. sind dann die Unteraufträge die zum Hauptauftrag dazugehören. Es geht dann aber auch noch weiter. Ein Schlafzimmer hat ein Bett, einen Kleiderschrank usw. Das wären dann die einzelnen Teile des Unterauftrags. Aber diese kann ich auch manuell nummerieren. In meinem Betrieb werden die Aufträge so wie die Ordnerstruktur auf dem Server nummeriert. Desalb auch A-2020/01/01. Wichtig ist das bei jedem Auftrag auch die Nummerierung der Unteraufträge bei 1 beginnt.
Ich hoffe das war einigermaßen verständlich.
-
Ja Mac, das kann man gut sehen. Gibt es denn Ninox auch für Windows u. Co. ?
-
Ok, ich konnte den Fehler nachvollziehen. Ofensichtlich benutzt du die Einzelplatzversion. Ich habe alles in der Cloud programmiert.
in der App (ohne Team) ist es so dass wenn man einen Untertabellendatensatz über Plus Zeichen erstellt, wird zuerst der Trigger nach neu ausgeführt und dann die Verknüpfung zu der Haupttabelle erstellt. Der Trigger versuch die Nummer von der Haupttabelle zu finden, aber zu diesem Zeitpunkt gibt es keine Verknüpfung.
Dieses Verhalten hatte ich vor Jahren festgestellt und dachte-es ist inzwischen abgestellt. Dem ist nich so.Abhilfe kann ein Funktionsfeld in der Untertabelle schaffen:
---
let my := this;
Auftrag.'Auftrags-Nr.' + "/" + format(cnt(Auftrag.'Unteraufträge'[number(Nr) <= number(my.Nr)]), "00")
---
Oder man fügt einen Button "Unterauftrag hinzufügen":
---
let my := this;
let new := (create 'Unteraufträge');
new.(Auftrag := my);
let myUN := max('Unteraufträge'.number(last(split('Unterauftrags-Nr.:', "/")))) + 1;
let myF2 := format(myUN, "00");
let myF1 := 'Auftrags-Nr.';
new.('Unterauftrags-Nr.:' := myF1 + "/" + myF2);
popupRecord(new)---
Leo
-
Gerade wollte ich schreiben: "In der Mac-App funktioniert es auch bei mir nicht. Der Verweis 'Aufträge'.'Auftrags-Nr.' gibt keinen Wert zurück. Jedenfalls nicht als Trigger "Bei neuem Datensatz". Mit einer Schaltfläche hingegen funktioniert der Code (in beien Versionen). Sehr seltsam. Ein Bug? Ich habe leider auch keine Idee für einen Workaround. Vielleicht fällt Leo was ein."
Und zack - schon ist die Lösung da. ;)
-
Das mit dem Funktionsfeld in der Untertabelle passt perfekt so und funktioniert auch wie gewünscht. Den Button sehe ich eher als Notlösung. Danke
Content aside
- vor 4 JahrenZuletzt aktiv
- 27Antworten
- 2860Ansichten