0

Wie Lagerbestand in Tabelle B automatisch verringern wenn ich Tabelle A ein Teil gewählt wird?

Habe mich lang davor gedrückt, die jährliche Inventur bringt mich wieder dazu etwas an meiner Ninox App zu schrauben. Stehe aber grad wieder einmal auf dem berühmten Schlauch und erhoffe mir Hilfe :-)

In Tabelle A habe ich meine Auftragsverwaltung in der ich auch meine Ersatzteile aus Tabelle B auswählen kann. Das habe ich mit einer simplen Verknüpfung gelöst (siehe Screenshot). Wie kann ich es nun wohl noch lösen, dass in der Ersatzteiltabelle B der Lagerbestand des entsprechenden Teils um die links (ebenfalls in Tabelle A) gewählte Anzahl verringert wird?

16 Antworten

null
    • Pyromixer.1
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Screenshot vergessen:

    • Birger_H
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ganz einfach :-)

    Buchen Sie doch einen Termin für eine Screensharing-Session mit mir unter diesem Link:

    https://calendly.com/birger-hansen/15min

     

    Birger

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

    Das ja nett gemeint aber da muss ich leider Geld verdienen diese Tage. Ich bin Ninox-Nachtarbeiter, da ist dann wohl nichts mit Screensharing.

    Ein Lösungsansatz wäre aber nett, dann kann ich mal herum probieren :)

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo,

    grundsätzlich würde ich einen Button hinzufügen der folgenden Code ausführt:

    if number(text('Anzahl_1')) > 0 and 'Material_1' != null then
      'Material_1'.Lagerbestand := 'Material_1'.Lagerbestand - number(text('Anzahl_1'))
    end;
    if number(text('Anzahl_2')) > 0 and 'Material_2' != null then
      'Material_2'.Lagerbestand := 'Material_2'.Lagerbestand - number(text('Anzahl_2'))
    end;
    if number(text('Anzahl_3')) > 0 and 'Material_3' != null then
      'Material_3'.Lagerbestand := 'Material_3'.Lagerbestand - number(text('Anzahl_3'))
    end;
    if number(text('Anzahl_4')) > 0 and 'Material_4' != null then
      'Material_4'.Lagerbestand := 'Material_4'.Lagerbestand - number(text('Anzahl_4'))
    end;

    Die umständliche Arbeitsweise mit "number(text('Anzahl_1'))" ist dem geschuldet, dass Du kein numerisches Feld sondern ein Auswahlfeld genutzt hast und ich mir nicht sicher sein kann, ob die Einträge in der Reihenfolge den Werten entsprechen. Wenn das passt solltest du auch einfach 'Anzahl_1' nutzen können. Ich würde aber ein Mengenfeld eigentlich immer als numerisches Feld anlegen...

    Du solltest dir auch irgendwo abspeichern, dass Du die Mengen schon gebucht hast - sonst drückst du hinterher mehrfach auf den Button und bist ganz schnell deinen ganzen Lagerbestand los... ;) Das könnte z. B. mit logischen Feldern 'Material_1_gebucht' sein (natürlich auch für 2 bis 4). Der Code könnte dann so aussehen:

    if number(text('Anzahl_1')) > 0 and 'Material_1' != null and 'Material_1_gebucht' = false then
      'Material_1'.Lagerbestand := 'Material_1'.Lagerbestand - number(text('Anzahl_1'));
      'Material_1_gebucht' := true;
    end;

    Aber besprich das gerne per Session mit Birger - da scheint noch viel Potential zu sein.

    VG Frank

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Eigentlich sollte es als Trigger bei BEIDEN FELDERN (Material_1 und Anzahl_1) gehen:

    ---

    if Material_1 and Anzahl_1 then

    let myA:=number(Anzahl_1);

    Materilal_1.(Lagerbestand:=Lagerbestand-myA)

    end

    ---

     

    Da aber bei deiner Datenbank immer wieder verstekte Tabellen auftauchen, kann sein,  dass die Formel zu einfach gestrickt ist.

     

    Leo

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Oh, da war der Frank scneller.

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

    Danke schon mal... Werde nachher mal mit beiden Varianten herumspielen....

     

    Zitat:

    Die umständliche Arbeitsweise mit "number(text('Anzahl_1'))" ist dem geschuldet, dass Du kein numerisches Feld sondern ein Auswahlfeld genutzt hast und ich mir nicht sicher sein kann, ob die Einträge in der Reihenfolge den Werten entsprechen. Wenn das passt solltest du auch einfach 'Anzahl_1' nutzen können. Ich würde aber ein Mengenfeld eigentlich immer als numerisches Feld anlegen...

     

    Tja, das hatte ich gemacht da diese Felder nahezu ausnahmslos auf dem iPad verwendet werden. Draussen im Einsatz und es so eigentlich schneller geht da man nur zwei mal tabben muss um die Anzahl einzutragen. Ich kann das natürlich noch ändern wenn es deutlich einfacher geht.

     

    Ich werde es mal alles ausprobieren von Euren Vorschlägen :-)

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

    Puh.... Manchmal treibts mich zum Wahnsinn...

    Ich habe Eure beiden Vorschläge versucht in einen Code zu bekommen bei dem Ninox nicht meckert. Findet aber immer noch Fehler. Ich vermute es hat mit der Zuweisung der Materialtabelle zu tun oder irgendwelchen Tippfehlern mit den Apostrophen/Oberstrichchen welches bei links und bei mir rechts ist wenn ich die Material Tabelle wähle.

     

    Leos Lösung habe ich auch probiert, da findet Ninox die Tabelle angeblich nicht... Ich habe schon diverse Variationen probiert.

     

    Ich habe die Tabelle AUFTRAG in der wie oben zu sehen ist die Auswahlfelder drin sind. Und die Ersatzteile in einer Untertabelle namens MATERIAL. Der Bestand eines Artikels wird im Feld IST Bestand festgehalten.

    Ob man Material_1, Material_2, Material_3 oder Material_4 wählt hat nur mit der Nachbildung eines schon vorher vorhandenen Papierformulars zu tun welches ich nachbilden musste. Dort werden einfach 4 Zeilen für Material angezeigt und logischerweise fange ich mit Material_1 an und dann das nächste oder eben nichts. Alle 4 greifen aber auf die selbe MATERIAL Tabelle, also den selben Bestand zu.

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Na wenn das richtige Feld "IST Bestand" heißt muss zuminest das schon mal geändert werden... ausserdem will Ninox noch den aktuellen Datensatz dazu haben...

    var myAuftrag := this;
    if number(text(Anzahl_1)) > 0 and Material_1 != null then
      Material_1.('IST Bestand' := myAuftrag.Material_1.'IST Bestand' - number(text(myAuftrag.Anzahl_1)))
    end;
    if number(text(Anzahl_2)) > 0 and Material_2 != null then
      Material_2.('IST Bestand' := myAuftrag.Material_2.'IST Bestand' - number(text(myAuftrag.Anzahl_2)))
    end;
    ...

    In meiner schnell nach deinen Angaben dahingeklickten Datenbank funktioniert dies.

    Den Vorschlag von Leo den Code in den Änderungs-Trigger zu packen ist zwar technisch möglich - ich halte den aber für fehleranfällig. Da klickst du aus Versehen mal die Menge 5 an und schon ist der Bestand um 5 verringert - dann fällt dir auf, dass es doch nur 4 waren und du stellst auf 4 um - schon ist der Bestand um weitere 4 verringert - insgesamt also 9. Dann entweder noch eine Abfrage vorschalten oder eine Lösung finden, wie die bereits gebuchte Bestandsveränderung gespeichert und bei Änderung nur die Differenz nachgebucht wird.

    VG Frank

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ach ja - natürlich kannst du bei deinen Auswahlfeldern bleiben wenn dies deine Bedienung vereinfacht - unkonventionell... aber wenn es funktioniert... ;)

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Wie ich vermutet habe, nix stimmt mit den Uhrsprungsangaben. Ich würde dir empfehlen, die Datenbank mit Experten (hier Frank) zu teilen. Sonst ist es wie stille Post. 

    Leo

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

    Wow.... Ich weiss zwar nicht wieso Ihr immer so gut durch diesen Code Dschungel kommt aber: Dein letztes Ding funktioniert auf Anhieb. Schon mal vielen, vielen Danke!

    Da habe ich grad aus  eigener Schusseligkeit aber noch entdeckt, dass ich keine Rückmeldung oder Kontrolle habe ob nun schon gebucht wurde oder nicht. Wenn ich (aus Versehen) zweimal drücke sind natürlich auch 2 Teile weniger im Bestand. Ich werde den "Teile buchen" auch erst ganz am Ende der Kette einbauen. Dort wo ich auch den endgültigen PDF Bericht erstelle. Trotzdem wäre natürlich gut wenn der Button z.B. von von blau auf rot springt wenn eine Buchung durchgeführt wurde und dann auch gesperrt bleibt. Und z.B. einfach grau ist wenn gar keine Teile gewählt wurden... Das kriege ich vielleicht sogar selber hin.

     

    Das zurückbuchen falls die Teile dann doch nicht gebraucht werden ist wohl auch umständlich. In so einem Fall muss ich dann halt in die Lagerliste und das manuell machen.

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Das Thema der Doppelbuchungen habe ich ja in meinem ersten Beitrag schon angesprochen und einen Vorschlag gemacht.

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

    Sooo....

    Ich habe es nun mit vier Buttons gelöst, wobei immer nur einer davon zu sehen ist. Es sieht also aus als schalte das Ding je nach Status um. Das Ganze ganz am Ende wo ich auch den PDF Bericht generiere weil dann ziemlich sicher ist was wirklich für den Auftrag verbraucht wurde.

     

    Wenn keine Materialien gewählt wurden, also alle Materialfelder leer sind erscheint ein grauer Button "Kein Material". So sieht man sofort, dass keine Teile gebraucht wurden.

    Falls aus Versehen nur die Anzahl aber kein Teil gewählt wurde oder andersherum ein Teil gewählt wurde aber keine Anzahl eingegeben wurde erscheint ein roter Warnbutton "Fehler Material!" Dann muss man nochmal nachsehen was da faul ist. Wenn mind. einmal Anzahl mitsamt Teil gewählt wurde erscheint anstelle der beiden Buttons nun ein blauer Button "Teile buchen". So sieht man, dass irgendwelchen Teile gewählt wurden, kann nochmal nachsehen oder einfach drauf drücken und die Teile werden vom Bestand abgebucht.

     

    Und hier hänge ich nun wieder etwas: Ich habe noch einen vierten, roten Button "Teile gebucht" der mir anzeigen soll, dass bereits für diesen Auftrag Teile gebucht wurden. Wie aber münze ich das in einen Buttonbefehl um?

    • Frank_Schafer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Was soll denn der Button "Teile gebucht" noch machen? Der hat doch gar keine Aufgabe mehr, oder? Du brauchst ein Feld in dem du das speichern kannst. Nimm ein logisches Feld "Teile gebucht". Das setzt du zum Abschluß der Buchungsfunktion auf true und lässt es auch nur dann anzeigen. 

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

    Zitat: "Was soll denn der Button "Teile gebucht" noch machen? Der hat doch gar keine Aufgabe mehr, oder?"

    Nein. Hat rein optische Gründe weil immer ein Button an der Stelle angezeigt wird. Aber ich habs nun hinbekommen. Genauso wie Du es grad beschrieben hast gemacht. Nun funktioniert alles wie es soll :-)

     

    Gleichzeitig werden auch die Materialauswahlfelder und Anzahlfelder gesperrt, damit man da nach erfolgter Buchung nichts mehr verändern kann. Nur wenn man das logische Feld extra entsperrt wird gehts wieder... Das muss man also bewusst machen und kann dann auch den Bestand im Lager wieder berichtigen. Kommt eh selten vor so ein Fall.

     

    100% ist die ganze Sache sowieso nicht bei mir. Da kommen schon mal Teile wieder ins Haus die ich hin und wieder vergesse wieder einzupflegen usw. Wenn ich hier disziplinierter werde, dann würde es schon gut passen.

     

    Ich bedanke mich recht herzlich. Alle heutigen Tagesziele erreicht :-) DANKE!

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 16Antworten
  • 5441Ansichten