PDA

Vollständige Version anzeigen : BITTE DRINGEND UM HILFE!!!!!


computercomponents.at
19.06.2001, 14:59
Ich habe in einer Tabelle folgende Felder, in denen Öffnungszeiten von Firmen gespeichert werden:
MoVormVon, MoVormBis, MoNachVon, MoNachBis, DiVormVon, ....

Nun möchte ich hier die Daten (Uhrzeiten) auslesen und einen String in folgendem Format ausgeben:

Montag - Donnerstag: 08:00 - 18:00
Freitag: 08:00 - 12:00 und 13:00 - 18:00
Samstag: 08:00 - 12:00

Wie kann ich dieses Problem lösen?

Es müssen alle Sonderfälle Berücksichtigt werden ( So kann z.b. eine Firma zwar Mo, Di, Do und Fr geöffnet haben, nicht jedoch am Mittwoch)

Scorefun
19.06.2001, 16:32
waere es in Deinem Fall nicht einfacher, das gewünschte Ergebnis in einem einzigen Textfeld des Formats Memo komplett reinzutippen?

Ich glaube nicht, daß sich der Aufwand des Programmierens dafuer lohnen wuerde.

Oder hast Du weiterfuehrende Auswertungen mit den einzelnen Oeffnungszeiten vor?

computercomponents.at
20.06.2001, 06:20
Ja! Ich will in weiterer Folge auch noch auswertungen und Abfragen auf dieser Tabelle machen. Daher kann ich diese Zeiten leider nicht in dieser Form eintragen (lassen).

FW
20.06.2001, 08:47
... ich glaube, dass man zunächst die Datenbank-Struktur hinterfragen müsste.
Der Aufbau Deiner Tabelle macht für mich aus mehreren Gründen keinen Sinn. Ich halte es für sinnvoller, Haupt- und Detail-Tabellen anzulegen. Das würde Dich der Lösung Deines Problemes bestimmt näher bringen...

Kurt aus Kienitz
20.06.2001, 12:54
Hallo,

Der Einwand mit der Tabellenstruktur erscheint auch mir richtig.
Allerdings würde mir für das vorliegende Problem, auf Anhieb, keine Struktur einfallen die es einem leichter macht.

Um daß Problem zu lösen, braucht man wohl eine VBA-Funktion.
Diese bekommt als Parameter die ID der Firma mit und liefert den formatierten String zurück.

In einer Schleife (1 -6, Mo - Sa) werden nacheinander alle Von/Bis Zeiten ermittelt (Recordset oder DLookup) und mit den Zeiten des zuerst/zuletzt gelesenen Wochentages verglichen.

Wenn sich die Zeiten unterscheiden baut man einen String zusammen und setzt den aktuellen Wochentag als zuletzt gelesen Wochentag ein.

Um die Werte zu ermitteln kann man, in der Schleife, einer String-Variablen das Wochentagkürzel zuweisen (Mo, Di, Mi, etc.).

Ein DLookup könnte dann so aussehen:
DLookup("[" & WT & "NachBis]", "Oeffnungszeiten", "[FaID]=" & Str$(FirmaID))

Kurt aus Kienitz
20.06.2001, 13:38
Hallo nochmal,

Hier ein Beispiel:

Function GetOeffnungszeiten(FirmaID As Long) As String

Dim vVar As Variant ' für DLookup(), wg. NULL-Values
Dim sErg As String ' Ergebnis
Dim sTeilErg As String ' Teilergebnis
Dim i As Integer ' Zähler
Dim WT As String ' Wochentagkürzel

Dim AktWT As String ' Aktueller Datensatz
Dim AktVonVM As Date
Dim AktVonVMSet As Boolean ' Boolean, für den Fall daß NULL-Values gelesen werden
Dim AktVonNM As Date
Dim AktVonNMSet As Boolean
Dim AktBisVM As Date
Dim AktBisVMSet As Boolean
Dim AktBisNM As Date
Dim AktBisNMSet As Boolean

Dim LastWT As String ' Letzte unterschiedliche Datensatz
Dim LastVonVM As Date
Dim LastVonVMSet As Boolean
Dim LastVonNM As Date
Dim LastVonNMSet As Boolean
Dim LastBisVM As Date
Dim LastBisVMSet As Boolean
Dim LastBisNM As Date
Dim LastBisNMSet As Boolean
Dim LastI As Integer

Dim bSameValues As Boolean

For i = 1 To 7

Select Case i
Case 1:
WT = "Mo"
AktWT = "Montag"
Case 2:
WT = "Di"
AktWT = "Dienstag"
Case 3:
WT = "Mi"
AktWT = "Mittwoch"
Case 4:
WT = "Do"
AktWT = "Donnerstag"
Case 5:
WT = "Fr"
AktWT = "Freitag"
Case 6:
WT = "Sa"
AktWT = "Samstag"
Case 7:
' Samstag doppelt um die Formatierung (siehe unten) nur einmal
' codieren zu müssen.
WT = "Sa"
AktWT = "Samstag"
End Select

' Wert von z.B. [MoVormVon] ermitteln
vVar = DLookup("[" & WT & "VormVon]", "Oeffnungszeiten", "[FaID]=" & Str$(FirmaID))
If Not IsNull(vVar) Then
'
' NULL-Values beachten
'
AktVonVM = vVar
AktVonVMSet = True
Else
'
' wenn NULL-Value gefunden, dann Kennzeichen
' daß Wert nicht gesetzt ist
'
AktVonVMSet = False
End If

' Wert von z.B. [MoVormBis] ermitteln
vVar = DLookup("[" & WT & "VormBis]", "Oeffnungszeiten", "[FaID]=" & Str$(FirmaID))
If Not IsNull(vVar) Then
AktBisVM = vVar
AktBisVMSet = True
Else
AktBisVMSet = False
End If
vVar = DLookup("[" & WT & "NachVon]", "Oeffnungszeiten", "[FaID]=" & Str$(FirmaID))
If Not IsNull(vVar) Then
AktVonNM = vVar
AktVonNMSet = True
Else
AktVonNMSet = False
End If
vVar = DLookup("[" & WT & "NachBis]", "Oeffnungszeiten", "[FaID]=" & Str$(FirmaID))
If Not IsNull(vVar) Then
AktBisNM = vVar
AktBisNMSet = True
Else
AktBisNMSet = False
End If

If WT = "Mo" Then
'
' Im ersten Durchlauf werden die Daten einfach übernommen
'
LastWT = AktWT
LastVonVM = AktVonVM
LastVonVMSet = AktVonVMSet
LastBisVM = AktBisVM
LastBisVMSet = AktBisVMSet
LastVonNM = AktVonNM
LastVonNMSet = AktVonNMSet
LastBisNM = AktBisNM
LastBisNMSet = AktBisNMSet
LastI = i
Else
'
' Kennzeichen, daß die gelesenen Werte mit den
' "gemerkten" Werten übereinstimmen, auf TRUE setzen.
' Es ist einfacher festzustellen daß ein Unterschied
' vorhanden ist als festzustellen daß alle Werte
' gleich sind.
'
bSameValues = False
If LastVonVMSet = AktVonVMSet Then
bSameValues = True
If LastVonVMSet = True And LastVonVM <> AktVonVM Then
bSameValues = False
End If
End If

If LastBisVMSet = AktBisVMSet And bSameValues Then
If LastBisVMSet = True And LastBisVM <> AktBisVM Then
bSameValues = False
End If
End If

If LastVonNMSet = AktVonNMSet And bSameValues Then
If LastVonNMSet = True And LastVonNM <> AktVonNM Then
bSameValues = False
End If
End If

If LastBisNMSet = AktBisNMSet And bSameValues Then
If LastBisNMSet = True And LastBisNM <> AktBisNM Then
bSameValues = False
End If
End If

If bSameValues Then
'
' Wenn die Werte gleich sind, dann daß Teilergebnis formatieren
'
If LastI < i - 1 Then
'
' Wenn die gemerkten Werte mehr als einen Wochentag zurück liegen,
' dann Formatierung mit VonWochentag - BisWochentag
'
sTeilErg = LastWT & " - " & AktWT & ": "
If LastVonVMSet And LastBisVMSet And LastVonNMSet And LastBisNMSet Then
'
' Formatierung Vormittag Von - Vormittag Bis und Nachmittag Von - Nachmittag Bis
'
sTeilErg = sTeilErg & Format(LastVonVM, "hh:mm") & " - " & Format(LastBisVM, "hh:mm") & _
" und " & Format(LastVonNM, "hh:mm") & " - " & Format(LastBisNM, "hh:mm")
ElseIf LastVonVMSet And LastBisNMSet Then
'
' Formatierung Vormittag Von - Nachmittag Bis
'
sTeilErg = sTeilErg & Format(LastVonVM, "hh:mm") & " - " & Format(LastBisNM, "hh:mm")
Else
sTeilErg = sTeilErg & " undefiniert "
End If
Else
sTeilErg = LastWT & ": "
If LastVonVMSet And LastBisVMSet And LastVonNMSet And LastBisNMSet Then
sTeilErg = sTeilErg & Format(LastVonVM, "hh:mm") & " - " & Format(LastBisVM, "hh:mm") & _
" und " & Format(LastVonNM, "hh:mm") & " - " & Format(LastBisNM, "hh:mm")
ElseIf LastVonVMSet And LastBisNMSet Then
sTeilErg = sTeilErg & Format(LastVonVM, "hh:mm") & " - " & Format(LastBisNM, "hh:mm")
Else
sTeilErg = sTeilErg & " undefiniert "
End If

End If
End If

If Not bSameValues Or i = 7 Then
'
' Wenn die Werte unterschiedlich sind, dann Teilergebnis an Ergebnis anhängen.
' Das gleiche für den letzten Durchlauf (7 oder 2. mal Samstag)
'
sErg = sErg & sTeilErg & vbCrLf

LastWT = AktWT
LastVonVM = AktVonVM
LastVonVMSet = AktVonVMSet
LastBisVM = AktBisVM
LastBisVMSet = AktBisVMSet
LastVonNM = AktVonNM
LastVonNMSet = AktVonNMSet
LastBisNM = AktBisNM
LastBisNMSet = AktBisNMSet

LastI = i

End If

End If

Next i

GetOeffnungszeiten = sErg

End Function