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 4 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 20015 287 inlägg
#61

iDayMonth = DatePart("d", DateSerial(Year(dteDate), Month(dteDate)+1, 0))

Medlem sedan mars 2002823 inlägg
#62

MItt nästa problem är att jag hela tiden får en rad med tomma (dvs svarta) celler. Så jag har försökt med (ändringen är i fet-stil)

For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>" 
If aKalender(i)= "" [B]And i mod < 7[/B] 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

Men får bara felmeddelandet:

Microsoft VBScript compilation error '800a03ea'
Syntax error
If aKalender(i)= "" And i mod < 7 Then
------------------------------^

Medlem sedan dec. 20003 887 inlägg
#63
If aKalender(i) = "" And i mod 7 > 0 Then

Menar du så?
Det är enklare att kolla på detta sätt

If i < iFirstDayIndex Or i > iLastDayIndex Then
Medlem sedan mars 2002823 inlägg
#64

Tyvärr funkar inget av dina förslag - dvs fel rutor blir svart färgade.
Det jag vill är att efter att månadens sista dag är i fylld , så kompleteras den tabellraden, och därefter

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

Har även försökt med

Do Until i mod NOT 7

Men får inte till detta heller

Medlem sedan dec. 20003 887 inlägg
#65

Den sista dagen är iLastDayIndex, så när i > iLastDayIndex uppfylls, så är den sista dagen i månaden utskriven. Bekymret du har kvar är att sista cellen du skriver ut troligtvis behöver få en colspan="x", där x = 7 - (i mod 7). Då bör du kunna skriva din loop på följande sätt

Response.Write "<table><tr>"

For i = 0 to iLastDayIndex
  If i mod 7 = 0 Then Response.Write "</tr><tr>"

  If i < iFirstDayIndex Then
    Response.Write "<td bgcolor=""black"">&amp;nbsp;</td>"
  Else
    Response.Write "<td align=""center"" valign=""middle"" bgcolor=""black"" style=""color: #330099;"">" & aKalender(i) & "</td>"
  End If
Next

x = 7 - (iLastDayIndex mod 7)

If x > 0 Then Response.Write "<td colspan=""" & x & """>&amp;nbsp;</td>"

Response.Write "</tr></table></body></html>"

Mod-operationen är precis som plus, minus eller division osv, så du kan inte kombinera den hur du vill.

Medlem sedan mars 2002823 inlägg
#66

Jag är ledsen Engine, men dit senaste kod verkar inte fungera
Nedanstående kod genererar ovanstående sida

'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(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>"
  Response.Write "<tr>"

  For i = 0 to iLastDayIndex
  If i mod 7 = 0 Then Response.Write "</tr><tr>"

  If i < iFirstDayIndex Then
    Response.Write "<td bgcolor=""black"">&nbsp;</td>"
  Else
    Response.Write "<td align=""center"" valign=""middle"" bgcolor=""black"" style=""color: #330099;"">" & aKalender(i) & "</td>"
  End If
Next

x = 7 - (iLastDayIndex mod 7)

If x > 0 Then Response.Write "<td colspan=""" & x & """>&nbsp;</td>"

Response.Write "</tr></table></body></html>"
%>
Medlem sedan dec. 20003 887 inlägg
#67

Det blidde ett felmeddelande där...

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'CDate'

/plelkesprojekt/test_list.asp, line 35

Medlem sedan mars 2002823 inlägg
#68

För att slippa ovanstående felmedd. måste ändra koden

DateSerial(Year(Request.Form("year")), Month(Request.Form("month"))+1, 0))

till
[KOD]iDayMonth = DatePart("d", DateSerial(Year(dteDate), Month(dteDate)+1, 0))

Medlem sedan dec. 20003 887 inlägg
#69

Ska det inte vara

DateSerial(Request.Form("year"), Request.Form("month") + 1, 0)

Eftersom jag antar att du har en <select> för år och en för månad.

Medlem sedan mars 2002823 inlägg
#70

verkar funka med båda sätten

Medlem sedan mars 2002823 inlägg
#71

Vet att troligtvis såbryter jag mot ngra principer vi har här på forumet, men äär på jobbet och får inte fram felutskrifterna..
Vill fortfarande trolla bort sista svarta raden.
Kommet på följande konstruktion som borde funka, men ngnstans blir det fel:

For i = 0 to 41
If i mod 7 = 0 Then Response.Write "<TR>"  'i mod 7 = 0 betyder att om i är jämt delad med 7
'Eftersom raderna går 0 ->6, 7 ->13, 14 ->20 osv så börjar_
'en ny tabellrad för varje gång i/7 = 0, dvs_
'0, 7, 14, 21, 28, 35

If aKalender(i) < 1 Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
If i > intLastDayIndex And i mod 7 = 0 Then Response.Write "</TR>_
</TABLE></BODY></HTML>"
Else
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
End If
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 dec. 20003 887 inlägg
#72

Nu drar jag till med ytterligare en suspekt lösning. Om det fungerar lär du märka det ;)

Response.Write "<tr>"

If iFirstDayIndex > 0 Then
  Response.Write "<td bgcolor=""#000000"" colspan=" & (intFirstDayIndex - 1) & ">&amp;nbsp;</td>"
End If

For i = [b]intFirstDayIndex[/b] to [b]intLastDayIndex[/b]
  If i mod 7 = 0 Then Response.Write "<TR>"  [blue]'i mod 7 = 0 betyder att om i är jämt delad med 7
  'Eftersom raderna går 0 ->6, 7 ->13, 14 ->20 osv så börjar_
  'en ny tabellrad för varje gång i/7 = 0, dvs_
  '0, 7, 14, 21, 28, 35[/blue]

  Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
  Response.Write aKalender(i) & " " 
  Response.Write "</FONT></CENTER></TD>"

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

intColSpan = 7 - (intLastDayIndex mod 7) 
If intColSpan > 0 Then
  Response.Write "<td bgcolor=""#000000"" colspan=" & intColSpan & ">&amp;nbsp;</td>"
End If

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

Får inte Engines lösning att fungera, å andra sidan verkar jag inte få ngra att fungera alls från jobbet*snyft*

Min undran är ifall jag kan skriva som jag skrev i nedanstående kod

1:  If aKalender(i) < 1 Then
2: Response.Write "<TD BGCOLOR=""#000000"">"
3: Response.Write " _" & "</TD>"
4: If i > intLastDayIndex And i mod 7 = 0 Then
5:  Response.Write "</TR>_
6: </TABLE></BODY></HTML>"
7: Else
8: Response.Write "<TD BGCOLOR=""#000000"">"
9: Response.Write " _" & "</TD>"
10: End If
11: Else
12: Response.Write "<TD ALIGN=""CENTER"" 
13: VALIGN=""MIDDLE""><CENTER><FONT 
14: COLOR=""#330099"">"
15: Response.Write aKalender(i) & " " 
16: Response.Write "</FONT></CENTER></TD>"
17: End If
18: Next

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

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

Uppenbarligen är det ngt fel med koden, men vad??
Med rad 4, 5 och 6 har jag tänkt säga att om i> intLastDayIndex
OCH i jämt delbart med 7, dvs vi har kommit till tabellrads slutet så avsluta raden och tabellen.
Om i > intLastDayIndex, men INTE jämt delbart med 7 så skriv ut en svart cell. Fortsätt skriva till radslutet

Medlem sedan mars 2002823 inlägg
#74

Kan tyvärr inte logga in till Brinkster för att prova,
men kan man skriva på följande sätt?

If i mod 7 = 0 Then Response.Write "<TR>" 
If aKalender(i)= "" Then
Response.Write "<TD BGCOLOR=""#000000"">"
Response.Write " _" & "</TD>"
[B]Do until i > intLastDayIndex And i mod 7 = 0
[/B] 
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
Medlem sedan dec. 20003 887 inlägg
#75

Jag blir inte riktigt klok på dina bekymmer ;)

Så här gjorde jag min kalender

dteNow = Date()
intFirstDayIndex = WeekDay(DateSerial(Year(dteNow), Month(dteNow), 1), 2)
intLastDayIndex = DatePart(DateAdd("d", -1, DateAdd("m", 1, DateSerial(Year(dteNow), Month(dteNow), 1))))

strHTML = "<table><tr><td>Mån</td><td>Tis</td><td>Ons</td><td>Tor</td><td>Fre</td><td>Lör</td><td>Sön</td></tr>" & _
        = "<tr><td colspan=""7"" height=""1"" bgcolor=""black""></td></tr>" & _
        = "<tr><td colspan=""" & (intFirstDayIndex - 1) & """>&amp;nbsp;</td>"

For intIndex = intFirstDayIndex To intLastDayIndex
  If intIndex - intFirstDayIndex + 1 = Day(dteNow) Then
    strHTML = strHTML & "<td bgcolor=""white"">" & (intIndex -intFirstDayIndex + 1) & "</td>"
  Else
    strHTML = strHTML & "<td bgcolor=""gray"">" & (intIndex - intFirstDayIndex + 1) & "</td>"
  End If

  If intIndex mod 7 = 0 Then
    strHTML = strHTML & "</tr><tr>"

  intIndex = intIndex + 1
Next intIndex

If 7 - (intLastDayIndex mod 7) > 0 Then
  strHTML = strHTML & "<td colspan=""" & (7 - (intLastDayIndex mod 7)) & "&amp;nbsp;</td>"

strHTML = strHTML & "</tr></table>"

Response.Write strHTML

Den fungerar väl som det är tänkt, men innehåller inga finesser, eftersom jag har suttit och testat där för att kunna hjälpa dig ;) Kruxet kan vara att jag skriver den i C# och svarar dig med VBScript, men jag tror inte att det ska vara några allvarliga missar någonstans.

Medlem sedan mars 2002823 inlägg
#76

Herj,
mina bekymmer:

  1. Varför kan jag inte skriva koden på det sätttet jag angav i mitt förra inlägg?

  2. Är inte bekant med ditt sätt att skriva tex

    strHTML = strHTML & "</tr><tr>"
    

    Hur skulle det se ut med Response.Write?

Medlem sedan dec. 20003 887 inlägg
#77

1. Jag fick den uppfattningen att det inte fungerade?

2. Response.Write "</tr><tr>". strHTML är en sträng jag bygger upp med den HTML-kod som senare ska visas.

Medlem sedan mars 2002823 inlägg
#78

Det stämmer att min kod inte funkar, men undrar varför det inte gör.
Anser att det borde funka om man fritt översätter...

Medlem sedan mars 2002823 inlägg
#79

Ett litet förtydligande kanske:

Nedanstående fungerande if satser

If aKalender(i) < 1 Then
2: Response.Write "<TD BGCOLOR=""#000000"">"
3: Response.Write " _" & "</TD>"
4: If i > intLastDayIndex And i mod 7 = 0 Then
5:  Response.Write "</TR>_
6: </TABLE></BODY></HTML>"
7: Else
8: Response.Write "<TD BGCOLOR=""#000000"">"
9: Response.Write " _" & "</TD>"
10: End If

som jag vill utföra så länge som

Do until i > intLastDayIndex And i mod 7 = 0

Har laborerat med koden, men inte lyckats få till det

1:  If aKalender(i) < 1 Then
2: Response.Write "<TD BGCOLOR=""#000000"">"
3: Response.Write " _" & "</TD>"
4: If i > intLastDayIndex And i mod 7 = 0 Then
5:  Response.Write "</TR>_
6: </TABLE></BODY></HTML>"
7: Else
8: Response.Write "<TD BGCOLOR=""#000000"">"
9: Response.Write " _" & "</TD>"
10: End If
11: Else
12: Response.Write "<TD ALIGN=""CENTER"" 
13: VALIGN=""MIDDLE""><CENTER><FONT 
14: COLOR=""#330099"">"
15: Response.Write aKalender(i) & " " 
16: Response.Write "</FONT></CENTER></TD>"
17: End If
18: Do until i > intLastDayIndex And i mod 7 = 0
19: Next

Snälla ASP-gurus hjälp mig få till det hela

Medlem sedan dec. 20003 887 inlägg
#80
Do Until i > intLastDayIndex And i mod 7 = 0
  If aKalender(i) < 1 Then
    Response.Write "<TD BGCOLOR=""#000000""> _</TD>"
  Else
    Response.Write "<TD ALIGN=""CENTER"" VALIGN=""MIDDLE""><CENTER><FONT COLOR=""#330099"">"
    Response.Write aKalender(i) & " " 
    Response.Write "</FONT></CENTER></TD>"
  End If

  If i mod 7 = 0 Then Response.Write("</tr><tr>")

  i = i + 1
Loop

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

Så skulle det kunna se ut...

Jag tycker den här stackars kodsnutten borde fixa sig själv snart ;)

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