0

Massenbearbeitung mit Filterkriterium

Hallo liebe Mitstreiter,

könnt ihr mich bei folgenden Problem in die richtige Richtung "schubsen"?

Ich muss in einer großen Datenbank (>200.000 Zeilen) Spaltenwerte ("Lieferscheine") ändern. Darin verstecken sich wiederkehren Containerladungen, welche 26 Paletten mit 36 Modulen beinhalten.

Bisher habe ich mir händisch wie folgt geholfen:

Dazu filter ich zuerst die Datenbank nach der Spalten "Schiff-Container-Nr.". Danach filter ich noch einmal nach einer "Palettennr." und danach gehe ich über Massenbearbeitung um in der nun eingeblendeten Übersicht, die Spalte "Lieferschein" mit einem Wert (Lieferscheinnr.) zu befüllen.

Ich würde das gern vereinfachen und fehlerunanfälliger gestalten. Mein Idee dazu...

Ich erstelle eine Oberfläche mit den Filterkriterien "Schiff-Container-Nr.", ein Drop-Down Menü/Multiple-Choice-Menü für die dem "Schiff-Container-Nr." zugehörigen "Palettennr." und ein "Textfeld" hinter welchem eine Loop-Anweisung steckt, die alle oben gefilterten bzw. ausgewählten Zeilen mit dem im "Textfeld" eingegebenen Wert befüllt. 

Mit den Select Statement und eine Loop-Anweisung müsste das doch machbar sein oder habt ihr eine andere bessere Idee?

Ich bin für jede Hilfe sehr dankbar, meine Programmierkenntnisse sind sehr alt...

 

VG

Frank

3 Antworten

null
    • Developer by Smartplanung
    • smartplanung
    • vor 1 Jahr
    • Gemeldet - anzeigen
    • Dynamisches Auswahlfeld "Container-Nr" mit select Containertabelle
    • Dynamisches Auswahlfeld "Palettennr." mit:
      • let myContainer := number('Container-Nr');
        select Palettentabelle where Containertabelle = myContainer
    • Ansicht (Hierüber kann man sich zusätzlich Daten über den Container anzeigen lassen):

      • let myContainer := number(Container-Nr');
        let myPalette := number('Palettennr.');
        select Palettentabelle where Containertabelle = myContainer and Nr = myPalette
    • Textfeld "Lieferschein" - darin den neuen Lieferschein angeben
    • Entweder im Trigger oder mit einem Button:
      • let myContainer := number('Container-Nr');
        let myPalette := number('Palettennr.';
        let myLieferschein := Lieferschein;
        for i in select Palettentabelle where Containertabelle = myContainer and Nr = myPalette do
            i.Lieferschein := myLieferschein;
        end

         

    • Frank_Krischok
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Patrick, vielen Dank für deine Antwort. Leider komme ich nicht weiter es richtig umzusetzen. Kannst du mir bitte nochmal weiterhelfen?

    Ich habe diese "Master"-Tabelle mit 43056 Zeilen und mit den Spalten "Container No." und "Pallet No.". Ich würde jetzt gern ein Scipt aufsetzen und jeder Zeile einen Spaltenwert "Lieferscheine" hinzufügen möchte. Dafür will ich vorher nach der entsprechenden "Container No." filtern und dann nochmals nach den zugehörigen 26 verschiedenen "Pallet No." filter.

    Um das Umzusetzen habe ich eine neue Tabelle wie folgt aufgesetzt. Zuerst habe ich das dynamische Auswahlfeld "Container-Nr." aufgesetzt. Danach habe ich das dynamische Auswahlfeld "Palleten-Nr." aufgesetzt. 

    Mit dem jetzigen Code wird mir 936 mal die gleiche Containernr. (936  Zeilenwerte) angezeigt. Wenn ich einen Containerwert auswähle, wird mir nur eine Pallet-No., wahrscheinlich die zugehörige Nummer, angezeigt. Ich hoffe ich konnte meinen (Denk)Fehler so eingrenzen.

    Ich schicke gleich noch ein kurzes Video vom "Code".

     

    Schon einmal Besten Dank!

     

    Grüße

    Frank

      • Developer by Smartplanung
      • smartplanung
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Frank Krischok Hallo Frank,

      wenn ich das jetzt richtig sehe, hast Du die Tabellen so verknüpft, dass Du mehrere Lieferscheine auf einem Container haben kannst. Sollte es nicht anders herum sein? Also Pro Container ein Lieferschein? In dem Fall erstmal die Verknüpfung rausschmeißen und entsprechend die korrekte Richtung einfügen (In der Container Tabelle "==> Verknüpfung" auf Lieferscheine).

      Ergänzung zu obigen Text:

      Jetzt zum Schluss ist mir klar geworden, dass diese "csv" Tabelle alle Paletten anzeigt und darin der entsprechende Container angezeigt wird? Ich bin ursprünglich davon ausgegangen, dass es eine Tabelle nur mit Containern gibt und jeder Container dann per Untertabelle/Rückverknüpfung mehrere Paletten hat. Aber auch dann passt ggf. die Vermutung, dass Du vermutlich nur einen Lieferschein pro Datensatz/Palette haben möchtest.

       

      Zu den dynamischen Auswahlfeldern:

      Was mir vorher nicht bewusst war, Du hast in der "csv" Tabelle auch die gleiche Container-Nr. mehrfach drin. Jetzt ist wichtig, ob die Container-Nr. nur einmal vorkommen kann oder bei jeder Lieferung neu vergeben werden könnte und bei einer Lieferung von z.B. vor 3 Monaten schon mal vorhanden war. Wenn diese Nummer öfter vergeben wird, müssen die Scripte entsprechend auf einen einmaligen Wert (Datum, irgendeine Nummer, etc.) gefiltert werden, damit man auch die richtige Lieferung trifft. Wenn es diese Nummer jedoch nur einmal gibt und in deiner Tabelle jetzt nur bedingt durch die Paletten mehrfach vorkommt, kann man das dynamische Feld "Container-Nr." wie folgt füllen:

      let myContainer := unique((select deineContainerTabelle).'Container No.');
      sort(for i in myContainer do
              first((select deineContainerTabelle)['Container No.' = i])
          end)

      Somit wird immer nur die erste vorkommende Container-Nr. angezeigt.

      Bei dem dyn Auswahlfeld für die Palette dann folgendes:

      let myContainer := text('Container-Nr.')
      select deineContainerTabelle where 'Container No.' = myContainer

      Wenn ich das richtig sehe, gibt es keine Tabelle, wo nur Container aufgeführt sind. Demnach ist die "Container No." nur in einem Textfeld hinterlegt? Dann musst Du statt eine "Number" einen "String" mit "text()" aus dem dyn. Auswahlfeld erzeugen, da sonst die Datensatz-ID mitgegeben wird, was in deinem aktuellen Fall aber die ID einer Palette(?) ist. Deshalb wurde auch nur diese eine Palette in der Auswahl angezeigt.