PDA

Vollständige Version anzeigen : VBA: Vergleiche von Datensätzen


Shorty
05.10.2002, 21:14
Moin,

ich bin ein VBA-Neuling, der einen Schubs in die richtige Richtung gebrauchen könnte.

Folgendes Problem:

Tabelle Zeitraum: [ZR_Nr], [Beginn], [Ende]

Es sind bereits Zeiträume vorhanden. Nachdem ein neuer eingegeben wurde, soll er mit den bestehenden der Tabelle verglichen werden.
Also im Formular: Ereignisprozedur nach Aktualisierung von [Ende].
Es soll geprüft werden, ob der Zeitraum sich mit bestehenden überschneidet oder ob er innerhalb liegt.
Wie kann ich den neuen DS mit den vorhandenen vergleichen (z.B. mit dem davor oder mit
dem des jüngsten/ältesten Datums)?

Ich wäre für jeden Anstoss Dankbar.

Gruß,

Shorty

Nouba
05.10.2002, 22:15
Hallo Shorty,

<div><font face="Times New Roman, Times, serif">auf Tabellenebene kann eine Validierungsregel festgelegt werden, um eine Prüfung auf Datensatzebene zu erzielen.</font></div>
<pre><font face="Courier New, Courier, monospace">([Beginn] Is Null) Or ([Ende] Is Null) Or ([Ende]&gt;=[Beginn])
</font></pre>
<div><font face="Times New Roman, Times, serif">mit folgender Abfrage erhält man das kartesische Produkt. Überschneidungen werden jeweils 2x ausgegeben.</font></div>
<pre><font face="Courier New, Courier, monospace">SELECT Z1.ZR_Nr,
Z2.ZR_Nr,
Z1.Beginn,
Z2.Beginn,
Z1.Ende,
Z2.Ende,
([Z2.Beginn]&gt;=[Z1.Ende])
Or ([Z2.Ende]&lt;=[Z1.Beginn])
Or ([Z1.ZR_Nr]=[Z2.ZR_Nr]) AS KeineUeberschneidung
FROM Zeitraum AS Z1,
Zeitraum AS Z2
WHERE (((([Z2.Beginn]&gt;=[Z1.Ende])
Or ([Z2.Ende]&lt;=[Z1.Beginn])
Or ([Z1.ZR_Nr]=[Z2.ZR_Nr]))=False));
</font></pre>
<div><font face="Times New Roman, Times, serif">Mehr dazu steht unter <a href="http://users.bigpond.net.au/abrowne1/appevent.html">Clashing Events/Appointments</a>. Die Überprüfung auf Terminüberschneidung ist im AfterUpdate Ereignis der Form am einfachsten zu bewerkstelligen, mit etwas mehr Aufwand geht's vermutlich auch im BeforeUpdate der Form.</font></div>

Shorty
06.10.2002, 12:23
Danke Nouba,
das hat soweit funktioniert. Nur leider stecke ich schon wieder fest.
Ich hol mal weiter aus.
Ich beliefere Kunden täglich mit Ware. Die oben beschriebene Tabelle soll ein lückenloser "Zeitstrahl" sein. Jeder Datensatz ist an Bestellungen gebunden, also für jeden Zeitraum (ZR) eine bestimmte Lieferung.
Beispiel: Ein Kunde bekommt dieselbe Lieferung vom 1.6.2002 bis 31.12.2003. Nun ruft ein Kunde mich an und möchte z.B. ab dem 1.11.2002 für 2 Wochen eine andere Lieferung.
Ich gebe also einen weiteren DS ein (1.11.2002 bis 14.11.2002). Access soll nun automatisch drei Datensätze erzeugen (1.6. - 31.10. / 1.11. - 14.11. / 15.11. - 31.12.2003).
Der Kunde ruft mich wieder an und möchte länger beliefert werden. Vom 1.10.2003 - 1.4.2004 mit einer anderen Lieferung. Ich gebe diesen ZR als neuen DS ein. Access: 15.11.2002 - 30.9.2003 (abschneiden) / 1.10.2003 - 1.4.2004.
Also: Überschneidungen und Lücken sollen vermieden und automatisch gelöst werden und bestehende ZR sollen aufgeteilt werden, wenn ein neuer innerhalb liegt.

Gruß,

Shorty

Shorty
09.10.2002, 16:34
Für alle die es interessiert:
Ich habe obiges Problem inzwischen selbst lösen können. Per VBA ans Ereignis BeforeUpdate geknüpft:

Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection

Dim rs As New ADODB.Recordset
Dim dat1 As Date
Dim dat2 As Date

Dim tdat1 As Date
Dim tdat2 As Date
Dim tkunr As Long

dat1 = Me!BD_Datum1
dat2 = Me!BD_Datum2

rs.Open "SELECT * from BESTELLDATUM order by BD_Datum1", _
ActiveConnection:=CurrentProject.Connection, _
CursorType:=adOpenKeyset, _
LockType:=adLockOptimistic


Do Until rs.EOF

tdat1 = rs("BD_Datum1")
tdat2 = rs("BD_Datum2")
tkunr = rs("BD_KU_Nr")

' Prüfung, ob Zeitraum am ANFANG überschnitten wird
If dat1 &lt tdat1 And dat2 &gt tdat1 And dat2 &lt tdat2 Then

With rs
If .Supports(adUpdate) Then
!BD_Datum1 = dat2 + 1
.Update
End If
End With

' Prüfung, ob Zeitraum INNERHALB liegt
ElseIf dat1 &gt tdat1 And dat2 &gt tdat1 And dat2 &lt tdat2 Then

With rs
If .Supports(adUpdate) Then
!BD_Datum2 = dat1 - 1
.AddNew
!BD_KU_Nr = tkunr
!BD_Datum1 = dat2 + 1
!BD_Datum2 = tdat2
.Update
End If
End With

' Prüfung, ob Zeitraum am ENDE überschnitten wird
ElseIf dat1 &gt tdat1 And dat1 &lt tdat2 And dat2 &gt tdat2 Then

With rs
If .Supports(adUpdate) Then
!BD_Datum2 = dat1 - 1
.Update
End If
End With

' Prüfung, ob Zeitraum ÜBERLAGERT wird
ElseIf dat1 &lt tdat1 And dat2 &gt tdat2 Then

rs.Delete

End If

rs.MoveNext

Loop
rs.Close
Set rs = Nothing

cu

Shorty (mit Brett vorm Kopf)