Avatar billede mortency Nybegynder
06. februar 2003 - 13:04 Der er 19 kommentarer og
1 løsning

Update flere poster

Jeg skal hente ut dato fra databasen så oppdatere alle feltene med nye verdier utifra hvilken dato det står.

Scriptete jeg har ser slik ut. Den vil ikke oppdatere feltene.

<!--#include file ="../include/common.asp"-->
<%
dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

dim adoRs
set adoRs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT Premie FROM tblBiler"
set adoRs = adoCn.Execute(strSQL)
Set strSQL = Nothing
   
strOLDPREMIE = adoRs("Premie")

If Request.QueryString("Endre") = "YES" Then
   
    strSQL = "UPDATE tblBiler SET Premie='" & Request.Form("txtAarspremie") & "' WHERE premie='" & strOLDPREMIE & "'"
    set adoRs = adoCn.Execute(strSQL)
    Set strSQL = Nothing
   
    strSQL = "SELECT COUNT (*) AS antall FROM tblbiler WHERE Premie='" & Request.Form("txtAarspremie") & "'"
    set adoRs = adoCn.Execute(strSQL)
    Set strSQL = Nothing
   
    strAntall = adoRs("antall")
   
    For i=1 to strAntall
        strSQL = "SELECT BilID,GjelderFra FROM tblBiler"
        set adoRs = adoCn.Execute(strSQL)
        Set strSQL = Nothing
       
        Dim strBilID
        strBilID = adoRs("BilID")   
   
        Dim strAarsPremie
        strAarspremie = Request.Form("txtAarspremie")
   
        Dim strGjelderFra
        strGjelderFra = adoRs("GjelderFra")       
       
        Dim strSisteDag
        strSisteDag = "31/12/" & year(Date())
       
        Dim strGetDager
        strGetDager = DateDiff("Y", strGjelderFra, strSisteDag)
       
        Dim strPeriodePremie
        strPeriodePremie = Cstr(strAarsPremie) / 365 * Cstr(strGetDager)
       
        If strPeriodepremie < strAarsPremie Then
            strPeriodePremie = strAarsPremie
        End if
       
        strSQL = "UPDATE tblBiler SET PeriodePremie='" & strPeriodePremie & "' WHERE BildID='" & strBilID & "'"
        Response.Write(strSQL)
        'set adoRs = adoCn.Execute(strSQL)
        'Set strSQL = Nothing

    Next       

End if

adoRs.Close
set adoRs = nothing
   
adoCn.Close
set adoCn = nothing
%>
Avatar billede keysersoze Ekspert
06. februar 2003 - 13:10 #1
sker der ingenting? opdaterer den bare ikke? eller...
Avatar billede eagleeye Praktikant
06. februar 2003 - 13:19 #2
Hvis strPeriodePremie og strAarsPremie er tekst er du nød til at konveretere til Int når du sammenliger de to i if sætningen her, eller vil de ikke blive sammenlignet som to tal:

        If strPeriodepremie < strAarsPremie Then
            strPeriodePremie = strAarsPremie
        End if


Så det bliver:
        If Int(strPeriodepremie) < Int(strAarsPremie) Then
            strPeriodePremie = strAarsPremie
        End if
Avatar billede eagleeye Praktikant
06. februar 2003 - 13:21 #3
En anden ting som gør den slet ikke opdater er fordi koden som skulle udføre UPDATE SQL'en er udkommenteret, SQL bliver kun udskrevet:


      strSQL = "UPDATE tblBiler SET PeriodePremie='" & strPeriodePremie & "' WHERE BildID='" & strBilID & "'"
        Response.Write(strSQL)
        'set adoRs = adoCn.Execute(strSQL)    '<--- Denne er udkommenteret


Lav det sådan her du behøver ikke noget recordset da UPDATE ikke returnere nogle records:


      strSQL = "UPDATE tblBiler SET PeriodePremie='" & strPeriodePremie & "' WHERE BildID='" & strBilID & "'"
        Response.Write(strSQL)
        adoCn.Execute(strSQL)  '<---- Nu udføres SQL'en som opdater
Avatar billede mortency Nybegynder
06. februar 2003 - 14:15 #4
Var ikke det jeg mente! Fant ut av det selv! Du skal få 50 point! er det greit!

<%
dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

dim adoRs
set adoRs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT Premie FROM tblBiler"
set adoRs = adoCn.Execute(strSQL)
Set strSQL = Nothing
   
strOLDPREMIE = adoRs("Premie")

If Request.QueryString("Endre") = "YES" Then
   
    strSQL = "UPDATE tblBiler SET Premie='" & Request.Form("txtAarspremie") & "' WHERE premie='" & strOLDPREMIE & "'" & " OR premie is null"
    set adoRs = adoCn.Execute(strSQL)
    Set strSQL = Nothing

        strSQL = "SELECT BilID,GjelderFra FROM tblBiler"
        set adoRs = adoCn.Execute(strSQL)
        Set strSQL = Nothing
       
        i = 1
        Do While NOT adoRs.EOF
       
        Dim strBilID
        strBilID = adoRs("BilID")   
   
        Dim strAarsPremie
        strAarspremie = Request.Form("txtAarspremie")
   
        Dim strDato
        strDato = adoRs("GjelderFra")
       
        strDay = Day( strdato )
        if len(strDay) = 1 then
            strDay = "0" & strDay
        end if
           
        strMonth = Month( strdato )
        if len(strMonth) = 1 then
            strMonth = "0" & strMonth
        end if
       
        strYear = Year( strdato )
        if len(strYear) = 1 then
            strYear = "0" & strYear
        end if
       
        Dim strGjelderFra
        strGjelderFra = strYear & "/" & strMonth & "/" & strDay   
       
        Dim strSisteDag
        strSisteDag = year(Date()) & "/12/31"
       
        Dim strGetDager
        strGetDager = DateDiff("Y", strGjelderFra, strSisteDag)
       
        Dim strDagerIaar
        strDagerIaar = DateDiff("Y", year(Date()) & "/01/01", year(Date()) & "/12/31")
       
        Dim strPeriodePremie
        strPeriodePremie = Cstr(strAarsPremie) / strDagerIaar * Cstr(strGetDager)
       
        If Int(formatnumber((strPeriodePremie),0)) > Int(strAarsPremie) Then
            strPeriodePremie = strAarsPremie
        End if
       
        strSQL = "UPDATE tblBiler SET PeriodePremie='" & formatnumber((strPeriodePremie),0) & "' WHERE BildID='" & strBilID & "'"
        Response.Write(strSQL & "<br>")
        'set adoRs = adoCn.Execute(strSQL)
        'Set strSQL = Nothing

    adoRs.MoveNext
    i=i + 1
    Loop       

End if

adoRs.Close
set adoRs = nothing
   
adoCn.Close
set adoCn = nothing
%>
Avatar billede mortency Nybegynder
06. februar 2003 - 14:21 #5
Men nå får jeg en Timeout expired! Linje 19
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:21 #6
Ok, ja det helt fint.
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:22 #7
Hvilken er linje 19?
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:25 #8
HVis jeg tæller rigtigt er dette linje 19:

Set strSQL = Nothing

Prøv uden Set:
strSQL = Nothing

Eller = ""
strSQL = ""
Avatar billede mortency Nybegynder
06. februar 2003 - 14:28 #9
Operation is not allowed when the object is closed. Linje 79

    adoRs.MoveNext <-- linje 79
    i=i + 1
    Loop
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:32 #10
Og koden er som du har vist 06/02-2003 14:15:55 ?

Det betyder adoRS er blevet lukke og man fosøger at flytte til næste recordset.
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:32 #11
recordset skulle være record.
Avatar billede mortency Nybegynder
06. februar 2003 - 14:34 #12
Koden ser slik ut nå!

<%
dim adoCn
dim strSQL
set adoCn = Server.CreateObject("ADODB.Connection")
adoCn.Open strConn

dim adoRs
set adoRs = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT Premie FROM tblBiler"
set adoRs = adoCn.Execute(strSQL)
Set strSQL = Nothing
   
strOLDPREMIE = adoRs("Premie")

If Request.QueryString("Endre") = "YES" Then
   
    strSQL = "UPDATE tblBiler SET Premie='" & Request.Form("txtAarspremie") & "' WHERE premie='" & strOLDPREMIE & "'" & " OR premie is null"
    set adoRs = adoCn.Execute(strSQL)
    Set strSQL = Nothing

        strSQL = "SELECT BilID,GjelderFra FROM tblBiler"
        set adoRs = adoCn.Execute(strSQL)
        strSQL = ""
       
        i = 1
        Do While NOT adoRs.EOF
       
        Dim strBilID
        strBilID = adoRs("BilID")   
   
        Dim strAarsPremie
        strAarspremie = Request.Form("txtAarspremie")
   
        Dim strDato
        strDato = adoRs("GjelderFra")
       
        strDay = Day( strdato )
        if len(strDay) = 1 then
            strDay = "0" & strDay
        end if
           
        strMonth = Month( strdato )
        if len(strMonth) = 1 then
            strMonth = "0" & strMonth
        end if
       
        strYear = Year( strdato )
        if len(strYear) = 1 then
            strYear = "0" & strYear
        end if
       
        Dim strGjelderFra
        strGjelderFra = strYear & "/" & strMonth & "/" & strDay   
       
        Dim strSisteDag
        strSisteDag = year(Date()) & "/12/31"
       
        Dim strGetDager
        strGetDager = DateDiff("Y", strGjelderFra, strSisteDag)
       
        Dim strDagerIaar
        strDagerIaar = DateDiff("Y", year(Date()) & "/01/01", year(Date()) & "/12/31")
       
        Dim strPeriodePremie
        strPeriodePremie = Cstr(strAarsPremie) / strDagerIaar * Cstr(strGetDager)
       
        If Int(formatnumber((strPeriodePremie),0)) > Int(strAarsPremie) Then
            strPeriodePremie = strAarsPremie
        End if
       
        strSQL = "UPDATE tblBiler SET PeriodePremie='" & formatnumber((strPeriodePremie),0) & "' WHERE BilID='" & strBilID & "'"
        Response.Write(strSQL & "<br>")
        'set adoRs = adoCn.Execute(strSQL)
        strSQL = ""

    adoRs.MoveNext
    i=i + 1
    Loop       

End if

adoRs.Close
set adoRs = nothing
   
adoCn.Close
set adoCn = nothing
%>
Avatar billede mortency Nybegynder
06. februar 2003 - 14:35 #13
Hvis denne er kommenter bort så viser scriptet at det kjører riktig.
Hvis jeg fjerner ' så virker det ikke.
'set adoRs = adoCn.Execute(strSQL)
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:40 #14
Hvis du fjerne ' i denne linie:

'set adoRs = adoCn.Execute(strSQL)

En UPDTATE SQL giver et tomt recordset tilbage i og det ligge i denne linie ind i adoRs.
set adoRs = adoCn.Execute(strSQL)

Det er det samme recordset som du bruger til at loope igennem og dermed overskrives det adoRs og bliver tomt. Så kommer fejlen.

Spm jeg også skrev i mit forsatte svar (06/02-2003 13:21:13) så lav denne linie:
set adoRs = adoCn.Execute(strSQL)

Om til:
adoCn.Execute(strSQL)
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:46 #15
Så koden nede ved strSQL som opdater bliver til.:


        strSQL = "UPDATE tblBiler SET PeriodePremie='" & formatnumber((strPeriodePremie),0) & "' WHERE BilID='" & strBilID & "'"
        Response.Write(strSQL & "<br>")
        adoCn.Execute(strSQL)
        strSQL = ""

    adoRs.MoveNext
Avatar billede mortency Nybegynder
06. februar 2003 - 14:47 #16
Scriptet kjører ca 250 poster så får jeg feilmeldingen:

Active Server Pages, ASP 0113 (0x80004005)
The maximum amount of time for a script to execute was exceeded. You can change this limit by specifying a new value for the property Server.ScriptTimeout or by changing the value in the IIS administration tools.
Avatar billede mortency Nybegynder
06. februar 2003 - 14:48 #17
Vet jeg kan sette Server.ScriptTimeout = 500 men er det noen annen måte så scriptet går raskere? Kan bli mange tusen poster i databasen. I dag er det kun ca 500

//Morten
Avatar billede eagleeye Praktikant
06. februar 2003 - 14:56 #18
Ja du kan sætte Server.ScriptTimeout høje op hvis du har mange data som skal behandles. Det er angivet i sekunder, Server.ScriptTimeout = NumSeconds

Det er svært at sige hvad man præsis kan gøre for at få et hurtigere script, generelt skal man undgå for mange tilgange til databasen, det har du hold på et minimum i loopet.

En anden ting kunn være hvis der var flere record med forskelligt BilID men skal havde samme værdi i PeriodePremie kunne man måske prøve at lave scriptet så det kan opdatere flere recordset i samme SQL:

strSQL = "UPDATE tblBiler SET PeriodePremie='" & formatnumber((strPeriodePremie),0) & "' WHERE BilID='441' OR BilID='2' OR BilID='87'"

Men det er ikke altid det er muligt at gøre..
Avatar billede mortency Nybegynder
06. februar 2003 - 14:59 #19
Hva hvis man oppdaterer feks 100 poster av gangen da? Blir det noe hurtigere?

If i = 100 then
??????
End if
Avatar billede eagleeye Praktikant
06. februar 2003 - 17:12 #20
Ja men det giver det samme som at loope gennem hele recordset'et på en gang. Eller skal man på en eller anden måde lave det sådan at scriptet reloades for hver 100 opdateringer..

i = 0
do while not rs.EOF AND i < 100
  rs.Movenext
  i = i + 1
next
if i = 100 AND NOT rs.EOF then
  Response.redirect "sammeside.asp?ID=" & i
end if

Men så skal request.form teksten også overføres på en måde,jeg tror det bliver svært at styre.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester