Datensatz aus Untertabelle in andere Untertabelle schreiben
Hallo
Ich habe eine Tabelle Eingansjurnal mit mehreren gleichen Untertabellen (Raum1,Raum2,...).
Nun möchte ich, in den Untertabellen, mit einem Auswahlfeld eine ander Utabelle auswählen und ein Datensatz in die ausgewälte Tabelle schreiben und in der bestehenden löschen.
hat jemand eine Lösung?
Danke Walter
15 Antworten
-
Hallo Walter, verstehe ich es richtig, dass ein Datensatz bspw. von der Untertabelle “Raum1” in “Raum2” verschoben werden soll? Okay, angenommen die Haupttabelle hieße “Eingangsjournal” und hätte drei gleiche Untertabellen namens “Raum1”, “Raum2” und “Raum3”. Das Auswahlfeld hieße “Raum” und hätte die Namen der drei Untertabellen zum Inhalt. Dann könnte man es so versuchen (am besten mit einer Schaltfläche in jeder der drei Untertabellen):
if Raum then
let myJ := Eingangsjournal;
let meRoom := this;
let myRoom := text(Raum);
let newRoom := switch myRoom do
case “Raum1”: (create Raum1)
case “Raum2”: (create Raum2)
case “Raum3”: (create Raum3)
end;
newRoom.(Eingangsjournal := meRoom.Eingangsjournal);
newRoom.(Raum := myRoom);
newRoom.(DatenfeldA := meRoom.DatenfeldA);
newRoom.(DatenfeldB := meRoom.DatenfeldB);
[...]
delete meRoom;
openRecord(myJ)
end
-
Beten Dank
Deine Beschreibung stimmt, Werde ich probieren.
-
Hallo Copytexter
Es funktionier mit den einfachen Datenfeldern , geht das auch mit den anderen?
Gruss Walter
-
hier noch mein Code.
Fehlermeldung: Die Tabellenspalte ist kein einfaches Datenfeld: Posten Nr. in Zeile 18. Spalte 25
if “Stapel verschiben” then
let myJ := Eingangsjournal;
let meRoom := this;
let myRoom := text(“Stapel verschiben”);
let newRoom := switch myRoom do
case “Raum1”:
(create “Raum 1”)
case “Raum2”:
(create “Raum 2”)
case “Raum3”:
(create “Raum 3”)
end;
newRoom.(Eingangsjournal := meRoom.Eingangsjournal);
newRoom.(“Stapel verschiben” := myRoom);
newRoom.(“Einlagerungs Datum” := meRoom.“Einlagerungs Datum”);
newRoom.(Platz := Platz);
newRoom.(“Stk.” := “Stk.”);
newRoom.(“Posten Nr.” := “Posten Nr.”);delete meRoom;
openRecord(myJ)
end -
Was ist “Posten Nr.” denn? Ein Berechnungs-/Funktionsfeld? Dann lässt sich der Inhalt nicht übertragen, weil Funktionsfeldern ja immer eine Formel bzw. ein Skript zugrunde liegt, nach der das Ergebnis berechnet wird. Die Formel müsste also auch in allen Untertabellen vorhanden sein.
Davon abgesehen sollte man immer die betreffende ID der betreffenden Datensätze angeben (Übertragung von meRoom nach newRoom):
[...]
newRoom.(Platz := meRoom.Platz);
newRoom.(“Stk.” := meRoom.“Stk.”)
-
in einem Feld “Eingangsjournal” habe ich die Grund Daten des Datensatzes, Verknüpfung UTabelle Raum 1 mit Tabelle Eingangsjournal. das geht sicher auch nicht?
-
Ich blicke da gerade nicht mehr so recht durch. Deshalb gehe ich mal etwas grundsätzlicher ran. Alsooo ...
Jeder Datensatz hat eine eindeutige, von Ninox automatisch vergebene ID, bestehend aus einem Buchstaben für die Tabelle und einer Zahl als laufende Nummer des Datensatzes in der Tabelle. Beispiel für eine solche ID: B12 (Datensatz Nr. 12 in Tabelle B).
Im Verlauf des o. a. Skriptes werden drei verschiedene IDs ermittelt und in Variablen gespeichert:
meRoom = ID des aktuellen Datensatzes, in dem das Skript aufgerufen wird (this)
myJ = ID des übergeordneten Journal-Datensatzes, mit dem der aktuelle Datensatz verknüpft ist
newRoom = ID des mit “create” neu erstellten Datensatzes in der anderen UntertabelleDurch Angabe von ID.FELD kann man nun auf jedes Datenfeld aller drei Tabellen zugreifen. So bewirkt bspw. die Zeile
newRoom.(Platz := meRoom.Platz)
dass der Inhalt des Datenfeldes “Platz” aus dem Datensatz “meRoom” in ein Feld gleichen Namens und Typs des Datensatzes “newRoom” übertragen wird. Wenn der Inhalt aber aus dem Datensatz “myJ” gelesen werden soll, dann kann man auch schreiben:
newRoom.(Platz := myJ.Platz)
Voraussetzung ist natürlich, dass das Feld “Platz” auch in der betreffenden Tabelle (hier: Eingangsjournal) vorhanden ist. Wobei es auch anders heißen kann, wichtig ist nur, dass der Datentyp (Text, Zahl, Datum ...) bei beiden Feldern übereinstimmt.
newRoom.(Platz := myJ.Plaetzchen)
würde also auch funktionieren, wenn die Felder halt so heißen würden. Insofern: Ja, du kannst dem neuen (Raum-) Datensatz auch Daten der übergeordneten (Journal-) Tabelle zuweisen. Durch Angabe der ID, also in diesem Fall “myJ”.
Vielleicht hilft dir das, die entsprechenden Zuordnungen hinzubekommen. Ansonsten kannst du gerne auch Screenshots zeigen, müsstest die allerdings irgendwo auf einen externen Server legen und hier verlinken, da dieses Forum leider gerade etwas buggy ist und keine Bilder anzeigen kann.
-
Hier noch zwei Screenshot,
von der Hauttabelle “Eingangsjournal”,
https://www.dropbox.com/s/lg3k6rrdn7k0ary/Datensatz%20im%20Eingangsjournal.png?dl=0
und hier die von den Raum UTabelle
https://www.dropbox.com/s/56mqmsp9kj5qlcv/datensatz%20in%20raum.png?dl=0
das Problem ist nur noch das Verknüpfungsfeld “Eingangsjournal”.
-
Danke für die Screenshots. Aber was genau ist denn das Problem? Bleibt das Verknüpfungsfeld im neuen Datensatz leer? Oder ...?
Wenn das Verknüpfungsfeld dem Screenshot entsprechend in allen Untertabellen “Eingangsjournal” heißt, müsste die Zeile “newRoom.(Eingangsjournal := meRoom.Eingangsjournal)” eigentlich funktionieren. Alternativ kann man aber auch direkt die Variable “myJ” einsetzen, da sie denselben Inhalt (ID des übergeordneten Journal-Datensatzes) haben müsste:
newRoom.(Eingangsjournal := myJ);
Noch was Grundsätzliches zu Verknüpfungsfeldern wie “Eingangsjournal”: Gespeichert wird darin wie gesagt nur die ID des verknüpften Datensatzes. Weil mit der ID alleine aber niemand etwas anfangen könnte, zeigt Ninox einige Informationen aus dem verknüpften Datensatz an. Deshalb steht da jetzt bspw. “19.09.2020 , 188 , XXXXX Hans-Jörg , Glockenapfel”. Das Verknüpfungsfeld wird aber nur angezeigt, wenn man die Tabelle direkt aufruft. Klickt man nur in die Verknüpfung der übergeordneten Tabelle, erscheint sie nicht, weil der Bezug ja klar ist.
Ganz generell: Warum hat jeder Raum eine eigene Untertabelle? Das ist ja ein irrer Aufwand. Ich kenne die Besonderheiten deiner Bedarfssituation nicht, aber normalerweise widerspricht eine solche Vorgehensweise der Datenbank-Philosophie. Wäre es nicht sinnvoller, EINE Untertabelle zu nehmen und dort jeweils die Raum-Nummer zu speichern? Nur so als Anregung.
-
Mein code
https://www.dropbox.com/s/spnryprhq9iez2u/bildschirmfoto%202020-12-23%20um%2019.22.38.png?dl=0
wenn ich in ausführe springt ninox nach Eingangsjournal
https://www.dropbox.com/s/bza2epx7qxyrmhq/bildschirmfoto%202020-12-23%20um%2019.18.54.png?dl=0
Das Resultat in Raum2
https://www.dropbox.com/s/0kvroszpifualv4/bildschirmfoto%202020-12-23%20um%2019.17.30.png?dl=0
Wegen den Untertabellen, habe ich gemacht das ich einfach ein Stapelplan machen kann.
https://www.dropbox.com/s/skf74im91voy8n5/bildschirmfoto%202020-12-23%20um%2019.36.14.png?dl=0
-
Abgesehen davon, dass die Zeile “meRoom.(Eingangsjournal := ...” unnötigerweise zweimal vorkommt, sehe ich im Skript selbst jetzt keinen Fehler. Allerdings wird da auch das Auswahlfeld “Stapel verschieben” angesprochen, das im Screenshot zu “Raum 2” aber gar nicht vorhanden zu sein scheint. Alles sehr mysteriös.
Wo befindet sich das Skript denn eigentlich? Beziehungsweise: Wie und wann wird es ausgeführt? War der verschobene Datensatz überhaupt mit dem Eingangsjournal verknüpft? Falls nicht, bleibt die Verknüpfung natürlich auch im Ziel-Datensatz leer. Als Alternative schon mal die zuletzt vorgeschlagene Variante versucht?
[...]
newRoom.(Eingangsjournal := myJ);
[...]
Ansonsten kann ich nur anbieten, mir die Datenbank einmal direkt anzusehen. Dazu gäbe es zwei Möglichkeiten:
1.) Die Datenbank mit Demodaten zum Download bei Dropbox ablegen.
2.) Die Datenbank in ein Demo-Team importieren und mich in dieses Team einladen (E-Mail-Adresse fände sich hier: https://copytexter.com). -
Hallo Walter, du hattest zwar extra ein Demoteam erstellt, mich aber leider nur als Editor eingeladen, deshalb konnte ich die Skripte nicht einsehen und dem konkreten Problem nicht nachgehen.
Um aber wenigstens zu zeigen, wie man die Daten durch Verknüpfungen m. E. besser strukturieren kann, habe ich das beispielhaft mal in einer neuen DB nachgestellt. Dort sind die Räume alle in einer Tabelle, und man kann sie trotzdem einzeln auswerten. Um einen Posten zu verschieben, muss man nur die RaumNr ändern. Auch die Lieferanten habe ich in eine Tabelle ausgelagert, was zusätzliche Auswertungsmöglichkeiten verschafft. Und in der Tabelle “Lagerabfrage” lassen sich sämtliche Lagerbestände nach verschiedenen Kriterien filtern.
Man kann da natürlich noch viel mehr machen, aber es soll ja einfach nur eine Anregung für eine andere Herangehensweise sein. Vielleicht hilft es weiter.
Da ich ohne Administratorrechte auch keine DB ins Team stellen konnte, habe ich sie zum Download bei mir in die Dropbox gelegt: https://www.dropbox.com/s/gzopgbi9xgnvwfy/Apfellager.ninox?dl=0
-
Hallo Copytexter
Der Link funktioniert leider nicht, habe dich noch freigeschaltet.
Gruss und bsten Dank
Walter
-
Der Link sollte funktionieren (per Copy and Paste), ich habe die DB jetzt aber auch mochmal ins Team gestellt.
-
Hallo Copytexter
Da sehe ich das ich noch Anfänger bin.
Besten Dank für die Lösung
Content aside
- vor 4 JahrenZuletzt aktiv
- 15Antworten
- 1420Ansichten