0

Per Button mehrere neue Datensätze in anderer Tabelle anlegen

Also erstmal vorneweg:

Ich bastele jetzt seit rund 5 Monaten an Ninox, und das Ding wird immer größer, und umfangreicher. Und gleichzeitig baue ich mir dabei sogar meine maßgeschneiderte Anwendung, wie ich sie nirgends sonst bekäme. Je länger man daran arbeitet, desto besser wird es. Das System wächst, und die eigenen Skills erlauben immer schnellere Anpassungen oder Erneuerungen. Ich bin ziemlich begeistert. Geht euch das auch so?
 

Genug des Lobes, jetzt zu meinem konkreten Anliegen:

Ich habe eine Tabelle Fertigungen. In dieser Tabelle möchte ich gerne per Button in einer anderen, verknüpften Tabelle Lieferungen je nach zuvor festgelegter Definition in Fertigungen einen, oder auch mehrere Lieferungen erstellen.

Also ein gefertigter Artikel soll z.B. im Anschluss an die Fertigung an z.B. 3 verschiedene Ziele versendet werden.

Ich würde als in der Fertigung ein Feld haben "Anzahl Destinationen" hier z.B. 3 eintragen und per klick erstellt Ninox in der Tabelle Lieferungen 3 neue Einträge.

Wie würde man das machen?

Und Anschlussfrage, am besten würde ich auch bereits die Mengen und die Ziele vorab in der Fertigung festlegen.

Wie würde man das am besten machen? 

In der Tabelle Fertigungen eine Untertabelle erstellen, in der man die Anzahl und die Lieferdestinationen bereits festlegt?

14 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo, wenn ich die Beschreibung richtig interpretiere, dann wäre es vielleicht am sinnvollsten, die Datensätze in der Tabelle 'Lieferungen' gleich anzulegen und dann jeweils Menge und Ziel darin zu speichern. Das Anlegen der Datensätze könnte z. B. so aussehen:

    let me := this;
    let myDZ := 'Anzahl Destinationen' + 1;
    for xy from 1 to myDZ do
       let newL := (create Lieferungen);
       newL.(Zufallsnummer := me)
    end
    

    Damit würde man allerdings nur X leere Datensätze in 'Lieferungen' anlegen und mit dem Datensatz in 'Fertigungen' verknüpfen. Um dort jeweils Menge und Ziel einzutragen, müsste man die Datensätze dann auch einzeln öffnen, so dass man es auch gleich manuell über "+ Datensatz erstellen" machen könnte.

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       vielen Dank. Du hast es ganz richtig interpretiert. Und ich gebe zu, die Sinnhaftigkeit der Aktion darf in Frage gestellt werden. Man kann eigentlich ebensogut die 3 Lieferscheine von Hand erstellen. 
       

      Mir geht es dabei vor allem um ein paar Referenzwerte die im neuen Lieferschein fehlerfrei eingetragen werden sollen. Die würde ich dann im selben Skript gleich mit übergeben.

      Also idealerweise, bin ich in der Fertigung, trage hier die nötigen Parameter ein (Referenzwert x, Anzahl Einheiten je Destination, Vorauswahl der Destinationen) dann drücke ich den Button und zack wären die 3 Lieferungen fix und fertig und vor allem fehlerfrei erstellt.

      Ich probiere das mal mit deinem Skriptentwurf, das hilft mir doch schon mal weiter.

      Wenn ich per Skript einen neuen Datensatz in den Lieferungen erstelle, wird ja ein neues Fenster, oder in Ninox ist es ja eher ein Layer geöffnet. 

      Ich frage mich gerade wie das wohl abläuft bei z.B. 3 neuen Lieferungen, sind dann 3 Layer offen? Könnte man die automatisch auch schließen?

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Arwin Dustdar 

      Über die Variable newL könnten beim Erstellen der Datensätze in 'Lieferungen selbstverständlich auch noch weitere Daten aus dem Fertigungs-Datensatz übergeben werden. Am Beispiel eines Feldes namens 'Datum':

      let me := this;
      let myDZ := 'Anzahl Destinationen' + 1;
      for xy from 1 to myDZ do
         let newL := (create Lieferungen);
         newL.(Fertigungen := me);
         newL.(Datum := me.Datum)
      end

      Die Frage ist ja, wann und wo die individuellen Daten (Menge, Ziel) zu den X Lieferungen erfasst werden sollen. Es gäbe auch noch die Möglichkeit, mit temporären Feldern in der Tabelle'Fertigungen' zu arbeiten. So mache ich es z. B. bei der Zeiterfassung. Im Projekt habe ich u. a. die temporären Felder 'Datum', 'Dauer' und 'Kurzbeschreibung'. Die fülle ich aus und drücke dann auf einen Button, der diese Daten in die Untertabelle 'Zeiterfassung' schreibt und die temporären Felder wieder leert. Der Eintrag erscheint dann auch sofort in der Untertabelle.

      Wenn man per Script mit "create" einen neuen Datensatz erstellt, wird dieser nicht automatisch geöffnet. Wollte man das, müsste man es explizit auch noch mit angeben. In obigem Beispiel könnte man das bspw. mit einer weiteren Funktion in der letzten Zeile erreichen:

      ...
      end;
      popupRecord(newL)

      Ansonsten wird der Datensatz zwar erstellt, verknüpft und ggf. mit Daten befüllt, aber nicht geöffnet.

      Ich würde die verschiedenen Möglichkeiten und Verhaltensweisen einfach mal ausprobieren und dann entscheiden, welches der beste Workflow ist.

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hammer! Danke. Das ist eine geniale Idee mit den temporären Feldern.

      Denke das werde ich so machen, entspricht genau dem Bedarf. Die werden dann im Skript vermutlich nach 

      Danke für die Hinweise. 

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      In einfachster Form könnte das dann bspw. so aussehen wie auf dem Screenshot.

      (1, 2) Temporäre Felder für Ziel und Menge

      (3) Button mit folgendem Code:

      let me := this;
      let newL := (create Lieferungen);
      newL.(
         Fertigungen := me;
         FertigungsNr := me.FertigungsNr;
         Menge := me.Menge;
         Ziel := me.Ziel
      );
      Menge := null;
      Ziel := null
      

      (4) Verknüpfte Tabelle (1:N)

      Beispielhaft würde hier als zusätzliche Information auch noch die FertigungsNr mit übertragen.

      Darüber hinaus ließen sich natürlich noch zusätzliche Abfragen und Aktionen einbauen, z. B. dass der Button erst sichtbar wird, wenn die Felder Menge und Ziel  ausgefüllt wurden. Oder die Verknüpfungstabelle "verstecken" und statt dessen  Ansicht einblenden um zu verhindern, dass die Schaltfläche "+ Datensatz erstellen" genutzt wird.

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       das ist perfekt so.

      Auch die Anordnung der Felder, mit den verknüpften Lieferscheinen darunter. Ich hatte bislang gedacht ich müsste die versch. Destinationen/Mengen erst eintragen, und dann den Button klicken, um alle (z.B. 3) Lieferungen zu erzeugen. Aber das ist ja quatsch, zumal ja jede erzeugte Lieferung unten direkt angezeigt wird. Das ist viel besser so. :)

      Ich muss nur mal sehen, wie ich das mit den Destinationen am besten mache. Im Moment habe ich diese in der Lieferung mit 2 Tabellen angelegt, quasi Empfänger (heißt bei mir tatsächlich Destinationen) wird zuerst ausgewählt, und dann in der entsprechenden Untertabelle davon die eigentliche Adresse.

      Konkret geht es hier um Amazon Fulfilmentcenter. Die haben so Kürzel wie "DTM2" müsste dann etwas so gehen, oder?:

      Ziel := Destinationen.Untertabelle where Kürzel = me.Ziel

      Nochmal, vielen Dank für das Mitdenken.

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ich probiere das gerade mal aus mit deinem Code und meinen Fähikgkeiten, denke gerade vielleicht kann ich es auch mit den Zielen direkt mit einem dynamischen Auswahlfeld hinbekommen.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ja, wenn die Anzahl der Destinationen überschaubar ist (Übersichtlichkeit), kann man es mit einem dynamischen Auswahlfeld (DAF) machen. Ansonsten ginge es auch mit einer Verknüpfung.

      Bei DAF sollte man allerdings berücksichtigen, dass Ninox die Record-Nr des gewählten Eintrags als numerischen Wert zurückgibt. Dadurch ändert sich die Art der Verarbeitung und Zuweisung. Wenn es dazu Fragen gibt - gerne melden.

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       genau das ist gerade mein Engpass. Es klappt mit dem Anlegen, aber ich kann die Verknüpfung zu den dynamischen Auswahlfeldern nicht herstellen, also dem Empfänger (Destination) und der entsprechenden Adresse.


      Wie macht man das? 

      Ich habe ja die Destinationen so organisiert, dass die eigentlichen Ziele in einer Untertabelle (Adressen) stecken.

      Überlegung 1:
      Ich wähle in der Fertigung 1 x global die Destination
      und dann in dem Ziele Feld die Adresse je Lieferschein, jeweils vor der Erzeugung des LS

      Überlegung 2:
      Ich wähle aus einem Auswahlfeld bereits die Adresse, und per Rückverfolgung könnte ich dann am Lieferschein die zugehörige Destination setzen?

      Mir ist Überlegung 1 irgendwie sympathischer obwohl es 1 Schritt mehr ist.

      Aber ich hadere an der Umsetzung. Wie bringe ich der Lieferung bei, dass er Destinationen verknüpfen soll, mit der Destination aus meinem Auswahlfeld?
       

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Wenn die 'Lieferungen' mit 'Destinationen' verknüpft sind, würde ich die Zuweisung so versuchen:

      Destinationen := record(Destinationen,number(me.Destination));
      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       genial, vielen Dank.

      Es klappt wie geplant:

      Ich werde das noch gegen eine "Ansicht" auswechseln, wie du empfohlen hast. Also vielen Dank für die weitreichende Hilfestellung. 🙏 😊

    • Arwin_Dustdar.1
    • vor 1 Jahr
    • Gemeldet - anzeigen

     einen habe ich noch :)

    In der Lieferung erzeuge ich bei Bedarf ein PDF Dokument mit einem Button. Im Button steht nun dieses Script:

    let myFileName := "Lieferschein_" + Nummer + "_vom_" + format(today(), "YYYY-MM-DD") + ".pdf";
                importFile(this, printAndSaveRecord(this, "Lieferschein_mit_Hinweis"), myFileName);
                Lieferschein_PDF := myFileName

    Wir würde man jetzt aus der Fertigung und dem Button zur Erzeugung der Lieferungen auch die Erzeugung der PDFs dort (also in den Lieferungen) anstoßen?

    Ich müsste ja statt
     importFile(this, printAndSaveRecord(this,...

    etwa 
     importFile(that, printAndSaveRecord(that,

    ... definieren.

    Oder geht sowas gar nicht?

      • Arwin_Dustdar.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

        Yeehaaa!! Ich ha's hinbekommen:

      importFile(newL, printAndSaveRecord(newL,

      macht den Job.

      Also hier nochmal das ganze Script auf meinem Button in der Fertigung, von wo aus dann die Lieferungen jeweils per klick angelegt werden:

      let me := this;
      let newL := (create Lieferungen);
      newL.(
          Fertigungen := me;
          Destinationen := record(Destinationen,number(me.Destination));
          Adressen := record(Adressen,number(me.Lieferung_Ziel));
          Interne_Referenznummer := me.Nummer;
          Externe_Referenznummer := me.'FBA-ID';
          Bemerkungen := me.Lieferung_Bemerkung;
          let newPos := (create Lieferpositionen);
          newPos.(
              Lieferungen := newL;
              Produkte := me.Produkte;
              Menge := me.Lierferung_Menge
          );
          let myFileName := "Lieferschein_" + Nummer + "_vom_" + format(today(), "YYYY-MM-DD") + ".pdf";
          importFile(newL, printAndSaveRecord(newL, "Lieferschein_mit_Hinweis"), myFileName);
          Lieferschein_PDF := myFileName
      );
      Lierferung_Menge := null;
      Lieferung_Ziel := null
      

      Danke für die tolle Hilfe. 👍

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       
      Irgendwie funktioniert die Schaltfläche  "Gefällt mir" gerade nicht, deshalb hier: 👍