webForumDet fria alternativet

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

ASP

86 svar · 1 703 visningar · startad av plelkes

Medlem sedan mars 2002823 inlägg
Frågan#1

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 dagar på de korrekta positionerna i arrayen, kan formaterad utskrift av kalendern 
'fås genom att loopa igenom arrayen.
'Exempel:
'om aktuella månadens första dag är en tisdag (= 3 i funktionen DatePart() ). Med andra ord så tilldelas 
'3:e elementet i vår arrey värdet 1. 4:e elementet i arreyen ( = onsdag i funktionen DatePart()) tilldelas värdet 2.
'Detta fortsätter så många gånger som det finns dagar i månaden.

Dim dagensdat  'för att få reda på det aktuella datumet
Dim iFirstDayMonth  'aktuella månadens första dag
Dim iDayMonth 'hur många dagar innehåller den aktuella månaden?
Dim aKalender(42) 'vi fyller arrKalenderDagar med aktuella månadens dagar
Dim iDag    'månadens dagar
Dim sWeekDayNamn
Dim Radbehov   'antalet rader som vår tabell behöver
Dim iVecka  'antalet rader vi har
Dim iVeckodag 'kolumnerna i tabellen

dagensdat = Date()
iFirstDayMonth = DatePart("w", DateSerial(Year(dagensdat), Month(dagensdat), 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 iDag = 1 to iDayMonth
    aKalender(iDag + iFirstDayMonth -2) = iDag  '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

'Nu när vi har vår array vill vi visa vår almanacka som en HTML-tabell med veckans dagar som kolumner
'och veckorna som rader.
'Antalet rader (Radbehov) som tabellen kommer att innehålla fås fram genom:
'från totala antalet celler subtrahera sista lementet i vår array.
Radbehov = 6 - INT((42 - (iFirstDayMonth + iDayMonth))/7)

'Nu när vi vet hur många rader vi behöver, skapar vi 2 loopar:
'Loop1 - itererar igenom antalet rader
'Lopp2 - lopar igenom kolumnerna, dvs. veckans dagar
 '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>"

'skapa ett nytt rad
For iVecka = 1 to Radbehov
Response.Write "<TR>"
For iVeckodag = 1 to 7
'skapa en ny cell
'om cellen är tom, så fyll cellen med svartfärg, annars visa dagen
If aKalender((iVecka-1)*7 + iVeckodag) > 0 then 'visa datumet
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender((iVecka-1)*7 + iVeckodag)
Response.Write "</FONT></CENTER></TD>"
Else 'fyll cellen med svart färg"
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write "&nbsp;" & "</TD>"
End If
Next
Response.Write "</TR>"
Next

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

Men som ni ser här kommer inte månadens första dag med

Detta ger upphov till följande frågor:

  1. vilket/vilka fel har jag gjort?
  2. varför fungerade det för maj-03?
Medlem sedan mars 2002823 inlägg
#2

Genom att ägna mig åt felsökning har jag kommit fram till att raderna innehåller fel

Radbehov = 6 - INT((42 - (iFirstDayMonth + iDayMonth))/7)
For iVecka = 1 to Radbehov
Response.Write "<TR>"
For iVeckodag = 1 to 7
'skapa en ny cell
'om cellen är tom, så fyll cellen med svartfärg, annars visa dagen
If aKalender((iVecka-1)*7 + iVeckodag) > 0 then 'visa datumet
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender((iVecka-1)*7 + iVeckodag)

Det grundar jag på:

  • månadnes första dag är rätt
  • antalet dagar i månaden är rätt
  • MEN!! Radbehovet "beräknas" till 5, när det i verkligheten är 6
Medlem sedan dec. 20003 887 inlägg
#3
For iVecka = 0 To Radbehov

eller

Radbehov = 7 - INT((42 - (iFirstDayMonth + iDayMonth))/7)

Kan det vara ditt bekymmer?

Medlem sedan mars 2002823 inlägg
#4

Tyvärr EngineEngine^ ingen av dina förslag löser det*suckochcnyft*

For iVecka = 0 To Radbehov

Ger fel-utskrift som duser .
Och

Radbehov = 7 - INT((42 - (iFirstDayMonth + iDayMonth))/7)

Lägger till en tabell-rad
Och det jag vill åstadkomma är ju att månadens första dag - som i detta fall är en söndag - skall 1:an hamna på söndag i en rad mellan dag-raden och den raden som börjar med en 2:a

Medlem sedan dec. 20003 887 inlägg
#5

Kontrollera denna rad

iDayMonth  = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, [b]1-1[/b])) [blue]'da´n innan första dagen i[/blue]
Medlem sedan mars 2002823 inlägg
#6

Kontrollera denna rad
kod:--------------------------------------------------------------------------------iDayMonth = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, 1-1)) 'da´n innan första dagen i--------------------------------------------------------------------------------

???
Är det ngt fel där?
i så fall vad?

Medlem sedan mars 2002823 inlägg
#7

Nu har jag försökt så hårt att huvudet ramlar i bitar*snyft*
Men fattar inte felet...
Kan inte hitta felet i

iDayMonth  = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, 1-1))

heller..

Response.Write iDayMonth

ger som det sig bör 30
och

Response.Wrie Month(dagensdat)+1

ger som det skall nämligen 7 som ju är juli

Medlem sedan mars 2002823 inlägg
#8

Snälla alla duktiga ASPare.... ngn som kan hjälpa mig??

Medlem sedan apr. 2001425 inlägg
#9

Byt ut raden:


iFirstDayMonth = DatePart("w", DateSerial(Year(dagensdat), Month(dagensdat), 1))

till

iFirstDayMonth = DatePart("w",DateSerial(Year(dagensdat),Month(dagensdat),1),vbMonday)

mvh

Medlem sedan mars 2002823 inlägg
#10

Tack för ditt tipps Macce, men inte heller det blir rätt..

Som Du/Ni ser börjar månaden med en lördag, istället för på en söndag, och slutar på söndag istället för på en måndag

Medlem sedan apr. 2001425 inlägg
#11

då har du gjort nåt fel, medan jag kollade på din kod, testade den och det funkar...

Medlem sedan apr. 2001425 inlägg
#12

här

<%
Session.LCID = 1053

Dim dagensdat  'för att få reda på det aktuella datumet
Dim iFirstDayMonth  'aktuella månadens första dag
Dim iDayMonth 'hur många dagar innehåller den aktuella månaden?
Dim aKalender(42) 'vi fyller arrKalenderDagar med aktuella månadens dagar
Dim iDag    'månadens dagar
Dim sWeekDayNamn
Dim Radbehov   'antalet rader som vår tabell behöver
Dim iVecka  'antalet rader vi har
Dim iVeckodag 'kolumnerna i tabellen

dagensdat = Date()
iFirstDayMonth = DatePart("w",DateSerial(Year(dagensdat),Month(dagensdat),1),vbMonday)
iDayMonth  = DatePart("d", DateSerial(Year(dagensdat), Month(dagensdat)+1, 1-1)) 'da´n innan första dagen i 

For iDag = 1 to iDayMonth
    aKalender(iDag + iFirstDayMonth -2) = iDag 
Next

Radbehov = 6 - Round((42-(iFirstDayMonth+iDayMonth))/7)

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

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

'skapa ett nytt rad
For iVecka = 1 to Radbehov
Response.Write "<TR>"
For iVeckodag = 1 to 7
'skapa en ny cell
'om cellen är tom, så fyll cellen med svartfärg, annars visa dagen
If aKalender((iVecka-1)*7 + iVeckodag) > 0 then 'visa datumet
Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
Response.Write aKalender((iVecka-1)*7 + iVeckodag)
Response.Write "</FONT></CENTER></TD>"
Else 'fyll cellen med svart färg"
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " " & "</TD>"
End If
Next
Response.Write "</TR>"
Next

Response.Write "</TABLE>"
%>
Medlem sedan apr. 2001425 inlägg
#13

med

Round((42-(iFirstDayMonth+iDayMonth))/7)

istället för Int-slipper du den svarta sista raden...

Medlem sedan mars 2002823 inlägg
#14

Mycket mystiskt att du har fått det hela att funger...

Jag har klippt och klistrat - men får det hela INTE att fungera
så här blir det ändå

Medlem sedan apr. 2001425 inlägg
#15

Tycker det ser bra ut !

Medlem sedan dec. 20003 887 inlägg
#16

Det verkar vara så att du använder dig av fel index i din aKalender(), när du kör aKalender((iVecka - 1) * 7 + iVeckodag). Har du kontrollerat vad som sker om du skippar - 1?

iFirstDayMonth och iDayMonth är ju helt riktiga, så det borde fungera...

Medlem sedan mars 2002823 inlägg
#17

Jag får inte till det hela ngn som kan hjälpa mig please??
Jag har fyllt min array - och det funkar som ni ser här
Nu vill jag:

  1. presentera arrayen i form av en tabell se nedan på sidan
  2. Med början i rätt ruta - dvs om månadnes första dag är en söndag, så skall det stå 1 i rutan för söndag i vecka 1 (iDag = 1)
  3. fylla på så länge som det finns antal dagar i aktuell månad -nästa ruta 2 (iDag = 2), nästa 3 (iDag = 3) osv..
  4. om rutan inte innehåller dag - så fyll rutan med svart färg

Snälla hjälp mig innan jag blir galen

Medlem sedan mars 2002823 inlägg
#18

Snälla experter här i forumet - ngn av Er som kan visa mig ljuset, dvs visa en lösning??

Medlem sedan mars 2002823 inlägg
#19

Hej blir bara konstigare och konstigare...
Med nedanstående kod:

<%@ Language = VBSCRIPT %>
<% Option Explicit %>

<HTML>
<BODY>

<%

   'Next, we need to obtain the current
   'date.  To do this, we will store the result of the
   'Date() function into a variable named dbCurrentDate
   Dim dbCurrentDate
   dbCurrentDate = "4/1/2003"

   'Now, we need to display a calendar.  At most, a calendar
   'can have six weeks.  Since a week contains seven days,
   'we will show, at most, 42 calendar cells.  We will use
   'a TABLE to generate this calendar

   'We will create an array that will store the 42 possible
   'days of the month.
   Dim aCalendarDays(42)

   'Into aCalendarDays, we will place the days of the current
   'month.  We will use the DatePart function to determine
   'when the first day of the month is
   Dim iFirstWeekday
   iFirstWeekday = DatePart("w",DateSerial(Year(dbCurrentDate), Month(dbCurrentDate), 1))

   'Now, we want to loop from 1 to the number of days in the
   'current month, populating the array aCalendarDays
   'Loopen gör ju att värdet: ( iLoop + iFirstWeekday - 1) ändras för varje varv 
   'loopen gör (iLoop räknas ju upp ett snäpp). Då blir det ju som så att först får då 
   'aCalendarDays(4) sitt värde, nästa varv får aCalendarDays(5) sitt värde osv. 
    'iLoop är ju själva räknaren som räknar upp, startar på 1, därav dras det sen bort -1
	'alternativet borde ju kunna vara att börja räkna från 0 i stället. 
    'iFirstWeekday är ju med för att den inte ska börja räkna på första dagen i veckan, utan 
	'första dagen i månaden.
	'iLoop = antalet dagar i aktuella månaden

   Dim iDaysInMonth
   iDaysInMonth = DatePart("d",DateSerial(Year(dbCurrentDate), Month(dbCurrentDate)+1, 1-1))
   Dim iLoop
   For iLoop = 1 to iDaysInMonth
      aCalendarDays(iLoop + iFirstWeekday - 2) = iLoop
   Next

   'Now that we have our populated array, we need to display the
   'array in calendar form.  We will create a table of 7 columns,
   'one for each day of the week.  The number of rows we will use
   'will be 6, the total number of possible rows, minus 42 (the upper 
   'bound of the aCalendarDays array) minus the last array position
   'used (iFirstWeekday + iDaysInMonth) divided by seven, the number of
   'days in the week!  Simple, eh!!  :)
   Dim iColumns, iRows
   iColumns = 7
   iRows = 6 - Int((42 - (iFirstWeekDay + iDaysInMonth)) / 7)
   '(iFirstWeekDay + iDaysInMonth) = totala antalet celler som behövs

   'Now, create the table
%>

   <TABLE ALIGN=CENTER BORDER=1 CELLSPACING=1 WIDTH=75% HEIGHT=75%>
     <TH COLSPAN=7>
        <FONT SIZE=+2>
<%
   'Display the month and year
   Response.Write GetMonthName(Month(dbCurrentDate))
   Response.Write ", " & Year(dbCurrentDate)
%>
        </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>"
  
   'Now, loop through 1 through iRows, then 1 through iColumns
   Dim iRowsLoop, iColumnsLoop
   For iRowsLoop = 1 to 6
     'Create a new row
     Response.Write "<TR>"
     For iColumnsLoop = 1 to 7
       'Create a new column
       'If there is a day there, display it, else black out the cell
       If aCalendarDays((iRowsLoop-1)*7 + iColumnsLoop)="" then
         'Black out the cell
         Response.Write "<TD BGCOLOR=BLACK>&nbsp;</TD>"
       Else
        'Display the date
         Response.Write "<TD VALIGN=TOP ALIGN=RIGHT WIDTH=""14%"">"
         Response.Write aCalendarDays((iRowsLoop-1)*7 + iColumnsLoop)
         Response.Write "</TD>"
       End If
     Next

     'Close the row
     Response.Write "</TR>"
   Next
%>

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

Så fungerar det för:
april03
juli-03
januari-02 Men när jag kör för innevarande månad så blir det konstig. Som ni ser får jag inte med månadens första dag alls - som ju är en söndag .

Händer bara just juni -03 av alla de månader jag har provat!!

[3]Kan ngn av ER på detta forum please förklara varför?

Medlem sedan mars 2002823 inlägg
#20

Snälla forumet:
Finns det ngn som kan lösa ovanstående mysterium för mig???????

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
134 ms — ändringar (db)