0

Duplizieren eines Datensatzes

Hallo zusammen,

 

um die manuelle Anlage von neuen Datensätzen zu beschleunigen, könnte man den Datensatz kopieren. Die von Ninox bereitgestellte Kopierfunktion dupliziert den kompletten Datensatz aber das ist nicht zielführend, denn einige Felder müssen mit aktuellen Daten befüllt werden.

 

Daher habe ich ein Skript geschrieben, welches den Datensatz kopiert und danach direkt einige Felder auf null setzt.

 

let myRGNR := 'Rg-Nr.:';
for i in (select RechnungsManagement)['Rg-Nr.:' = myRGNR] do
    let new := duplicate(i);
    new.('Rg.-Dat.:' := null);
    let mycount := cnt((select RechnungsManagement)[year('Rg.-Dat.:') = year(today())]) + 1;
    let 'myRechnung-ID:' := "RE-" + year(today()) + "-" + format(mycount, "0000");
    new.('Rg-Nr.:' := "Abo-Vorgang");
    new.('FS-ID' := null);
    new.('SP-ID' := null);
    new.('Rg-Nr.:' := null);
    new.('Rechnung-ID:' := null);
    new.'Zahlaufträge'.(Betrag := null);
    new.(festgeschrieben := 0);
    new.('Rechnung-ID:' := 'myRechnung-ID:');
    alert("Der Datensatz wurde zur weiteren Verarbeitung kopiert!");
    popupRecord(new)
end

 

Die Schleife ist an dieser Stelle sicherlich überdimensioniert.

 

der zu kopierende Datensatz beinhaltet aber auch eine Untertabelle / verknüpfte Tabelle. Diese wird komplett mit kopiert unabhängig davon wievielt Datensätze sie beinhaltet. Aber gerade diese Untertabelle soll leer bleiben.

 

Wie kann ich das obige Skript ergänzen, dass die Untertabelle 'Buchungen' leer bleibt?

 

Viele Grüße

 

Michael

3 Antworten

null
    • Geschäftsführerin bei Kennes Digital
    • Stefanie_K
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo!

    In der Dokumentation heißt es zu duplicate():

    "Mit dieser Funktion erstellen Sie ein exaktes Duplikat des Datensatzes, auf den Sie diese Funktion anwenden. Außerdem werden verknüpfte Daten aus Untertabellen übertragen."

    Möchtest du das nicht, verzichte auf den Befehl und ersetze ihn durch 

    let my := this;

    let new:=create RechnungsManagement

    und dann lässt du nur die gewünschten Felder befüllen, z.B.

    new.Feld1 := my.Feld1;

    new.Feld2 := my.Feld2

    ...

     

    Da du nur einen Datensatz, nämlich den aktuellen kopierst, kannst du dir die Schleife komplett schenken. Wo immer möglich, sollte zugunsten der Performance ohnehin auf select-Befehle verzichtet werden.

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
    Michael said:
    Wie kann ich das obige Skript ergänzen, dass die Untertabelle 'Buchungen' leer bleibt?

    Nur der Vollständigkeit halber: Gar nicht. Beim "duplicate" erstellt Ninox immer erst mal eine exakte Kopie des Original-Datensatzes mit sämtlichen Daten (außer der Record-Nr). Man kann diese Daten im Script dann nachträglich verändern, indem man den Feldern andere Werte zuweist. Oder sie auch löscht, was im Fall der Untertabelle mit delete(new.Buchungen) möglich wäre.

    Es ist also prinzipiell immer eine Frage der Abwägung, wie viele Inhalte des Original-Datensatzes 1:1 in den neuen übernommen bzw. verändert werden sollen. Wenn das per Button für einen einzelnen Datensatz gemacht wird, spielt die Performance m. E. nicht die entscheidende Rolle. Man darf dabei durchaus auch den Umfang und die Übersichtlichkeit des Codes berücksichtigen. Ändern sich also im neuen Datensatz bspw. nur wenige von vielen Feldern, kann "duplicate" durchaus sinnvoll sein, insbesondere dann, wenn Daten aus Untertabellen eben doch übernommen werden sollen.

    In den meisten Fällen wird aber Stefanies Vorschlag mit "create" der bessere sein.

    • Michael.3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Stephanie,

    Hallo planox.pro,

     

    vielen Dank für die Erklärungen! Ich werde mir mal überlegen, was für mich die beste Lösung ist.

     

    VG

    Michael

Content aside

  • Status Answered
  • vor 1 JahrZuletzt aktiv
  • 3Antworten
  • 146Ansichten
  • 3 Folge bereits