webForumDet fria alternativet

Kalender, skriva ut föregående månads sista dagar.

ASP

9 svar · 699 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Tjena
Håller på med en kalender som visar aktuell månad.
Det funkar nu så långt att alla "denna månads" dagar visas schysst.

Eftersom varje månad (i princip) börjar / slutar mitt i en vecka (som i Torsdags när det var den 1'a Mars, så skulle jag vilja skriva ut även de sista dagarna i föregående månad (i nuläget Måndag den 26'e, Tisdag den 27'e samt Onsdag den 28'e).

Som det är nu så skrivs bara tomma rutor ut, eftersom jag inte får till det här med dagarna i förra / nästa månad.

Såhär har jag gjort:

datumet = date()

sAr = DatePart("yyyy", datumet)
sMan = DatePart("m", datumet)
sDay = DatePart("d", datumet)
%>
	<p class="dayname asweek">Vecka</p>
	<p class="dayname asweek">Måndag</p>
	<p class="dayname asweek">Tisdag</p>
	<p class="dayname asweek">Onsdag</p>
	<p class="dayname asweek">Torsdag</p>
	<p class="dayname asweek">Fredag</p>
	<p class="dayname asweek">Lördag</p>
	<p class="dayname asweek">Söndag</p>
	<div style="clear: both;"></div>
<%
If InStr(sMan, "0") And sMan < 10 Then
	sMan = Right(sMan, 1)
End If

dtmFirstDay = DateSerial(Year(datumet), sMan, 1)
dtmLastDay = DateAdd("d", -1, DateAdd("m", 1, DateSerial(Year(datumet), sMan, 1)))
Response.Write("<p class=""weekday asweek"">" & DatePart("ww", dtmFirstDay, 2, 2) & "</p>" & vbCrLf)
[red]
If Weekday(dtmFirstDay, 2) > 1 Then
	For j = 1 To Weekday(dtmFirstDay, 2) - 1
		Response.Write("<p class=""weekday"">" & [b]Day(dtm - j)[/b] & "</p>" & vbCrLf)
		intCount = intCount + 1
	Next
End If
[/red]
For dtm = dtmFirstDay To dtmLastDay
	If intCount Mod 7 = 0 AND intCount > 0 Then
		Response.Write("<p class=""weekday asweek"">" & DatePart("ww", dtm, 2, 2) & "</p>" & vbCrLf)
	End If

	Response.Write("<p class=""weekday"">" & Day(dtm) & "</p>" & vbCrLf)
	intCount = intCount + 1
Next
[red]
If intCount Mod 7 > 0 Then
	For j = 7 To (intCount Mod 7) + 1 Step - 1
		Response.Write(" <p class=""weekday"">&nbsp;</p>" & vbCrLf)
	Next
End If
[/red]
intCount = 0

Det första rödfärgade stycket är de dagar som finns _innan_ aktuell månad skrivs ut, det fetstilta är ett tappert försök att skriva ut dagarna, men det som står nu skriver ut fel (det skriver ut 29, 28, 27 vilket både är fel dagar och i fel ordning).
Det sista rödfärgade stycket är de dagar som kommer först i "nästa" månad.

Det jag vill göra är alltså att skriva ut de dagar som "inte" tillhör nuvarande månad.

Tack på förhand!

Medlem sedan juni 20003 076 inlägg
#2

Det du gör är att inte loopa endast aktuell månad utan du loopar datumet för första dagen i den första veckan i aktuell månad till sista dagen i sista veckan i aktuell månad.
Hängde du med?! :)

Du kan ta hjälp av dessa funktioner:

'Hämtar första dagen i vald vecka =========================================
Public Function getFirstweekday(ByVal Current_date)
    If Len(Current_date) = 0 Or Not isDate(Current_date) Then Exit Function
	getFirstweekday = Current_date - weekday(Current_date, 2)+1
End Function

'Hämtar sista dagen i vald vecka ==========================================
Public Function getLastweekday(ByVal Current_date)
    If Len(Current_date) = 0 Or Not isDate(Current_date) Then Exit Function
	getLastweekday = Dateadd("D", (7 - weekday(Current_date, 2)), Current_date)
End Function

'Hämtar första dagen i vald månad =========================================
Public Function getFirstmonthday(ByVal Current_date)
    If Len(Current_date) = 0 Or Not isDate(Current_date) Then Exit Function
	getFirstmonthday = Dateserial(Year(Current_date), Month(Current_date), 1)
End Function

'Hämtar sista dagen i vald månad ==========================================
Public Function getLastmonthday(ByVal Current_date)
    If Len(Current_date) = 0 Or Not isDate(Current_date) Then Exit Function
	getLastmonthday = Dateserial(Year(Current_date), Month(Current_date)+1, 1-1)
End Function

För att hitta startdatum och slutdatum för loopen:

dtmFirstDay = getFirstweekday(Date())
dtmLastDay = getLastweekday(getLastmonthday(Date()))

For dtm = dtmFirstDay To dtmLastDay
...
Next

Sen behöver du bara lista ut hur du färgmarkerar de olika dagarna! :)

Medlem sedan feb. 20034 441 inlägg
#3

Hmm, är inte riktigt med.
Bifogar en bild på hur koden ovan skriver ut saker och ting.
Första / sista dag i vald månad har jag ju redan, det är de sista dagarna ur månaden innan jag vill få ut.
Som det framgår på bifogad bild så skrivs 29, 28, 27 ut på rutorna högst upp till vänster, eftersom den första Mars var i Torsdags.
Det som ska skrivas ut i det här fallet är 26, 27, 28 så på något sätt måste loopen skivas ut åt andra hållet, samt att den måste ta hänsyn till eventuellt skottår.

Det är alltså i de två kodstyckena högst upp samt längst ner (de rödfärgade) som något ska ändras i.

Frågan är bara vad?
Tack!

planit_dump.jpg
Medlem sedan feb. 20034 441 inlägg
#4

doggelito skrev:

dtmFirstDay = getFirstweekday(Date())
dtmLastDay = getLastweekday(getLastmonthday(Date()))

For dtm = dtmFirstDay To dtmLastDay
...
Next

När jag kör din kod rakt av, så får jag:

Körningsfel i Microsoft VBScript (0x800A000D)
Inkompatibla typer: 'getFirstweekday'
/****/index.asp, line 102

Rad 102 är alltså dtmFirstDay = getFirstweekday(Date())

Medlem sedan juni 20003 076 inlägg
#5

MickeA.com skrev:

Det är alltså i de två kodstyckena högst upp samt längst ner (de rödfärgade) som något ska ändras i

Jag förstår precis vad du är ute efter. :)
Det jag var inne på var att du krånglar till det en aning.
Som du kodat så behöver du 3 loopar, en för föreg. månad, en för aktuell månad och en för nästa. Du kan slå ihop alla till en loop.

MickeA.com skrev:

När jag kör din kod rakt av, så får jag:
Kod:

Körningsfel i Microsoft VBScript (0x800A000D)
Inkompatibla typer: 'getFirstweekday'
/****/index.asp, line 102

Rad 102 är alltså dtmFirstDay = getFirstweekday(Date())

Det är inge fel på funktionerna, du måste ha inkluderat dem på nått konstigt ställe.
Funktionerna kan du inkludera överst eller underst eller var du vill ha dem.

Medlem sedan feb. 20034 441 inlägg
#6

doggelito skrev:

Det är inge fel på funktionerna, du måste ha inkluderat dem på nått konstigt ställe.
Funktionerna kan du inkludera överst eller underst eller var du vill ha dem.

Funktionerna ligger i en fil som heter "funcs.asp" och denna inkluderas högst upp med <!--#include file="css/funcs.asp"-->.

Allt annat i denna fil funkar klockrent, men inte just dina funktioner.

Varför?

Medlem sedan juni 20003 076 inlägg
#7

MickeA.com skrev:

Varför?

Svårt att säga varför när man inte ser koden men jag googla lite på "inkompatibla typer" och ofta så skickar man in fel värde in i funktionen.
Är det verkligen Date() du skickar in i funktionen eller har du ett eget datum?
Har du ett eget datum som en sträng så kan du slänga på CDate för att konvertera till datumtyp:

datum = CDate(dittdatum)

Funktionerna är testade och fungerar om man använder dem rätt. Jag lovar! :)

Medlem sedan feb. 20034 441 inlägg
#8

doggelito skrev:

Funktionerna är testade och fungerar om man använder dem rätt. Jag lovar! :)

Jo, jag tror dig.
När jag testade körde jag enl. din kod, alltså med "Date()", därför tycker jag att det är konstigt att det inte funkade.
Jag flyttade preics koden från includefilen in i filen där funktionerna används och då fungerar det konstigt nog.

Har även fått ordning på det andra med, det här med färgning av datum fixade genom DateDiff().

For dtm = dtmFirstDay To dtmLastDay
	the_month = ""
	If intCount Mod 7 = 0 AND intCount > 0 Then
		Response.Write(VbTab & "<div style=""clear: both; height: 0px;"">&nbsp;</div>" & VbCrLf)
		Response.Write(VbTab & "<p class=""weekday asweek"" style=""border-left: 1px #6D6D6D solid;""><br /><br />" & DatePart("ww", dtm, 2, 2) & "</p>" & vbCrLf)
	End If
	If DateDiff("m", date_string, dtm) = -1 Or DateDiff("m", date_string, dtm) = 1 Then
		Response.Write(VbTab & "<p class=""weekday premonth"">" & DatePart("d", dtm) & "</p>" & vbCrLf)
	Else
		Response.Write(VbTab & "<p class=""weekday"">" & Day(dtm) & "</p>" & vbCrLf)
	End If
	intCount = intCount + 1
Next

Finns det kanske någon alternativ lösning?

Medlem sedan juni 20003 076 inlägg
#9

Kul att du fick fart på grejjorna! :)

MickeA.com skrev:

Finns det kanske någon alternativ lösning?

Det ser väl bra ut.
En liten optimeringsgrej kan ju vara att skippa din intCount, den behöver du egentligen inte.
Du skulle kunna nyttja weekday() istället för att ta reda på brytningarna.
http://www.devguru.com/technologies/vbscript/13987.asp

Jag är ganska säker på att du listar ut hur! ;)

Medlem sedan feb. 20034 441 inlägg
#10

doggelito skrev:

En liten optimeringsgrej kan ju vara att skippa din intCount, den behöver du egentligen inte.
Du skulle kunna nyttja weekday() istället för att ta reda på brytningarna.
http://www.devguru.com/technologies/vbscript/13987.asp

Jag är ganska säker på att du listar ut hur! ;)

Hehe, jo, det grejjar jag nog utan problem, tack!

269 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)