Hallo liebe Access-Gemeinde,
ich habe ein Problem und hoffe auf Tipps für eine Lösung.
Folgende Konstellation (Access 2007):
In einem Unterformular erfasse ich bis zu sechs verschiedene Aufenthaltszeiten in einem Hotel. Z.B. Check_in1 = 15.03.11, Check_out1 = 18.03.11 - Check_in2 = 16.03.11, Check_out2 = 20.03.11 - Check_in3 = 17.03.11, Check_out3 = 19.03.11; Hintergrund: Bei jeder Checkin-Checkout-Zeit benötigen wir unterschiedliche Anzahl von Zimmern für jeweils die gleiche Veranstaltung.
Im HF habe ich zwei ungebundene Textfelder mit Anreise- und Abreisedatum. Ich möchte nun im Feld "Anreisedatum" automatisch den frühesten Checkin der gerade bearbeiteten Veranstaltung ausgeben lassen und analog dazu im Feld "Abreisedatum" automatisch den spätesten Checkout dieser Veranstaltung.
Ich bin mit VBA nicht so firm und hoffe deshalb auf Eure Hilfe! Gibt es eine Möglichkeit, dies so zu bewerkstelligen?
LG
Karin
Hallo,
die Check_in / Check_out Felder gehören in eine eigene Tabelle, jeweils ein Datensatz für Check_in / Check_out mit einem Bezug zur Veranstaltung. Es sind dann auch problemlos mehr als 6 Werte zu erfassen. Das Ermitteln eines Max/Min Wertes innnerhalb eines Datensatzes ist für Access ein Problem, da es nicht einem normalisierten Datenmodell entspricht. Du musst die Datumswerte in ein Array einlesen, das Array mit einer VBA Sortierung sortieren, erst dann hast Du den gesuchten Wert. Der Aufwand ist beträchtlich. Mit der vorgeschlagenen Extra Tabelle wäre das kein Problem, es genügt die Funktion Max() die aber nur auf Spalten anwendbar ist und nicht auf Felder innerhalb eines Datensatzes. Das ist ein deutlicher aber entscheidender Unterschied zu Excel.
Vielen Dank für Deine Antwort! Dann lass ich es so, wie es jetzt ist, denn der Aufwand lohnt nicht....
LG
Karin
Sind in deinem Unterformular nur die 6 Felder, oder ist es ein Endlosformular?
Wenn es nur die 6 Felder (Check_In/Out1 bis Check_In/Out3) sind dann kann man sowas ähnliches wie das hier machen:
dMinDatum=IIF(Forms("Unterformularname").Form("Check_In1") < Forms("Unterformularname").Form("Check_In1") , _
Forms("Unterformularname").Form("Check_In1") , Forms("Unterformularname").Form("Check_In2"))
dMinDatum=IIF(Forms("Unterformularname").Form("Check_In3") < dMinDatum , Forms("Unterformularname").Form("Check_In3") , dMinDatum)
Mit dem MaxDatum ist dan äquivalent zu verfahren.
Bei einem Endlosformular würde ich das eher über eine SELECT Abfrage machen, irgendwie so ähnlich:
...
Dim db as Database
Dim rs as Recordset
Set db=CurrentDb
Set rs=db.OpenRecordset("SELECT Min([Check_In1]) AS MinDatum1, Max([Check_Out1]) AS MaxDatum1, " & _
"Min([Check_In2]) AS MinDatum2, Max([Check_Out2]) AS MaxDatum2, " & _
"Min([Check_In3]) AS MinDatum3, Max([Check_Out3]) AS MaxDatum3 " & _
"FROM tblDeineTabelle WHERE VeranstaltungsID=" & Forms!Hauptformular!VeranstaltungsID & ";")
if rs=nothing then goto Fehler ' Syntaxfehler in SQL-Statement
if isnull(rs) then goto Fehler ' Kein Datensatz (a.k.a. Tabelle bzw. Ergebnismenge leer)
dMinDatum=rs!MinDatum1
dMaxDatum=rs!MaxDatum1
dMinDatum=IIF(rs!MinDatum2<dMinDatum,rs!MinDatum2,dMinDatum)
dMinDatum=IIF(rs!MinDatum3<dMinDatum,rs!MinDatum3,dMinDatum)
dMaxDatum=IIF(rs!MinDatum2>dMaxDatum,rs!MinDatum2,dMaxDatum)
dMaxDatum=IIF(rs!MinDatum3>dMaxDatum,rs!MinDatum3,dMaxDatum)
rs.close
...
Das "Aussenherum" musst du halt noch hinzufügen (Fehler abfangen etc.)
Hallo,
@imp666
es sind ja 6 Felder die verglichen werden müssen und nicht nur 3.
Es muss 1 mit 6, 1 mit 5, 1 mit 4 , 1 mit 3 1 mit 2, 2 mit 6 2 mit 5, 2 mit 4 usw. usw. verglichen werden
@MzKlMu:
ich denke dass ein Check_Out (rein logisch) immer NACH einem Check_In erfolgen sollte...
aber möglicherweise wird in der Zukunft im Zeitalter der Zeitreisen eine solche Möglichkeit in Betracht zu ziehen sein ;)
@
Zitataber möglicherweise wird in der Zukunft im Zeitalter der Zeitreisen eine solche Möglichkeit in Betracht zu ziehen sein
Das wollen wir mal lieber nicht hoffen. ;D
Ich hatte das so verstanden, dass das 6 Datumspaare sind, die da verglichen werden müssen und nicht nur 3.