webForumDet fria alternativet

Kalenderproblem

20 svar · 872 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

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"">&nbsp;</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"">&nbsp;</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!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#2

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
#3

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

MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

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
#5

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.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

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
#7

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?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#8

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
#9

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.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

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!

image3.jpg
J.N.Medlem sedan apr. 20031 660 inlägg
#11

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.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#12

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
#13

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.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#14

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 ;)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#15

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;"">&nbsp;</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
#16

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

MickeA.comMedlem sedan feb. 20034 441 inlägg
#17

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!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#18

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!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#19

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
#20

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?

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)