Försöker köra en sub 2ggr.. men den avbryter efter en körning och kör inte vidare.. Du har återanvänt din variabel I i sub-proceduren vilket ställer till problem. Om I inte blir större än 2 i <code> Jag gillar inte att du konkatenerar din sträng. Det slösar resurser i onödan. <b>Varje gång du lägger till något till strängar, alokeras ny plats för strängen, den gamla strängen kopieras över, den ny strängen läggs till.</b> Sorry, du har rätt, det var med .Net som den kom, och det är självklart en StingBuilder jag menar och inte en StringBuffer. Ett antagande jag gjort med det beteende av strängkonkatenering. Går inte köra en sub 2ggr
<code=asp>
sub MakeCalendar(strDate)
strHTML = ""
strHTML = strHTML & "<table class=""calendar"">" & vbCrLf
strHTML = strHTML & vbTab & "<tr>" & vbCrLf
strStartDate = DateAdd("d", 1 - DatePart("d", strDate), strDate)
strEndDate = DateAdd("d", -1, DateAdd("m", 1, strStartDate))
intFDoM = DatePart("w", strStartDate, vbMonday)
For I = 1 To intFDoM - 1
d = d + 1
strHTML = strHTML & vbTab & vbTab & "<td class=""nodate""> </td>" & vbCrLf
Next
For I = 1 To DateDiff("d", strStartDate, strEndDate) + 1
d = d + 1
If d = 8 Then
d = 1
strHTML = strHTML & vbTab & "</tr>" & vbCrLf
strHTML = strHTML & vbTab & "<tr>" & vbCrLf
End If
If DatePart("yyyy", Date) & "-" & DatePart("m", Date) & "-" & DatePart("d", Date) = DatePart("yyyy", strDate) & "-" & DatePart("m", strDate) & "-" & I Then
strHTML = strHTML & vbTab & vbTab & "<td class=""today"">" & I & "</td>" & vbCrLf
Else
strHTML = strHTML & vbTab & vbTab & "<td class=""date"">" & I & "</td>" & vbCrLf
End If
Next
For I = d To 6
strHTML = strHTML & vbTab & vbTab & "<td class=""nodate""> </td>" & vbCrLf
Next
strHTML = strHTML & vbTab & "</tr>" & vbCrLf
strHTML = strHTML & "</table>" & vbCrLf
response.write strHTML
End sub
For I=-2 to 2
MakeCalendar DateAdd("m", I, Date())
Next
</code>Sv: Går inte köra en sub 2ggr
For I = 1 To DateDiff("d", strStartDate, strEndDate) + 1
</code>
så blir den i alla fall det i
<code>
For I = d To 6
</code>
vilket gör att du redan efter första anropet till MakeCalendar kommer att gå ur loopen. För att rätta till problemet är det nog enklast att byta namn på variablen du använder i loopen.Sv: Går inte köra en sub 2ggr
Varje gång du lägger till något till strängar, alokeras ny plats för strängen, den gamla strängen kopieras över, den ny strängen läggs till.
Då är det bättre att skriva ut, Response.Write.
En alternativ kalender jag konpat ihop:
Sub WriteCalendarHead(Y, M, FirstDayOfWeek)
Dim DayOfWeek
Response.Write vbTab + "<caption>" & Y & " " & MonthName(M) & "</caption>" + vbCrLf + _
vbTab + "<tr>" + vbCrLf
For DayOfWeek = 1 To 7
Response.Write vbTab + vbTab + "<th>" & WeekdayName(DayOfWeek, True, FirstDayOfWeek) & "</th>" + vbCrLf
Next
Response.Write vbTab + "</tr>"
End Sub
Sub WriteCalendar(Y, M, Value, FirstDayOfWeek)
Dim DayOfWeek
Dim DayOfMonth
Dim FirstDate
Dim FirstDateInMonth
Dim LastDate
Dim LastDateInMonth
FirstDateInMonth = DateSerial(Y, M, 1)
FirstDate = DateAdd("d", 1 - Weekday(FirstDateInMonth, FirstDayOfWeek), FirstDateInMonth)
LastDateInMonth = DateSerial(Y, M + 1, 0)
LastDate = DateAdd("d", 7 - Weekday(LastDateInMonth, FirstDayOfWeek), LastDateInMonth)
Response.Write "<table class=""calendar"">" + vbCrLf
WriteCalendarHead Y, M, FirstDayOfWeek
For DayOfMonth = FirstDate To LastDate Step DateAdd("d", 1, 0)
DayOfWeek = DayOfWeek + 1
If DayOfWeek = 1 Then
Response.Write vbTab + "<tr>" + vbCrLf
End If
If DayOfMonth < FirstDateInMonth or DayOfMonth > LastDateInMonth Then
Response.Write vbTab + vbTab + "<td class=""nodate""> </td>" + vbCrLf
ElseIf DayOfMonth = Value Then
Response.Write vbTab + vbTab + "<td class=""today"">" & Day(DayOfMonth) & "</td>" + vbCrLf
Else
Response.Write vbTab + vbTab + "<td>" & Day(DayOfMonth) & "</td>" + vbCrLf
End If
If DayOfWeek = 7 Then
DayOfWeek = 0
Response.Write vbTab + vbTab + "</tr>" + vbCrLf
End If
Next
Response.Write "</table>" + vbCrLf
End sub
Dim Today
Dim Offset
Dim DateInMonth
Today = Date()
For Offset = -2 to 2
DateInMonth = DateAdd("m", Offset, Today)
WriteCalendar Year(DateInMonth), Month(DateInMonth), Today, vbMonday
Next
Sv:Går inte köra en sub 2ggr
Hur är det med att använda en StringBuffer istället?Sv:Går inte köra en sub 2ggr
Men frågan kvarstår, utökar den bara minnet som används eller allokerar den sig helt och hållet till en ny adress på det sätt du beskriver för variabler?Sv: Går inte köra en sub 2ggr
Just i detta fallet är det ju relativt få strängkonkratteneringar som görs.
Men om det rört sig om att gå igenom et recordset, så kommer det ju kunna växa. Därmed inte skala så bra.
Det gäller att varna i rätt tid innan man drar ner produktionsservrar. ;-)