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?

6 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 9 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 6 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.

Content aside

  • vor 6 StundenZuletzt aktiv
  • 6Antworten
  • 28Ansichten
  • 3 Folge bereits