Rücksetzen einer lfdNr auf 1 bei Vertragswechsel (Vertragsnummer = Basis für Nummerierung)
Hallo liebe NINOX Gemeinde,
ich mal wieder. Ich arbeite gerade an einer größeren Anwendung mit zahlreichen Tabellen und Verknüpfungen. Soweit, so gut. Vieles arbeitet bereits so, wie ich es mir wünsche.
Nun habe ich jedoch mal wieder ein Problem, an dem ich mir derzeit ein wenig die Zähne ausbeiße:
Ich habe eine Unter-Tabelle (Kombination) Namens „Versicherte“ (greift auf übergeordnete Tabelle „Vertrag“ zu.
In der Untertabelle enthalten sind u.a. die Felder
Berechnendes Feld) „Vertragsnummer“ (Anm.: greift auf überordnete Tabelle Vertrag = „Vertrag.Vertragsnummer“ zu
Berechnendes Feld (Versichertennummer) soll formatiert so aussehen „V2018081-1),
wobei V2018081 = „Vertragsnummer“ aus Tabelle Vertrag
lfdNr = -1..-2…-3 usw., d.h. die laufende Nummer soll jeweils um 1 vergrößert werden, wenn ein neuer Versicherter hinzugefügt wird (Ein Vertrag kann mehrere Versicherte haben), aber erneut bei 1 beginnt, sobald der Vertrag gewechselt wird (um dort neue Versicherte hinzuzufügen.
Soweit klapp es bereits ganz gut, allerdings bekomme ich es derzeit lediglich hin, dass (die korrekte Vertragsnummer (Auswahlfeld aus Verknüpfung zu Tabelle Vertrag) gezogen wird, allerdings zählt die lfdNr immer fortwährend um Eins höher, ohne das ich sie wieder auf 1 gesetzt bekomme.
Ich möchte aber, dass bei Wechsel eines Vertrages (Referenz „Vertrag.Vertragsnummer“) (also bei Wahl eines neuen Vertrages) beim Hinzufügen der Versicherten, die „Versichertennummer“ immer wieder bei 1 beginnt und dann nur so lange hoch zählt, wie ich neue Versicherte eben zu diesen (gewählten) Vertrag hinzufüge und wieder bei 1 beginnt, wenn ein neuer Vertrag gewählt wird.
Dies bekomme ich derzeit beim besten Willen nicht gebacken. Wer kann hier helfen. Dafür wäre ich sehr dankbar.
6 Antworten
-
Hallo Manfred,
eine Frage noch. Hat ein Versicherter immer nur ein Vertrag oder kann er auch mehrere Verträge haben?
Leo
-
Hallo Leoo,
danke für die schnelle Rückäußerung.
Ein Versicherter kann (neben andeeren) Mitversicherter zu einem Vertrag sein, jedoch auch selbst einen oder mehrere Verträge haben. Ich hatte zunächst die Versicherten als Untertabelle (Kombination) zu Kunden eingebaut. D.h. ein Kunde ist Versicherungsnehmer und hat Tochterunternehmen als Mitversicherte, die sich dann zu den Verträgen jeeils einzeln auswählen ließen. Dies klappte zwar, löst das Problem aber nicht, da jeder Mitversicherte zu einem anderen Vertrag eben auch Kunde, also Verscherungsnehmer sein kann. Die Mitversicherten müssen daher als gleichberechtige Mitglieder in der Datiei Kunde geführt werden. Die Auswahl, ob sie als Mitversicherte geführt werden, erfolgt dann über die Untrtabelle Versicherte.
-
Hallo Manfred,
von Datenmodel abgesehen: die Formel zu Versichertennummer in der Untertabelle wäre:
---
let myID := Nr;
Vertrag.Vertragsnummer + "-" + cnt(Vertrag.Versicherte[Nr <= myID])
---
Leo
-
Hallo Leo,
super, vielen Dank. Deine Formel funktioniert prima (eingebaut in das berechnende Feld "Versichertennummer).
Die dahinter stehende Funktion ... cnt/Vertrag.Versicherte[Nr <= myID]) - insbes. der Teil in den eckigen Klamer, habe ich zwar nicht komplett durchaschaut (die Wege des Herrn sind halt manchmal unergründlich ;-) ), aber ich bin mit der Lösung mehr als zufrieden.
Danke vielmals für die schnelle Hilfe und schönen Abend.
-
Hallo Manfred,
zur Erklärung. Man befindet sich in einem Datensatz der Untertabelle Versicherte. Zuerst merkt man sich die Id des Datensatzes (diese wird automatisch fortlaufend durchgeführt). Jetzt geht man in den verknüpften Datensatz der Haupttabelle Vertrag und von dort in dessen Untertabelle Versicherte. Da die Datensätze miteinander verknüpft sind, braucht man an der Stelle keine Einschränkungen. Jetzt haben wir mit Vertrag.Versicherte die Datensätze ausgewählt, die in dem Vertrag beinhaltet sind. Mit cnt kann ich die Anzahl der Datensätze ermitteln. Wenn ich jetzt die vormel so lasse cnt(Vertrag.Versicherte), krige ich immer die Anzahl der Versicherten in dem Vertrag. Wir haben uns vorher die ID des Datensatzes gemerkt: let myID:=Nr. Nehmen wir an, es gibt 3 Versicherten mit IDs 1,5 und 7 (die IDs sind deswegen nicht vortlaufend, weil andere IDs eventuel bei anderen Verträgen vorhanden sind). Wir möchten dass aus 1->1 wird, aus 5->2 und aus 7->3. Wie lösen wir das? Die Lösung lautet: die Anzal der Datensetze deren ID kleiner oder gleich als die aktuelle ID ist. Die Bedingungen bei verknüpften Tabellen werden immer in Eckklammer geschrieben (in nicht verknüpften Tabellen geht es mit select). Also - [Nr <= myID]. Bei dieser Gelegenheit fällt mir ein, dass die IDs bei Ninox als Texte behandelt werden, obwohl sie wie Zahlen aussehen. Das hält damit zusammen, dass die Tabellen bei Ninox für Interne Berechnungen mit Buchstaben referenziert werden und die eindeutigen Nummern innerhalb der Datenbank A1,A2,A3...B1,B2,B3 .....usw. heißen. Die Texte werden anders als Zahlen sortiert (2<10 aber "2">"10"). für uns heißt es das ab Versicherten nummer 10 die Berechnungen fehlerhaft werden. Man muss die IDs zuerst als Zahlen darstellen. Das geht mit dem Befehl number(Text). Die richtige Formel wäre deswegen:
---
let myID := number(Nr);
Vertrag.Vertragsnummer + "-" + cnt(Vertrag.Versicherte[number(Nr) <= myID])
---
Leo
-
Hallo Leo,
vielen Dank für die Nachreichung der Erklärung; dies hilft mir sehr.
ein Super-Support.
Content aside
- vor 6 JahrenZuletzt aktiv
- 6Antworten
- 2087Ansichten