Verknüpfte Tabellen

Tabellenverknüpfungen – auch Beziehungen oder Relationen genannt – sind eine der wichtigsten Funktionen von Ninox. Dass Sie Tabellen in Beziehung zueinander setzen können, unterscheidet Ninox von vielen anderen Apps, die lediglich die Verwaltung simpler Listen ermöglichen. Zudem sind Relationen ein wesentlicher Unterschied von echten Datenbanken zu Tabellenkalkulationsprogrammen.

Wenn Sie bisher nur wenig Erfahrung mit Datenbanksystemen gesammelt haben, sollten Sie diesen Abschnitt lesen, um zu erfahren welche unterschiedlichen Beziehungstypen es gibt und wie Sie diese am Besten einsetzen.

Grundlagen: Die 1:N-Beziehung

Ninox unterstützt – wie die meisten relationalen Datenbanksysteme – als Grundbaustein sogenannte 1:N-Beziehungen (lies: Eins zu N). Das bedeutet, dass Sie mit dieser Beziehung einem einzelnen Datensatz aus einer Tabelle mehrere Datensätze aus einer anderen zuordnen können.

relations_1N

Ein Beispiel dafür sind Kunden und Rechnungen. Zu einem Kunden können Sie beliebig viele Rechnungen zuordnen. Zu einer Rechnung können Sie aber nur einen Kunden festlegen.

Diese grundlegende Beziehung definieren Sie, indem Sie in der Tabelle Rechnung eine Verknüpfung zur Tabelle Kunde erstellen – die Rechnung verweist auf einen Kunden.

Wenn Sie nun die Formularansichten für Rechnung und Kunde öffnen, sehen Sie, dass im Rechnungsformular ein einzelnes Feld zur Aufnahme des Kunden eingeblendet wird. Im Kundenformular hingegen wird eine eingebettete Tabelle aller zugeordneten Rechnungen dargestellt.

Untertabellen: Die Kompositionsbeziehung

Eine besondere Form der 1:N-Beziehung ist die Komposition. Komposition bedeutet in etwa “besteht aus”. Ein gutes Beispiel hierfür sind Rechnungspositionen. Eine Rechnung besteht aus mehreren Positionen. Wenn die Rechnung gelöscht wird, sind auch die Positionen hinfällig.

relations_composition

Sie können eine Tabellenverknüpfung (auch nachträglich) als Kompositionsbeziehung markieren, indem Sie bei den Feldeigenschaften der Verknüpfung die erweiterten Optionen einblenden und “Komposition” mit “Ja” aktivieren.

Dies hat folgende Auswirkungen:

  • Im Datenmodell wird die Tabelle als Untertabelle der verknüpften Tabelle (Obertabelle) angezeigt, nämlich verschachtelt.
  • Auf der Startseite der Datenbank ist die Untertabelle nicht mehr zu sehen.
  • Beim Löschen eines Datensatzes in der Obertabelle werden alle verknüpften Datensätze der Untertabelle entfernt.
  • In der Formulardarstellung der Obertabelle fehlt die Option “Suchen und hinzufügen” (Lupensymbol) an der Untertabelle.
  • In der Formulardarstellung der Untertabelle fehlt die Option “Verknüpfung aufheben”.

Untertabellen eignen sich gut für Dinge, die fest miteinander verbunden sind; um einige Beispiele zu nennen:

  • Rechnungspositionen gehören unabdingbar zu einer Rechnung.
  • Telefonnummern sind fest mit einem Kontakt verbunden. Wird der Kontakt gelöscht, sollen auch die Telefonnumern entfernt werden – ohne die Kontaktinformation sind sie nicht nützlich.

Gegenbeispiele:

  • Die Mitarbeiter einer Firma sollten nicht als Untertabelle realisiert werden, da sie z. B. die Firma wechseln könnten bzw. unabhängig von der Firma existieren.
  • Rechnungen für einen Kunden
  • Rechnungspositionen sind zwar sinnvollerweise eine Untertabelle einer Rechnung, sollten aber zum Artikel eine ganz normale Beziehung haben.

Beziehungstabellen: die N:M-Beziehung

Manchmal sind 1:N-Beziehungen bzw. Kompositionen nicht ausreichend, um einen Sachverhalt darzustellen. Wie die meisten relationalen Datenbanksysteme unterstützt auch Ninox nicht direkt N:M-Beziehungen. Reine N:M-Beziehungen sind allerdings auch nur in Ausnahmefällen sinnvoll; häufig sollen Beziehungen nämlich noch weiter qualifiziert, also mit weiteren Daten angereichert werden.

relations_NM

Ein Beispiel: In einer Tabelle Firma werden Firmen erfasst. Eine weitere Tabelle Person erfasst Kontkatdaten von Personen. Nun soll zugeordnet werden, welche Person welchen Arbeitgeber hat. Die einfachste Modellierung wäre eine Verknüpfung von Person zu Firma. Wenn Sie allerdings berücksichtigen wollen, dass eine Person auch mehrere Arbeitgeber hat oder diese über die Zeit wechselt, ist dieses Modell nicht hinreichend.

Stattdessen benötigen Sie eine dritte Tabelle, zum Beispiel “Mitarbeiter”. In der Tabelle Mitarbeiter definieren Sie eine Verknüpfung zur Firma und eine weitere zur Person. Beide Beziehungen sollten als Komposition markiert werden, denn wenn die Firma gelöscht wird, hat Sie auch keine Mitarbeiter mehr. Wenn eine Person gelöscht wird, ist diese ebenfalls kein Mitarbeiter mehr.

Hinweise:

  • Obwohl für Mitarbeiter Kompositionsbeziehungen definiert wurden, wird die Tabelle nicht als Untertabelle dargestellt. Offensichtlich kann Mitarbeiter nicht Untertabelle von zwei verschiedenen Obertabellen sein.
  • Beachten Sie die Auswirkungen der Kompositionsbeziehungen auf das Löschen von Datensätzen: Wird eine Person gelöscht, so wird auch der Mitarbeiter gelöscht, nicht aber die Firma. Wird eine Firma gelöscht, werden alle ihre Mitarbeiter ebenfalls entfernt. Allerdings bleiben die Personen unberührt.

Die Tabelle Mitarbeiter ist eine sogenannte Beziehungstabelle, da Sie im Wesentlichen die Beziehung von Personen zu Firmen modelliert. Neben diesem Hauptzweck können Sie die Tabelle nun aber auch nutzen, um die Beziehung um hilfreiche Daten anzureichern. Beispiele wären in diesem Fall Felder für das Eintritts- und Austrittsdatum oder für das Gehalt. In diesem Sinne steht die Tabelle Mitarbeiter also für das Arbeitsverhältnis zwischen Person und Firma oder gar für den Arbeitsvertrag.

Beziehungsgeflechte

Die drei vorgestellten Grundtypen von Beziehungen lassen sich beliebig erweitern. So gibt es keine Einschränkung, auch höherwertige Beziehungen – zum Beispiel zwischen drei Tabellen – zu erstellen.

Hilfreich kann sein, wenn Sie sich beim Design Ihrer Datenbank zunächst eine Skizze auf Papier erstellen.

Malen Sie zunächst alle Objekte, die Sie verwalten wollen, als Kästen auf. Jeder Kasten steht für eine Tabelle. Im zweiten Schritt überlegen Sie, welche Beziehungen zwischen diesen Objekten bestehen. 1:N-Beziehungen können Sie einfach als Pfeil eintragen. Wenn das nicht ausreicht, müssen Sie einen weiteren Kasten für die Beziehungstabelle einfügen.

Achten Sie auch darauf, dass Sie nicht redundante (überflüssige) Beziehungen erstellen: Folgen Sie den Pfeilen: Wenn Sie von einem Kasten A auf zwei unterschiedliche Wege zu einem anderen Kasten B gelangen können, sollten Sie überlegen, ob die beiden Pfade tatsächlich verschiedene Sachverhalte darstellen oder ob Sie hier vereinfachen können.

Zu guter Letzt noch ein Tipp: Versuchen Sie nicht, mit Ihrem Datenmodell alle Eventualitäten zu erschlagen. Manchmal ist es besser, ein einfaches Modell zu verwenden und die ggf. wenigen Ausnahmen durch Kommentare oder andere Hilfsmittel zu kennzeichnen. KISS – Keep It Simple, Stupid.

227 Gedanken zu „Verknüpfte Tabellen

  1. Hallo zusammen,

    gegeben sind 3 Tabellen T1, T2 und T3.

    T1 besteht aus nummerischen Feldern F1T1, F2T1 und einer Schaltfläche SF1T1.
    T2 besteht aus einem nummerischen Feld F1T2 und diverse nicht nummerische Felder.

    Wenn man auf SFT1 klickt. wird eine Berechnung mit den Feldern F1T1 und F2T1 durchgeführt und das Ergebnisse mit dem Feld der F1T2 verglichen.

    Wenn

    das Ergebnis nicht übereinstimmt
    soll
    a) eine Meldung erscheinen (irgendwo habe ich eine Formel alert() gesehen, die ich noch nicht ausprobiert habe) : “Falsche Eingabe”
    b) die Eingaben in den Feldern F1T1 und F2T1 leeren
    c) in T1 bleiben um weitere Eingaben in F1T1 und F2T1 zu tätigen

    oder

    wenn

    das Ergebnis übereinstimmt
    zu T3 springen um dort sofort Einträge in den nächsten Datensatz zu tätigen
    (ohne die vorherigen Einträge in T3 zu sehen)

    Danke schon vorab für die Unterstützung

    Georg_0815

      1. Guten Morgen Leo,

        nein die Tabellen T1 und T2 stehen in keiner Beziehung zu einander.
        T2 besteht aus einem einzelnen Datensatz.

        (In diesem Model will ich es einfach halten bis das Ganze funktioniert. Durch Deine Frage in welchen Datensatz aus der Tabelle 2 F1T2 verglichen werden soll, komme ich auf die Idee, dass später doch mehrere Datensätze in T2 sein könnten. in dem Fall soll der Vergleich in eine Art Schleife durchgeführt werden, wobei die Berechnung aus T1 mit F1T2 in sämtlichen Datensätzen von T2 verglichen wird und wenn ein einzelner “Treffer” stattfindet, soll weiter so vorgegangen werden wie oben beschrieben)

        Vielen Dank

        Gruß Georg_0815
        PS: Wenn ich auf die Uhrzeit Deiner Antwort schaue…wow

        1. Hallo Georg_0815;
          let myF := F1T1 + F2T1;
          let myCNT := cnt(select T2 where F1T2 = myF);
          switch myCNT do
          case 0:
          (
          alert(''Falsche Eingabe");
          F1T1 := null;
          F2T1 := null
          )
          default:
          (
          let NT := (create T3);
          openRecord(record(T3,number(NT.Nr)))
          )
          end

          Grüße
          Leo

          1. Hallo Leo,
            Danke, funktioniert sehr gut !!
            (mit Kopieren/Einfügen des Codes muss man die Anführungszeichen in alert(“.. manuell eingeben, sie werden nicht richtig übergeben).

            Darf ich noch fragen, als Verfeinerung, wie bekommt man es hin, dass man

            1) im Feld F1T3 (in Tabelle T3) springt ?
            (Ich habe es mit select(T3,F1T3) versucht, allerdings bekomme ich es
            mit der Syntax nicht hin)

            2) Sobald man im Feld F1T3 gesprungen ist, den erzeugten Datensatz in
            T1 komplett löschen, also nicht nur die Werte, so dass T1 immer nur
            kurzfristig aus einem Datensatz besteht?

            Gruß Georg_0815

            1. Hallo Geor_0815,
              soweit ich weiß, kann man bei Ninox den Fokus nicht auf unterschiedliche Felder setzen.
              Zu dem Punkt 2:
              am einfachsten ist es alle Datensätze mit “delete” zu löschen.

              let myF := F1T1 + F2T1;
              let myCNT := cnt(select T2 where F1T2 = myF);
              switch myCNT do
              case 0:
              (
              alert("Falsche Eingabe");
              F1T1 := null;
              F2T1 := null
              )
              default:
              (
              let NT := (create T3);
              delete select T1;
              openRecord(record(T3,number(NT.Nr)))
              )
              end


              grüße
              Leo

      2. Hallo Leo (und an Alle natürlich)

        also die Variante mit einen einzelnen Datensatz in T2 funktioniert grundsätzlich.
        Wie sehe die Lösung aus, wenn in T2 weitere Datensätze vorhanden wären und wie ich am Februar 22, 2018 um 6:19 am – beschreibe, dass eine Schleife durchgeführt werden soll die beim ersten Treffer so verfährt wie Du mit einem Datensatz in T2 gelöst hast?
        Gruß Georg_0815

        1. Hallo Georg_0815,
          Die Formel funktioniert auch bei mehreren Datensätzen in T2. Zur Erklärung:
          cnt(select T2 where F1T2 = myF) gibt Anzahl aller Datensätze in der Tabelle T2 zurück, wo der Wert von F1T2 gleich myF (F1T1 + F2T1) ist. Wenn die Anzahl gleich null ist, gibt es Alarm. Wenn aber mindestens eine Übereinstimmung da ist, wird die Tabelle T3 geöffnet.
          Also geht auch ohne Schleife.

          Grüße
          Leo

  2. Hallo liebes Support-Team. Eine Frage zum Anzeigen von verküpften Tabellen.
    Ich habe eine Tabelle und dort andere Tabellen verküpft. Wenn ich nun einen Datensatz öffne, erscheint ja automatisch von der verknüpften Tabelle ein kleinen Übersicht, siehe Bild. Die Anzahl der dort angezeigten Zeilen scheint auf 5-7 Zeilen festgelegt. Kann man die ändern? Ich würde gerne später große Liste drucken, wo alle Datensätze der verknüpften Tabellen angezeigt werden, nicht nur die 7.

    http://www.bilder-upload.eu/show.php?file=5d6ec0-1518704944.png

    Danke

      1. Ach man wie blöd, da hätte ich auch selber drauf kommen können. Ein Problem hab ich aber noch. Wenn ich nun einen Report erstellen und drucken will, da zeigt er mir leider weiterhin nur 5-7 an. Kann ich das irgendwie ändern?

  3. Hallo zusammen,
    bin gerade dabei eine DB für unsere vermieteten Objekte zu erstellen.
    Nach zahlreichen Versuchen stecke ich nun irgendwie fest.
    Bislang war mein Ansatz die Umlagen in einer anzulegen und dann als Positionen in der Abrechnung einzeln anzufügen. Besser wäre es für mich wenn eine Position auswählen könnte hinter der dann alle Umlagen hinterlegt sind.
    Wenn ich dies in einer Untertabelle anlege, kann ich zwar die Position auswählen aber bekomme die einzelnen Umlagen nicht angezeigt.

    Lieben Gruß Heiko

  4. Hallo Nik,
    unique habe ich hier im Forum vor ca. 1,5 Jahren gesehen. Es ging damals um eindeutige Einträge bei concat-Funktion. Mit array habe ich einfach ausprobiert -und es ging. Ob es noch etwas schönes gibt – bestimmt.

    grüße
    Leo

  5. Hallo!

    Ich möchte Ninox gerne für die Verwaltung von Geräteeinweisungen nutzen. Ich tue mich aber sehr schwer damit, die korrekten Beziehungen der Tabellen herzustellen. Es geht um folgendes:
    Es gibt viele Mitarbeiter, diese erhalten Einweisungen in Geräte. Zu jedem Gerät kann es mehrere Einweisungstermine geben und jeder Mitarbeiter muss mindestens einmal, kann aber auch mehrfach Einweisungen besuchen. Ich möchte einen Überblick darüber behalten, welche Einweisungen einem Mitarbeiter noch fehlen und ich möchte bei einem neuen Einweisungstermin direkt erkennen können, welchen Mitarbeitern die Einweisung zu diesem Gerät noch fehlt.
    Bisher bin ich bei meinen Überlegungen von einer Tabelle ‘Mitarbeiter’ und einer Tabelle ‘Geräte’ ausgegangen. Dann habe ich noch eine Tabelle ‘Einweisungstermine’ hinzugenommen. Die Verknüpfung zwischen Geräte und Einweisungstermine kann ich gut als 1:N Beziehung darstellen, da jeder Einweisungstermin genau einem Gerät zugeordnet werden kann. Aber die restlichen Beziehungen machen mir Schwierigkeiten.
    Ich wäre sehr dankbar, wenn mir hier jemand einen Tipp geben würde, wie sich das am besten lösen lässt.
    Vielen Dank!
    Nina

    1. Hallo Nina,
      dafür brauchst du eine n:m Beziehung. Erstell noch eine Tabelle “Teilnahme”.
      In diese Tabelle fügst du die Verknüpfungen zu den Tabellen Einweisungstermine und Mitarbeiter (beide als Komposition einstellen).
      Jetzt solltest du bei jedem Einweisungstermin ein Gerät und mehrere Mitarbeiter einfügen können.
      Einzig unbequeme dabei ist es, dass man beim Einfügen des Mitarbeiters zwei mal klicken muss: mit dem ersten Klick landest du in der Tabelle Teilname und beim zweiten wählst du den Mitarbeiter.

      Grüße
      Leo

      1. Hallo!

        Vielen Dank für die Hilfe. Auf die Idee mit der zusätzlichen Tabelle bin ich nicht gekommen, es funktioniert einwandfrei!
        Ich hätte noch eine weitere Frage. Ich habe leider nicht sehr viel Ahnung von dem was ich hier tue und teste meistens einfach aus was funktioniert. Also schonmal Entschuldigung für die sehr laienhaften Fragen…
        Ich möchte in meiner Tabelle ‘Geräte’ bei jedem Gerät anzeigen lassen, wer bereits für dieses Gerät eingewiesen wurde. Mit der Formel
        if Einweisungstermine.’Geräte’.'Gerätename’ = ‘Gerätename’ then concat(Einweisungstermine.Teilname.Mitarbeiter.Nachname) else “0″ funktioniert das bei mir, allerdings nur solange es nicht mehr als einen Einweisungstermin für das Gerät gibt. Wie kann ich die Formel konstruieren, damit auch bei mehreren Terminen, alle bereits Eingewiesenen angezeigt werden? Am besten auch noch so, dass jemand der an zwei Terminen war dennoch nur einmal aufgeführt wird. Zweites Problem ist, dass so nur der Nachname angezeigt wird. Allerdings habe ich mehrere Mitarbeiter mit dem gleichen Nachnamen. Wie kann ich den Vornamen mit anzeigen lassen?

        Und wo ich schon einmal dabei bin, absolut perfekt wäre es, wenn ich mir weiterhin eine Liste der Mitarbeiter anzeigen lassen könnte, deren Einweisung noch fehlt. Hier habe ich selber leider gar keine Idee wie ich das verwirklichen kann.

        Vielen Dank für die Unterstützung!
        Nina

        1. Hallo Nina,
          Du kannst die Formel für die Spalte so gestallten:

          concat(Einweisungen.unique(Teilname.Mitarbeiter.(Vorname + ” ” + Nachname)))

          Die Anführungszeichen muss du aber selbst setzen. Mit Copy / Paste kommt eine Fehlermeldung
          Mit der anderen Liste muss ich mir noch Gedanken machen

          Grüße
          Leo

          1. Vielen Dank!!! Ich würde das gerne etwas besser verstehen. Der Unique -Befehl ist vermutlich dafür da, Duplikate rauszufiltern?! Aber woher weiss die Formel für welches Gerät die Mitarbeiter gesucht werden? Warum werden hier nicht alle Mitarbeiter ausgeworfen?

            1. Hallo Nina,
              Wenn eine Tabelle ohne “select” angesprochen wird, nimmt Ninox die Verknüpfte Tabelle, und behandelt nur die Datensätze die mit der Haupttabelle verknüpft sind. Hier sucht Ninox nach Einweisungen, welche mit deinem Gerät verknüpft sind, dann geht es weiter in die Verknüpfung “Teilname” und von dort zu der Verknüpfung zu “Mitarbeiter”.

              Leo

              1. Habe die Formel nochmals analysiert. Die Formel wird nur funktionieren, wenn in einer Einweisung ein Mitarbeiter zwei mal aufgeführt ist. Wenn aber ein Mitarbeiter an unterschiedlichen Terminen Teilgenommen hat, dann funktioniert das ganze nicht. “unique” weigert sich die Doppelwerte rauszuschmeißen. Die Korrekte formel wäre dann:

                unique(split(concat(Einweisungen.Teilname.Mitarbeiter.(” ” + Vorname + ” ” + Nachname)), “, “))

                split wandelt den Text in einen Array . Dann kann unique wieder eingesetzt werden.

                Leo

                1. Stimmt, jetzt funktioniert es einwandfrei. Danke! Wofür ist das “, ” in der Formel gut? Ich habe es mal weg gemacht und mal durch ein anderes Zeichen ersetzt, das hat an der Darstellung nichts geändert…?!

                2. Hallo Leo

                  Von wo kommt jetzt auf einmal dieser Befehl “unique(Array)” her oder wie bist du darauf gekommen?

  6. Hi zusammen,

    ich habe ein Dienstleistungsangebot mit einer kleinen Datenbank realisiert. Die Dienstleistungspreise ändern sich jedoch von zeit zu zeit. Daher bin auf folgendes Problem gestoßen. Die Dienstleistungen sind wie einzelne Artikel angelegt. Wenn ich jetzt die Preise der Artikel verändere, Verändern sich auch alle bisher erstellten Angebote, Rechnungen, etc. im Preis. Wie schaffe ich es, dass ich bei der Erstellung einer Rechnung die Auswahl aus der Artikeltabelle vornehmen kann, aber im nachhinein an dieser nichts verändert wird?

    LG, Andi

    1. Hallo Andi,
      Die Problematik ist in der Vorlage. „Rechnungen“ sehr gut gelöst. Dort gibt es eine Tabelle „Rechnungspositionen“ in dieser Tabelle ist eine Verknüpfung zu der Tabelle Artikel. Der Artikelpreis ist nicht als Berechnung sondern als Zahlenfeld angelegt. Bei der Verknüpfung zu Artikel steht ein Trigger bei Änderung mit der Formel:
      —-
      Pres:=Artikel.Preis
      —-
      Diese Formel bewirkt, dass der Preis nur beim übertragen des Artikels in die Angebotsposition übertragen wird und dann nicht mehr von Der Tabelle Artikel abhängig ist.
      Grüße
      Leo

      1. Hi Leo,

        vielen Dank für deine schnelle Antwort. Funktioniert perfekt. Hatte die Rechnungsvorlage eigentlich nachgebaut, aber den Trigger so nicht auf dem Schirm. ;-)

        Eine Frage hätte ich noch. Die automatische Rechnungsnummern Vergabe funktioniert bei mir aktuell so, dass ich durch einen Button eine neue Rechnungsnummer erstellen lasse. Grund für den Button ist, dass in meiner Tabelle auch Angebote stehen, die zum Teil so nicht durchgeführt werden. Meine Rechnungsnummer sieht akutell so aus 201801. Ist es möglich in das skript noch einen Bindestrich einzufügen, damit das Format so aussieht: 2018-01

        Vorab vielen Dank.

        LG, Andi

        1. Hallo Andy,
          dafür muss ich die Formel sehen, die du für die Rechnungsnummer benutzt.
          pauschal soll es dann etwa so aussehen

          let y := year(‘Invoice Date’);
          let c := cnt(select Invoice where year(‘Invoice Date’) = y);
          ‘Invoice No’ := y + “-” + format(c, “00″)

          Grüße
          Leo

          1. Danke dir. Leider funktioniert das so nicht. Ich bekomme immer eine Fehlermeldung wenn ich den Bindestrick “-” so einfüge.

            Aktuell siehts so aus:
            if not Rechnungsnummer then
            let y := year(Rechnungsdatum);
            let c := cnt(select Kooperationen where year(Rechnungsdatum) = y);
            Rechnungsnummer := y + format(c, “00″)
            else
            void
            end

            Aber das ist eben ohne den Bindestrich.

            LG, Andi

            1. Es sollte so aussehen:
              –––
              if not Rechnungsnummer then
              let y := year(Rechnungsdatum);
              let c := cnt(select Kooperationen where year(Rechnungsdatum) = y);
              Rechnungsnummer := y + "-" + format(c, "00")
              end
              –––

              Bitte darauf achten, dass die Ninox Srcipt-Sprache immer unformatierte Anführungszeichen erwartet.

              Birger – Ninox support

              1. Vielen Dank.

                Jetzt klappt es. Den Ansatz hatte ich auch schon. Das Problem war, dass das Rechnungsnummer Feld als Zahl formatiert war und er mir somit durch den Bindestrich nichts angezeigt hat.

                LG, Andi

  7. Hallo Kvasir,
    du kannst zu Rechnungen eine Tabelle “Rechnungspositionen” als Komposition verknüpfen und zu dieser Tabelle dann die beiden Tabellen (Artikel und Unterartikel)
    jetzt solltest du in Rechnungspositionen noch die Berechnungsfelder (Artikelnr., Beschreibung, Preis) hinzufügen und diese Funktion etwa so einrichten(z.B. für Beschreibung):

    if Artikel != null then Artikel.Beschreibung else if Unterartikel !=null then Unterartikel.Beschreibung

    Dann fügst du noch die Zahl “Menge” und ein Berechnungsfeld “Betrag” (Menge*Preis)

    Ich habe kleine Beispieldatenbank gebastelt.

    https://www.dropbox.com/s/3zk8m08a8h23n6g/Unterarikel.ninox?dl=0

    Grüße
    Leo

  8. Hallo zusammen,
    ich würde gerne eine Artikelverwaltung realisieren und bekomme die Logik zum Datenmodell nicht gelöst.
    Benötigt werden Kombiartikel, also die Möglichkeit, einem Artikel mehrere “Unterartikel” zuordnen zu können.
    zB: Shop für Küchenartikel. Ich möchte gerne eine Spülmaschine als einzelnen Artikel verkaufen können. Zugleich soll aber auch eine ganze Küche mit Unterschränken, Kühlschrank UND Spülmaschine einem Angebot/Rechnung zuzuordnen sein. Ein Artikel soll also sowohl einzeln, als auch als Kombiartikel mit weiteren, festen Positionen angelegt werden.
    Hat jemand eine Idee wie ich eine solche Tabellenstruktur aufbaue.

    Viele Grüße und frohe Weihnachten.

    1. Ich würde das so angehen, dass einem Angebot/Rechnung grundsätzlich *nur* Kombiartikel zugeordnet werden, die dann die Unterartikel enthalten. Und einer der Kombiartikel heißt dann „Einzelartikel“ und enthält nur z.B. die Spülmaschine.

Hinterlasse eine Antwort