Selecteren tussen bepaalde periodes

  • Onderwerp starter Onderwerp starter Risk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Risk

Gebruiker
Lid geworden
5 jul 2010
Berichten
275
Forum,

In mijn nimmer afkomende database (ik verzin steeds leukere en waardevolle mogelijkheden) woorden tijdstippen aangegeven. In een Query snap ik between etc.

Wat ik graag wil maken is in een formulier de mogelijkheid om te selecteren (reden is een analyse uitvoeren) tussen bepaalde tijdstippen. Stel 10:00 en 14:00. De reden is om een analyse uit te voeren wanneer er de meeste ongelukken gebeuren. Uiteraard gaat de uitkomst naar een rapport.

Heeft iemand de link naar de oplossing?

Met dank

Risk
 
Op dezelfde manier als bij datums, vrees ik; ik kan het niet leuker maken dan het is.
 
Durfde er haast niet vanuit te gaan dat dat in die richting moest.

Ga knutselen.

Risk
 
Zo moeilijk is dat niet; een datum is een geheel getal, de tijd is de breuk er achter. Dus daar kun je op exact dezelfde manier mee rekenen.
 
Michel,

Heb even geen beeld erbij. Als ik een veld maak en daarnaast nog een veld, dan krijg ik dus nooit een opsomming van alle tijdstippen die binnen de opgegeven tange vallen. Of stijgt de warmte nu al na een dagje zon en vertroebeld mijn gedachten.


Risk
 
Ik heb er ook geen beeld bij, want ik weet niet wat je wilt zien. Je hebt het tot nu toe alleen maar over een selectie gehad. Dat doe je met BETWEEN, zoals je zelf al aangaf.
 
Michel,

De bedoeling is dat ik in een selectieformulier een tijdsperiode kan selecteren.Die tijdstippen moet je naar mijn mening in twee velden opgeven. De uitkomst moet dan zijn de tijdstippen die liggen tussen bijv. 10:00 en 14:00. Als ik dat in een query maak met Between krijg ik dus standaard die selectie.

Ik zou graag de tijdstippen (tijdspanne) verschillend willen analyseren. Bijv. verfijnen naar 10:00 en 12:00 enz.

Ik hoor en leer graag.

Risk
 
En dat gaat op dezelfde manier als bij datums. Je kunt keuzelijsten maken die een begin- en een eindtijd pakken, en daar je criterium op baseren in de onderliggende query. Het maakt echt niet uit of je filtert op datums of op tijden. Wèl zou ik de waarden uit de keuzelijst converteren met TimeValue. Dan krijg je iets als bijgaand voorbeeld.

Inrichting: twee keuzelijsten met de namen cboBeginTijd en cboEindTijd. Keuzelijsten hebben geen RowSource, die worden met VBA toegewezen.
Op het formulier twee constanten gedeclareerd:
Code:
Option Compare Database
Option Explicit
Dim i As Integer, iSel As Integer
Dim arrTijd() As String
Dim strTijdLijst As String
Dim strSQL As String, strWhere As String
Const strTijd = "08:00;09:00;10:00;11:00;12:00;13:00;14:00;15:00;16:00;17:00;18:00;19:00;20:00;21:00;22:00"
Const strSQL_Basis = "SELECT Reserveringnr, Zaal, Startdatum, Einddatum, Aanmelder, Afdeling, Budgethouder, status FROM _Reserveringen " & vbCrLf

Bij het laden van het formulier wordt de keuzelijst cboBegintijd ingesteld.
Code:
    arrTijd = Split(strTijd, ";")
    strTijdLijst = ""
    For i = iSel To UBound(arrTijd) - 1
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) - 1 Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboBegintijd
        .RowSourceType = "Value List"
        .RowSource = strTijdLijst
    End With
Bij het kiezen van een Begintijd wordt de tweede keuzelijst ingesteld; die bevat alleen zinvolle waarden. Kies je 13:00 als begintijd, dan mag de eindtijd niet 11:00 zijn, maar moet beginnen vanaf 14:00.
Code:
Private Sub cboBegintijd_Click()
Dim strTijdLijst As String
    
    iSel = Me.cboBegintijd.ListIndex
    arrTijd = Split(strTijd, ";")
    For i = iSel + 1 To UBound(arrTijd)
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboEindtijd
        .Value = ""
        .RowSource = strTijdLijst
        .Requery
    End With
End Sub
Kies je een eindtijd, dan wordt (in mijn geval) het formulier gefilterd. Omdat ik een Datum/Tijd veld gebruik, moet ik het te filteren datumveld omzetten naar een tijd met TimeValue.
Code:
Private Sub cboEindtijd_Click()
    strWhere = "WHERE (([Startdatum] Is Not Null) AND (TimeValue([Startdatum]) Between #12/30/1899 " _
        & TimeValue(Me.cboBegintijd) & "# AND #12/30/1899 " & TimeValue(Me.cboEindtijd) & "#))"
    strSQL = strSQL_Basis & strWhere
    Me.RecordSource = strSQL
    Me.Details.Visible = True
    Me.Requery
End Sub
En dat werkt dus prima. Uiteraard kun je de filtering ook in een query zetten, maar ik hou daar niet van en doe dat dus nooit. Ofwel filteren op het formulier, ofwel de SQL van de query aanpassen.
 
Laatst bewerkt:
Michel,

Ziet er indrukwekkend uit en zover ik het nu begrijp kom ik wel een eindje.
Ga vanavond c.q. van het weekeinde ga ik e.e.a. bekijken.

We keep in touch.

Risk
 
Michel,

Excuus dat ik later aan de klus begin dan gepland.

Ik heb gemaakt een tabel met datum en tijden.

Een formulier met 2 keuzelijsten die nergens gekoppeld worden.

De beide codes begin en eindtijd al gebeurtenis geplakt achter de keuzelijsten bij <klikken>

Ben ik heel dom dat ik even worstel met het eerste 1e codeblok. Waar plaats ik die? En waar selecteert e.e.a. als ik in mijn testdatabase de Tabel1 voorzien heb van data?

In jou code staat ook een Startdatum. Die is vlgs. mij verder niet nodig om in het keuzeformulier te plaatsen.

Dan lees ik verder:
het te filteren datumveld omzetten naar een tijd met TimeValue
. Waar wijzig ik dit?

Graag een leermoment aanvullen. Ondanks de warme: op glas ijs.

Ik hoor graag. (inmiddels weet ik waar de juiste knopjes zitten op dit forum)

Risk
Code:
Option Compare Database


Private Sub cboBegintijd_Click()
Dim strTijdLijst As String
    
    iSel = Me.cboBegintijd.ListIndex
    arrTijd = Split(strTijd, ";")
    For i = iSel + 1 To UBound(arrTijd)
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboEindtijd
        .Value = ""
        .RowSource = strTijdLijst
        .Requery
    End With
End Sub
End Sub

Private Sub cboEindtijd_Click()
    strWhere = "WHERE (([Startdatum] Is Not Null) AND (TimeValue([Startdatum]) Between #12/30/1899 " _
        & TimeValue(Me.cboBegintijd) & "# AND #12/30/1899 " & TimeValue(Me.cboEindtijd) & "#))"
    strSQL = strSQL_Basis & strWhere
    Me.RecordSource = strSQL
    Me.Details.Visible = True
    Me.Requery
End Sub

Private Sub Form_Load()
   arrTijd = Split(strTijd, ";")
    strTijdLijst = ""
    For i = iSel To UBound(arrTijd) - 1
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) - 1 Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboBegintijd
        .RowSourceType = "Value List"
        .RowSource = strTijdLijst
    End With
End Sub
 
Als je naar je eigen code kijkt, dan zie je dat de eerste regel Option Compare Database is. Bij mijn code ook. Dat zou je een clue moeten geven waar dat blok moet komen te staan :)
Access gebruikt een Datum/Tijd type om in één veld zowel de datum als de tijd op te slaan. Het is aan de gebruiker om te bepalen wat hij wil opslaan/zien. Wil je alleen een datum, dan vul je het veld met Date(). Wil je de tijd, dan gebruik je Time(). In het eerste geval wordt de tijd op 0:00 gesteld, en in het laatste geval is de datum 0-1-1900. Wil je beide vastleggen, dan gebruik je Now(). Maar je krijgt dus altijd een datum en een tijd uit dit veld. Met Opmaak regel je wat je wilt zien. Bij een Datum hoef je doorgaans de tijd niet te zien, en omgekeerd. Vandaar dus dat in mijn code het filter op een datumveld gemaakt lijkt te zijn.
 
Michel,

Heb e.e.a. aangegepast. Krijg inhet formulier de selectie te zien (nog niet naar een rapport gekoppeld overigens, rapport maak ik nog) en krijg dan te zien:

Fout 2580 tijdens uitvoering:
De recordbron SELECT Tijdstip FROM _Tabel 1
WHERE (([Schadedatum] Is Not Null) AND (TimeValue([Schadedatum])
Between #12/30/1899 9:00:00#... die is opgegeven op dit formulier of in dit rapport, bestaat niet.

  1. Heb wat kleine aanpassingen gedaan inde code o.a. de bandbreedte van de tijden aangepast en Schadedatum ingevoerd. Om een tijdstip te selecteren is Schadedatum niet nodig of wel??
  2. Jou opmerking mbt Date() etc. Heb e.e.a. op korte tijdnotatie gezet in eigenschappen. Is dat juist? In de eigenschappen van de tabel zou ik dit niet weten te wijzigen.




Code:
Option Compare Database

Option Explicit
Dim i As Integer, iSel As Integer
Dim arrTijd() As String
Dim strTijdLijst As String
Dim strSQL As String, strWhere As String
Const strTijd = [COLOR="#FF0000"]"01:00;02:00;03:00;04:00;05:00;06:00;07:00;08:00;09:00;10:00;11:00;12:00;13:00;14:00;15:00;16:00;17:00;18:00;19:00;20:00;21:00;22:00;23:00;24:00"[/COLOR]
Const strSQL_Basis = "SELECT Tijdstip FROM _[COLOR="#FF0000"]Tabel1 [/COLOR]" & vbCrLf

Private Sub cboBegintijd_Click()
Dim strTijdLijst As String
    
    iSel = Me.cboBegintijd.ListIndex
    arrTijd = Split(strTijd, ";")
    For i = iSel + 1 To UBound(arrTijd)
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboEindtijd
        .Value = ""
        .RowSource = strTijdLijst
        .Requery
    End With
End Sub


Private Sub cboEindtijd_Click()
    strWhere = "WHERE (([COLOR="#FF0000"][Schadedatum][/COLOR] Is Not Null) AND (TimeValue([Schadedatum]) Between #12/30/1899 " _
        & TimeValue(Me.cboBegintijd) & "# AND #12/30/1899 " & TimeValue(Me.cboEindtijd) & "#))"
    strSQL = strSQL_Basis & strWhere
    Me.RecordSource = strSQL
    Me.Details.Visible = True
    Me.Requery
End Sub

Private Sub Form_Load()
   arrTijd = Split(strTijd, ";")
    strTijdLijst = ""
    For i = iSel To UBound(arrTijd) - 1
        strTijdLijst = strTijdLijst & arrTijd(i)
        If i < UBound(arrTijd) - 1 Then strTijdLijst = strTijdLijst & ";"
    Next i
    With Me.cboBegintijd
        .RowSourceType = "Value List"
        .RowSource = strTijdLijst
    End With
End Sub


Je hulp meer dan welkom ter leering en den vermaeck.

Risk
 
Je haalt een veld Tijdstip op, maar je doet de check op het veld Schadedatum. Lijkt mij een beetje vreemd. Ik zou minstens hetzelfde veld verwachten, dus ofwel filteren op Tijdstip, of Startdatum laten zien.
 
Michel,

Moet ik hier de Schadedatum vervangen door Tijdstip? Dan kom ik weer in de knop met Between. In mijn enthousiasme heb ik daar 00:00 en 24:00 van gemaak. Werkt niet. Alles terug en dan is bij foutoplossing te zien het rood geschreven ,maar in de foutopsporing geel gearceerde, gedeelte in de code.

Ik leer enhoor graag.

Risk


Code:
Private Sub cboEindtijd_Click()
    strWhere = "WHERE (([Schadedatum] Is Not Null) AND (TimeValue([Schadedatum]) Between #12/30/1899 " _
        & TimeValue(Me.cboBegintijd) & "# AND #12/30/1899 " & TimeValue(Me.cboEindtijd) & "#))"
    strSQL = strSQL_Basis & strWhere
   [COLOR="#FFFF00"][B] [COLOR="#FF0000"]Me.RecordSource = strSQL[/COLOR][/B][/COLOR]
    Me.Details.Visible = True
    Me.Requery
End Sub
 
Klopt de basissql wel?
 
Michel,

Wat is de basissql c.q. waar vind ik die ??

Risk
 
Wat dacht je hiervan:
Code:
Const strSQL_Basis = "SELECT Tijdstip FROM _Tabel1 " & vbCrLf
Je eigen code ;)
 
Michel,

Tijdstip = correct evenals Tabel1. Krijg de eerder genoemde foutmelding.

Snap even niet wat er niet klopt. Focus mij op de Schadedatum, maar die komt nergens voor in het formulier

Foutopsporing blijft hier naar verwijzen: Me.RecordSource = strSQL

Wat doe ik nog steeds fout??

Risk
 
Michel,

Begrip voor het feit dat je niet full time wekrt aan dit forum, maar zou je bi gelegenheid nog eens naar mijn probleem kunnen kijken?

Kom geen steek verder. Probleem blijft steeds opduiken.

Met dank
Risk
 
Maak een voorbeeldje :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan