Übertabelle Untertabelle Verständnisfrage
Hab mal eine verständnis Frage
Ich möchte Daten von der Übertabelle auch in der Untertabelle anzeigen lassen.
Momentan habe ich beim Erstellen eines Auftrags(Untertabelle)Daten von der Übetrtabelle direkt in Textfelder der Untertabelle geschrieben.
Bei nachträglichen Änderungen in der Übertabelle sind diese aber dann nicht auf die Untertabelle übergegangen.
Wäre es hier nicht sinnvoller ein Funktionsfeld in der Untertabelle anzulegen mit dem Verweis auf das Feld in der Übertabelle?
oder kann man so ein Verweis in einem Textfeld in der Untertabelle auch angeben?
Gruß
Andreas
12 Antworten
-
Hallo Andreas
auch wenn das Handbuch manche Frage offen lässt, ist die Relation Tabelle-Untertabelle hier eigentlich ganz gut erklärt, finde ich:
https://ninox.com/de/manual/tabellen-und-beziehungen/tabellen-verknuepfen
Wenn du nach Lektüte noch Fragen hast, kannst du sie natürlich immer noch stellen
lg
Arsène
-
Hallo Andreas, falls dir Arsènes Link nicht weiterhelfen sollte: Um Änderungen in der Haupttabelle automatisch in die Datensätze der Untertabelle zu übernehmen, gibt es zwei Möglichkeiten.
Erstens mit einem Berechnungsfeld in der Untertabelle, das auf das betreffende Feld der Haupttabelle Bezug nimmt und dessen aktuellen Inhalt spiegelt. Angenommen, die Haupttabelle hieße 'Auftrag' und das zu spiegelnde Feld 'Modell', dann würde die Angabe im Berechnungsfeld der Untertabelle lauten:
Auftrag.Modell
Zweitens mit einem Trigger "Nach Änderung" in dem Feld der Haupttabelle, dessen Werte automatisch in die Datensätze der Untertabelle übernommen werden sollen. Wenn die Untertabelle bspw. 'Positionen' hieße und das darin befindliche Datenfeld ebenfalls 'Modell', würde der Code für den Trigger folgendermaßen lauten:
let myData := Modell;
for i in Positionen do
i.Modell := myData
end
Welche Variante besser ist? Kommt drauf an. Berechnungsfelder haben die Eigenschaft, dass die darin befindliche Funktion bei jedem Aufruf immer wieder neu ausgeführt wird, was insbesondere bei tabellarischen Ansichten mit vielen Datensätzen zu Performance-Problemen führen kann. Trennt man außerdem irgendwann die Daten der Untertabelle von der Haupttabelle, dann müsste man die Werte vorher in ein Datenfeld übertragen, um sie zu erhalten.
Der Änderungstrigger in Variante 2 hingegen wird immer nur dann ausgeführt, wenn tatsächlich eine Änderung in dem betreffenden Feld durchgeführt wird. Das kann aber einmalig etwas länger dauern, wenn die Untertabelle viele Datensätze enthält.
-
Hallo,
Danke für die Antworten.
Dann versuch ich das mal mit dem Trigger
Gruß
Andreas
-
Hallo,
ertsmal Danke es funktioniert so mit dem Trigger aber ich habe dann doch noch eine Frage dazu:
funktioniert das für das gleiche Feld auch dann in der Untertabelle in umgekehrter Richtung oder fliegt mir dann das ganze um die Ohren
wenn sich beide Felder gegenseitig triggern.
Grund ist: Der Techniker sieht nur die Untertabelle mit dem Auftrag die übergeordnete Tabelle liefert den Grundstock an Daten die aber nicht alle
relevant sind für den Monteur.
Sollte der Monteur jedoch bei seinem Auftrag etwas korrigieren müssen sollte das dann auch gleich in die Haupttabelle zurück geschrieben werden.
Gruß Andreas
-
Hallo Andreas, das funktioniert prinzipiell auch umgekehrt mit einem entsprechenden Änderungstrigger in dem betreffenden Feld ('Modell') der Untertabelle ('Positionen'). Auf das obige Beispiel bezogen:
let myData := Modell;
Auftrag.Modell := myData
Wobei sich die Frage stellt, ob das Feld 'Modell' nur in der Haupttabelle geändert werden soll oder auch in den anderen Datensätzen der Untertabelle. In letzterem Fall müsste man den Code erweitern.
-
Also das funktioniert im Prinzip auch. Aber ich habe hier wohl eine Fehler in meiner Datenbankkonstruktion oder in meinem Code
In der Hauptdatenbank habe ich eine Befehlsschaltfläche die ein Auftrag anlegt und dort gleich ein paar Grundeinstellungen anlegt.
Die Verknüpfung von Hauptabelle nach Untertabelle funktioniert. Aber die Rückverknüpfung ist nicht vorhanden die muss ich immer zuerst von Hand erstellen.
Der Code für das erstellen des Auftrages lautet:
let my := this;
let new := (create 'Aufträge');
new.(Turnus_Rest_2020 := my);
new.(Vorname := my.E_Vorname);
new.(Nachname := my.E_Nachname);
new.('Straße' := my.'E_Straße');
new.(Hausnummer := my.E_Hausnummer + " " + my.E_Hauszusatz);
new.(PLZ := my.E_PLZ);
new.(Ort := my.E_Ort);
new.('Zähler' := my.'Zählernummer');
new.('Zählerplatz' := my.'Zählerplatz');
let myID := Sparte;
if myID like "2" then
'Aufträge'.(Sparte := 1) and 'Aufträge'.(Auftragsstatus := 1) and 'Aufträge'.(Mitarbeiter := 2)
end;
if myID like "3" then
'Aufträge'.(Sparte := 2) and 'Aufträge'.(Auftragsstatus := 1) and 'Aufträge'.(Mitarbeiter := 2)
endFehlt hier noch eine Eintrag der den Auftrag auch an die Haupttabelle bindet
Gruß Andreas
-
hier noch eine Idee weshalb das eventuell nicht funktioniert
Hier habe ich jetzt oben vier möglichkeiten zu Auswahl Termin und Terminart sind Felder kommen hier nicht in Frage
sondern es sollte hier ja die Bezugstabelle rein
Also Turnus_Rest_2020 oder Turnusdaten.
Die Tabelle Turnus_Rest_2020 wurde von mir vor ein paar Wochen in Turnusdaten umbenannt
ist das eventuell das Problem dass die Rückverknüpfung nicht funktioniert? Denn Turnus_Rest_2020 gibt es ja eigentlich garnicht mehr aber nur dieser Eintrag ist ohne Fehlermeldung zulässig
Gruß Andreas
-
Hallo Andreas. Wenn Du die Tabelle umbenennst, dann wird nicht automatisch der Name des Verknüpfungsfelds in einer anderen Tabelle geändert. Du kannst nun also entweder "Turnus_Rest_2020" benutzen oder änderst den Namen des Verknüpfungsfeld in Aufträge noch in "Turnusdaten".
-
Ok das habe ich jetzt bereinigt und nun passt es schon fast perfekt
jetzt habe ich aber noch immer ein Problem mit der logik hier
Wenn ich jetzt ein Auftrag erzeuge über meinen Button:
wir der Auftrag generiert:
Wenn ich den Auftrag dann direkt hier aufrufe fehlt die Verbindung zur Turnusdaten Tabelle:
Gehe ich direkt über die Tabell Aufträge zu diesem Auftrag Nr 875 so ist die Verbindung zu sehen:
-
Das ist ganz normal. 'Aufträge' ist augenscheinlich eine Untertabelle. Das heißt, jeder Datensatz ist fest an einen der Haupttabelle gebunden. Deshalb wird die Verknüpfung nicht angezeigt, wenn man den Datensatz aus der Haupttabelle heraus öffnet. Ruft man dagegen die Untertabelle direkt auf, wird dort auch die Verknüpfung zur Haupttabelle angezeigt.
-
ok danke
-
PS: Wenn man sich im Formular der Untertabelle Daten aus der Haupttabelle anzeigen lassen will, kann man das mit einem Funktionsfeld machen. Beispiel:
Turnusdaten.FeldX + ", " Turnusdaten.FeldY
Wobei FeldX und FeldY natürlich nur Platzhalter sind und der Veranschaulichung dienen.
Content aside
- vor 3 JahrenZuletzt aktiv
- 12Antworten
- 649Ansichten