Avatar billede wilweb Nybegynder
01. august 2004 - 01:09 Der er 4 kommentarer og
1 løsning

forsat fra http://www.eksperten.dk/spm/524230

Forsat fra http://www.eksperten.dk/spm/524230

I går løste eagleeye mit problem med at få udskrevet et skema, der er dog et problem som kan ses på: http://www.wilweb.dk/exp/skema.png

hvis brugeren er der om mandag og så kommer brugeren ikke mere den uge. Så skrives der bare tomme felter ud.
Ville det være muligt at få udskrevet fraværende i de dage hvor der ikke er oplysninger om brugeren?
Jeg har prøvet på flere måder men intet er lykkes.

Her er koden:

<!--#include file="../conn/skema.asp" -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Uge skema</title>
<link href="../css/skema.css" rel="stylesheet" type="text/css">
</head>

<body>
<%
Session.LCID = 1030

if request.QueryString("uge") = "" then
    ugeNr = weekNr(date)
Else
    ugeNr = CInt(request.QueryString("uge"))
End if

'Find dato, første mandag i den valgte uge
dato = findMandag(ugeNr,Year(Date))
'Find ugens dage navne + dato
dagMandag = WeekdayName(DatePart("W", dato, 1))
dagMandag = UCase(Left(dagMandag,1)) & Mid(dagMandag,2) & " [" & Day(dato) & "-" & Month(dato)& "]"
'trækker dato ud af dag1
dag1=Day(dato)&"-"&Month(dato)&"-"&year(dato)
'-----
dato = DateAdd("d", 1, dato)
dagTirsdag = WeekdayName(DatePart("W", dato, 1))
dagTirsdag = UCase(Left(dagTirsdag,1)) & Mid(dagTirsdag,2) & " [" & Day(dato) & "-" & Month(dato)& "]"
'trækker dato ud af dag2
dag2=Day(dato)&"-"&Month(dato)&"-"&year(dato)
'--------
dato = DateAdd("d", 1, dato)
dagOnsdag = WeekdayName(DatePart("W", dato, 1))
dagOnsdag = UCase(Left(dagOnsdag,1)) & Mid(dagOnsdag,2) & " [" & Day(dato) & "-" & Month(dato)& "]"
'trækker dato ud af dag3
dag3=Day(dato)&"-"&Month(dato)
'------
dato = DateAdd("d", 1, dato)
dagTorsdag = WeekdayName(DatePart("W", dato, 1))
dagTorsdag = UCase(Left(dagTorsdag,1)) & Mid(dagTorsdag,2) & " [" & Day(dato) & "-" & Month(dato)& "]"
'trækker dato ud af dag4
dag4=Day(dato)&"-"&Month(dato)
'----------
dato = DateAdd("d", 1, dato)
dagFredag = WeekdayName(DatePart("W", dato, 1))
dagFredag = UCase(Left(dagFredag,1)) & Mid(dagFredag,2) & " [" & Day(dato) & "-" & Month(dato)& "]"
'trækker dato ud af dag5
dag5=Day(dato)&"-"&Month(dato)&"-"&year(dato)
'------------------
'uge + / - 1
tmpDato = DateAdd("ww",1,dato)
ugeNrp= weekNr(tmpDato)
aarNrp= Year(tmpDato+3)
tmpDato = DateAdd("ww",-1,dato)
ugeNrm= weekNr(tmpDato)
aarNrm= Year(tmpDato+3)

fraDato= dag1
tilDato= dag5
SQL = "select * from loginelev where sdato >= #" & fraDato & "# and sdato <= #" & tilDato & "# and strshop='multimedie' order by strnavn, sdato"
Set rs=Conn.Execute(SQL)
%>
<form action="skema_week.asp" method="post" name="skemaform">
<table border="0" width="950" cellspacing="2" cellpadding="5">
  <tr>
    <td colspan="7" class="tbl_text_kal" height="20"><strong>Uge</strong> <%=ugeNr%> </td>
  </tr>
  <%
Response.Write "<tr><td width=''15 class='tbl_log'>Nr.</td><td class='tbl_log'>Navn</td><td class='tbl_log' align='center'>" & dagMandag & "</td><td class='tbl_log' align='center'>" & dagTirsdag & "</td><td class='tbl_log' align='center'>" & dagOnsdag & "</td><td class='tbl_log' align='center'>" & dagTorsdag & "</td><td class='tbl_log' align='center'>" & dagFredag & "</td>"
oldNavn=""
x=1
do while not rs.EOF
  if oldNavn <> rs("strnavn") then
    oldNavn = rs("strnavn")
    oldDato=dag1
   
    Response.Write "</tr><tr><td class='tbl_text_kal'>" & x & "</td><td class='tbl_text_kal'>" & rs("strnavn") & "</td>"
  x=x+1
  end if
  i=0
  do while CDate(oldDato) < CDate(rs("sdato")) and i < 5
    oldDato=DateAdd("d",1,oldDato)
    'if i
    response.write "<td class='tbl_text_kal2'>fraværende</td>"
    i=i+1
  loop
 
  Response.Write "<td align='center' class='tbl_text_kal'>" & left(rs("stid"),5) &"</td>"
  oldDato=DateAdd("d",1,oldDato)
  rs.Movenext
loop

Response.Write "</tr>"

  %>

  <tr class="tbl_log">
<%
    Response.Write("<td align='center'></td> ")
    Response.Write("<td align='center'></td> ")
    Response.Write("<td align='center'><a href='skema_week.asp?uge=" & ugeNrm & "'>Forrige uge</a></td> ")
    Response.Write("<td align='center'><a href='skema_week.asp?uge=" & ugeNrp & "'>Næste uge</a></td> ")
    Response.Write("<td align='center' colspan='3'></td> ")
   
%>
  </tr>
 
</table>

</form>
<%
    Conn.Close
    Set Conn = Nothing
'Den første dag i indeværende uge:
    Function getDate(ByVal weekNr, ByVal startDate)
      If Not isDate(startDate) Then Exit Function
      dato = CDate(startDate)
      Do While DatePart("ww", dato, vbMonday, vbFirstFourDays) <> weekNr
          dato = DateAdd("d", 1, dato)
      Loop
      getDate = dato
    End Function
'find uge nummer
    Function weekNr (dtmDate)  ' Week Of Year
        weekNr = DatePart("ww", dtmDate, vbMonday, vbFirstFourDays)
        If weekNr > 52 Then
            If DatePart("ww", dtmDate + 7 , vbMonday, vbFirstFourDays) = 2 Then weekNr = 1
        End If
    End Function
'Find mandag i valgt uge,år
    function findMandag(uge,aar)
    d = DateSerial(aar, 1, 1)    ' 1/1/i år
    'find mandag i uge 1
        If DatePart("ww", d, 2, 2) = 1 Then    'Hvis 1/1 er i uge 1
          While(DatePart("w", d, 2, 2) <> 1)    'find sidste mandag
            d = DateAdd("d", -1, d)
          WEnd
        Else
          While(DatePart("ww", d, 2, 2) <> 1)  'find næste mandag
            d = DateAdd("d", 1, d)
          WEnd
        End If
    findMandag = DateAdd("d", 7*(uge-1), d) 'juster til ugenummer, mandag
    end function
%>
</body>
</html>
Avatar billede thesurfer Nybegynder
01. august 2004 - 01:40 #1
TD'er må ikke være tomme: <td align='center'></td>

Hvis der ikke er noget tekst, skal der indsættes "&nbsp;", som betyder "mellemrum":

<td align='center'>&nbsp;</td>

Du skal sørge for, at der som minimum står "&nbsp;".
Avatar billede eagleeye Praktikant
01. august 2004 - 13:31 #2
Der skal tilfæje et loop mere inde i loopet som skriver "fraværende" når der skiftes person eller rs.EOF er nået så hele loopet bliver:


do while not rs.EOF
  if oldNavn <> rs("strnavn") then
    oldNavn = rs("strnavn")
    oldDato=dag1
   
    Response.Write "</tr><tr><td class='tbl_text_kal'>" & x & "</td><td class='tbl_text_kal'>" & rs("strnavn") & "</td>"
  x=x+1
  end if
  i=0
  do while CDate(oldDato) < CDate(rs("sdato")) and i < 5
    oldDato=DateAdd("d",1,oldDato)
    'if i
    response.write "<td class='tbl_text_kal2'>fraværende</td>"
    i=i+1
  loop
 
  Response.Write "<td align='center' class='tbl_text_kal'>" & left(rs("stid"),5) &"</td>"
  oldDato=DateAdd("d",1,oldDato)
  rs.Movenext
  if not rs.EOF then tmpNavn = rs("strnavn")
  if (oldNavn <> tmpNavn) OR rs.EOF then
    i=0
    do while CDate(oldDato) <= CDate(dag5) and i < 6
      oldDato=DateAdd("d",1,oldDato)
      response.write "<td class='tbl_text_kal2'>fraværende</td>"
      i=i+1
    loop
  end if
loop



Skriver den en "fraværende" kolonne for meget skal = tegnet fjernes i denne linje:

do while CDate(oldDato) <= CDate(dag5) and i < 6
Avatar billede wilweb Nybegynder
01. august 2004 - 14:45 #3
eagleeye:> den virkede super! jeg kan ikke rigtigt forstå hvad det er der sker. Kunne jeg være så fræk at spørge om du gad sætte lidt kommentar ind, jeg vil jo så gerne forstå det. Har du ikke tid er det i orden. :>

thesurfer:> tak for din kommentar, den ryger lige i huskebogen :>
Avatar billede eagleeye Praktikant
01. august 2004 - 15:27 #4
Jo da, meget gerne. Sig til hvis det ikke er nok:


oldNavn=""  'Variable bruges til at finde ud af hvornår en ny person skal vises
x=1
do while not rs.EOF
  'Tjek om det er en ny person og lave en ny række i tabellen
  if oldNavn <> rs("strnavn") then
    'ny bruger fundet, gem brugeres navn i oldNavn
    oldNavn = rs("strnavn")
    'da det ikke er sikkert alle dage er i databasen laves en dato variable som holder
    'styr på hvilken da man er kommet til i tablen man udskriver.
    oldDato=dag1  'Når en ny person er fundet, sættes den til første dag i ugen.
   
    Response.Write "</tr><tr><td class='tbl_text_kal'>" & x & "</td><td class='tbl_text_kal'>" & rs("strnavn") & "</td>"
  x=x+1
  end if
  i=0  'i bruges back-up stop hvis der går helt kluder i dato'erne, vil siden ikke hænge.
  'Dette loop tjekker hvilken dag man er komme til i udskrivningen oldDato.
  'Og hvis oldDato er mindre end den dato der er i posten i recordset betyder det
  'personen har være fraværende de(n) dag(e).
  do while CDate(oldDato) < CDate(rs("sdato")) and i < 5
    oldDato=DateAdd("d",1,oldDato)
    'if i
    response.write "<td class='tbl_text_kal2'>fraværende</td>"
    i=i+1
  loop
  'Udskriver status
  Response.Write "<td align='center' class='tbl_text_kal'>" & left(rs("stid"),5) &"</td>"
  'gør klar til at udskrive næste dag.
  oldDato=DateAdd("d",1,oldDato)
  rs.Movenext

  'Hvis en ny person skal uskrives nu så tjekker man på om oldDato er lig med sidste dag i uden som man er ved at udskrive.
  'Er oldDato mindre end sidste dag i ugen, har personen været fraværende fra oldDato til sidste dag i ugen: dag5
  'Denne if sætning ligger næste posts brugernavn i en variable som bruges i næste if
  'sætning til at tjekke om det er en ny person. Grunden til det er lavet sådan er for
  'man ikke behøver at gentage det næste do while, to gange. Loop'et skal nemlig køres
  'når der er valgt en ny person eller det er sidste person som udskrives.
  if not rs.EOF then tmpNavn = rs("strnavn")
  if (oldNavn <> tmpNavn) OR rs.EOF then
    'Enten er det en ny person eller også var det den sidste person som er udskrivet.
    i=0
    'Dette loop skriver "fraværende" fra oldDato til dag5.
    'Igen brugs variablen i som back-up stop for loop'et :)
    do while CDate(oldDato) <= CDate(dag5) and i < 6
      oldDato=DateAdd("d",1,oldDato)
      response.write "<td class='tbl_text_kal2'>fraværende</td>"
      i=i+1
    loop
  end if
loop


oldDato skal for hver bruger igennem: dag1, dag2, dag3, dag4, dag5
Da man ikke kender antal'et af dage en bruger har status for i databasen er der de to loop som sikre at der kommer til at fraværende for de dage som manglre i databasen for en bruger.

Hvis en bruger kun har status for dag2 og dag3, vil det første loop sikre at der står fraværende i dag1. Det sidste loop sikre det står fraværende i dag4 og dag5.
Avatar billede wilweb Nybegynder
01. august 2004 - 15:38 #5
Det er flot, tak skal du have. Nu skal jeg nok fatte det:>
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