0

Vorhandene Datensätze einer Untertabelle mit Haupttabelle verknüpfen

Hallo zusammen,
ich habe mir eine DB über eine Modellbahnsammlung gebastelt.
Die Haupttabelle "Stammdaten" enthält die Daten zu allen Artikeln. Die Artikel werden über die Felder "Hersteller", "Artnr" und "Variante eindeutig identifiziert.

Die Untertabelle "Koll2001" enthält zu bestimmten Artikeln ein oder mehrere Zeilen mit dem Schätzpreis jeden Jahres. Auch hier werden die Zeilen über die Felder "Artikel", Herstelle und "Variante" eindeutig identifiziert.

Mein Problem besteht nun in der nachträglichen Verknüpfung der Felder aus der Untertabelle "Koll2001" zu dem entsprechenden Datensatz in der Haupttabelle "Stammdaten". Manuell geht das über in der Untertabelle über "Vorhandenen Datensatz hinzufügen" leider immer nur einzeln.

Kann man auch gleichzeitig alle Datensätze aus der Untertabelle, dem Datensatz mit denselben Schlüsselfeldern zuordnen?

8 Antworten

null
    • mirko3
    • vor 2 Tagen
    • Gemeldet - anzeigen

    Hallo  Das kann man. Zum Beispiel kann eine Schleife über die Untertabelle laufen und alle Schlüsselfelder vergleichen mit dem passenden Datensatz der Obertabelle. Du kannst das Script in einen Button legen. Ein Beispiel (eine andere Variante) einer solchen Iteration per select() lege ich hier mal bei. Wenn du das testen willst, dann mach vorher ein backup. 
     

    (select Koll2001).(
        let h := Hersteller;
        let a := Artnr;
        let v := Variante;
        Stammdaten := first(select Stammdaten where Hersteller = h and Artnr = a and Variante = v)
    )
    

    Das Verknüpfungsfeld heißt in meinem Fall "Stammdaten", wie die Obertabelle. Mirko

    • jochem_esch
    • gestern
    • Gemeldet - anzeigen

    Hallo Mirko,

    vielen Dank für Deinen Kommentar. Leider bin ich in Ninox-Skript nicht besonders eingelesen. Ich habe mir mal ein paar Tutorials bezüglich Schleifen angeschaut und mein Skript im Formular der Untertabelle "Koll bis 2001" wie folgt bei einem Button hinterlegt:

    for i in select 'Koll bis 2001' do
        let h := i.HerstellerKoll2001;
        let a := i.ArtnrKoll2001;
        let v := i.VarianteKoll2001;
        i.StammdatenID := first(select Stammdaten where Hersteller = h and Artnr = a and Variante = v).Nr
    end
    

    In der Tabelle "Koll bis 2001" habe ich ein Feld namens "StammdatenID" angelegt. Für mein Verständnis sollte hier durch das Skript für jeden Datensatz in "Koll bis 2001" die eindeutige "Nr" des in der Tabelle "Stammdaten" gefundenen Datensatzes eingefügt werden.

    So funktioniert die 1:n-Verknüpfungen ohne Untertabelle jedenfalls in anderen Verknüpfungen bei mir jedenfalls  einwandfrei.

    Das obige Skript scheint allerdings nicht wie gewünscht zu arbeiten. Es werden keine Daten in das Feld "StammdatenID" geschrieben.

    • mirko3
    • gestern
    • Gemeldet - anzeigen

    Mein Script kann natürlich nicht funktionieren, da die Feldbezeichnungen anders sind, als von dir oben beschrieben. Ausserdem dachte ich, dass StammdatenID ein Verknüpfungsfeld ist, also, dass Stammdaten und 'Koll bis 2001' 1:N verknüpft werden sollen. Also, jede Menge Vorannahmen, die nicht gestimmt haben. Jetzt gibt es zwei Möglichkeiten, die ich vorschlage. Entweder, du schreibst die relevanten Namen (korrekter Tabellenname, korrekte Feldbezeichnung und Feldtypen) mal auf und ich stelle es in einer Datenbank bei mir kurz nach, oder du leerst deine DB-Kopie von allen nicht benötigten Tabellen und Daten und stellst sie hier ein. Dann sollte das lösbar sein. Dein Script oben sieht gut aus, wahrscheinlich ergibt das first() keinen Wert. Gruß Mirko

    • jochem_esch
    • gestern
    • Gemeldet - anzeigen

    Hallo Mirko,

    die DB habe ich angehangen. Die Feldbezeichnungen hatte ich nach meinem ersten Post geändert. Sorry für die Verwirrung.

    Ich bin bisher davon ausgegangen, dass bei einer 1:N-Verknüpfung immer die Datensatznummer aus aus der N-Tabelle verwendet wird. So habe ich es jedenfalls realisiert, bei den Stammdaten mit "N:1"-Beziehung realisiert (siehe Stammdate/Hersteller).

    Die Beziehung zwischen "Stammdaten" und "Koll bis 2001" ist aber eine 1:N-Beziehung. Deshalb habe ich "Koll bis 2001" als Untertabelle eingefügt. Das würde auch alles einwandfrei funktionieren, solange man die leere Untertabelle einbindet und dann Manuel Daten eintippt. In ist aber so, dass ich die Daten bereits aus einem Access-Export vorliegen und ich diese in die Untertabelle importiert habe. Dabei entsteht aber eben keine Verknüpfung zu den Stammdaten, da man keine Schlüsselfelder definieren kann, oder ich nicht weiß, wie.

    Ich kenne leider keinen Lösungsweg, habe aber noch weitere Untertabellen, die in Stammdaten eingefügt werden müssen ("Koll ab 2002", "Einkäufe bis 2001" und "Einkäufe ab 2002". Auch dazu liegen Access-Exporte vor.

    Bin gespannt, ob Du eine Lösung findest.

    • mirko3
    • vor 23 Stunden
    • Gemeldet - anzeigen

    Was ich aus deiner DB herauslese ist, daß die Datensätze der 'Koll ab 2001' Tabelle über nur zwei Felder verglichen werden können. ArtnrKoll2001 mit Artnr und VarianteKoll2001 mit Variante. Ein Feld HerstellerKoll2001 gibt es nicht und das Feld Hersteller in den Stammdaten ist ein Zahlenfeld. Dann soll das Verknüpfungsfeld "StammdatenTAB" verknüpft werden und die ID aus den Stammdaten in das Feld StammdatenID eingefügt werden. Richtig? Denn dann sollte es so wie unten funktionieren.

    Eine Anmerkung. Sollten verschiedene Hersteller gleiche Artikelnummern und Varianten haben, dann gibt es Fehler. Aber das wirst du besser wissen. Ich habe das Skript in deiner DB getestet und zumindest gibt es plausible Werte, die ich kontrolliert habe. Alle Werte habe ich aber nicht durchgeschaut. Mirko

    for i in select 'Koll bis 2001' do
        let a := i.ArtnrKoll2001;
        let v := i.VarianteKoll2001;
        let recordID := first(select Stammdaten where Artnr = a and Variante = v);
        i.(StammdatenID := recordID.Id);
        i.(StammdatenTAB := recordID)
    end
    
    • jochem_esch
    • vor 20 Stunden
    • Gemeldet - anzeigen

    Hallo Mirko,

    vielen Dank für Deine Hilfe, es hat prima funktioniert, verstanden habe ich das allerdings nicht.

    1. Das Feld HerstellerKoll2001 ist das zweite Feld in der Feldliste der Tabelle "Koll bis 2001". Ich habe versucht, den Code entsprechend zu ergänzen, aber dann passiert wieder nichts. Dabei wäre damit die Problematik der doppelten Artnr bei anderen Herstellern gelöst.
    2. Warum braucht man die recordID in StammdatenTAB und in welches Feld wird sie geschrieben?

    Ich habe das Gefühl, dass ich das ganze Konstrukt der Verknüpfungen noch nicht verstanden habe, obwohl ich relationale Datenbankmodelle z.B. auf ORACLE-Basis oder eben Access gut zu beherrschen glaube.

    • mirko3
    • vor 5 Stunden
    • Gemeldet - anzeigen

    Das Feld StammdatenTAB ist ein Verknüpfungsfeld. Es beinhaltet die Zuweisung zu genau einem Datensatz der Tabelle Stammdaten. Die Zuweisung wird realisiert durch die ID des Datensatzes der Tabelle Stammdaten. Im deutschen wird "Nr" benutzt. Wenn du mal in einem Funktionsfeld raw(StammdatenTAB) eingibst, dann siehst du so etwas wie "H4043". H ist die Bezeichnung für die Tabelle und 4043 für den Datensatz (wird auch record genannt). Darüber ist nun eindeutig eine Verknüpfung realisiert. Wenn du in den Einstellungen des Felds "StammdatenTAB" in den erweiterten Optionen unter "Daten anzeigen als" folgendes eingibst:

    HerstellerTAB.Hersteller
    

    dann siehst du den Herstellernamen. Hier wird jetzt auf den Datensatz der Stammdaten-Tabelle verwiesen über die Nr. In diesem Datensatz wird nach dem Feld "HerstellerTAB" gesucht, was die Verknüpfung zur Tabelle "Hersteller" ist und dort nach dem Feld "Hersteller". Das wird dann angezeigt.

    Mit first() wird im Script ein record gesucht, der den Vergleichen standhält und damit dem Verknüpfungsfeld zugewiesen. Sinngemäß steht dort also: Verknüpfungsfeld := Nr. 

    Wie oben geschrieben, gibt es in deiner Tabelle Stammdaten das Feld Hersteller als Zahlenfeld. Dieses ist in der gesamten Tabelle leer und seine Bedeutung erschliesst sich mir nicht.

    Den Hersteller gibst du ja über eine weitere Verknüpfung aus einer Tabelle ein. Das ist clever, aber ich würde das nicht über eine Combobox anzeigen lassen, da sieht man nicht den Namen. 

    Also könnte man am Design der Datenbank noch schrauben, bevor sie in den Routinebetrieb geht. 

    P.S. Die Feldbezeichnung von Verknüpfungsfeldern umzubenennen ist nicht immer eine gute Idee

    P.S.2. Es gibt ein sehr schönes Tutorial hier. Das hilft vielleicht weiter. 

    P.S.3. Da ich auch kein Profi bin und mich nur eingearbeitet habe, sind vielleicht nicht alle Formulierungen oben nach Lehrbuch ;-)

    • jochem_esch
    • vor 3 Stunden
    • Gemeldet - anzeigen

    Guten Morgen Mirko,

    danke für die ausführliche Antwort. Sie hilft mir schon wieder etwas weiter.

    Der derzeitige Stand der DB konzentriert nicht noch ganz auf das Datendesign. Die leeren Felder sind mir auch schon auf gefallen, sie entstehen beim Import. Das sind jeweils die Schlüsselfelder. Warum die leer bleiben erschließt sich mir auch nicht, aber die werden dann auch später noch entfernt. Der Schliff am Layout usw. erfolgt dann erst, wenn ich mit dem Tabellendesign zufrieden bin.

    Wünsche Dir ein schönes Wochenende

Content aside

  • vor 3 StundenZuletzt aktiv
  • 8Antworten
  • 30Ansichten
  • 3 Folge bereits