Ankündigung

Einklappen
Keine Ankündigung bisher.

Kompletten Datensatz mit Unterdatensätzen kopieren

Einklappen
X

Kompletten Datensatz mit Unterdatensätzen kopieren

Einklappen
  • Filter
  • Zeit
Alles löschen
neue Beiträge

  • Kompletten Datensatz mit Unterdatensätzen kopieren

    Hallo zusammen,

    ich möchte einen Datensatz (News) mit allen Unterdatensätzen (Empfänger/Verteiler) kopieren.

    Das Kopieren des Elterndatensatzes funktioniert super mit Hilfe der Funktion:

    function copyRecord(p_oButton)
    {
    var oFup = p_oButton.oUp.oFup;
    oFup.recId ="-1";

    return true;
    }

    Allerdings werden die Kinddatensätze (also die Empfänger) nicht mitkopiert.

    Hat jemand ein nachvollziehbares ähnliches Beispiel, dass er hier Bereitstellen könnte.
    Am Besten als LAX-Datei.

    Ich komme hier einfach nicht weiter.

  • #2
    Warum über JavaScript? nicht nicht über Groovy?

    Kommentar


    • #3
      Hi KimThomas,

      mir erschien der Ansatz per Javascript am einfachsten. Führt mich aber nicht zum Ergebnis :-(

      Könntest Du mir eine Lösung des Problems per Groovy aufzeigen.. wäre echt super.

      Lg
      intrexxer

      Kommentar


      • #4
        Ich mache es immer wie folgt:
        1. Datensatz der kopiert werden soll, per boolean markieren
        2. Prozess definieren der auf Datensatz Änderung reagiert ; Filter auf Markierung setzen
        3. Datengruppen Aktion; Datensatz hinzufügen und den Datensatz Kopf kopieren. Ich schreibe die alte LID in ein Int Feld.
        4. per Groovy Aktion Kinder kopieren
        Code:
        //==========================================================================================================================
        //Autor:
        //Datum:
        //Beschreibung:
        //letzte Änderungen:
        //==========================================================================================================================
        // Systemconfig aufbauen
        l_conn             = g_dbConnections.systemConnection
        //==========================================================================================================================
        //Variablen definieren
        def LID         = g_record["123......"].value /* datafield (PK) (S) ID <integer> */
        def myDate      = g_record["123....."].value /* datafield (S) ÄnderungsDatum <datetime> */
        //==========================================================================================================================
        //Daten selektieren
        def newFKLID    = g_dbQuery.executeAndGetScalarValue(l_conn, "SELECT LID FROM <Name der Datengruppe Eltern> WHERE L_LIDALT = ?" )
            {
            setInt(1, LID)
            }
        int newLid         = 0
        
        def stmt = g_dbQuery.prepare(l_conn, "SELECT LID, FKLID, REF_79CA2B70 FROM <Name der Datengruppe Kinder> WHERE FKLID = ?")
        stmt.setInt(1, LID)
        
        def rs = stmt.executeQuery()
        //==========================================================================================================================
        // größte LID ermitteln
        def MaxLid = g_dbQuery.executeAndGetScalarValue(l_conn, "SELECT MAX(LID) FROM "<Name der Datengruppe Kinder>", 0)
        newLid = MaxLid + 1
        //==========================================================================================================================
        // Insert Statement für Kinder schreiben
        def stmtInsert = g_dbQuery.prepare(l_conn, "INSERT INTO <Name der Datengruppe Kinder>(LID, FKLID, REF_79CA2B70) VALUES (?,?,?)")
        
        rs.each
        {
            stmtInsert.setInt(1, newLid)
            stmtInsert.setInt(2, newFKLID)
            stmtInsert.setInt(3, it.value(3))
            stmtInsert.executeUpdate()
            newLid = newLid + 1;
        }
        //==========================================================================================================================
        rs.close()
        stmtInsert.close()
        5. erneute Datengruppen Aktion um Markierungsfeld auf false zu setzen.

        Kommentar


        • #5
          Vielen Dank für Deine Hilfe.

          Mit Deinem Beispiel habe ich es hinbekommen.

          Lg
          intrexxer

          Kommentar


          • #6
            Hallo.
            Erstmal Danke das dieses Script hier eingestellt wurde.
            Ich habe hierzu noch eine Frage.

            Zitat von KimThomas Beitrag anzeigen
            3. Datengruppen Aktion; Datensatz hinzufügen und den Datensatz Kopf kopieren. Ich schreibe die alte LID in ein Int Feld.
            Was ist ein Datensatzkopf und wozu benötige ich die alte LID im neuen Datensatz ?


            Code:
            //==========================================================================================================================
            //Variablen definieren
            def LID = g_record["123......"].value /* datafield (PK) (S) ID <integer> */
            def myDate = g_record["123....."].value /* datafield (S) ÄnderungsDatum <datetime> */
            //==========================================================================================================================
            Wofür stehen die 2 "g_record" Variablen? Sind die vom Eltern - oder Kinddatensatz?

            Und muss man beim abschließenden INSERT alle Datenfelder der Eltern - und der Kinddatengruppe mit angeben.

            Kann man auch 2 oder mehr Kinddatengruppen mit duplizieren ?


            Viele Fragen - Ich hoffe auf Eure Unterstützung

            Gruß André

            Kommentar


            • #7
              Wir machen es, wenn keine Manipulation der Daten notwendig ist, meist ohne Skripte.

              Man braucht jeweils im Elterndatensatz und der/den Kinderdatengruppe(n) nur ein Feld CopyID (Ganzzahl bzw. String bei GUIDs).

              Mittels JS wird dann die recId des Buttons auf -1 gesetzt (wie im Eingangspost) und die aktuelle LID in das versteckte Feld CopyID geschrieben.
              Es entsteht beim Speichern nun ein neuer Datensatz mit der Quell-LID im Feld CopyID des neuen Datensatzes.

              Also startet der Prozess bei Ereignis "Datensatz einfügen" der Elterndatengruppe. Hier hängt sich also alles am Zieldatensatz auf.
              Nun eine Bedingung, ob CopyID definiert. Falls ja, eine Aktion "Datensatz ändern" (Folgeereignisse aktivieren!) auf die gewünschte Kinderdatengruppe, mit dem Filter Quelle=CopyID und Ziel=FKLID.
              Bei der Feldzuordnung die aktuelle LID in die (Kinder-)CopyID schreiben. In den Kinderdatensätze der Quelle steht nun die LID des neuen Zieldatensatzes.
              Am Ende dieses Prozesszweiges das Feld CopyID (im neuen Zieldatensatz) wieder leeren.

              Neuen Prozesszweig mit dem Ereignis "Datensatz ändern" für die Kinderdatengruppe angelegen.
              Nun wieder eine Bedingung, ob CopyID definiert. Falls ja, eine Aktion "Datensatz hinzufügen" für dieselbe Kinderdatengruppe anlegen.
              Bei der Datenfeldzuordnung muss jetzt nur die CopyID der FKLID des neuen Datensatz zugeordnet werden. LID wird automatisch erstellt/zugewiesen. Zusätzlich alle Felder welche man kopieren möchte zuordnen.
              Auch am Ende dieses Prozesszweiges das Feld CopyID (in den Kinderdatensätzen) wieder leeren.

              Fertig.

              Im ersten Zweig kann man die CopyID bei beliebig vielen Kinderdatengruppen hintereinander zuweisen. Und dann entsprechend viele Ereignisse für "Datensatz ändern" der jeweiligen Kinderdatengruppen erstellen. So kann man mehrere Kinderdatengruppen kopieren.
              Oder man arbeitet im Datensatzdialog mit Kontrollkästchen, um dem Benutzer die Wahl der zu kopierenden Kinderdatengruppen zu überlassen.
              Diese muss man dann nur im ersten Zweig in aufeinanderfolgenden Bedingungen auswerten (und am Ende ebenfalls wieder leeren).

              Das ist zwar definitv nicht die performanteste Lösung.
              Aber bequem und einfach zu konfigurieren oder nachzubearbeiten.
              Felder, die kopierte werden, können nicht einfach in der Applikation gelöscht werden - mit Verweis auf den Prozess. Ein Groovy-Skript würde da erst einmal auf die Bretter gehen.

              Kommentar


              • #8
                Also ich finde den Weg von KimThomas erstmal ganz symphatisch.
                Habe auch hinbekommen das der Elterndatensatz dupliziert wird und einige Datenfelder mit aktuellen Daten versehen werden (Manipulation der Daten).

                Es wird auch ein Folgeprozess angestossen der eine neue Nummer vergibt.

                Klicke auf die Grafik für eine vergrößerte Ansicht  Name: Rechnungen.png Ansichten: 1 Größe: 353,1 KB ID: 5933

                Nun weiß ich nicht wie es weiter geht.
                Die GrovvyAktion (Kinddatensätze anhängen) gibt einen Fehler aus ("Fehler bei der Datenverarbeitung").

                Auch weiß ich nicht wie ich jetzt eine neue Datengruppenaktion anstosse um die Markierung (Datensatz kopieren ) wieder zu löschen.
                Gibt es eine Reihenfolge wie der Prozess abläuft ?

                Gruß André

                Kommentar

                Lädt...
                X