Hallo,
ich suche eine Erweiterung für meinen bisher erstellten VBA-Code (siehe Anhang).
Mit dem Code soll die Hauptphase in Tabelle 1 für jede Id eingetragen werden.
Wenn die Hauptphase in Tabelle 2 den Wert 1 hat , ist diejenige Phase als Hauptphase einzutragen, die das früheste Von-Datum hat.
Das funktioniert auch soweit bis auf einen Fall:
Wenn bei einer Id die Von-Daten übereinstimmen und die Phasen nicht übereinstimmen (wie bei Id1), soll bei Hauptphase für die entsprechende Id "keine Zuordnung
möglich" eingetragen werden.
Hat jemand eine Idee, was ich noch einbauen muss, damit dieser Fall abgedeckt wird?
Vielen Dank.
Hat wirklich niemand eine Lösung?
Hallo,
das Problem scheint eher zu sein, dass niemand Dein Vorhaben/Problem versteht.
Das trifft wohl auch im anderen Forum zu.
http://www.office-loesung.de/p/viewtopic.php?f=167&t=717382
Deine DB kann ich mir nicht ansehen, da ich kein neueres Access (ACCDB) habe.
Oh, wenn man die nicht öffnen kann, ist es auch nicht zu verstehen. Sorry.
Ich habe folgende Tabelle gegegeben:
Hauptphase = 0 heißt, dass es keine Hauptphase ist.
Hauptphase = 1 heißt, dass es die Hauptphase ist.
Id Hauptphase von bis Phase
1 1 01/08/2014 01/08/2015 Phase 1
1 1 01/08/2014 01/08/2015 Phase 2
1 1 01/08/2015 01/08/2016 Phase 1
1 1 01/08/2015 01/08/2016 Phase 2
2 1 01/08/2015 01/08/2016 Phase 3
2 0 01/08/2015 01/08/2016 Phase 4
3 1 01/08/2015 01/08/2016 Phase 1
3 1 01/10/2015 01/08/2016 Phase 2
4 1 01/10/2015 02/08/2016 Phase 4
4 1 01/10/2015 03/08/2017 Phase 4
5 0 01/10/2013 01/07/2014 Phase 3
Ich möchte jetzt für jede Id die Hauptphase bestimmen:
Gibt es für eine Id nur eine Zeile mit Hauptphase = 1, kann die
entsprechende Phase übernommen werden (z.B. Id 2).
Gibt es für eine Id mehrere Zeilen mit Hauptphase = 1 (z.B. Id 3),
soll die Id mit dem frühesten Von-Datum als Hauptphase ausgewählt werden.
Ist das Von-Datum allerdings für mehrere Zeilen identisch und die Phasen jedoch unterschiedlich (z.B. Id 1), soll "keine Zuordnung möglich" angezeigt werden.
Gibt es nur Zeilen mit Hauptphase = 0 (z.B. Id 5), soll auch "keine Zuordnung möglich" angezeigt werden.
Als Ergebnis soll sich Folgendes ergeben:
Id Hauptphase
1 keine Zuordnung möglich
2 Phase 3
3 Phase 1
4 Phase 4
5 keine Zuordnung möglich
Ich hoffe, es ist nun ein wenig verständlicher. Ansonsten bitte nachfragen.
Danke.
Hallo,
zunächst einmal möchte ich dir empfehlen, in VBA immer die "Option explicit" zu setzen und den Code sinnvoll zu strukturieren (einrücken).
Ich habe das mal gemacht:
Option Compare Database
Option Explicit '#
Sub Test()
Dim db As DAO.Database
Dim SQL As String
Dim rstTab1 As DAO.Recordset
Dim tab2 As DAO.Recordset '#
Dim z As Integer '#
Set db = CurrentDb
Set rstTab1 = db.OpenRecordset("Tabelle1")
If Not rstTab1.EOF = True And Not rstTab1.BOF = True Then rstTab1.MoveFirst '#m.E. unnötig
Do While rstTab1.EOF = False
SQL = "SELECT Tabelle2.Id, Tabelle2.Hauptphase, Tabelle2.von, Tabelle2.bis, Tabelle2.Phase " & _
"FROM Tabelle2 " & _
"WHERE ((Tabelle2.Id) =" & rstTab1.Fields!Id & ") " & _
"ORDER BY Tabelle2.Von;"
Set tab2 = db.OpenRecordset(SQL)
If Not tab2.EOF = True And Not tab2.BOF = True Then tab2.MoveFirst '#m.E. unnötig
z = 0
Do While tab2.EOF = False
If tab2.Fields!Hauptphase = 1 Then
z = 1
rstTab1.Edit
rstTab1.Fields!Hauptphase = tab2.Fields!Phase
rstTab1.Update
Exit Do
End If
tab2.MoveNext
Loop
If z = 0 Then
rstTab1.Edit
rstTab1.Fields!Hauptphase = "keine Zuordnung möglich"
rstTab1.Update
End If
Set tab2 = Nothing
rstTab1.MoveNext
Loop
'Set rstFoeB = Nothing '#???
Set rstTab1 = Nothing '#
Set db = Nothing
End Sub
So ist es doch etwas übersichtlicher...
Es fällt auf, dass du den Fall
ZitatIst das Von-Datum allerdings für mehrere Zeilen identisch und die Phasen jedoch unterschiedlich (z.B. Id 1), soll "keine Zuordnung möglich" angezeigt werden.
gar nicht überprüfst. Dazu müsstest du ja das Von-Datum vergleichen.
Nebenbei bemerkt:
Die Code-Zeilen "if not rs.eof = true and not rs.bof = true then rs.movefirst" könnte man auch so schreiben:
"if not rs.eof and not rs.bof then rs.movefirst".
Sie sind aber überflüssig, da der rs-Zeiger nach Öffnen sowieso auf bof steht. Und wenn es nur genau einen Datensatz gibt, ist eof auch true, glaube ich jedenfalls (oder wird eof erst gesetzt, wenn man den letzen vorhandenen Record mit movenext verlässt? Das weiß ich gerade nicht... Bitte selbst prüfen, da ich momentan leider keine Zeit habe.)
Bevor wir also weitermachen, schau dir deinen Code selbst noch einmal an und baue die Von-Datum-Logik ein.
Unklar ist noch, wann deine Sub "Test" überhaupt aufgerufen werden soll und warum sie dann jedesmal die gesamte Tabelle1 abscannen soll.
Frohe Pfingsten,
c