0

Script/Button für Werte aus dem letzten Jahr ins aktuelle Jahr übertragen

Hallo zusammen,

ich stehe gerade vor dem Problem meine Kunden-Kalender Tour für dieses Jahr zu planen. 

Der erste Schritt dabei ist die Stückzahlen der bei den Kunden übergebene Kalender vom letzten Jahr als Planzahl in dieses Jahr zu übertragen.

In den letzten 1-2 Jahren habe ich nur noch wenig an der Datenbank geändert und sie eigentlich nur noch benutzt, deswegen bin ich aus dem Programmieren fast völlig raus 🙈. Eigentlich war ich wahrscheinlich auch nie richtig drin 🥴.

Ich habe eine Tabelle „Kalender Verteilung Jahre", in der die entsprechenden Daten gespeichert sind.

Es fehlt mir also ein Skript/Button, mit dem ich die Kalenderverteilung aus dem vorigen Jahr (in dem Fall 2021) als Planzahl in das aktuelle Jahr (2022) übernehmen kann, weil ich diese als Ausgangsbasis nehmen möchte.

Bedeutet also, dass das Skripts prüfen soll, bei welchen Firmen im Feld „Jahr" das vorherige Jahr (in dem Fall 2021) auftaucht, gleichzeitig muss bei „Besuch vereinbart“ und „Besuch erledigt" ein „JA“ stehen.

Daraus sollen dann für alle betroffenen Firmen neue Datensätze generiert werden. Ins Feld „Jahr“ soll das aktuelle Jahr (2022), beim Feld  „Mengen geplant“ das „JA“ reingeschrieben und jeweils bei den „Kalendern“ die Zahl aus dem vorherigen Jahr als Planzahl übernommen werden. 

Ich stehe da aber aktuell voll auf verlorenen Posten was die Erstellung des Skripts angeht, in den letzten Jahren habe ich die Übertragung immer manuell vorgenommen, wollte das jetzt aber mal automatisieren.

Vielleicht habt ihr dafür eine Lösung für mich. Würde mich sehr freuen.

Besten Dank und ein schönes Rest-Wochenende 

Markus

16 Antworten

null
    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Markus,

     

    hast Du pro Kunde eine Untertabelle "Jahre" oder führst Du alles in einer Tabelle? 

    Wie Du schon beschrieben hast, hast Du ja zwei Anforderungen: Du suchst nach bestimmten Kunden wo alle Bedingungen zutreffen (for-Schleife), und du musst einen neuen Datensatz erzeugen mit bestimmten Werten (create).

    Auf einem Button als Script:

    for i in select Kalender [Jahr = 2021 and "Besuch vereinbart" = 1 and "Besuch erledigt" = 1] do
    i.(
    let myWandkalender := Wandkalender;
    let myTischkalender := Tischkalender
    ... usw
    let myUnterlagen := 'Schreibtisch-Unterlagen';
    let newEntry := (create Kalender);
    newEntry.(Jahr := 2022);
    newEntry.(Wandkalender := myWandkalender);
    newEntry. ........ usw.
    newEntry.('Schreibtisch-Unterlagen' := myUnterlagen)
    )
    end
    

    Du gehst also in deiner Tabelle "Kalender" alle Datensätze durch wo die Bedingungen zutreffen, und bei jedem Treffer (i) holst Du dir zuerst die Werte in deine Variablen (im obigen Script abgekürzt) und schreibst mit diesen Variablen dann einen neuen Datensatz. Falls die Datensätze irgendwelche Verknüpfungen haben, musst Du diese auch auslesen und übertragen, wenn nicht, wird einfach nur deine Tabelle um weitere Einträge erweitert...

    LG

    Tobias 

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Tobias,

    vielen Dank für deine Antwort und Erklärung.

    Für die Verteilung der Kalender habe ich tatsächlich eine Tabelle „Kalender Verteilung Jahre", in der pro Jahr (und Unternehmen) ein Datensatz erzeugt wird. 
    Diese wiederum ist mit der Tabelle „Kalenderbesuche“ und die wiederum mit der Tabelle „Unternehmen“ per N:1 verbunden.

    Dann müsste ich wahrscheinlich in deinem obigen Script die Tabelle Kalender durch „Kalender Verteilung Jahre" ersetzen.

    Wenn ich das Skript allgemeingültig halten will (um nicht jedes Mal das Jahr zu ändern) müsste ich das 

    Jahr = 2021

    durch das vorherige Jahr und das 

    newEntry.(Jahr := 2022)

    durch das aktuelle ersetzen.

    Kann ich so etwas auch in das Skript einbauen?

    LG Markus

    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ja, du musst das natürlich an deine Tabellennamen anpassen.

    Mit Year(now()) kommst du an das aktuelle Jahr - das kannst du ja im Script ganz simpel mit -1 für das vorige Jahr anwenden.

    Jahr = year(now()) -1
    
    newEntry.(Jahr := year(now()))

    Wichtig: now mit zwei Klammern now()

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Klasse, dann werde ich das mal einbauen und testen. Vielen Dank 👍🏼

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Tobias,

    jetzt habe ich es endlich mal auf die Reihe bekommen, deinen Vorschlag zu testen.

    Leider ohne Erfolg - kein Eintrag in der Tabelle  „Kalender Verteilung Jahre" für das Jahr 2022. Dabei habe ich jetzt folgendes Script genutzt:

    for i in (select 'Kalender Verteilung Jahre')[Jahr = year(now()) - 1 and "Besuch vereinbart" = 1 and "Besuch erledigt" = 1] do
        i.(
            let myWandkalender := Wandkalender;
            let myTischkalender := Tischkalender;
            let myUrlaubsplaner := Urlaubsplaner;
            let myChefplaner := Chefplaner;
            let mySchreibtischkalender := Schreibtischkalender;
            let myUnterlagen := 'Schreibtisch-Unterlagen';
            let newEntry := (create 'Kalender Verteilung Jahre');
            newEntry.(Jahr := year(now()));
            newEntry.(Wandkalender := myWandkalender);
            newEntry.(Tischkalender := myTischkalender);
            newEntry.(Urlaubsplaner := myUrlaubsplaner);
            newEntry.(Chefplaner := myChefplaner);
            newEntry.(Schreibtischkalender := mySchreibtischkalender);
            newEntry.('Schreibtisch-Unterlagen' := myUnterlagen)
        )
    end
    

    Hast du noch eine Idee, woran es ggf. liegen könnte? Wahrscheinlich wieder nur eine Kleinigkeit.

    Und dann noch gleich eine anschließende Frage:

    Wenn ich für den Schalter für das Feld „Mengen geplant" in den Datensätzen für 2022 auf 1/Ja setzten will, reicht dieser Eintrag dafür aus?

    newEntry.('Mengen geplant' = 1)
    

    Viele Grüße
    Markus

    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Markus,

    in deinem Code oben fehlt eine letzte 1 bei "Besuch erledigt" =  ... das kann aber ein Kopierfehler sein.

    Schau doch erstmal, ob er dir mit diesen Bedingungen überhaupt Datensätze ausspuckt. Leg Dir ein Formelfeld an mit:

    concat((select 'Kalender Verteilung Jahre')[Jahr = year(now()) - 1 and "Besuch vereinbart" = 1 and "Besuch erledigt" = 1)

    Wenn Du dabei schonmal Datensatznummern bekommst ist gut, wenn nicht, stimmt etwas mit den Bedingungen nicht. Dann hat NINOX auch keine "i" mit denen gearbeitet werden kann.

    Du kannst zu Testzwecken diese for-Schleife auch in ein Formelfeld packen und dir die Daten anzeigen lassen, ohne neue Datensätze zu erzeugen:

    for i in (select 'Kalender Verteilung Jahre')[Jahr = year(now()) - 1 and "Besuch vereinbart" = 1 and "Besuch erledigt" = 1] do
        i.("Wandkalender: " + Wandkalender + "
    Tischkalender: " + Tischkalender + "
    Urlaubsplaner: " + Urlaubsplaner + "
    
    ")
    end
    
    
    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen
    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Tobias,

    T. Bartzsch said:
    Schau doch erstmal, ob er dir mit diesen Bedingungen überhaupt Datensätze ausspuckt. Leg Dir ein Formelfeld an mit:
    concat((select 'Kalender Verteilung Jahre')[Jahr = year(now()) - 1 and "Besuch vereinbart" = 1 and "Besuch erledigt" = 1)

    Wenn Du dabei schonmal Datensatznummern bekommst ist gut, wenn nicht, stimmt etwas mit den Bedingungen nicht. Dann hat NINOX auch keine "i" mit denen gearbeitet werden kann.

    wenn die Formel so aussieht (also z.B. ohne die eckigen Klammern), bekomme ich mit concat() auch Datensatznummern angezeigt:

    concat(select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1)
    

    ansonsten war es das Formelfeld leer.

    Genauso verhält es sich mit der for-Schleife, auch hier musste ich Klammern weglassen, um ein Ergebnis angezeigt zu bekommen.

    for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1 do
        i.("Wandkalender: " + Wandkalender + "
        Tischkalender: " + Tischkalender + "
        Urlaubsplaner: " + Urlaubsplaner + "
        Chefplaner: " + Chefplaner + "
        Schreibtischkalender: " + Schreibtischkalender + "
        'Schreibtisch-Unterlagen': " + 'Schreibtisch-Unterlagen' + "
        ")
    end
    

    Das als Basis genommen, werde ich das nachher nochmal mit dem Button testen, sollte dann ja auch funktionieren.

    Danke schon mal für den Hinweis. Schönen Feiertag noch

    Markus

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    so, dieses Script schreibt schon einmal die Werte in die Tabelle

    for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1 do
        i.(
            let myWandkalender := Wandkalender;
            let myTischkalender := Tischkalender;
            let myUrlaubsplaner := Urlaubsplaner;
            let myChefplaner := Chefplaner;
            let mySchreibtischkalender := Schreibtischkalender;
            let myUnterlagen := 'Schreibtisch-Unterlagen';
            let newEntry := (create 'Kalender Verteilung Jahre');
            newEntry.(Jahr := year(now()));
            newEntry.(Wandkalender := myWandkalender);
            newEntry.(Tischkalender := myTischkalender);
            newEntry.(Urlaubsplaner := myUrlaubsplaner);
            newEntry.(Chefplaner := myChefplaner);
            newEntry.(Schreibtischkalender := mySchreibtischkalender);
            newEntry.('Schreibtisch-Unterlagen' := myUnterlagen);
            newEntry.('Mengen geplant' := 1)
        )
    end
    

    Allerdings fehlen mir jetzt noch Angaben zu den Ansprechpartnern (Anrede + ASP) aus der Tabelle Kalenderbesuche (die mit der Tabelle  'Kalender Verteilung Jahre' verknüpft ist) und Angaben zu den Unternehmen (Mitglieds-Nr., Name + Ort) aus der Tabelle Unternehmen, die wiederum mit der Tabelle Kalenderbesuche verknüpft ist (siehe oben).

    So hab ich es versucht - klappt aber nicht:

    for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1 do
        i.(
            let myWandkalender := Wandkalender;
            let myTischkalender := Tischkalender;
            let myUrlaubsplaner := Urlaubsplaner;
            let myChefplaner := Chefplaner;
            let mySchreibtischkalender := Schreibtischkalender;
            let myUnterlagen := 'Schreibtisch-Unterlagen';
            let myAnrede := Kalenderbesuche.Anrede;
            let myASP := Kalenderbesuche.ASP;
            let myMGNR := Kalenderbesuche.Unternehmen.'Mitglieds-Nr.';
            let myName := Kalenderbesuche.Unternehmen.Name;
            let myOrt := Kalenderbesuche.Unternehmen.Ort;
            let newEntry := (create 'Kalender Verteilung Jahre');
            newEntry.(Jahr := year(now()));
            newEntry.Kalenderbesuche.(Anrede := myAnrede);
            newEntry.Kalenderbesuche.(ASP := myASP);
            newEntry.Kalenderbesuche.Unternehmen.('Mitglieds-Nr.' := myMGNR);
            newEntry.Kalenderbesuche.Unternehmen.(Name := myName);
            newEntry.Kalenderbesuche.Unternehmen.(Ort := myOrt);
            newEntry.(Wandkalender := myWandkalender);
            newEntry.(Tischkalender := myTischkalender);
            newEntry.(Urlaubsplaner := myUrlaubsplaner);
            newEntry.(Chefplaner := myChefplaner);
            newEntry.(Schreibtischkalender := mySchreibtischkalender);
            newEntry.('Schreibtisch-Unterlagen' := myUnterlagen);
            newEntry.('Mengen geplant' := 1)
        )
    end
    

    Hab ich da noch einen Syntax-Fehler? Oder muss ich die beiden Tabellen noch irgendwie zusätzlich einbinden?

    Viele Grüße
    Markus

    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ja immerhin, ein Teilerfolg. Wenn Du allerdings so viele Untertabellen und Verknüpfungen hast, wäre es u.U. sinnvoller die in der for-Schleife gefundenen Datensätze mit duplicate(this) zu duplizieren, und dann im duplizierten Datensatz das Jahr zu ändern und evtl. einige Schalter wie 'Besuch geplant' usw. auf Null zu setzen, statt sich mühsam alle Variablen zu holen ... Verknüpfte Tabellen werden immer über die Datensatz ID (Nr) definiert. Die musst du vorher abfragen und zuweisen:

    let myKalenderbesuche := Kalenderbesuche.Nr

    ....

    newEntry.(Kalenderbesuche := myKalenderbesuche)

    damit stellst Du erstmal die Verknüpfung auf einen Datensatz her. Die einzelnen Felder in Kalenderbesuche musst du dann ja nicht mehr befüllen, da du ja eine Verlinkung auf einen Datensatz anlegst...

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Jepp - mühsam ernährt sich... 🥴

    Ich befürchte, ich kann dir gerade nicht ganz folgen.

    Zum einen könnte ich duplicate benutzen. Wie sieht denn dann der das Script aus?

    duplicate(for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1)
    
    oder?
    
    for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1 ;
    duplicate(this)
    

    Ist das eine zusätzliche Möglichkeit mit der Datensatz ID?
    Muss das dann nur für diese Bereiche in das Script rein 🤔?

            newEntry.Kalenderbesuche.(Anrede := myAnrede);
            newEntry.Kalenderbesuche.(ASP := myASP);
            newEntry.Kalenderbesuche.Unternehmen.('Mitglieds-Nr.' := myMGNR);
            newEntry.Kalenderbesuche.Unternehmen.(Name := myName);
            newEntry.Kalenderbesuche.Unternehmen.(Ort := myOrt); (empty)

    Viele Grüße
    Markus 

    • Markus.1
    • vor 2 Jahren
    • Gemeldet - anzeigen
    • T_Bartzsch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Super. Gern, das Forum ist eine der wichtigsten Anlaufstellen für solche Anliegen...

    Zur Ergänzung:

    Wenn Du einen Datensatz via duplicate(this) duplizierst, werden auch alle Verknüpfungen usw. dupliziert. In deinem Fall, wenn die for-Schleife einen Datensatz findet dann i.duplicate(this)

    Dann musst du zusätzlich noch den letzten Datensatz in der Tabelle suchen (das ist ja dann der duplizierte) und nach Bedarf einige Felder ändern. 

    Je nach Fall ist mal die eine, mal die andere Lösung mit weniger Aufwand verbunden

    for i in select 'Kalender Verteilung Jahre' where Jahr = year(now()) - 1 and 'Besuch erledigt' = 1 do
        i.(
            duplicate(this);
            last(select 'Kalender Verteilung Jahre').(Jahr := year(now))
             ... usw
        )
    end
    
      • Markus.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      T. Bartzsch Hallo Tobias, danke für die Ergänzung und die Erklärung dazu. Das werde ich auf jeden Fall mal mit der Testdatenbank testen

    • Ninox-Professional
    • planoxpro
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo, ohne mir jetzt jedes Feld genau angesehen zu haben, würde ich es mal in der Art versuchen:

    for i in (select Kalender)[Jahr = 2021 and 'Besuch vereinbart' and 'Besuch erledigt'] do
       let newEntry := duplicate(i);
       newEntry.(
          Jahr := 2022;
          'Besuch vereinbart' := false;
          'Besuch erledigt' := false
       )
    end
    

    Damit würden alle Datensätze, die dem Filterkriterium entsprechen, mit sämtlichen Daten in einen neuen Datensatz kopiert und in diesem die Werte von 'Jahr', 'Besuch vereinbart' und 'Besuch erledigt' geändert.

      • Markus.1
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro danke dir, auch das werde ich mal testen. Kann ja nicht schaden, mehrere Wege zu kennen 😊

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 16Antworten
  • 137Ansichten
  • 3 Folge bereits