/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Dato funktioner?
Fra : Ukendt


Dato : 29-12-09 14:33

Hej,
Jeg har en MSSQL ASP hjemmeside

For at minde brugere om at skifte batterier i "Worker og Spare" udstyr
udføres et database opslag hver gang en bruger logger på siden.
Hvis batterilevetiden er overskredet sendes en e-mail til brugeren.

Der er følgende betingelser for batteriskift:
Brugeren skal modtage en mail en måned før tidspunktet for udskiftning, og
igen efter 4 måneder hvis udskiftnings datoen ikke er opdateret i databasen.
Spare batterier udskiftes hvert andet år i lige årstal.
Worker batterier udskiftes hvert andet år i ulige årstal.
De nuværende udskiftnings datoer følger ikke disse regler, derfor kan en
bruger blive bedt om at skifte spare batteri næste år, selv om der ikke er
gået 2 år fordi et Spare batteri skal udskiftes i lige år.

Min løsning er indtil videre:
<%
SQLstmt = "SELECT Id, StationCode, DateWorker, DateSpare, Modified,
ModifiedBy, NotifyWorker, NotifySpare FROM tblSSEbat ORDER BY StationCode
ASC"
Set rs = Conn.Execute(SQLstmt)
'****************
'DateWorker og DateSpare er datoen for sidste udskitning, NotifyWorker og
NotifySpare er datoen for sidste e-mail notification
'****************
Session.LCID = 1030
Function DateToSql(Value)
DateToSql = "DateSerial(" & Year(Value) & ", " & _
Month(Value) & ", " & _
Day(Value) & ")"
End Function

Dim
ReplaceMonthWorker,ReplaceMonthSpare,Emailtxt,Emailtxt1,Emailtxt2,WorkerSpare,EmailFrom,NameFrom,EmailTo
EmailFrom = "noReply@xxxxx.dk"
NameFrom = "SSE Battery Database"
Emailtxt1 = "<br><br>This message was generated by the xxxxxxx Website SSE
Battery Database.<br>According to the SSE Disk Array Battery replacement
database your SSE "
Emailtxt2 = "scheduled to be replaced within a month.<br>Please update the
xxxxxxx Website SSE Battery Database when the battery/batteries has been
replaced.<br><br>Best regards<br>xxxxxx Website SSE reminder"

DO WHILE NOT rs.EOF
WorkerSpare = ""
'check if Worker replacemet year is even or odd
IF Year(rs("DateWorker")) MOD 2 = 0 THEN
ReplaceMonthWorker = -11
'The year is EVEN
ELSE
ReplaceMonthWorker = -23
'The Year is ODD
END IF
'Check worker dates
IF rs("DateWorker") < DateAdd("m", ReplaceMonthWorker, Date()) AND
rs("NotifyWorker") < DateAdd("m", -4, Date()) Then
WorkerSpare = "Worker Disk Array battery is "
SQLstmt = "UPDATE DISTINCTROW tblSSEbat SET NotifyWorker = (" &
DateToSql(Date()) & ") WHERE StationCode = '" & rs("StationCode") &"'"
Conn.Execute(SQLstmt)
END IF

'check if Spare replacemet year is even or odd
IF Year(rs("DateSpare")) MOD 2 = 0 THEN
ReplaceMonthSpare = -23
'The year is EVEN
ELSE
ReplaceMonthSpare = -11
'The Year is ODD
END IF
'Check Spare dates
IF rs("DateSpare") < DateAdd("m", ReplaceMonthSpare, Date()) AND
rs("NotifySpare") < DateAdd("m", -4, Date()) Then
IF WorkerSpare <> "" THEN
WorkerSpare = "Worker and Spare Disk Array batteries are "
ELSE
WorkerSpare = "Spare Disk Array battery is "
END IF
SQLstmt = "UPDATE DISTINCTROW tblSSEbat SET NotifySpare = (" &
DateToSql(Date()) & ") WHERE StationCode = '" & rs("StationCode") &"'"

Conn.Execute(SQLstmt)
END IF

IF WorkerSpare <> "" THEN
'send e-mail notification
%>

Der er nogle småproblemer i mit script:
Hvis en bruger modtager en e-mail i december, og først opdater databasen
året efter, vil han blive bedt om at udskifte igen efter 11 måneder, selv om
det først skulle ske efter 23 måneder. Pga. reglen om udskitning af Spare i
lige år og worker i ulige år.

Har I nogle forslag til forbedring af databaseopslag og script?

Godt nytår
Henning



 
 
Stig Johansen (29-12-2009)
Kommentar
Fra : Stig Johansen


Dato : 29-12-09 15:36

"Henning Smed" <henning at smeds dk> wrote in message
news:4b3a050d$0$8568$d40e179e@nntp06.dk.telia.net...
> Hej,
> Jeg har en MSSQL ASP hjemmeside
[snip]
> Har I nogle forslag til forbedring af databaseopslag og script?

Ja, men det er lidt svært at overskue hvad du gør p.t.

Når du skriver du har en MSSQLServer, så lad den gøre arbejdet.

Der findes nærmest ufattelig mange muligheder for at finde data, eksempelvis
hvis du vil finde datoer i lige år:
.....
select year(MessageTime),year(MessageTime)%2 from messages where
year(MessageTime)%2 = 0
.....

eller antal måneder (>20) fra dato til nu:
.....
select * from messages where datediff(mm,MessageTime,getdate()) > 20
.....

Hvis du beskriver hvad det er du vil, og evt. poster en generate af tabellen
med, så kan du måske få nogle forslag.

Det med 'hver gang brugeren logger på', kan jeg ikke få til at hænge sammen
med din SQL, hvor der ikke er nogen Where - er det den rigtige du har
postet?

Hvis du er ude efter noget 'cron job', så findes det i SQLServer agent,
alternativt findes der gratis online 'cronjobs' til den slags opdateringer
(hvis man ikke selv har adgang til det)

--
Med venlig hilsen/Best regards
Stig Johansen




Ukendt (31-12-2009)
Kommentar
Fra : Ukendt


Dato : 31-12-09 08:51


"Stig Johansen" <wopr.dk@gmail.com> skrev i en meddelelse
news:4b3a12f3$0$276$14726298@news.sunsite.dk...
> "Henning Smed" <henning at smeds dk> wrote in message
> news:4b3a050d$0$8568$d40e179e@nntp06.dk.telia.net...
>> Hej,
>> Jeg har en MSSQL ASP hjemmeside
> [snip]
>> Har I nogle forslag til forbedring af databaseopslag og script?
>
> Ja, men det er lidt svært at overskue hvad du gør p.t.
>
> Hvis du beskriver hvad det er du vil, og evt. poster en generate af
> tabellen
> med, så kan du måske få nogle forslag.

Det er en simpel tabel med 7 rækker www.smeds.dk/tblSSEbat.xls

>
> Det med 'hver gang brugeren logger på', kan jeg ikke få til at hænge
> sammen
> med din SQL, hvor der ikke er nogen Where - er det den rigtige du har
> postet?

Der er ingen WHERE for hver gang en bruger logger på på køres database
opslaget:
<%SQLstmt = "SELECT Id, StationCode, DateWorker, DateSpare, Modified,
ModifiedBy, NotifyWorker, NotifySpare FROM tblSSEbat ORDER BY StationCode
ASC"%>
Opslaget giver ikke væsentlig længere login tid, tabellen er jo kun på 7
rækker, og når forespørgselen køres ved login, er jeg sikker på at server
side scriptet køres regelmæssigt.

Afhængig af om dags dato er et lige eller ulige år trækker jeg 11 eller 23
måneder fra dags dato, og sammenligner med rs("DateWorker"), og omvendt for
rs("DateSpare") for at opfylde betingelsen:
Spare batterier udskiftes hvert andet år i lige årstal.
Worker batterier udskiftes hvert andet år i ulige årstal.
Hvis der er mere end fire måneder mellem datoen for sidste E-mail
(rs("NotifyWorker")) eller (rs("NotifySpare")), og dags dato sendes en
e-mail når batterilevetiden er overskredet:
<%DO WHILE NOT rs.EOF
WorkerSpare = ""
'check if Worker replacemet year is even or odd
IF Year(rs("DateWorker")) MOD 2 = 0 THEN
ReplaceMonthWorker = -11
'The year is EVEN
ELSE
ReplaceMonthWorker = -23
'The Year is ODD
END IF
'Check worker dates
IF rs("DateWorker") < DateAdd("m", ReplaceMonthWorker, Date()) AND
rs("NotifyWorker") < DateAdd("m", -4, Date()) Then
WorkerSpare = "Worker Disk Array battery is "
SQLstmt = "UPDATE DISTINCTROW tblSSEbat SET NotifyWorker = (" &
DateToSql(Date()) & ") WHERE StationCode = '" & rs("StationCode") &"'"
Conn.Execute(SQLstmt)
END IF

'check if Spare replacemet year is even or odd
IF Year(rs("DateSpare")) MOD 2 = 0 THEN
ReplaceMonthSpare = -23
'The year is EVEN
ELSE
ReplaceMonthSpare = -11
'The Year is ODD
END IF
'Check Spare dates
IF rs("DateSpare") < DateAdd("m", ReplaceMonthSpare, Date()) AND
rs("NotifySpare") < DateAdd("m", -4, Date()) Then
IF WorkerSpare <> "" THEN
WorkerSpare = "Worker and Spare Disk Array batteries are "
ELSE
WorkerSpare = "Spare Disk Array battery is "
END IF
SQLstmt = "UPDATE DISTINCTROW tblSSEbat SET NotifySpare = (" &
DateToSql(Date()) & ") WHERE StationCode = '" & rs("StationCode") &"'"

Conn.Execute(SQLstmt)
END IF

IF WorkerSpare <> "" THEN
'send e-mail notification
%>
Hvis en bruger modtager en e-mail i december, og først opdater databasen
året efter, vil han med det nuværende script blive bedt om at udskifte igen
efter 11 måneder, selv om
det først skulle ske efter 23 måneder. Pga. reglen om udskiftning af Spare i
lige år og worker i ulige år.
Hvordan løser jeg den?
Det er et midlertidigt problem, når alle batterier er udskiftet efter
reglerne om lige og ulige år, kan jeg bare sende en e-mail 23 måneder efter
sidste udskiftning.

Godt Nytår
Henning



Stig Johansen (03-01-2010)
Kommentar
Fra : Stig Johansen


Dato : 03-01-10 04:14

"Henning Smed" <henning at smeds dot dk> wrote in message
news:4b3c57cf$0$283$14726298@news.sunsite.dk...
> Hvis en bruger modtager en e-mail i december, og først opdater databasen
> året efter, vil han med det nuværende script blive bedt om at udskifte
igen
> efter 11 måneder, selv om
> det først skulle ske efter 23 måneder. Pga. reglen om udskiftning af Spare
i
> lige år og worker i ulige år.
> Hvordan løser jeg den?
> Det er et midlertidigt problem, når alle batterier er udskiftet efter
> reglerne om lige og ulige år, kan jeg bare sende en e-mail 23 måneder
efter
> sidste udskiftning.

Det er lidt svært at gennemskue hvordan det hænger sammen (datamæssigt).
Umiddelbart vil jeg mene, at hvos der kun er 7 entries, så er det næsten
lige så let at sende manuelle mails, men det er nok ikke tilfældet.

Men den første tanke, der faldt mig ind da jeg så din tabel ver, at du
egentlig mangler en 'installationdate', som du angiver en cyklus for
udskiftning.

Det burde være denne dato (+ et antal år), der burde indikere om der skal
udskiftes eller ej.

Men når den nu ikke er der, så ser det ud som om du skal tjekke på notify
date, og ikke dags dato mht. udskiftning.

Det burde løse dit problem med notify i december og opdatering i januar, men
det vil give noget knald med de 4 måneder, hvis du opdaterer datoen her.

Jeg tror den eneste løsning må være at du opretter en 'installationsdato',
eller en 'shouldhavebeenreplaceddato' som fast holdepunkt.

--
Med venlig hilsen/Best regards
Stig Johansen




Ukendt (03-01-2010)
Kommentar
Fra : Ukendt


Dato : 03-01-10 07:39


"Stig Johansen" <wopr.dk@gmail.com> skrev i en meddelelse
news:4b400a89$0$283$14726298@news.sunsite.dk...
> "Henning Smed" <henning at smeds dot dk> wrote in message
> news:4b3c57cf$0$283$14726298@news.sunsite.dk...
>> Hvis en bruger modtager en e-mail i december, og først opdater databasen
>> året efter, vil han med det nuværende script blive bedt om at udskifte
> igen
>> efter 11 måneder, selv om
>> det først skulle ske efter 23 måneder. Pga. reglen om udskiftning af
>> Spare
> i
>> lige år og worker i ulige år.
>> Hvordan løser jeg den?
>> Det er et midlertidigt problem, når alle batterier er udskiftet efter
>> reglerne om lige og ulige år, kan jeg bare sende en e-mail 23 måneder
> efter
>> sidste udskiftning.
>
> Det er lidt svært at gennemskue hvordan det hænger sammen (datamæssigt).
> Umiddelbart vil jeg mene, at hvos der kun er 7 entries, så er det næsten
> lige så let at sende manuelle mails, men det er nok ikke tilfældet.

Den manuelle metode har været forsøgt indtil nu. men det fungerer ikke.

> Men den første tanke, der faldt mig ind da jeg så din tabel ver, at du
> egentlig mangler en 'installationdate', som du angiver en cyklus for
> udskiftning.
>
> Det burde være denne dato (+ et antal år), der burde indikere om der skal
> udskiftes eller ej.

'DateWorker' og 'DateSpare' er dataon for sidste udskiftnig, og opdateres af
brugeren når batterierne er udskiftet

> Men når den nu ikke er der, så ser det ud som om du skal tjekke på notify
> date, og ikke dags dato mht. udskiftning.
>
> Det burde løse dit problem med notify i december og opdatering i januar,
> men
> det vil give noget knald med de 4 måneder, hvis du opdaterer datoen her.
>
> Jeg tror den eneste løsning må være at du opretter en 'installationsdato',
> eller en 'shouldhavebeenreplaceddato' som fast holdepunkt.
>
Ja en schould 'shouldhavebeenreplaceddato' kan løse mit problem omkring
årsskifter.

Tak for din hjælp og Godt Nytår
Henning



Stig Johansen (03-01-2010)
Kommentar
Fra : Stig Johansen


Dato : 03-01-10 09:57

"Henning Smed" <henning at smeds dot dk> wrote:

> 'DateWorker' og 'DateSpare' er dataon for sidste udskiftnig, og opdateres
> af brugeren når batterierne er udskiftet

Ja, det er jeg med på, men det indikerer kun hvornår det _er_ udskiftet,
ikke hvornår der _skulle_ være udskiftet.

>>
> Ja en schould 'shouldhavebeenreplaceddato' kan løse mit problem omkring
> årsskifter.
>
> Tak for din hjælp og Godt Nytår

Også godt nytår til dig, og som nævnt kan jeg ikke se nogen mulighed for at
styre det uden at have en 'autoratativ' dato (cyklus).

Bortset fra det, så mangler du lidt fejlhåndtering i dine procedurer.

Kort fortalt, så hvad hvis:
- opdateringen går godt, men afsendelse af email fejler
eller
- opdateringen går skidt, men email går godt.

Dette kan styres med transcation handling, og jeg finder noget kode ovre på
min anden PC, som tager højde for det.

Det bliver dog ikke i dette øjeblik, men på et tidspunkt...

--
Med venlig hilsen
Stig Johansen

Stig Johansen (05-01-2010)
Kommentar
Fra : Stig Johansen


Dato : 05-01-10 10:27

"Stig Johansen" <wopr.dk@gmaill.com> wrote in message
news:4b405ce5$0$274$14726298@news.sunsite.dk...
> Dette kan styres med transcation handling, og jeg finder noget kode ovre

> min anden PC, som tager højde for det.
>
> Det bliver dog ikke i dette øjeblik, men på et tidspunkt...

Jeg tror jeg glemte dig, men her er min kode til oprettelse af en bruger, og
noget lignende gør sig gældende i dit tilfælde:
.....
Activationcode= md5(Request.Form("username")+cStr(now))
Email = Request.Form("Email")
SQL = "INSERT INTO Users
(username,MD5password,Email,ActivationCode,IsActive,Addtime,Changetime)
VALUES (?,?,?,?,0,now,now)"
Parameters(0) = Request.Form("username")
Parameters(1) =
md5(lcase(Request.Form("username"))+Request.Form("Password"))
Parameters(2) = Email
Parameters(3) = Activationcode
oConn.Begintrans
Rowsaffected = Query(oConn,SQL,Parameters,4)
Response.Write "rows affected " + cStr(Rowsaffected)
if Rowsaffected = 1 then
Set msg = Server.CreateObject("JMail.Message")
msg.ContentType = "text/plain; charset=ISO-8859-1"
msg.From = "<email>"
msg.FromName = "Notes - new user"
msg.AddRecipient Email
msg.Subject = "Please activate your user"
msg.Body = "Hej " + Request.Form("username") +"." + vbCrLf +
... osv..
if not msg.Send("smtp.unoeuro.com") then
Response.write msg.log
oConn.RollbackTrans
Else
Response.write "Activation mail sent to: " + Email
oConn.CommitTrans
end if
else
Response.write "Error adding user - " + Err.Description
oConn.RollbackTrans
end if
oConn.Close
set oConn = nothing
.....

Bemærk brugen af begintrans og commit/rollback.

--
Med venlig hilsen/Best regards
Stig Johansen




Søg
Reklame
Statistik
Spørgsmål : 177417
Tips : 31962
Nyheder : 719565
Indlæg : 6407864
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste