0

Verknüpfte Tabellen

Hallo,

wie muss ich denn bei der N:M Beziehung in dem Beispiel die Tabelle Mitarbeiter mit Datenfeldern bestücken? Ich kann ja einem Datenfeld nicht zwei andere Tabellen zuordnen.

236 Antworten

null
    • Mirko.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo,

    ich bräuchte einenm Tip zur Verknüpfung.

    Ich habe mehrere Tabellen erstellt, und möchte diese gerne in einer selbst formatierten Tabellenform ausgeben, z. B. auf einem DIN A5 Blatt hochkant, leider kann ich mit der Vorlage zum Tabellendruck nur die Spalten ändern, aber nicht das Design der Druckvorlage.
    Nun habe ich mir gedacht, einfach jede Tabelle, die ich bestimmt formatiert haben möchte in einer neuen Tabelle zu verknüpfen, so dass ich diese dann in der Druckvorlage selber anpassen kann.
    Wenn ich die Verknüpfung mit der Tabelle herstelle, sind in der Drucktabelle ja noch keine Daten drin, wie bekomme ich denn evtl. mittels Formel oder anders alle Daten in die Verknüpfte Tabelle kopiert, und auch beim anlegen eines Datensatzes automatisch dort eine Verknüpfung hergestellt.
    Es sind mittlerweile eine Menge Daten, die würde ich nicht von Hand alle einzeln verknüpfen wollen.

    Grüße
    Mirko
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Können Sie mir die Datenbank, an der Sie arbeiten einmal also Kopie zuschicken (Hauptmenü -> "Archiv sichern unter...")? Ich schaue dann gerne einmal hinein.

    Birger - Ninox Support
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo,
    ich möchte per Skript die Datensätze in der verknüpften Tabelle suchen und einfügen (als würde ich auf den Lupensymbol in der Verknüpfung klicken). Geht das?

    Grüße Leo
    • Frank_Bohmer
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Leo,
    etwa so (bei 1:N):

    let n := _id;
    let suche := "Test";
    let ergebnis := select Untertabelle where Spalte1 like suche or Spalte2 like suche;
    for datensatz in ergebnis do
    datensatz.Verknuepfung := n
    end

    Viele Grüße
    Frank
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Frank,
    danke, aber ich wollte eigentlich was anderes. Wenn ich auf die Lupe neben der 1:n Beziehungsfeld klicke, erscheint eine sagen wir "Suchtabelle" mit vorhandenen Datensätzen. Diese Tabelle möchte ich per Skript aufrufen können (z.B. mit Befehlsschaltfläche). Die Benutzer klicken sehr oft auf Plus-Symbol neben der Lupe und mit der Schaltfläche wäre die Bedienung sicherer.

    Grüße
    Leo
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Ich glaube nicht, dass das geht. Es würd mich aber mal selber interessieren. Ich frage nach.

    Birger - Ninox Support
    • post.1
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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.
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • sbecker_flashcablech
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Leo :)
    Habe zwar leider keine Lösung für Dich, finde die Idee aber sehr interessant.
    Daher aus Neugierde: Bist Du mit der Frage mittlerweile schon etwas weiter gekommen?
    LG, Sarah

    P.S.: als einziger "Workaround" würde mir spontan einfallen, das Verknüpfungsfeld zu verstecken und die Tabellenverknüpfung manuell zu setzen. Und die möglichen Eingaben vielleicht als Referenz ein Multiline-Textfeld zu schreiben?
    Also als Trigger im Eingabefeld z.B.:

    let targetTbl := (select ‘Tbl’).number(Nr);
    let tMAX := max(targetTbl);
    let tMIN := min(targetTbl);
    let thisNum := number(‘mySourceField’)
    if thisNum >= tMIN and thisNum <= tMAX then
    TblLink.number(Nr) := thisNum;
    else
    void
    end;


    Hat aber auch diverse Tücken und ist nicht so wirklich schön.
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Hallo Sarah,
    nein, die Antwort habe ich nicht. Glaube, es gibt noch nichts in diese Richtung. Als Alternative würde ich mir Wünschen, dass ich die Einträge der Auswahlfelder aus einer Tabelle füllen kann.
    Deinen Ansatz verstehe ich nicht ganz. Wenn mySourceField ein mehrzeiliges Textfeld ist, was passiert, wenn du diesen als Nummer deklarierst?
    grüße
    Leo
    • sbecker_flashcablech
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Schade. Auswahlfelder befüllen wäre - ganz unabhängig - auch super, das stimmt.

    Bezüglich meiner Workaround-Idee: Das habe ich wohl sehr schlecht erklärt. Entschuldige. Und nach kurzem Nachdenken wäre auch ein Funktions-Feld als Referenz besser, als ein Multiline-Feld.

    Ich hab schnell ein Beispiel gebastelt - das erklärt es vielleicht etwas besser.

    Workaround - Beispiel DB
    • sbecker_flashcablech
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Kleine Ergänzung: Ich habe jetzt innerhalb der DB nichts weiter erklärt oder beschriftet. Ich hoffe man kapiert so besser, was ich meinte.

    Falls aber irgend etwas nicht klar sein sollte, einfach schnell melden. :)
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    Ok, hab verstanden.
    Ich würde statt Schleife eine concat Funktion einsetzen
    ---
    replace(concat((select Haupttabelle).(Nr + " | " + Eintrag)), ",", "
    ")
    ---
    aber ansonsten sehr nette Idee.

    Grüße
    Leo
    • wolfgangdaeger
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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.
    • andineumaier
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • andineumaier
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • andineumaier
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • andineumaier
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • NinaGarcia
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • NinaGarcia
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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
    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen
    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

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 236Antworten
  • 72443Ansichten