0

Wie 2 Tabellen durchsuchen und Werte ändern?

Guten Abend, vermutlich SEHR einfach, aber ich komme nicht weiter:

Tabelle A, Feld A1 (Textfeld)
Tabelle B, Feld B1 (Textfeld)

Eintrag aus Tabelle A (A1) nehmen und in Tabelle B (B1) suchen.
Wenn identisch, dann Wert in Tabelle B, Feld B2 um 1 erhöhen.

Also Tabelle A, Feld A1 enthält Text „Druckwalze_11“
Wenn in Tabelle B, Feld B1, „Druckwalze_11“ steht, den Zahlenwert in B2 um 1 erhöhen.

Die Tabelle A soll komplett durchlaufen werden, ebenso die Tabelle B.

Für einen Vorschlag / Tip wäre ich sehr dankbar. 

15 Antworten

null
    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Die Tabellen nsind nicht verknüpft und die Aktion soll über eine Schaltfläche aus einem "externen" Formular erfolgen.
    Das vielleicht noch zu Erläuterung.

    • Torsten_Stang.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Holzi,

     

    das sollte es tun:

     

    for i in select 'Tabelle A' where 'A1' != null do
       let myA1 := i.'A1';
       for p in select 'Tabelle B' where 'B1' = myA1 do
          let myB2 := p.'B2'+1;
          p.'B2' := myB2
       end
    end

     

    lg, Torsten

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,
    besten Dank für den Code. Ich habe ihn angepasst

    Die Tabelle "Scans" mit dem Feld "Codecontent" und die Tabelle "Geraete" mit den Feldern "QRText" und "Bestand".
    Keine Fehlermeldung, aber leider passiert auch nichts (!), d.h. der Bestand wird nicht erhöht.

    for i in select Scans where Codecontent != null do
    let myCodecontent := i.Codecontent;
    for p in select Geraete where QRText = myCodecontent do
    let myBestand := p.Bestand + 1;
    p.(Bestand := myBestand)
    end
    end

    Vielleicht kannst Du ja nochmal draufsehen; ich finde den Fehler einfach nicht.

    Vielen Dank

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Holzi, hallo Torsten

    ---

    for i in (select Scans)[Codecontent] do
    (select Geraete)[Text = i.Codecontent].(Bestand := Bestand + 1)
    end

    ---

    Leo

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Guten Abend an Euch. @Leo: Beeindruckend kurzer Code, aber leider gleiches Ergebnis: Keine Fehlermeldung, aber auch keine Erhöhung des Bestands. Wegen des Codes: Die Tabellen sind nicht verknüpft.

    vielleicht gibt‘s ja doch noch eine Lösung? Ich bin mit meinem Latein am Ende.

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Holzi,

    Ich vermute, es stimmt etwas nicht bei dir. Ich habe mir dein Datenmodel nachgebaut und es funktioniert. Prüf bitte ob die Texte wirklich exakt gleich sind (keine leerzeiche am Anfang un Ende)

    Leo

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,
    Danke für die schnelle Antwort. Ja, ich habe hier noch irgendwo den "Wurm" drin. Ich melde mich wieder, sobald ich ihn habe (den Wurm).

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten, Hallo Leo,
    Eure Codes funktionieren einwandfrei. Der "Wurm" bei mir: Ich habe einen Artikelbezeichnung in einen QR-Code-tauglichen Text (Codecontent) umgewandelt dabei habe ich in der einen Tabelle einen Unterstrich (für Leerzeichen) doppelt eingesetzt. Beim Vergleich konnte der Code natürlich nicht passendes finden und daher auch keine Bestandserhöhung. So einen blöden Fehler muss man erst mal finden.

    Mit einer zweiten Schaltfläche verringere ich den Bestaand jeweils um -1. Wie könnte ich in Euren Code (an welcher Stelle sinnvollerweise) einen Dialog einbauen, der warnt / fragt , wenn der Bestand unter 1 zu gehen droht?

    Auf jeden Fall schon einmal vielen Dank für die Hilfe.

    • Torsten_Stang.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Holzi!

     

    for i in select Scans where Codecontent != null do
       let myCodecontent := i.Codecontent;
      for p in select Geraete where QRText = myCodecontent do
         let myBestand := p.Bestand + 1;
         if myBestand <= 0 then
            let myChoice := dialog("Achtung!","Bestand verringert sich auf "+myBestand+"!",["Okay","Bloß nicht!"]);
            if myChoice = "Okay" then

               p.(Bestand := myBestand)
            end
          end

       end
    end

    lg, Torsten

    • Torsten_Stang.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    örgs,

     

    let myBestand := p.Bestand + 1;

     

    muss natürlich

     

    let myBestand := p.Bestand - 1;

     

    heißen!

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Guten Morgen Torste,

    vielen Dank für die schnelle Antwort. Ich werde die Ergänzung gleich ausprobieren. Diese Forum ist einfach Gold wert und ich bewundere das Engegement und die Geduld der "Profis", wie z.B. auch Leo. Ich habe immer noch Probleme mit der Syntax von NINOX, da nirgends wirklich komplett beschrieben. Und manchmal kann ich __ nicht von _ unterscheiden :)

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Torsten natürlich

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    @Torsten: Da habe ich mich etwas zu früh gefreut:
    Bei Deiner Konstruktion wird die Bestandsreduzierung nur dann durchgeführt, wenn vorher der Dialog ausgeführt wurde.
    Der wird aber nur aufgerufen, wenn der Bestand <0 ist. = Die Katze beißt sich in den ....
    Ich habe folgendes versucht, führt aber zu einer Endlosschleife.
    Hast Du eine Idee?

    for i in select Scans where Codecontent != null do
    let myCodecontent := i.Codecontent;
    for p in select Geraete where QRText = myCodecontent do
    let myBestand := p.Bestand - 1;
    p.(Bestand := myBestand);
    if myBestand <= 0 then
    let myChoice := dialog("Achtung!", "Bestand verringert sich auf " + myBestand + "!", ["Okay", "Nein!"]);
    if myChoice = "Nein!" then
    let myBestand := p.Bestand + 1;
    p.(Bestand := myBestand)
    end
    end
    end
    end

    • Torsten_Stang.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Holzi,

     

    ja, den Bug hab ich extra für Dich versteckt, dachte Du bekommst es selbst raus. ;-)

     

    Nein, Spass beiseite, natürlich hab ich's an der Stelle verpennt, sorry!

     

    for i in select Scans where Codecontent != null do
       let myCodecontent := i.Codecontent;
      for p in select Geraete where QRText = myCodecontent do
         let myBestand := p.Bestand - 1;
         if myBestand <= 0 then
            let myChoice := dialog("Achtung!","Bestand verringert sich auf "+myBestand+"!",["Okay","Bloß nicht!"]);
            if myChoice = "Okay" then
               p.(Bestand := myBestand)
            end
         else
            p.(Bestand := myBestand)
         end
       end
    end

     

    lg, Torsten

    • Holzi
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Halo Torsten, funktioniert wie erwartet. Danke nochmals!
    Ich habe's noch ein wenig "aufgehübscht".

    for i in select Scans where Codecontent != null do
    let myCodecontent := i.Codecontent;
    for p in select Geraete where QRText = myCodecontent do
    let myBestand := p.Bestand - 1;
    if myBestand <= 0 then
    let myChoice := dialog("Achtung!", "Bestandsprüfung für : " + p.QRText + "
    Bestand verringert sich auf " + myBestand + " !" + "
    Wollen Sie das wirklich ?", ["Ja", "Nein!"]);
    if myChoice = "Ja" then
    p.(Bestand := myBestand)
    end
    else
    p.(Bestand := myBestand)
    end
    end
    end

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 15Antworten
  • 2522Ansichten