webForumDet fria alternativet

Kalendern vill inte börja med första dagen i månden

ASP

86 svar · 1 703 visningar · startad av plelkes · sida 3 av 5

Frågan, av plelkes

Hej, jag har snickrat ihop en kalender som skall i HTML-tabell visa aktuell månads dagar. Nedanstående kod fungerade perfekt för maj-03 <%@LANGUAGE=VBSCRIPT %> <% Option Explicit %> <HTML> <BODY> <% Session.LCID = 1053 'Vi skapar en array med 42 element. 1:a elementet = 1:a cellen = 1:a Måndagen i månaden '2:a elementet = 2:a cellen = 1:a Tisdagen i månaden 'osv 'Om vi placerar månadens daga

Läs frågan i sin helhet →
Medlem sedan mars 2002823 inlägg
#41

Engine, jag skämms men fattar ändå mindre*snyft*

  • varför är måndag arrayens första dag - (för det är ju den om arr(0)=måndag
intFirstDayIndex = WeekDay("2003-06-01", 2)

utgår du i denna kod oxå från att måndag är arrayens första dag?

intFirstDayIndex = WeekDay("2003-06-01", 2) - 1 (= 6)

Denna månads första dag är alltså en söndag. 2 = vbMonday.

I loopen ska alltså datum 1 sättas in i arrayen på index 6.

Hur kommer det sig att det blir en 6:a och inte -1

Medlem sedan mars 2002823 inlägg
#42

snälla Engine^ ,
väntar med förväntan på ditt svar

Medlem sedan mars 2002823 inlägg
#43

Det verkar vara omöjligt att få kontakt med Engine*suck*
Kan ngna annan kanske förklar hur han tänkte?

Loopen placerar ut datumen på "rätt plats" i Arrayen.
Eftersom a_intKalender går från 0 till 41, så startar jag helt enkelt på (veckodagsnumret för den första den sökta månaden) - 1. -1 så att inte indexet blir galet.

Här fattar jag ändå tills

på (veckodagsnumret för den första den sökta månaden) - 1. -1 så att inte indexet blir galet.

Varför just "-1"?

intFirstDayIndex = WeekDay("2003-06-01", 2) - 1 (= 6)

Jag fattar att 2=vbMonday.. Men är den med för att jag vill att veckan skall starta på en måndag?
hur kommer man fram till att = 6? 1:a dagen är på 0:e plats i arrayen. då borde det bli -1??

Medlem sedan mars 20015 287 inlägg
#44

Med koden:
WeekDay("2003-06-01", 2)

Vill du ju få fram vilken veckodag det är den aktuella veckan.
2:an säger ju att veckans första dag är måndag, mao är måndag = 0.
Eftersom att 1/6-2003 är en söndag, får den numret 7.(Dag 7 i veckan)
Drar du bort 1 från 7 så har du 6 kvar.
Klart som korvspad. ;)

Tror jag...

Medlem sedan mars 2002823 inlägg
#45

Men är den koden allmängilltig, dvs kan användas för all månader?

Medlem sedan mars 20015 287 inlägg
#46

Det tycker jag banne mig att den ska vara. Du kan kika på MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vsfctweekday.asp

Medlem sedan mars 2002823 inlägg
#47

Ok,
nu har jag äntligen fattat konstruktionen med WeekDay()
Men i aktiella fallet har Engine lagt till "-1" dvs

WeekDay()-1

Och ni har förklarat med att -1 behövs för att aktuell månad börjar med söndag...
Då har jag följande frågor

  1. hur kan då koden vara allmängiltig? Alla månader börjar väl inte med söndag
Medlem sedan dec. 20003 887 inlägg
#48

Hmm... förlåt min frånvaro ;)

WeekDay returnerar vilken dag i veckan datumet du skickar in till funktionen motsvarar. WeekDay("2003-06-14", 2) - 1 returnerar fem, eftersom 1 = Måndag, 2 = Tisdag, ..., 6 = Lördag. Utan -1 skulle resultatet bli 6 och arrayen skulle förskjutas med ett steg "åt höger". Nu är det förvisso inte nödvändigt att använda -1 utan det går även att ändra loopen från 0 - 41 till 1 - 42.

Svar 1: Alla månader börjar med den första... WeekDay() returnerar alltså vilken dag i veckan som är månadens första dag.

Nu ser jag då jag läser igenom att jag inte skriver vad jag riktigt menar ibland och det kan jag tänka mig försvåra för dig en del :) Men men... fråga på du så kommer det i sinom tid ett helt korrekt svar ;)

Medlem sedan mars 2002823 inlägg
#49

Tillbaka från brölloppsresan, så gav jag mig i kast med mitt projekt igen...

Jag provade använda mig av de tipps som jag fick från Engine^ :birp , försökte midifiera lite till nedanstående

<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD>
<TITLE>wf</TITLE>
</HEAD>

<BODY>
<%
Session.LCID = 1053
Dim intFirstDayIndex, dagensdat, iDayMonth, iDag, aKalender(42)
dagensdat = Date()
intFirstDayIndex = WeekDay(dagensdat, 2) - 1
iDayMonth  = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, 1-1)) 'da´n innan första dagen i 

'Får att fylla vår array (som ju heter aKalender) behöver vi en loop från dag 1 i aktuell månad till
'sista dagen i aktuell månad
'Loopen kommer att snurra lika många varv som det finns dagar i månaden
For i = intFirstDayIndex to iDayMonth
    aKalender(i) = iDag
	iDag = iDag + 1  'för att förtydliga formeln: iDag = räknaren iFirstdayMonth är med för att det skall börja räkna från första dagen i månaden.

Next

  'låt oss skapa tabellen
%><TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75%> 
<TH COLSPAN=7> <FONT SIZE=+2> 
  <%
 'visa aktuell månad och år
   Response.Write MonthName(Month(dagensdat))
   Response.Write ", " & Year(dagensdat)
%>
  </FONT> </TH>
<%
Response.Write "<TR><TD><CENTER><B>"
  Response.Write "Måndag"  
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Tisdag"
  Response.Write "</B></CENTER></TD> <TD><CENTER><B>"
  Response.Write "Onsdag" 
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Torsdag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Fredag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Lördag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Söndag"
  Response.Write "</B></CENTER></TD></TR>"
For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>"
If aKalender(i) = "" Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write "&nbsp;" & "</TD>"
Else
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender(i)
Response.Write "</FONT></CENTER></TD>"
End If
Next
If i mod 6 = 0 And i <> 0 Then 
Response.Write "</TR>"
End If

%>

</TABLE>
</BODY>
</HTML>

Men som ni ser blev ju inte resultatet bra alls.. Följande fel blev resultatet:

  • månaden börjar på en tisdag
  • månaden slutar på onsdag
Medlem sedan mars 20015 287 inlägg
#50

iDag ska väl vara lika med 1 innan du börjar loopa.
Du måste väl utgå från den första i månaden för att det ska bli rätt med veckorna/datumen och inte med Date() ?

Sen när du fyller din array måste du väl göra typ som Engine gör, annars blir ju arrayen inte tillräkligt "lång":

intLastDayIndex = IntFirstDayIndex - 1 + DatePart("d", (DateAdd("m", 1, dteCurrentDate)))

' div kod...

For i = intFirstDayIndex to intLastDayIndex 
'osv
Medlem sedan mars 2002823 inlägg
#51

Nu fick jag för mina "synder". Skall aldrig mera göra avkall från min princip att för att kunna lära mig ngt, så måste jag förstå:r

iDag ska väl vara lika med 1 innan du börjar loopa.

varför det??

intLastDayIndex = IntFirstDayIndex - 1 + DatePart("d", (DateAdd("m", 1, dteCurrentDate)))

Jag förstår inte denna konstruktion. Om jag tillämpar på aktuell månad blir det som nedan:

 Session.LCID = 1053
 intFirstDayIndex = WeekDay("2003-06-01", 2) - 1
 intLastDayIndex = IntFirstDayIndex - 1 + DatePart("d", (DateAdd("m", 1, "2003-06-01") - 1))

Så får jag intLastDayIndex = 35

DateAdd("m", 1, "2003-06-01") – 1

ger som sig bör

you can use DateAdd to calculate a date 30 days from today

aktuell månads sista datum.

 DatePart("d", DateAdd("m", 1, "2003-06-01") - 1 )

ger antalet dagar som aktuell månad har. I vårt fall 30

 IntFirstDayIndex – 1

ger en 5:a = lördag som stämmer överens med föregående månads sista dagsindex

Sammantaget ger detta att

 For i = intFirstDayIndex to intLastDayIndex

kan översättas som

For i = 6 to 35

Och allt detta stämmer ju kanon fint..
M E N hur i hela fridens namn har Engine kommit fram till detta?????

Medlem sedan feb. 200112 078 inlägg
#52

Varför allt detta skrikande? Lugna ner oss ett par gram, tack.

MVH
OveRRidE

moderator, webForum

Medlem sedan mars 2002823 inlägg
#53

skrikande?
ber omursäkt, var absolut nte min mening :r

Medlem sedan mars 2002823 inlägg
#54

Förresten ytterligar en konstruktion som jag skulle behöva förstå är

mod är samma som division med rest: 7 mod 6 = 1, 7 mod 7 = 0... modul operation

For i = 0 To 41
  If i mod 7 = 0 Then strHTML = strHTML & "<tr>"

Betyder väl att om I = 7, 17, 21, 28, eller 35 då skrivs strHTML = strHTML & "<tr>"
Stämmer detta?

Medlem sedan mars 20015 287 inlägg
#55

På sista frågan svarar jag: ja.
Det stämmer väl va? Den ska ju byta rad efter sju dagar.

Hela tekninken med denna almanacka som jag ser det är att den utgår från en matta med 42 fält.
Frågan är alltså dels hur många fält som ska markeras samt vilken dag det ska börja markeras på.
Antalet får du ju reda på genom att kolla hur många dagar den aktuella månaden innehåller.
Vilken veckodag som är den första får du ju reda på genom WeekDay-funktionen.

Sen kollar du ju lätt hur många tomma rutor som ska skrivas innan du loppar ut de riktiga dagarna.

<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD>
<TITLE>wf</TITLE>
</HEAD>

<BODY>
<%
Session.LCID = 1053
Dim intFirstDayIndex, dagensdat, iDayMonth, iDag, aKalender(42)
dagensdat = "2003-06-01"

intFirstDayIndex = WeekDay(dagensdat, 2) - 1
iDayMonth  = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, 0)) 'da´n innan första dagen i 
intLastDayIndex = intFirstDayIndex  + iDayMonth - 1

'Första veckodagens placering, -1 = Antal tomma rutor/dagar innan utskrivning av eg. dagar.
'Antalet dagar i månaden
'Sista dagens placering i månaden. Tar -1 här för att jämka med intFirstDayIndex.

iDag = 1
For i = intFirstDayIndex to intLastDayIndex 

    aKalender(i) = iDag
	iDag = iDag + 1

Next

  'låt oss skapa tabellen

  Response.Write "<TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75% >"
  Response.Write "<TH COLSPAN=7> <FONT SIZE=+2>"

 'visa aktuell månad och år
   Response.Write MonthName(Month(dagensdat))
   Response.Write ", " & Year(dagensdat)

  Response.Write "</FONT> </TH>"
  Response.Write "<TR><TD><CENTER><B>"
  Response.Write "Måndag"  
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Tisdag"
  Response.Write "</B></CENTER></TD> <TD><CENTER><B>"
  Response.Write "Onsdag" 
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Torsdag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Fredag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Lördag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Söndag"
  Response.Write "</B></CENTER></TD></TR>"

For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>"
If aKalender(i) < 1 Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
Else
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender(i) & " " 
Response.Write "</FONT></CENTER></TD>"
End If
Next

If i mod 6 = 0 And i <> 0 Then 
Response.Write "</TR>"
End If

Response.Write "</TABLE></BODY></HTML>"
%>
Medlem sedan mars 2002823 inlägg
#56

Tack för det :birp .. Äntligen tror jag att jag har fattad det hela

Hela tekninken med denna almanacka som jag ser det är att den utgår från en matta med 42 fält.
Frågan är alltså dels hur många fält som ska markeras samt vilken dag det ska börja markeras på.

Detta var/är mitt syfte redan från bröjan.
Nu skall vi se om jag fattat rätt:

intLastDayIndex = intFirstDayIndex  + iDayMonth - 1

För att få rätt i array, så måste jag starta från första dagen och addera antalet dagar i månaden

If i mod 7 = 0 Then Response.Write "<TR>"

Eftersom raderna går 0 ->6, 7 ->13, 14 ->20 osv så börha en ny tabellrad för varje gång i/7 = 0, dvs 0, 7, 14, 21, 28, 35

Medlem sedan dec. 20003 887 inlägg
#57

En almanacka är skoj, eller hur?

Jag gjorde en ny lösning (som förvisso är i C#, men men), som jag kan skicka dig koden till (Den fanns för allmän åskådan på min testsida http://engine.servehttp.com).

red. Min sida är förändrad, så kalendern finns inte att se längre

Medlem sedan mars 2002823 inlägg
#58

Nu har jag gjort ytterligare modifieringar, bla att man kan välja månad och år själv.

<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD>
<TITLE>wf</TITLE>
</HEAD>

<BODY>
<%
Session.LCID = 1053

Dim intFirstDayIndex, dagensdat, iDayMonth, iDag, aKalender(42), strDate, dteDate

strDate = Request.Form("year") & "-" & Request.Form("month") & "-01"
dteDate = CDate(strDate)

intFirstDayIndex = WeekDay(dteDate, 2) - 1  
iDayMonth  = DatePart("d", DateSerial(Year(Request.Form("year")), Month(Request.Form("month"))+1, 0)) 

intLastDayIndex = intFirstDayIndex  + iDayMonth - 1 
iDag = 1
For i = intFirstDayIndex to intLastDayIndex 

    aKalender(i) = iDag
	iDag = iDag + 1

Next

Response.Write "<TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75% >"
Response.Write "<TH COLSPAN=7> <FONT SIZE=+2>"

   Response.Write MonthName(Month(dteDate))
   Response.Write ", " & Year(dteDate)

  Response.Write "</FONT> </TH>"
  Response.Write "<TR><TD><CENTER><B>"
  Response.Write "Måndag"  
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Tisdag"
  Response.Write "</B></CENTER></TD> <TD><CENTER><B>"
  Response.Write "Onsdag" 
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Torsdag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Fredag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Lördag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Söndag"
  Response.Write "</B></CENTER></TD></TR>"
For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>"  

If aKalender(i) < 1 Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
Else
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender(i) & " " 
Response.Write "</FONT></CENTER></TD>"
End If
Next

If i mod 6 = 0 And i <> 0 Then 
Response.Write "</TR>"
End If

Response.Write "</TABLE></BODY></HTML>"
%>

Har bara hunnit testa med ngra månader, men funnit redan att

  1. blir fel dvs månaden slutar på måndagen 31:a för juni-02
  2. för januari-90 så blir det 1 st extra tabellrad - kan jag bli av med denna rad på ngt sätt?

En så länge har jag formuläret där år och månadväljes på en egen sida

Medlem sedan mars 2002823 inlägg
#59

Får följande fle utskrift:

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'CDate'

/plelkesprojekt/test_list.asp, line 35

Rad 33 - 35 ser ut som följer:

Dim intFirstDayIndex, dagensdat, iDayMonth, iDag, aKalender(42), strDate, dteDate

strDate = Request.Form("year") & "-" & Request.Form("month") & "-01"
dteDate = CDate(strDate)
Medlem sedan mars 2002823 inlägg
#60

Snälla, kan ngn av Er gurus berätta vilket fel koden har?

<%@LANGUAGE="VBSCRIPT" %>
<HTML>
<HEAD>
<TITLE>wf</TITLE>
</HEAD>

<BODY>
<%
Session.LCID = 1053

Dim intFirstDayIndex, dagensdat, iDayMonth, iDag, aKalender(42), strDate, dteDate

strDate = Request.Form("year") & "-" & Request.Form("month") & "-01"
dteDate = CDate(strDate)

intFirstDayIndex = WeekDay(dteDate, 2) - 1  
iDayMonth  = DatePart("d", DateSerial(Year(Request.Form("year")), Month(Request.Form("month"))+1, 0)) 

intLastDayIndex = intFirstDayIndex  + iDayMonth - 1 
iDag = 1
For i = intFirstDayIndex to intLastDayIndex 

    aKalender(i) = iDag
	iDag = iDag + 1

Next

Response.Write "<TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75% >"
Response.Write "<TH COLSPAN=7> <FONT SIZE=+2>"

   Response.Write MonthName(Month(dteDate))
   Response.Write ", " & Year(dteDate)

  Response.Write "</FONT> </TH>"
  Response.Write "<TR><TD><CENTER><B>"
  Response.Write "Måndag"  
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Tisdag"
  Response.Write "</B></CENTER></TD> <TD><CENTER><B>"
  Response.Write "Onsdag" 
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Torsdag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Fredag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Lördag"
  Response.Write "</B></CENTER></TD><TD><CENTER><B>"
  Response.Write "Söndag"
  Response.Write "</B></CENTER></TD></TR>"
For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>"  

If aKalender(i) < 1 Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
Else
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender(i) & " " 
Response.Write "</FONT></CENTER></TD>"
End If
Next

If i mod 6 = 0 And i <> 0 Then 
Response.Write "</TR>"
End If

Response.Write "</TABLE></BODY></HTML>"
%>

Alla månader får 31 dagar, även februari. Månaderna börjar på rätt dag, men slutar på dag 31 :q
SNÄLLA hjälp mig please

276 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)