Check datum reservering via SQL

Status
Niet open voor verdere reacties.

janrunhart

Gebruiker
Lid geworden
6 mei 2010
Berichten
21
Beste lezers,

Ik ben aan het "pielen" met de SQL instructie voor het volgende probleem:

Ik heb een tabel tbl_uitgegeven
In deze tabel zitten de columns:

c_gereedschap : Dit is het ID(INT) van de gereedschappen die uitgegeven gaan worden
c_reservering_van : Datumveld reservering vanaf
c_reservering_tot : Datumvel reservering tot

Tevens heb ik een formulier met hierin de volgende velden:

gereedschap
reservering_van
reservering_tot

Nu wil ik bij het opslaan/wegschrijven van het ingevulde record in het formulier nagaan of de gewenste periode beschikbaar is. Nu heb ik de volgende code, maar zie niet waar ik de mist in ga:





Code:
Dim strSQL As String


strSQL = "SELECT c_gereedschap, c_reservering_van, c_reservering_tot" & vbCrLf
strSQL = strSQL & "FROM tbl_uitgegeven" & vbCrLf
strSQL = strSQL & "WHERE tbl_uitgegeven.c_gereedschap = Me.gereedschap" & vbCrLf
strSQL = strSQL & "AND tbl_uitgegeven.c_reservering_van Between Me.reservering_van And Me.reservering_tot" & vbCrLf
strSQL = strSQL & "OR tbl_uitgegeven.c_reservering_tot Between Me.reservering_van And Me.reservering_tot;"

With CurrentDb.OpenRecordset(strSQL)
     If .RecordCount > 0 Then
            MsgBox "Aanwezig"
     Else
            MsgBox "Niet Aanwezig"
    End If
End With

Iemand een ideetje?!

Groet,

Jan
 
Jan,

Kijk eens goed naar de sql-string.
Alles tussen de aanhalingstekens wordt letterlijk zo geinterpreteerd.

bv.:
het gedeelte met: "WHERE tbl_uitgegeven.c_gereedschap = Me.gereedschap"
De instructie kijkt dus op c_gereedschap gelijk is aan de tekst Me.gereedschap.
Dit zou moeten zijn:
"WHERE tbl_uitgegeven.c_gereedschap =" & Me.gereedschap

Nu verwijs je echt naar het veld op je formuliuer.
Hetzelfde geld voor de andere WHERE delen in je SQL-string

Groeten,

Paul
 
Paul,

Dank voor je reactie. Je hebt helemaal gelijk m.b.t. tot de string. Ik heb het nu aangepast, enkel dit lost het probleem nog niet geheel op.

Ik krijg nu het probleem: Typen komen niet met elkaar overeen:

Code:
Dim strSQL As String


strSQL = "SELECT c_gereedschap, c_reservering_van, c_reservering_tot" & vbCrLf
strSQL = strSQL & "FROM tbl_uitgegeven" & vbCrLf
strSQL = strSQL & "WHERE c_gereedschap =" & Me.gereedschap & vbCrLf
strSQL = strSQL & "AND c_reservering_van Between" & Me.reservering_van And Me.reservering_tot & vbCrLf
strSQL = strSQL & "OR c_reservering_tot Between" & Me.reservering_van And Me.reservering_tot

With CurrentDb.OpenRecordset(strSQL)
     If .RecordCount > 0 Then
            MsgBox "Aanwezig"
     Else
            MsgBox "Niet Aanwezig"
    End If
End With
 
Jan,

Ook de AND in de laatse 2 regels moeten tussen aanhalingstekens!
Heb even de juiste code ingetikt.

Code:
Private Sub reservering_tot_AfterUpdate()
  Dim strSQL As String
  strSQL = "SELECT c_gereedschap, c_reservering_van, c_reservering_tot" & vbCrLf
  strSQL = strSQL & " FROM tbl_uitgegeven" & vbCrLf
  strSQL = strSQL & " WHERE c_gereedschap =" & Me.gereedschap & vbCrLf
  strSQL = strSQL & " AND c_reservering_van Between " & Me.reservering_van & [B]" And " &[/B] Me.reservering_tot & vbCrLf
  strSQL = strSQL & " OR c_reservering_tot Between " & Me.reservering_van [B]& " And " &[/B] Me.reservering_tot

  With CurrentDb.OpenRecordset(strSQL)
    If .RecordCount > 0 Then
      MsgBox "Aanwezig"
    Else
      MsgBox "Niet Aanwezig"
      [B]Me.Undo[/B]    End If
  End With
End Sub

Let er ook op dat indien niet aanwezig je de record niet opslaat! (Undo)

Groeten,

Paul
 
Paul,

Voor zover krijg ik in ieder geval geen foutmeldingen meer MAAR:

Het probleem is dat hij de datumvergelijkingen niet uitvoert. Hij test enkel op de c_gereedschap.

Doe ik iets fout met de between functie? ik wil gewoon testen of de datum_van reeds aanwezig is in de database.

groet,

Jan
 
Paul,

Heb je de code wel gekopieeerd en in jouw formulier module gezet?

Bij mij geeft hij mooi aan of het aanwezig is of niet.

Groeten,

Paul
 
Paul,

Ik heb de exacte code overgenomen in VBA, als ik de andere vergelijkingen eruit haal werkt de eerste vergelijking wel c_gereedschap etc...

Als ik de query via de acces query uitvoer werkt deze wel.


Code:
SELECT tbl_uitgegeven.c_gereedschap, tbl_uitgegeven.c_reservering_van, tbl_uitgegeven.c_reservering_tot
FROM tbl_uitgegeven
WHERE (((tbl_uitgegeven.c_gereedschap)=[Formulieren]![Gereedschap_reserveren]![c_gereedschap]) AND ((tbl_uitgegeven.c_reservering_van) Between [Formulieren]![Gereedschap_reserveren]![c_reservering_van] And [Formulieren]![Gereedschap_reserveren]![c_reservering_tot])) OR (((tbl_uitgegeven.c_reservering_tot) Between [Formulieren]![Gereedschap_reserveren]![c_reservering_van] And [Formulieren]![Gereedschap_reserveren]![c_reservering_tot]));
 
Jan,

Nu zie ik pas wat er werkelijk fout is.

Je hebt in het eerste voorbeld van je strSQL code bij de Between regels de verkeerde namen van de besturingselementen gebruikt.

reservering_van moet zijn c_reservering_van.
Dit geldt voor alle gebruikte veldnamen bij de Between regels.

Dus even in de vba code veranderen!!!!!!

Groeten,

Paul
 
Dat had ik reeds geprobeerd maar geen resultaat, dan krijg ik wederom dat er te weinig parameters zijn.

Erg vreemd!
 
Jan,

Kun je nog een keer de exacte code kopieëren en hier posten.

Anders heb ik geen aanknopingspunten meer.

Nog beter is de database in een bijlage (zonder gevoelige gegevens).
Eerst in access comprimeren en herstellen en dan een zip bestand van maken.

Zie het wel.

Groeten,

Paul
 
Jan,

Ben er achter.
Query's gebruiken de amerikaanse datum opmaak.
Neem de volgende code in je vba formuliermodule op.

Code:
Private Sub reservering_tot_AfterUpdate()
  Dim strSQL As String
  strSQL = "SELECT *"
  strSQL = strSQL & " FROM tbl_uitgegeven"
  strSQL = strSQL & " WHERE [c_gereedschap] =" & Me.gereedschap
  strSQL = strSQL & " AND [c_reservering_van] Between #" & Format([reservering_van], "mm/dd/yyyy")
  strSQL = strSQL & "# AND #" & Format([reservering_tot], "mm/dd/yyyy")
  strSQL = strSQL & "# OR [c_gereedschap] =" & Me.gereedschap
  strSQL = strSQL & " AND [c_reservering_tot] Between #" & Format([reservering_van], "mm/dd/yyyy")
  strSQL = strSQL & "# And #" & Format([reservering_tot], "mm/dd/yyyy") & "#;"
 
  With CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
    If .RecordCount = 0 Then
      'geen records dus vrij
      MsgBox "Is Beschikbaar", vbOKOnly, "Gereedschap"
    Else
      'er zijn records dus niet vrij
      MsgBox "Niet beschikbaar", vbCritical + vbOKOnly, "Gereedschap"
      Me.Undo
    End If
  End With
End Sub

Groeten,

Paul
 
Paul,

Sorry voor de late response. Ik kom net pas aan op de zaak en mijn eigen laptop ligt momenteel bij HP.

Ik wil je hartelijk bedanken voor je hulp, het werkt nu als een zonnetje. Ik had gisteren al een gevoel dat het te maken had met het format van de data.

Nogmaals bedankt,

Groet Jan
 
Jan,

Ok, zet je vraag even op opgelost, anders blijft hij open staan.

Groeten, Paul
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan