Hallo,
ich würde mich trotz Erfahrung in der VBA-Programmierung in Excel als Neuling in VBA im Bereich Access bezeichnen.
Ich habe zwei Tabellen in meiner Datenbank.
Die erste ist chronologisch folgendermaßen aufgebaut (nur ein Beispiel zur Verdeutlichung):
1. Tabelle.png
MaterialID ist der Primärschlüssel und MaterialID mit GeplantesProduktionsdatum ist der Alternativschlüssel.
Die zweite ist ebenfalls chronologisch aufgebaut und hat folgende Struktur (nur ein Beispiel zur Verdeutlichung):
2. Tabelle.png
MaterialID ist der Primärschlüssel und MaterialID mit TatsächlichesProduktionsdatum ist der Alternativschlüssel.
Wie schaut jetzt eine Prozedur aus, die mir für MaterialID 300 z. B. ausgehend vom zugehörigen Datum in der Planungstabelle alle Produktionsmengen in der Isttabelle mit MaterialID 300 die vor 14 Tagen vor dem geplanten Produktionsdatum bis zum geplanten Produktionsdatum inklusive summiert und in einer neuen Spalte in einer neuen Tabelle ausgibt?
Dazu soll es aber noch eine Spalte geben, die mir die Summe der Mengen ausgibt, die in den folgenden 5 Tagen tatsächlich produziert wurde.
Jetzt kommt aber der Knackpunkt: Diese zwei Berechnungen (Zeitraum davor und danach) sollen die geplante Menge 'auffüllen' und den Überschuss an die nächste MaterialID 300 weitergeben, falls dieser Überschuss in die jeweiligen Zeiträume dieser nächsten MaterialID 300 fällt. Falls es keine nächste MaterialID 300 gibt mit sich überschneidenden Zeiträumen, soll keine anteilige Menge weitergegeben werden und falls es eine Unterdeckung gibt, gibt es sowieso nichts zum Weitergeben.
Die Endtabelle würde also so ausschauen:
Endtabelle.png
Wie setze ich das in VBA um in Access?
Liebe Grüße
Sabrina
Zitat von: Sabrina am Juni 23, 2022, 16:05:13MaterialID ist der Primärschlüssel und MaterialID mit TatsächlichesProduktionsdatum ist der Alternativschlüssel.
Die Aussagen sind unverständlich.
Die MaterialID müsste ein Fremdschlüssel sein - ist also ein Primärschlüssel einer anderen Tabelle oder wie meinst du das?
Gibt es Tabellen mit Beziehungen - dann zeige ein Bild des Beziehungsfensters mit den Tabellen.
Hallo Markus,
ja, du hast Recht, es sind Fremdschlüssel. Allerdings spielt dies keine Rolle, weil die zwei Tabellen Ergebnisse von zwei separaten Abfragen sind, die aus folgenden Beziehungen stammen:
Beziehungen.png
Ich möchte lediglich in einer Spalte verfolgen, wieviele Istmengen in den 14 Tagen vor dem Plandatum und am Plandatum produziert wurden und in einer anderen Spalte, wieviele Istmengen in den 5 Tagen nach dem Plandatum produziert wurden.
Dies aber mit der Bedingung, dass tatsächlich produzierte überschüssige Mengen nur dann an die nächste identische MaterialID weitergegeben werden, wenn das Datum der tatsächlich produzierten überschüssigen Menge in ihre zwei Zeitfenster fallen.
Liebe Grüße
Sabrina
Zitat von: Sabrina am Juni 24, 2022, 15:00:36Allerdings spielt dies keine Rolle..
Es spielt keine Rolle, aber solche Aussagen stiften Verwirrung.
Zitat von: Sabrina am Juni 24, 2022, 15:00:36Ich möchte lediglich in einer Spalte verfolgen, wieviele Istmengen in den 14 Tagen vor dem Plandatum und am Plandatum produziert wurden und in einer anderen Spalte, wieviele Istmengen in den 5 Tagen nach dem Plandatum produziert wurden.
Ist das ein Problem für dich?
Zitat von: Sabrina am Juni 24, 2022, 15:00:36Dies aber mit der Bedingung, dass tatsächlich produzierte überschüssige Mengen nur dann an die nächste identische MaterialID weitergegeben werden, wenn das Datum der tatsächlich produzierten überschüssigen Menge in ihre zwei Zeitfenster fallen.
Dieser Teil ist dann doch etwas zu schwammig formuliert.
Anhand welcher Kriterien wird das konkret bestimmt und was ist, wenn die Kriterien nicht zutreffen?
ZitatWie setze ich das in VBA um in Access?
In einer Datenbankumgebung würde man sinnigerweise bevorzugt auf Abfragelösungen (SQL) setzen und VBA dann als Ergänzung einsetzen.
Ich könnte mir folgenden Workflow vorstellen:
1) Datensätze der Isttabelle entsprechend Anzahl in Einzeldatensätze auflösen, also Anzahl 80 ergibt 80 Datensätze.
Daten vervielfältigen mit Zahlen-Hilfstabelle (https://www.ms-office-forum.net/forum/showthread.php?t=298414)
2) Die Datensätze erhalten eine chronologische fortlaufende Nummerierung. Damit kann man Informationen darüber gewinnen, welche Stücke bereits in zeitlich zugeordneten Planungen verbraucht wurden und welche noch offen sind.
Für das Verwerfen oder Mitnehmen für folgende Zuordnungen sollte man auch verwendbare Regeln haben.
Auf der genannten Basis könnte man nun mit Abfragen anfangen, wo Datensätze aus Plan und überarbeitetem Ist per ID, Zeitraum und Anzahl zugeordnet werden.
Hallo,
vielen Dank nochmal für eure Inputs.
Ich habe es mittlerweile gelöst.
Ich habe eine Buchungstabelle (tblMaterialComparison) und eine Transaktionstabelle (tblMaterialActualsTransaction). Von der Transaktionstabelle werden Mengen in der Buchungstabelle nach folgendem Schema gebucht (Es werden mittlerweile vier Zeiträume berücksichtigt.):
Option Compare Database
Public Sub ComparePlanningWithActuals()
Dim dbs As DAO.database
Dim rstP As DAO.Recordset
Dim rstA As DAO.Recordset
Dim strSQL As String
Set dbs = CurrentDb()
Set rstP = CurrentDb.OpenRecordset("SELECT * FROM tblMaterialComparison ORDER BY PlannedStartingDate ASC", dbOpenDynaset)
Do While Not rstP.EOF
Set rstA = CurrentDb.OpenRecordset("SELECT * FROM tblMaterialActualsTransaction WHERE MaterialID=" & rstP!MaterialID & " ORDER BY ActualLaunchDate ASC", dbOpenDynaset)
Do While Not rstA.EOF
If rstA!DailySumOfTotalOrderQuantity <= -(rstP!Backlog) Then
If rstA!ActualLaunchDate <= rstP!PlannedStartingDate And rstA!ActualLaunchDate >= rstP!PlannedStartingDate - 14 Then
rstP.Edit
rstP!ProducedInTime = rstP!ProducedInTime + rstA!DailySumOfTotalOrderQuantity
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = 0
ElseIf rstA!ActualLaunchDate > rstP!PlannedStartingDate And rstA!ActualLaunchDate <= rstP!PlannedStartingDate + 5 Then
rstP.Edit
rstP!ProducedWithDelayOf5DaysMax = rstP!ProducedWithDelayOf5DaysMax + rstA!DailySumOfTotalOrderQuantity
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = 0
ElseIf rstA!ActualLaunchDate > rstP!PlannedStartingDate + 5 Then
rstP.Edit
rstP!ProducedWithDelay = rstP!ProducedWithDelay + rstA!DailySumOfTotalOrderQuantity
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = 0
ElseIf rstA!ActualLaunchDate < rstP!PlannedStartingDate - 14 Then
rstP.Edit
rstP!ProducedTooEarly = rstP!ProducedTooEarly + rstA!DailySumOfTotalOrderQuantity
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = 0
End If
ElseIf rstA!DailySumOfTotalOrderQuantity > -(rstP!Backlog) Then
If rstA!ActualLaunchDate <= rstP!PlannedStartingDate And rstA!ActualLaunchDate >= rstP!PlannedStartingDate - 14 Then
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = rstA!DailySumOfTotalOrderQuantity - -(rstP!Backlog)
rstP.Edit
rstP!ProducedInTime = rstP!ProducedInTime + -(rstP!Backlog)
ElseIf rstA!ActualLaunchDate > rstP!PlannedStartingDate And rstA!ActualLaunchDate <= rstP!PlannedStartingDate + 5 Then
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = rstA!DailySumOfTotalOrderQuantity - -(rstP!Backlog)
rstP.Edit
rstP!ProducedWithDelayOf5DaysMax = rstP!ProducedWithDelayOf5DaysMax + -(rstP!Backlog)
ElseIf rstA!ActualLaunchDate > rstP!PlannedStartingDate + 5 Then
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = rstA!DailySumOfTotalOrderQuantity - -(rstP!Backlog)
rstP.Edit
rstP!ProducedWithDelay = rstP!ProducedWithDelay + -(rstP!Backlog)
ElseIf rstA!ActualLaunchDate < rstP!PlannedStartingDate - 14 Then
rstA.Edit
rstA!DailySumOfTotalOrderQuantity = rstA!DailySumOfTotalOrderQuantity - -(rstP!Backlog)
rstP.Edit
rstP!ProducedTooEarly = rstP!ProducedTooEarly + -(rstP!Backlog)
End If
End If
If rstP.EditMode <> dbEditNone Then
rstP.Update
End If
If rstA.EditMode <> dbEditNone Then
rstA.Update
End If
rstA.MoveNext
Loop
If rstA.EditMode <> dbEditNone Then
rstA.Update
End If
If rstP.EditMode <> dbEditNone Then
rstP.Update
End If
rstP.MoveNext
Loop
strSQL = "INSERT INTO tblMaterialActualsTransactionHistory ( MaterialID, ActualLaunchDate, DailySumOfTotalOrderQuantity ) SELECT tblMaterialActualsTransaction.MaterialID, tblMaterialActualsTransaction.ActualLaunchDate, tblMaterialActualsTransaction.DailySumOfTotalOrderQuantity FROM tblMaterialActualsTransaction"
CurrentDb.Execute strSQL, dbFailOnError
strSQL = "DELETE tblMaterialActualsTransaction.* FROM tblMaterialActualsTransaction"
CurrentDb.Execute strSQL, dbFailOnError
rstP.Close
rstA.Close
dbs.Close
ExitProc:
Set rstP = Nothing
Set rstA = Nothing
Set dbs = Nothing
End Sub
Liebe Grüße
Sabrina