none
schleife in VBA möglich?

    Frage

  • Hallo,

    ist die folgende gedankliche überlegung in access mit vba möglich?

    1. öffne tbl_forecast
    2. öffne tbl_bestand
    3. schaue, ob tbl_forecast.artikel + tbl_forecast.land in tbl_chargen vorhanden und wenn ja:
    3.1 nehme den ersten datensatz aus tbl_chargen und schaue, ob tbl_chargen.verfallsdatum  < tbl_forecast.forecast-datum und 
    wenn ja:
    3.1.1 gehe zum nächsten datensatz aus tbl_chargen mit gleichem artikel und gleichem land. falls vorhanden:
    3.1 prüfe, ob tbl_chargen.verfallsdatum  < tbl_forecast.forecast-datum und 
    wenn nein:
    3.2 prüfe, ob erster datensatz in tbl_chargen  tbl_forecast.Menge <tbl_chargen.chargengröße und tbl_forecast.Forecast-datum < tbl_chargen.verfallsdatum
    wenn ja,
    3.2.1 gehe zum nächsten datensatz in tbl_chargen und wiederhole 3.2, bis tbl_chargen_chargengröße <=0 oder tbl_forecast.Forecast-datum <= tbl_chargen.verfallsdatum
    wenn nein:
    gebe in einer spalte den zeitpunkt (tbl_forecast.forecast-datum) aus, an dem alle datensätze aus tbl_chargen in tabbele tbl_forecast subtrahiert wurden.

    Wäre über eine Antwort sehr dankbar.


    Sonntag, 14. Juni 2015 17:33

Alle Antworten

  • Das geht sicher, aber um da weiterzuhelfen, solltest du zuerst die drei beteiligten Tabellen mit den benötigten Feldern, ihren Primärschlüsseln und den Relationen zwischen den Tabellen beschreiben. Eine mehr inhaltliche Beschreibung des Problems und der gesuchten Lösung könnte auch hilfreich sein.

    Matthias Kläy, Kläy Computing AG

     
    Dienstag, 16. Juni 2015 09:07
  • Hallo Herr Kläy,

    folgende Info's kann ich abgeben:

    • Zwei Tabellen mit Datensätzen sind vorhanden.

    tbl_absatz: Enthält die prognostizierten Absätze für die Zukunft ab dem aktuellen Monat.

    Artikel  | Land | Absatz | Datum
    ------------------------------------
    12345   | USA  | 35     | 31.07.2015
    12345   | USA  | 7       | 31.08.2015
    12345   | USA  | 12     | 30.09.2015
    12345   | USA  | 21     | 31.10.2015
    12345   | USA  | 5       | 30.11.2015
    12345   | USA  | 31     | 31.12.2015
    12345   | USA  | 27     | 31.01.2016
    12345   | USA  | 15     | 28.02.2016
    12345   | USA  | 13     | 31.03.2016
    12345   | USA  | 19     | 30.04.2016

    tbl_bestand: Enthält den IST-Bestand. Jeder Datensatz ist eine Produktionscharge. Jede Charge kann ein unterschiedliches Verfallsdatum haben.

    Artikel   | Land | Chargengröße | Verfallsdatum
    ---------------------------------------------
    12345   | USA  | 59                      | 01.08.2015
    12345   | USA  | 26                      | 01.04.2016
    12345   | USA  | 45                      | 01.12.2015

    • Das Ziel soll es sein, dass die vorhandenen "Bestände" aus tbl_bestand mit dem Absatz aus tbl_absatz subtrahiert werden, damit die Reichweite bestimmt werden kann.

      Im oben genannten Beispiel wäre also der erste Schritt die Charge mit dem niedrigsten [Verfallsdatum] zu nehmen und [Chargengröße]-[Absatz] zu rechnen. Und zwar so lange, bis die [Chargengröße] von [Absatz] verzehrt wurde oder die Charge "verfallen" ist, also das [tbl_bestand].[Verfallsdatum]<=[tbl_absatz].[Datum] ist. 
      Mit der ersten Charge mit "59" Stk. würde ich bis zum 31.07.2015 kommen. (Aufgrund des Verfalls!).
      Nun soll die Schleife den nächsten Datensatz(Charge aus Bestand) mit dem nächst-höherem [Verfallsdatum] nehmen und gegen den [Absatz] rechnen. 
      Mit der Charge mit "41"Stk. komme ich bis in den Monat Oktober (30.11.2015). Leider kann man hier aber nicht den kompletten Absatz bedienen, es fehlt eine Menge von 4 Stk. Diesen Wert soll sich die Schleife merken. 
      Auf geht es zur letzten Charge in tbl_bestand. Die 4 Stk. sollten nun bereits von der [Chargengröße] 26 abgezogen werden. (=22Stk.) Mit diesen 22Stk. kann ich aber auch nur teilweise den Monat Dezember bedienen. Es bleibt ein Rest von 9 Stk.

    • Das ganze Ergebnis soll wie folgt in eine neue Tabelle "geschrieben/erstellt" werden:
    Artikel | Land | Datum     | Rest
    ---------------------------------
    12345   | USA  | 01.12.2015| 9

    Ich habe die aktuelle Lösung in Access mit "verschachtelten Wenn-Funktionen" sehr ungenau erledigt, weil ich in VBA zu wenig Erfahrung habe. Für meine weiteren Aufgaben benötige ich aber unbedingt eine zuverlässige Aussage über die Reichweite, weil dieser Wert auf späteren Berechnungen aufbauen wird.

    Ich hoffe ich habe es recht verständlich erklärt. Im Grunde genommen subtrahiert man die "Bestände" unter Berücksichtigung der Verfallsdaten mit dem Absatz in der Zukunft.

    Viele Grüße

    Dienstag, 16. Juni 2015 18:42
  • Ok, das verstehe ich schon besser. Aber damit die Zahlen im Beispiel in Text und Tabelle übereinstimmen, müsste in tbl_bestand am 1.12.2015 nicht 41 statt 45 stehen, und müsste es nicht heissen  "... komme ich bis in den Monat November (30.11.2015)" statt "...komme ich bis in den Monat Oktober (30.11.2015)?

    Nicht klar ist mir das Ende der Berechnung. Woher stammt das Datum 1.12.2015 in der Resultattabelle? Ist das von Aussen vorgegeben? Oder is es so, dass man den Rest zu jeder Charge in tbl_bestand berechnen möchte?

    Matthias Kläy, Kläy Computing AG

    Donnerstag, 18. Juni 2015 08:51
  • Hallo Herr Kläy,

    richtig, in der Eile und der Änderung einiger Daten zur Poblemveranschaulichung haben sich wohl ein paar Fehler eingeschlichen.

    Es müssten 41 dort stehen, wir kommen damit bis in den Monat November.

    Das Datum 1.12.2015 habe ich genommen, damit ich weiß, dass ich bis zum 1.12 auf jedenfall neue Ware produzieren muss. Man könnte hier mit Durchschnittsabsätzen pro Tag und dem Rest noch Tage hinzu addieren. Das wäre noch eine genauere Lösung.

    Ich bin schon wie wild am VBA "lernen", wenn es die Zeit zulässt. Aber wirklich weiter bin ich noch nicht. Aber ich kann schon recordsets öffnen :-)

    Viele Grüße

    Donnerstag, 18. Juni 2015 10:18
  • Option Compare Database Public Sub reichweite() Dim db As Database Dim rst_bestand As Recordset Dim rst_art As Recordset Dim rst_fc As Recordset Dim dbl_bestand_art_land As Double Dim RLZ As Date Dim dbl_bestand_minus_fc As Double Set db = CurrentDb Set rst_art = db.OpenRecordset("SELECT tbl_absatz.Artikel, tbl_absatz.Land FROM tbl_absatz GROUP BY tbl_absatz.Artikel, tbl_absatz.Land;") Set rst_bestand = db.OpenRecordset("SELECT * FROM tbl_bestand ORDER BY Artikel, Land, Verfallsdatum") While Not rst_art.EOF dbl_bestand_art_land = DLookup("Chargengröße", "tbl_bestand", "Artikel = '" & rst_art!Artikel & "' and Land = '" & rst_art!Land & "'") RLZ = DLookup("Verfallsdatum", "tbl_bestand", "Artikel = '" & rst_art!Artikel & "' and Land = '" & rst_art!Land & "'") Set rst_fc = db.OpenRecordset("SELECT * FROM tbl_absatz WHERE Artikel = '" & rst_art!Artikel & "' AND Land = '" & rst_art!Land & "'") dbl_bestand_minus_fc = dbl_bestand_art_land While Not rst_fc.EOF Do While dbl_bestand_minus_fc >= 0 dbl_bestand_minus_fc = dbl_bestand_minus_fc - rst_fc!FC If RLZ <= rst_fc!Datum Then Exit Do End If rst_fc.MoveNext

    ' DEBUG.PRINT Loop Wend rst_art.MoveNext Wend End Sub

    das ist bisher mein erste VBA-Code. Irgendwie will der nicht so richtig.Wenn ich oben an gekennzeichneter Stelle das Ergebnis im Direktfenster ausgeben lasse, dann stimmt zumindet schonmal der erste Schritt. Wann die erste Charge in welchem Monat mit welchem Wert ins "minus" geht. Aber sobald ich mit dem Debug.Print Zeilen weiter nach unten rutsche schmiert die Kiste ab!

    Donnerstag, 18. Juni 2015 12:57