Avatar billede kraghjensen Nybegynder
19. juni 2001 - 23:23 Der er 6 kommentarer og
1 løsning

Do while - Loop

Jeg har følgende \"lille\" kontrol af dato\'er og klokkeslæt.
Mit problem er, at rutinen kun kontrollere på den første post i databasen.
Hvor  skal jeg indsætte en - Do While rs.eof - , samt
- Loop - før alle posterne i databasen bliver kontrolleret.

<%

set Conn =Server.CreateObject(\"ADODB.Connection\")
Conn.Open \"datokontrol\"

SQLstmt = \"SELECT * FROM dato\"
Set rs = conn.Execute(SQLstmt)

Conn.Execute (SQLstmt)


    start_dato = rs(\"start-dato\")
    slut_dato = rs(\"slut-dato\")

    Ny_Start_Dato = request.form(\"datofra\")   
    Ny_Slut_Dato = request.form(\"datotil\") 

 

    If DateDiff(\"d\", Ny_Slut_Dato, start_dato) > 0 Then
        \'Ny dato slutter før de andre starter (ændrer til >= for at få overlap)
        overlap_dato = False
    Else
        If DateDiff(\"d\", slut_dato, Ny_Start_Dato) > 0 Then
            \'Ny dato starter efter de andre slutter
            overlap_dato = False
        Else
         
            overlap_dato = True
        End If
    End If
    If overlap_dato = False Then

    Else
   
   
    \'Datoen er optaget, derfor kontrol på klokken
   
      start_kl = rs(\"start-kl\")
    slut_kl = rs(\"slut-kl\")


    Ny_Start_kl = request.form(\"klfra\") 
   
    Ny_Slut_kl = request.form(\"kltil\")
   

    If DateDiff(\"h\", Ny_Slut_kl, start_kl) > 0 Then
       
        overlap_kl = False
    Else
        If DateDiff(\"h\", slut_kl, Ny_Start_kl) > 0 Then
         
            overlap_kl = False
        Else
           
            overlap_kl = True
           
        End If
    End If
 
   
    If overlap_kl = False Then
    rs.movenext
    Else
  response.write \"Lokalet er optaget i dette tidsrum, prøv noget andet.\"
    End If
End If
 
   
    conn.Close
Set conn = nothing
Set SQLstmt = nothing
%>

Avatar billede sbm Nybegynder
19. juni 2001 - 23:28 #1
Indsæt din do while lige efter du har lavet din Conn.Execute (SQLstmt) og luk af med loop umiddelbart efter din sidste End If

Det skulle vist gøre det.
Avatar billede sbm Nybegynder
19. juni 2001 - 23:29 #2
...du skriver i øvrigt Do while rs.eof , hvilket naturligvis skal ændres til Do while not rs.eof
Avatar billede kraghjensen Nybegynder
20. juni 2001 - 19:58 #3
Når jeg indsætter det som du (sbm) siger for jeg følgende fejlmeddelelse:

error \'ASP 0113\'
Script timed out

/datokontrol.asp

The maximum amount of time for a script to execute was exceeded. You can change this limit by specifying a new value for the property Server.ScriptTimeOut or by changing the value in the IIS administration tools.

Hvad betyder dette, og hvad skal jeg gøre for at undgå det.
Avatar billede sbm Nybegynder
20. juni 2001 - 23:17 #4
Hi hi... Der er et lille problem med denne del af koden:

If overlap_kl = False Then
  rs.movenext
Else
  response.write \"Lokalet er optaget i dette tidsrum, prøv noget andet.\"
End If

Hvis du kommer til en situation hvor overlap_kl = true, vil den gå ned i ELSE delen, og vil derfor ALDRIG KOMME VIDERE I DET RECORDSET. Den kører på den samme række igen og igen og igen... Jeg kan ikke lige gennemskue hvorfor du kun vil bevæge dig videre til næste række når overlap_kl = false, men du skal naturligvis sikre dig at du altid kommer videre i dit recordset, så du på et tidspunkt bliver færdig med det.

Hvis du smider en beskrivelse af hvornår du ønsker at flytte videre til næste række, kan jeg nok bedre hjælpe dig.
Avatar billede sbm Nybegynder
20. juni 2001 - 23:33 #5
Jeg har lige kigget koden løst igennem, og jeg vil tro at dette løser dit problem. (Hvis denne kodestump vel at mærke gør det som jeg tror den gør. :-)


...denne kodestump skifter du ud:
   
    If overlap_kl = False Then
    rs.movenext
    Else
  response.write \"Lokalet er optaget i dette tidsrum, prøv noget andet.\"
    End If
End If
 

...og sætter dette ind istedet:
   
    rs.movenext
End If
If overlap_dato = False Then
  response.write \"Der er slet ikke andre der har booket lokalet denne dato.\"
Else
  If overlap_kl = False Then
    response.write \"Lokalet er ledigt i det angivne tidsrum, men er i brug på andre tidspunkter den samme dag.\"
  Else
    response.write \"Lokalet er optaget i dette tidsrum, prøv noget andet.\"
  End if
End if

Nu bevæger du dig videre i dit recordset uanset hvad. Dertil bør du nok tilføje et ekstra klausul på din WHILE sætning, da du vel næppe gider bladre videre, hvis du allerede er klar over at lokalet er optaget...?

Det bliver vist noget i stil med:
Do while not (RS.eof or overlap_dato = True or overlap_kl = True)
Avatar billede sbm Nybegynder
20. juni 2001 - 23:35 #6
Ups... Jeg kan se at du godt kan arbejde videre selv om overlap_dato eventuelt er sat til true...

Vi ændrer lige Do while til:

Do while not (RS.eof or (overlap_dato = True and overlap_kl = True))
Avatar billede kraghjensen Nybegynder
28. juni 2001 - 08:37 #7
Tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester