Just a little background, our marketing department has been using static weather images on their signage and asked if it would be possible to pull something that updated in realtime. Since I'm the only person in our department with any type of programming experience, and I'm a novice at best, I got asked to come up with a solution. I have worked with classic asp in the past for a couple of other small projects I've done, so I decided to go that route. I have everything working the way I want it to with the exception of the extended forecast data. In the sample below I have the variables that I want to display with a For statement to pull the extended forecast xml data for each day. But for some reason it is only pulling the the last day of the extended forecast.
If (objXMLDOM.parseError.errorCode <> 0) Then
Response.Write("<p>Error parsing XML: " & objXMLDOM.parseError.reason & "</p>")
Else
For i = 0 to 3
Set objFuture = objXMLDOM.getElementsByTagName("forecast_conditions").Item(i) 'pull the XML node for each from one to three
For Each xmlNode In objFuture.childNodes 'loop through the dom tree
If (xmlNode.nodeName = "icon") Then
strIcon1 = "<img src=""http://www.google.com" & xmlNode.Attributes.getNamedItem("data").text & """ border=""0"">" & vbCrLf
End If
If (xmlNode.nodeName = "condition") Then
strCondition1 = xmlNode.Attributes.getNamedItem("data").text & vbCrLf
End If
If (xmlNode.nodeName = "low") Then
strLow = xmlNode.Attributes.getNamedItem("data").text & vbCrLf
End If
If (xmlNode.nodeName = "high") Then
strHigh = xmlNode.Attributes.getNamedItem("data").text & vbCrLf
End If
If (xmlNode.nodeName = "day_of_week") Then
strDay = xmlNode.Attributes.getNamedItem("data").text & vbCrLf
End If
Set objFuture = nothing
Next
Next
End if
I am then outputing the 4 day forecast into my main page with the following code:
<%For Each Item in objXMLDOM.getElementsByTagName("forecast_conditions")
Response.Write ("<td>" & strDay & "<br>" & strIcon1 & "<br>" & strCondition1 & "<br>" & "Low: " & strLow & "°F" & "<br>" & "High: " & strHigh & "°F" & "<br>" & "</td>")
Next %>
I have been looking at this off and on for a couple of days now and just can't seem to find what I am missing to pull each day instead of the just the last one. If anyone has any suggestions I would appreciate it!
You are using the same set of variables to store the forecast data for each day. So during every iteration of your for loop you are overwriting the previous day's information.
The solution is to move the code that writes the data to the screen insideyour first for loop, like such:
If (objXMLDOM.parseError.errorCode <> 0) Then
Response.Write("<p>Error parsing XML: " & objXMLDOM.parseError.reason & "</p>")
Else
For i = 0 to 3
Set objFuture = objXMLDOM.getElementsByTagName("forecast_conditions").Item(i)
For Each xmlNode In objFuture.childNodes
...
Next
' Write to the page here
Response.Write ("<td>" & strDay & "<br>" & strIcon1 & "<br>" & strCondition1 & "<br>" & "Low: " & strLow & "°F" & "<br>" & "High: " & strHigh & "°F" & "<br>" & "</td>")
Next
End if
Related
I am trying to check the current time VS the database time and display a message.
This is my second attempt but it's not working correctly, as you can see below, I am doing something wrong. Please help.
Thanks.
<%
Function ConvertToUnixTimeStamp(input_datetime) 'As String
Dim d : d = CDate(input_datetime)
ConvertToUnixTimeStamp = CStr(DateDiff("s", "01/01/2018 00:00:00", d))
End Function
'Response.write ("<BR><BR>Current Time Now: ") & ConvertToUnixTimeStamp(Now)
time_from_db = 11293015 + 60 'This would be the time from the database. It is generated using ConvertToUnixTimeStamp(Now) + 60
Response.write "Current Time: " & ConvertToUnixTimeStamp(Now) & "<BR><BR>"
Response.write "Time from DB: " & time_from_db & "<BR><BR>"
Response.write "<BR><BR>"
Response.write "Update DB with this time (Added 1 minute): " & ConvertToUnixTimeStamp(Now) + 60 & "<BR><BR>"
If ConvertToUnixTimeStamp(Now) > time_from_db then
Response.write("<BR>Current Time is Greaten then DB")
else
Response.write("<BR>DB Time is Newer then Current Time")
end if
%>
If ConvertToUnixTimeStamp(Now) > time_from_db then
this will never return true, as your function is converting the time to a STRING, and a string cannot be greater than another string.
I made some minor changes in your code, mainly explicitly converting variables into their data type (ex: CInt, CStr, etc).
<%
Function ConvertToUnixTimeStamp(input_datetime) 'As String
Dim d : d = CDate(input_datetime)
ConvertToUnixTimeStamp = DateDiff("s", "01/01/2018 00:00:00", d)
End Function
'Response.write ("<BR><BR>Current Time Now: ") & ConvertToUnixTimeStamp(Now)
time_from_db = 11293015 + 60 'This would be the time from the database. It is generated using ConvertToUnixTimeStamp(Now) + 60
Response.write "Current Time: " & ConvertToUnixTimeStamp(Now) & "<BR><BR>"
Response.write "Time from DB: " & time_from_db & "<BR><BR>"
Response.write "<BR><BR>"
Response.write "Update DB with this time (Added 1 minute): " & ConvertToUnixTimeStamp(Now) + 60 & "<BR><BR>"
If CInt( ConvertToUnixTimeStamp(Now) ) > time_from_db then
Response.write("<BR>Current Time is Greaten then DB")
else
Response.write("<BR>DB Time is Newer then Current Time")
end if
%>
I created an application to show a press release once the target date and time have been reached and wanted to know if this is getting the time from the server or the client because I'd like to use the server's time so that someone doesn't just change their clock in order to see it.
Here's my code:
<%
dim strDate
dim strTime
dim strTarget_time
dim strTarget_date
dim strBreak
dim strRuleBreak
dim strToday
strDate = Date()
strTime = Time()
strright_now = Now()
strTarget_time = "3:27:00 PM"
strTarget_date = "6/26/2012"
strBreak = "<br />"
strRuleBreak = "<br /><hr><br />"
strToday = Now()
response.write("<h2>TEST VARIABLES</h2>")
response.write("<p><strong>Today's date:</strong> " & strDate & strBreak)
response.write("<strong>Current time:</strong> " & strTime & strBreak)
response.write("<strong>Target date:</strong> " & strTarget_date & strBreak)
response.write("<strong>Target time:</strong> " & strTarget_time & "</p>")
response.write(strRuleBreak)
'TIME TESTER
response.write("<h2>TIME TESTER</h2>")
response.write("<p><nobr>Testing to see if it is past the target time of: " & strTarget_time & "</nobr></p>")
if strTime >= cdate(strTarget_time) then
response.write("<p>Yes, it is now " & Now() & ", which <strong>IS</strong> past the target time of: " & strTarget_time & "</p>")
else
response.write("<p>No, it is now " & Now() & ", which is <strong>NOT</strong> past the target time of: " & strTarget_time & "</p>")
end if
response.write(strRuleBreak)
'DATE TESTER
response.write("<h2>DATE TESTER</h2>")
response.write("<p><nobr>Testing to see if it is past the target date of: " & strTarget_date & "</nobr></p>")
if strToday >= cdate(strTarget_date) then
response.write("<p>Yes, it is now " & Now() & ", which <strong>IS</strong> past the target date of: " & strTarget_date & "</p>")
else
response.write("<p>No, it is now " & Now() & ", which is <strong>NOT</strong> past the target date of: " & strTarget_date & "</p>")
end if
response.write(strRuleBreak)
'DATE AND TIME TESTER
response.write("<h2>DATE AND TIME TESTER</h2>")
response.write("<p><nobr>Testing to see if it is past the target of: " & strTarget_date & " - " & strTarget_time & "</nobr></p>" & strBreak)
if strToday >= cdate(strTarget_date) AND strTime >= cdate(strTarget_time) then
response.write("<p>Yes, it is now " & Now() & ", which <strong>IS</strong> past the target of: " & strTarget_date & " - " & strTarget_time & "</p>")
else
response.write("<p>No, it is now " & Now() & ", which is <strong>NOT</strong> past the target of: " & strTarget_date & " - " & strTarget_time & "</p>")
end if
response.write(strRuleBreak)
%>
So in this case, if the time and date is AFTER 6/26/2012 3:27 PM, then the section will show. I'm mainly asking because I want to clarify whether this is client or server side time being used.
This is going to be server-side, as that is where ASP code is executed. In order to get the client-side datetime, you would need to use a script to run in the browser - generally JavaScript.
I have a classic ASP question.
Attempting to do this: the recordset is a simple list of years from 1995 to 2020; and i am trying to make 2010(current year) the default selection in the drop down.
issue: I trying to call a Sub proc in "Response.Write", but it keeps giving me this error:
"Error '800a000d' Type mismatch: 'selectyear' "
Below is the code, the Attempt 1 works with out any problem. But when i move that "if" logic to a sub procedure and call it in the Request.Write, it gives me the error.
Can any one please explain why Attempt1 works and Attempt2 wouldnt.
' Attempt 1:
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td> <td> <select name='theyear' style=""WIDTH: 67px"">"
dim selyr
while not rsYEAR.EOF
if CINT(rsYEAR.fields("year")) = year(now) then
selyr = "selected"
else selyr = ""
end if
Response.Write"<option value='" & rsYEAR.fields("year") & "' "& selyr &" >" & cstr(rsYEAR.Fields("year"))
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
' Attempt 2:
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td> <td> <select name='theyear' style=""WIDTH: 67px"">"
dim selyr2
while not rsYEAR.EOF
Response.Write "<option value='" & rsYEAR.fields("year") & "' " & cstr(selectyear(cint(rsYEAR.fields("year")))) &" >" & cstr(rsYEAR.Fields("year"))
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
'close and clean up
rsYEAR.Close
set rsYEAR = nothing
I would greatly appreciate your response.
thank you,
Shiva
I am guessing that cint(rsYEAR.fields("year")) is throwing the error because there is data that cannot be converted to int. I would expect that to happen in both cases though.
You shouldn't need the cstr in cstr(selectyear(cint(rsYEAR.fields("year")))) in the second attempt, as I assume selectyear is already returning a string. Can you show the code for selectyear?
(How has this sat for so long without a correct answer?)
A Sub does not have a value, so you can't Response.Write it. You need to either use a function, or put the Sub call on its own line.
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td><td><select name='theyear' style=""width: 67px"">"
dim y
while not rsYEAR.EOF
y = rsYEAR.fields("year")
Response.Write "<option value='" & y & "'" & IsCurr(y) & ">" & y & "</option>"
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
Function IsCurr(yr)
if Cstr(yr) = Cstr(year(now)) then
IsCurr = " selected"
else
IsCurr = ""
end if
End Function
Using a sub instead of a function, this would become
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td><td><select name='theyear' style=""width: 67px"">"
dim y
while not rsYEAR.EOF
y = rsYEAR.fields("year")
Response.Write "<option value='" & y & "'"
IsCurr y
Response.Write ">" & y & "</option>"
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
Sub IsCurr(yr)
if Cstr(yr) = Cstr(year(now)) then
Response.Write " selected"
end if
End Sub
Hi i have a problem with this asp pagination. it seems to be putting all the links in the one row, so i think it might have something to do with the check of the int i...
but im not that familar with asp. can anyone shed any light on this problem.
the folders contain pdfs for each day of the month, named A08P2.pdf A09P2.pdf etc...
Thanks
i = 1
Set fc = f.Files
Set ff = f.SubFolders
For Each f1 in fc
intPage = cint(mid(f1.name,2,2))
chrEdition = mid(f1.name,1,1)
if chrEdition = "A" then
if i = 1 then
Response.Write "<tr>"
end if
Response.Write "<td width='40' align='center'><a href=" & sUP & f1.name & " class='blue_11px'>" & intPage & "</a></td>"
if i = 10 then
Response.Write "</tr>"
i = 0
end if
end if
i = i + 1
Next
You should move the incrementing of the i (i=i+1) inside the if...end if, since if i is 9 and you encounter two chrEditions that are not 'A' then i will become 11 and will never match the closing condition i=10:
if chrEdition = "A" then
if i = 1 then
Response.Write "<tr>"
end if
Response.Write "<td width='40' align='center'><a href=" & sUP & f1.name & " class='blue_11px'>" & intPage & "</a></td>"
if i = 10 then
Response.Write "</tr>"
i = 0
end if
i = i + 1
end if
I'm a little blockheaded right now…
I have a date string in european format dd.mm.yyyy and need to transform it to mm.dd.yyyy with classic ASP. Any quick ideas?
If its always in that format you could use split
d = split(".","dd.mm.yyyy")
s = d(1) & "." & d(0) & "." & d(2)
this would allow for dates like 1.2.99 as well
Dim arrParts() As String
Dim theDate As Date
arrParts = Split(strOldFormat, ".")
theDate = DateTime.DateSerial(parts(2), parts(1), parts(0))
strNewFormat = Format(theDate, "mm.dd.yyyy")
OK, I just found a solution myself:
payment_date = MID(payment_date,4,3) & LEFT(payment_date,3) & MID(payment_date,7)
This is a way to do it with built in sanity check for dates:
Dim OldString, NewString
OldString = "31.12.2008"
Dim myRegExp
Set myRegExp = New RegExp
myRegExp.Global = True
myRegExp.Pattern = "(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)[0-9]{2})"
If myRegExp.Test Then
NewString = myRegExp.Replace(OldString, "$2.$1.$3")
Else
' A date of for instance 32 December would end up here
NewString = "Invalid date"
End If
I have my own date manipulation functions which I use in all my apps, but it was originally based on this sample:
http://www.adopenstatic.com/resources/code/formatdate.asp
function MyDateFormat(mydate)
'format: YYYYMMDDHHMMSS
MyDateFormat = year(mydate) & right("0" & month(mydate),2) & _
right("0" & day(mydate),2) & right("0" & hour(mydate),2) &_
right("0" & minute(mydate),2) & right("0" & second(mydate),2)
end function
response.write(MyDateFormat(Now))
show: 20200623102805