September 27, 2022, 23:05:33

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Abgleich von zwei Tabellen

Begonnen von Sabrina, Juni 23, 2022, 16:05:13

⏪ vorheriges - nächstes ⏩

Sabrina

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):
Sie dürfen in diesem Board keine Dateianhänge sehen.
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):
Sie dürfen in diesem Board keine Dateianhänge sehen.
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:
Sie dürfen in diesem Board keine Dateianhänge sehen.


Wie setze ich das in VBA um in Access?



Liebe Grüße

Sabrina

markusxy

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.


Sabrina

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:
Sie dürfen in diesem Board keine Dateianhänge sehen.

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

markusxy

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?

ebs17

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

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.

Mit freundlichem Glück Auf!

Eberhard

Sabrina

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