Hej!
Jag har en kalender, som jag använt på en av mina sajter.
Denna skriver ut varje månad i miniatyr för aktuellt år.
Nu ska jag göra om den här lite, den ska bara visa ett visst år, månad beroende på vad en querystring har för värde.
Såhär ser min kod ut:
<%
datumet = Request.Querystring("sDat")
sAr = Left(datumet, 4)
sMan = Mid(datumet, 6, 2)
sDay = Right(datumet, 2)
If InStr(sMan, "0") And sMan < 10 Then
sMan = Right(sMan, 1)
End If
%>
<table style="border: 0px #000000 solid; border-collapse: collapse">
<tr>
<td style="border-left: 0px; border-right: 0px; border-top: 0px; text-align: left; font-family: verdana; font-size: 9px; padding: 0px; color: #000000;" colspan="8"><%=UCase(Left(MonthName(sMan), 1)) & LCase(Mid(MonthName(sMan), 2))%></td>
</tr>
<tr>
<td class="weekDay">Vecka</td>
<td class="weekDay">M</td>
<td class="weekDay">T</td>
<td class="weekDay">O</td>
<td class="weekDay">T</td>
<td class="weekDay">F</td>
<td class="weekDay">L</td>
<td style="color: #FF0000" class="weekDay">S</td>
</tr>
<tr>
<%
dtmFirstDay = DateSerial(Year(Date()), sMan, 1)
dtmLastDay = DateAdd("d", -1, DateAdd("m", 1, DateSerial(Year(Date()), sMan, 1)))
Response.Write("<td class=""weekDay"">" & DatePart("ww", dtmFirstDay, 2) & "</td>" & vbCrLf)
If Weekday(dtmFirstDay, 2) > 1 Then
For j = 1 To Weekday(dtmFirstDay, 2) - 1
Response.Write("<td class=""smallCell""> </td>" & vbCrLf)
intCount = intCount + 1
Next
End If
For dtm = dtmFirstDay To dtmLastDay
If intCount Mod 7 = 0 AND intCount > 0 Then
Response.Write("</tr>" & vbCrLf & "<tr>" & vbCrLf)
Response.Write("<td class=""weekDay"">" & DatePart("ww", dtm, 2) & "</td>" & vbCrLf)
End If
Response.Write("<td class=""smallCell""")
If dtm = Date() Then
Response.Write(" style='color: #FFFFFF; background-color: #404040;'")
Else
Response.Write(" style='color: #000000; background-color: #FFFFFF;'")
End If
If Weekday(dtm, 2) = 7 Then Response.Write(" style=""color: #FF0000""")
Response.Write(">" & Day(dtm) & "</td>" & vbCrLf)
intCount = intCount + 1
Next
If intCount Mod 7 > 0 Then
For j = 7 To (intCount Mod 7) + 1 Step - 1
Response.Write(" <td class=""smallCell""> </td>" & vbCrLf)
Next
End If
intCount = 0
%>
</tr>
</table>
Har kört fast helt och hållet.
Kalendern ska alltid utgå efter dagens datum (date) och sen ska man kunna välja år och månad i en rullista el. liknande, och kalenderna ska ändras utefter det.
Hänger ni med på hur jag menar?
Har provat med massor av olika saker, men just datum och sånt är inte min starka sida ;)
Tack!
Nu har jag löst mitt problem delvis.
Det här med att visa rätt utifrån querystring'en är inte något problem längre.
Men jag upptäckte ett nytt, som jag inte får ordning på.
Veckan visas fel, om jag kollar in dagens datum, skriver den ut vecka 7, men det stämmer ju inte, det är vecka 6 nu...
Så, hur ska jag ordna till det här?
Tack!
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
När du skriver ut veckonumret måste du berätta hur du vill att året ska börja, det gör man med FirstDayofWeek i DatePart.
http://www.devguru.com/Technologies/vbscript/quickref/datepart.html
Hmm, jo, har läst samma sak fast i MSDN's referens.
Jag tycker ändå att:
Response.Write("<td class=""weekDay"">" & DatePart("ww", dtm, 2) & "</td>" & vbCrLf)
bordre skriva ut rätt..?
För jag har ju "ww", som är veckonummer, "dtm" som är den aktuella dagen, samt "2" för att visa att veckan börjar på en måndag.
Eller har jag missuppfattat allt?
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Var tvungen att testa först, trodde man måste skriva WW, för det har jag alltid gjort, men det gör ingen skillnad.
Du har istället missat en avslutande tvåa för FirstWeekofYear, First week of the year that has at least four days.
Då blir koden istället DatePart("ww", now(), 2, 2).
På DevGuru står den konstanten tillsammans med FirstDayofWeek, det är förvirrande.
Jag gissar att det är felskrivet, för de har ju inte med varandra att göra.
Jag tittade inte igenom din kod innan mitt första svar, då jag inte trodde det fanns i koden ovan, vilket det gjorde.
J.N. skrev:
Då blir koden istället DatePart("ww", now(), 2, 2)
hmm, funkar inte så bra, det resulterar i att ALLA veckor blir v.6, vilket är lite fel, right? ;)
Koden ser ut såhär:
For dtm = dtmFirstDay To dtmLastDay
If intCount Mod 7 = 0 AND intCount > 0 Then
Response.Write("</tr>" & vbCrLf & "<tr>" & vbCrLf)
[b]Response.Write("<td class=""weekDay"">" & DatePart("ww", dtm, 2) & "</td>" & vbCrLf)[/b]
End If
Response.Write("<td class=""smallCell""")
If dtm = Date() Then
Response.Write(" style='color: #FFFFFF; background-color: #404040;'")
strCSS = "#FFFFFF"
Else
Response.Write(" style='color: #000000; background-color: #FFFFFF;'")
strCSS = "#000000"
End If
If Weekday(dtm, 2) = 7 Then Response.Write(" style=""color: #FF0000""")
Response.Write("><a href=""#"" onclick=""alert('" & dtm & "'); return false;"" style=""color: " & strCSS & ";"">" & Day(dtm) & "</a></td>" & vbCrLf)
intCount = intCount + 1
Next
Den feta raden är den där felet ligger, alltså den rad där veckan _ska_ skrivas ut.
väldigt tacksam för hjälp!
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Vilka krav du har! :e
Den enkla lösningen är att du har fel på variablen dtm, men var?
Skrivs dag, månad, år ut rätt på alla andra ställen, dvs det är endast vecka det blir fel på?
Det borde bli fel på dessa också, dvs variblerna dtmFirstDay och dtmLastDay blir dagens vecka alltid?
Allt annat stämmer bra, kolla själv ;)
http://mickea.dyndns.org/hissen/register/cal.asp
Allt visas rätt, men inte veckan :)
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Har du fixat detta sedan inlägget, för alla veckor jag ser är rätt?
Däremot markeras inte okt, nov, dec; testade 2005-2006-2007.
Kolla min befogade bild, så ser du hur det ser ut hos mig.
Att Okt, Nov, Dec inte blir markerade ska jag lösa när jag kommer hem, där vet jag vad som spökar.
Men precis som bilden jag bifogar säger så visar kalendern att det är vecka 7 nu, men det är fel, för nu är det vecka 6.
Inget annat fel i koden då?
Måste bara lösa det här.
Tack!
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
NU förstår jag vad du menar med detta:
MickeA.com skrev:
J.N. skrev:
Då blir koden istället DatePart("ww", now(), 2, 2)
hmm, funkar inte så bra, det resulterar i att ALLA veckor blir v.6, vilket är lite fel, right? ;)
Du menar att ALLA veckor blir v6 om du använder min kod, och endast min kod, där du skriver ut veckan!
Då är det inte så konstigt att det blir fel, det ÄR ju v6 nu, och har du now() blir det denna vecka överallt!
Min kod är endast för att du ska se skillnaden, now() ska bytas mot dtm.
När jag skrev att veckorna är rätt menade jag att veckorna har olika nummer. Att veckornumret var fel tänkte jag inte på; jag var nöjd över att inte se sexor överallt!
I din kod ser jag nu att du fortfarande kör med den gamla, med en enkel tvåa.
Näru, när jag provade din kod förut så ändrade jag ju givetvis Now() till dtm.
Problemet då blir att varja månad börjar med samma vecka, som nu tex. då står det att förra veckan var vecka 6 samtidigt som det står att aktuell vecka är 6.
De två första veckorna varje månad blir således samma, inte bra ;)
vidare så har jag försökt kolla upp vad som är fel med att Okt, Nov, Dec inte blir markerade som valda och förstår inte vad som rä fel:
For mM = 1 to 12
If mM = 1 Or mM = 7 Then
Response.Write("<tr>")
End If
If mM < 10 Then
sTmp = "0" & mM
Else
sTmp = mM
End If
If sTmp = sMan Then
sClr = "#404040"
sTxt = "#FFFFFF"
Else
sClr = "#E6E4E4"
sTxt = "#000000"
End If
Response.Write( "<td class=""pMon"" style=""background-color: " & sClr & ";"">" &_
"<a href=""?sDat=" & sAr & "-" & sTmp & "-" & sDay & """ style=""color:" & sTxt & ";"">" & Ucase(Left(MonthName(mM), 3)) & "</a>" &_
"</td>")
If mM = 6 Or mM = 12 Then
Response.Write("</tr>")
End If
' Response.Write("Stängen är: " & sTmp)
' Response.End
Next
Det där skriver ut alla månader högst upp och där någonstans är det fel.
Såhär har jag tänkt:
Om vald månad är av samma värde som skrivs ut "just nu" i for-loopen, byt bakgrunds / textfärg.
Om aktuell månad är mindre än 10, lägg till "0" framför (01, 02, 03 osv.)
Men någonstans blir det fel när den kliver upp till 10, 11, 12, varför? ;)
Vore glad om det här kunde sluta strula nångång ;)
Tack!
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Ok, det var ju synd :)
Ang första problemet:
Skriv ut vilken datum du räknar veckonumret på i varje rad. Av någon anledning räknas tex oktober med två dagar (lör-sön) som första dagar som hörande till samma vecka som nästa.
Utan kontroll på vilka siffror du har är det svårt att lösa detta.
Ang andra problemet:
Som ovan, skriv ut dina variabler.
Låter lite som ett CInt-fel, men eftersom värde>9 inte fungerar är det tvärtom...
Att flytta sTmp = mM borde inte bli fel, då du kan lägga till en nolla framför i raden ovan, utan CInt.
J.N. skrev:
Ang andra problemet:
Som ovan, skriv ut dina variabler.
Låter lite som ett CInt-fel, men eftersom värde>9 inte fungerar är det tvärtom...
Att flytta sTmp = mM borde inte bli fel, då du kan lägga till en nolla framför i raden ovan, utan CInt.
Har provat att skriva ut sTmp, men där ser allt ut att stämma, därför blir jag så förvirrad, den skriver ut 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, så jag förstår inte alls vad som skulle kunna vara fel.
Jag kollar lite till och återkommer om det löser sig, eller om det inte gör det ;)
Nu verkar allt funka, veckorna verkar stämma och markeringen av varje månad likaså.
Såhär gjorde jag:
[b]Prob. 1[/b]
------------------------------------
Select Case mM
Case 1 : sTmp = "01"
Case 2 : sTmp = "02"
Case 3 : sTmp = "03"
Case 4 : sTmp = "04"
Case 5 : sTmp = "05"
Case 6 : sTmp = "06"
Case 7 : sTmp = "07"
Case 8 : sTmp = "08"
Case 9 : sTmp = "09"
Case 10 : sTmp = "10"
Case 11 : sTmp = "11"
Case 12 : sTmp = "12"
End Select
------------------------------------
Bytte helt enkelt ut if-satsen mot en select case och det började funka, berodde förmodligen på (som J.N var inne på ovan), att den inte visst att vi snackade tal och inte textsträngar ;)
[b]Prob. 2[/b]
------------------------------------
dtmFirstDay = DateSerial(Year(datumet), sMan, 1)
dtmLastDay = DateAdd("d", -1, DateAdd("m", 1, DateSerial(Year(datumet), sMan, 1)))
[b]Response.Write("<td class=""weekDay"">" & DatePart("ww", dtmFirstDay, 2, 2) & "</td>" & vbCrLf)[/b]
If Weekday(dtmFirstDay, 2) > 1 Then
For j = 1 To Weekday(dtmFirstDay, 2) - 1
Response.Write("<td class=""smallCell"" style=""background-color: #CCCCCC;""> </td>" & vbCrLf)
intCount = intCount + 1
Next
End If
For dtm = dtmFirstDay To dtmLastDay
If intCount Mod 7 = 0 AND intCount > 0 Then
Response.Write("</tr>" & vbCrLf & "<tr>" & vbCrLf)
[b]Response.Write("<td class=""weekDay"">" & DatePart("ww", dtm, 2, 2) & "</td>" & vbCrLf)[/b]
End If
Response.Write("<td class=""smallCell""")
If dtm = Date() Then
If Weekday(dtm, 2) = 7 Then
Response.Write(" style=""color: #FF0000; background-color: #404040;""")
Else
Response.Write(" style='color: #000000; background-color: #404040;'")
End If
strCSS = "#FFFFFF"
Else
If Weekday(dtm, 2) = 7 Then
Response.Write(" style=""color: #FF0000; background-color: #FFFFFF;""")
strCSS = "#FF0000"
Else
Response.Write(" style='color: #000000; background-color: #FFFFFF;'")
strCSS = "#000000"
End If
End If
Response.Write("><a href=""#"" onclick=""sDate('" & dtm & "'); return false;"" style=""color: " & strCSS & ";"">" & Day(dtm) & "</a></td>" & vbCrLf)
intCount = intCount + 1
Next
------------------------------------
Hade tidigare bara ändrat på den understa av de två feta raderna ovan, hittade den först, ändrade till det du, J.N visade mig och vips så funkade det.
Tack för alla bra svar, tips och idéer!
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Bra att det fungerar! :h
Men, nu är inte problem 1 siffror, utan bokstäver. :OO
Men det vet du säkert, och fungerar det, så gör det.
Du borde kunna justera ditt månadsproblem till Month(sDat), då du har aktuell datum i querystringen.
Då slipper du problemet med nollan också.
Problem två var inte enkelt att lösa för mig, jag visste ju inte att du inte bytt på båda raderna... :birp
Tja!
Nä, klart det inte var så himla lätt för dig att knäcka den biffen, men huvudsaken var ju att allt löste sig.
Nu har jag ingen "riktig" kalender med veckonummer tillhands, men jag har jämfört med min PocketPC och kollat div. olika, dagar, månader, år samt veckodagar och så långt stämmer det ;)
Tack ännu en gång!
Hej,
Nu har jag lite trubbel med veckor igen, tror jag rör ihop det totalt i huvudet.
Jag ska skriva ut ett års samtliga veckor från den 1'a Januari - 31'a December, året kan vara vilket som helst.
Har gjort såhär:
week_ago = DatePart("ww", Year(stats_year) & "-01-01", 2, 2)
week_upc = DatePart("ww", Year(stats_year) & "-12-31", 2, 2)
If Len(stats_week) < 1 Or (Not IsNumeric(stats_week)) Then stats_week = DatePart("ww", Now(), 2, 2) End If
If Len(stats_week) < 2 Then stats_week = "0" & stats_week
For i = week_ago To week_upc
w = i
If Len(w) < 2 Then w = "0" & w End If
If w = stats_week Then s = " selected=""selected""" Else s = "" End If
Response.Write("<option value=""" & w & """" & s & ">" & w & "</option>" & VbCrLf)
Next
Men endast "52" skrivs ut i listan.
Vad gör jag för fel?
Tack!
Nu gjorde jag såhär:
dtmFirstDay = DateSerial(stats_year, 1, 1)
dtmLastDay = DateSerial(stats_year, 12, 31)
For i = dtmFirstDay To dtmLastDay Step 7
w = i
Response.Write("<option value=""" & Replace(w, "-", "") & """" & s & ">" & DatePart("ww", w, 2, 2) & "</option>" & VbCrLf)
Next
Det funkar bra, men finns det andra, bättre sätt?
J.N.Medlem sedan apr. 20031 660 inlägg HEJ!
Ger svar i en gammal tråd, då jag har något att tillföra!
Kontrollera om 31/12 är v53, annars är w=52.
Därför borde du kunna förenkla loopen till For 1 to w. Du vet ju att alla år är 1-52, minst.
Varför du i inlägg #19 alltid får 52 kunde jag inte komma fram till.
Nu är det väl inte ett problem längre, men provade du skriva ut diverse variabler?