0

Server antwortet nicht / Abgleich zweier Tabellen

Hallo zusammen,

ich habe zwei Tabellen (Eine Import und eine Originale) und ich prüfe mit folgendem Code, ob sich ein Preis nach Import geändert hat:

 

 
let myImport := (select 'Artikel Import');

for i in myImport do

                let myOriginal := first(select 'Artikel' where nummer = i.nummer);

                if myOriginal then

                               if myOriginal.preis != i.preis then

                                               myOriginal.(preis := i.preis);

                                               myOriginal.('Änderung durch Import' := 2);

                                               myOriginal.('Geändert am (durch Import)' := format(now(), "DD-MM-YYYY hh:mm:ss"))

                               else

                                               myOriginal.('Änderung durch Import' := 1)

                               end

                else

                               let new := (create 'Artikel');

                               new.(nummer := i.nummer);

                               new.(Bezeichnung := i.Bezeichnung);

                               new.(preis := i.preis);

 

                               new.('Änderung durch Import' := 3)

                end

end

Es handelt sich um ca. 5500 Datensätze und leider geht Ninox jedes mal in die Knie. Der Server antwortet nicht oder es tut sich nichts. Habe auch mal versucht das gesamte Skript in "do as server" zu setzen, allerdings passiert dann auch nichts. Seht ihr Möglichkeiten den Code anders zu schreiben, sodass es für Ninox einfacher wird? 5500 Datensätze sollten doch möglich sein?

 

Vielen Dank im Voraus!

 

LG Sebastian

9 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Sebastian, hast du schon mal folgende Variante versucht?

     

    do as server
       for i in select 'Artikel Import' do
       [...]
    end

    • DV digital vereinfacht GmbH
    • Sebastian_Kalberg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Du meinst so?

    do as server
    for i in select 'Artikel Einstandspreise Import' do
    let myOriginal := first(select 'Artikel Einstandspreise' where Material = i.Material);
    if myOriginal then
    if myOriginal.Einstandspreis != i.Einstandspreis then
    myOriginal.(Einstandspreis := i.Einstandspreis);
    myOriginal.('Änderung durch Import' := 2);
    myOriginal.('Geändert am (durch Import)' := format(now(), "DD-MM-YYYY hh:mm:ss"))
    else
    myOriginal.('Änderung durch Import' := 1)
    end
    else
    let new := (create 'Artikel Einstandspreise');
    new.(Material := i.Material);
    new.(Bezeichnung := i.Bezeichnung);
    new.('Klassifizierung 1' := i.'Klassifizierung 1');
    new.(Produktgruppe := i.Produktgruppe);
    new.(Beschreibung := i.Beschreibung);
    new.(Materialtyp := i.Materialtyp);
    new.(Einstandspreis := i.Einstandspreis);
    new.(Materialklasse := i.Materialklasse);
    new.(Verkaufssperre := i.Verkaufssperre);
    new.('Änderung durch Import' := 3)
    end
    end
    end

     

    So habe ich es gerade versucht, es sah ganz gut aus, weil zumindest das "ladende Rädchen" kam... ich habe 5 min gewartet und dann kam "Der Server antwortet nicht" Sehr komisch.

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

    Wenn der Server nicht antwortet, liegt es wohl nicht am Code. Wende dich am besten mal an den Support.

    • Michi.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Bei mir lag es daran, das es zu lange dauerte. (Die abfrage an sich. 20 min) 

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Vielleicht so:

    ---

    let myImport := (select 'Artikel Import');
    let myOrig := (select Artikel);
    for i in myImport do
    if cnt(myOrig[nummer = i.nummer]) = 0 then
    let new := (create Artikel);
    new.(
    nummer := i.nummer;
    Bezeichnung := i.Bezeichnung;
    preis := i.preis;
    'Änderung durch Import' := 3
    )
    else
    if first(myOrig[nummer = i.nummer]).preis != i.preis then
    first(myOrig[nummer = i.nummer]).(
    preis := i.preis;
    'Änderung durch Import' := 2;
    'Geändert am (durch Import)' := format(now(), "DD-MM-YYYY hh:mm:ss")
    )
    else
    first(myOrig[nummer = i.nummer]).('Änderung durch Import' := 1)
    end
    end
    end

    ---

    • DV digital vereinfacht GmbH
    • Sebastian_Kalberg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Das funktioniert Leo. Es dauert zwar ca. 7 Minuten aber bei 5.500 Datensätzen vielleicht normal? Vielen Dank!

    • DV digital vereinfacht GmbH
    • Sebastian_Kalberg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hab das Skript von Leo jetzt noch als do as server probiert und das geht deutlich schneller < 1,5 min

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich werfe mal meinen Hut in den Ring.
    Der code von Leo funktioniert ja.
    Könnte man es nicht beschleunigen, wenn man statt der verschachtelten selec'st eine Verknüpfung etabliert.

    In beiden Tabellen scheint ja das Feld nummer zu existieren, welche die Abhängigkeit des Records der einen Tabelle mit dem Record der anderen Tabelle darstellt.
    Wenn man jetzt beim Import der csv auf den Änderungstrigger des Feldes Nummer, per select, die Verknüpfung etabliert. (Ich weiss nicht ob bei  Import von CSV der Trigger anspringt)
    Damit sollte doch die Änderung zügiger vonstatten gehen, da man das Suchen in 5500 Datensätzen vermeidet.
    Wie gesagt, das ist nur ein Gedanke wie ich es probieren würde wenn die beschriebenen Funktionsmöglichkeiten zutreffen.

    • DV digital vereinfacht GmbH
    • Sebastian_Kalberg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hi Uwe,

    ich verstehe die Idee, aber ich bin mir relativ sicher, dass ein Trigger nach CSV Import leider nicht möglich ist.