Newsgroup: it.comp.www.asp
Titolo: Ora vi gfaccio uscire pazzi :)

Ok, mai un topic fu' piu' vero :P
Spiego rapidamente: Ho un sito con 2 DB separati, che contengono a loro
volta 2 tabelle temporanee (ciascuno), mi sono accorto che dopo una giornata
di lavoro il database triplica le sue dimenzioni (anche cancellando le
tabelle temporanee) e percio' volevo effettuare una sorta di manutenzione
del db togliendo i record dentro le tabelle temporanee e compattando i DB in
Access2000...
Il tutto l'ho messo in Application_OnEnd cosi' e' sicuro che nessuno lo ha
aperto in quel momento...
Durante Application_OnEnd viene generato una sorta di Log delle operazioni,
cosi' nel caso in cui si interrompe per un errore, so' dove si e' fermato il
tutto...
Il codice (che trovate piu' sotto) funziona perfettamente...
Copiandolo nel Application_OnEnd, funziona solo la prima volta...
Non riesco a capire perche'!
Ditemi un po' voi!
Sub Application_OnEnd
    dim Testo, fso, File, F1, F2, Engine
    dim rsDelRecords, rsDelRecords2, ConnString, ConnString2
    Set rsDelRecords    = Server.CreateObject("ADODB.Recordset")
    Set rsDelRecords2    = Server.CreateObject("ADODB.Recordset")
    Set ConnString        = Server.CreateObject("ADODB.Connection")
    Set ConnString2        = Server.CreateObject("ADODB.Connection")
    Set fso                = CreateObject("Scripting.FileSystemObject")
    Set Engine            = CreateObject("JRO.JetEngine")        ' JRO -
MDAC 2.1
' Creazione Modifica file di log
    If fso.FileExists(Application("path") & "db_actions.log") Then
        Set f1 = fso.GetFile(Application("path") & "db_actions.log")
        if f1.size>0 then
            Set F2 = FSO.OpenTextFile(Application("path") &
"db_actions.log")
            Testo = F2.ReadALL
            F2.close
        end if
    end if
' Apertura/inserimento file di log
    Set file = fso.OpenTextFile( Application("path") & "db_actions.log", 2,
True, 0)
    if len(testo)>0 then file.Write Testo
     file.Write date() & " - " & time() & " - Inizio operazione" & chr(10)
' Apertura DB
    ConnString.Open        Application("DB_QL")
     file.Write date() & " - " & time() & " - File it.mdb aperto" & chr(10)
    ConnString2.Open    Application("DB_QL_en")
     file.Write date() & " - " & time() & " - File en.mdb aperto" & chr(10)
' Cancellazione Temp
    sqldelete            = "DELETE * FROM TEMP"
    rsDelRecords.Open    sqldelete, ConnString
    Set rsDelRecords    = ConnString.Execute(sqldelete)
     file.Write date() & " - " & time() & " - Dati Temp it.mdb cancellati" &
chr(10)
    rsDelRecords2.Open    sqldelete, ConnString2
    Set rsDelRecords2    = ConnString2.Execute(sqldelete)
     file.Write date() & " - " & time() & " - Dati Temp en.mdb cancellati" &
chr(10)
' Cancellazione Temp_MAIL
    sqldelete            = "DELETE * FROM TEMP_Mail"
    rsDelRecords.Open    sqldelete, ConnString
    Set rsDelRecords    = ConnString.Execute(sqldelete)
     file.Write date() & " - " & time() & " - Dati Temp Mail it.mdb
cancellati" & chr(10)
    rsDelRecords2.Open    sqldelete, ConnString2
    Set rsDelRecords2    = ConnString2.Execute(sqldelete)
     file.Write date() & " - " & time() & " - Dati Temp Mail en.mdb
cancellati" & chr(10)
    Connstring.Close
    Connstring2.Close
    Set rsDelRecords    = nothing
    Set rsDelRecords2    = nothing
' Eliminazione eventuali residui di DB compattati xx_.mdb
    If fso.FileExists( Application("path") & "it_.mdb" ) Then
        fso.DeleteFile Application("path") & "it_.mdb"
        file.Write Date() & " - " & time() & " - File it_.mdb cancellato" &
chr(10)
    end if
    If fso.FileExists( Application("path") & "en_.mdb" ) Then
        fso.DeleteFile Application("path") & "en_.mdb"
        file.Write Date() & " - " & time() & " - File en_.mdb cancellato" &
chr(10)
    end if
' Compattazione db xx.mdb in xx_.mdb
    file.Write date() & " - " & time() & " - Inizio compattazione" & chr(10)
    Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
Application("path") & "it.mdb", "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" & Application("path") & "it_.mdb"
    file.Write date() & " - " & time() & " - Compattazione it.mdb
effettuata" & chr(10)
    Engine.CompactDatabase "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
Application("path") & "en.mdb", "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" & Application("path") & "en_.mdb"
    file.Write date() & " - " & time() & " - Compattazione en.mdb
effettuata" & chr(10)
' Eliminazione eventuali backup dei DB xx_old.mdb
    If fso.FileExists( Application("path") & "it_old.mdb" ) Then
        fso.DeleteFile Application("path") & "it_old.mdb"
        file.Write date() & " - " & time() & " - File it_old.mdb cancellato"
& chr(10)
    end if
    If fso.FileExists( Application("path") & "en_old.mdb" ) Then
        fso.DeleteFile Application("path") & "en_old.mdb"
        file.Write date() & " - " & time() & " - File en_old.mdb cancellato"
& chr(10)
    end if
' Backup DB xx.mdb -> xx_old.mdb
    fso.MoveFile Application("path") & "it.mdb", Application("path") &
"it_old.mdb"
    file.Write date() & " - " & time() & " - File it.mdb rinominato
it_old.mdb come backup" & chr(10)
    fso.MoveFile Application("path") & "en.mdb", Application("path") &
"en_old.mdb"
    file.Write date() & " - " & time() & " - File en.mdb rinominato
en_old.mdb come backup" & chr(10)
' Eliminazione db xx.mdb
    If fso.FileExists( Application("path") & "it.mdb" ) Then
        fso.DeleteFile Application("path") & "it.mdb"
        file.Write Date() & " - " & time() & " - File it.mdb cancellato" &
chr(10)
    end if
    If fso.FileExists( Application("path") & "en.mdb" ) Then
        fso.DeleteFile Application("path") & "en.mdb"
        file.Write Date() & " - " & time() & " - File en.mdb cancellato" &
chr(10)
    end if
' Rinominazione db compattato in db da utilizzare xx_.mdb xx.mdb
    fso.MoveFile Application("path") & "it_.mdb", Application("path") &
"it.mdb"
    file.Write Date() & " - " & time() & " - File it_.mdb rinominato come
it_.mdb" & chr(10)
    fso.MoveFile Application("path") & "en_.mdb", Application("path") &
"en.mdb"
    file.Write Date() & " - " & time() & " - File en_.mdb rinominato come
en_.mdb" & chr(10)
' Fine operazioni
    file.Write Date() & " - " & time() & " - Fine operazione" & chr(10)
    file.Write
"---------------------------------------------------------------------------
---" & chr(10)
    file.close
end sub
--
Massimo "Red Foxy" Ciccio'
Home Page: 
http://www.redfoxy.go.to/
Web Master di:
 - Libreria Ciofalo: 
http://www.ciofalo.it
 - Quantum Leap: 
http://ql.programmazione.it
..<-------- Se ricevo spam denuncio l'autore al server ------->.
..o0 ------------------------------------------------------- 0o.
..o0 --------- Dentro ognuno di noi c'e' un animale, ------- 0o.
..o0 ----------- sta' a noi scoprirlo e domarlo ------------ 0o.
..o0 ------------------------------------------------------- 0o.
..o0 --- Non c'e' uomo che non abbia paura dell'animale, --- 0o.
..o0 --------- non esiste uomo che non sia animale --------- 0o.
..o0 ------------------------------------------------------- 0o.
..o0 ------------------------------------------- Red Foxy -- 0o.

Pazzi? No, il codice è troppo e non lo leggiamo neanche.
Una domanda sorge spontanea. Per fare Application_OnEnd qualcuno o qualcosa
deve dare l'ordine di fermare il server web. Oppure ad esempio riavviando il
PC. Quindi o hai messo uno scheduler o devi intervenire manualmente?
E riavviando il server, l'oggetto Applicazione viene avviata solo con prima
visita. Se non c'è nessuna visita, niente On_Start e quindi niente On_End.
Senza aspettare un Application_OnEnd, metti tutto in una sub separata (che
poi potrai richiamare anche dal global.asa) eseguilo a piacimento e guarda
se effettivamente il problema dipende dall'oggetto Applicazione o da altro.
Paolo
"Ciò che non c'è non si rompe"
(Antico motto marinaro)

 se effettivamente il problema dipende dall'oggetto Applicazione o da
altro.
Eh???
Non ho afferrato!


 Cosa centra il fermare il server web o riavviare il server???
No. Application_OnEnd si scatena quando l'applicazione viene chiusa.
Un'applicazione WEb è il web definito nel web server. Quindi, quando stoppi
il web, o il web server, l'applicazione termina. Anche se non c'è nemmeno un
utente collegato, l'applicazione è sempre attiva.
Application_OnStart si scatena, invece, al primo utente che si collega.
Al contrario, è possibile, su Session_OnEnd, o Session_OnStart, contare il
numero di utenti collegati in un dato momento.
Quindi, utilizzando un codice riciclato da ASPItalia.com e modificato
opportunamente (vedi Session_OnEnd):
Sub Application_OnStart
 Application.Lock
  Application("collegati") = 0
 Application.UnLock
End Sub
Sub Session_OnStart
 Application.Lock
  Application("collegati") = Application("collegati") + 1
 Application.UnLock
End Sub
Sub Session_OnEnd
 Application.Lock
  Application("collegati") = Application("collegati") - 1
    If Application("collegati") = 0 Then
        CompattaDB()
    End If
 Application.UnLock
End Sub
Function CompattaDB()
    ...
End Function
Mi raccomando, utilizza Application.Lock e Application.UnLock (occhio a non
dimentirti si sbloccare l'applicazione, però).

 dimentirti si sbloccare l'applicazione, però).
Hemmm prima non li usavo :P
Ma anche per leggere la application devo prima bloccare e poi sbloccare?
Grazie ora provo subito!
Ciao ;^)=
Buona idea!!!


 Ma anche per leggere la application devo prima bloccare e poi sbloccare?
No. Il Lock serve solo quando modifichi il valore. Puoi anche non usarlo,
ma, almeno, se usi il Lock, sei sicuro che nessun altro potrà accedere
all'applicazione finchè non verrà eseguito l'Unlock. Infatti, la mia
raccomandazione era più che altro per ricordarti di usare l'Unlock quando
hai finito, altrimenti l'applicazione si blocca... credo.
Un po' come in Access, quando usi il "docmd.setwarning false": bisogna
ricordarsi di inserire sempre, quando finisce la routine, il
"docmd.setwarning true".... beh, non è esattamente la stessa cosa :-)
Un paragone forse un po' più calzante può essere quello delle transazioni...