Newsgroup: it.comp.www.asp
Titolo: [PWS] - Aggiornamento MDB da file TXT = kernel in crisi

Rieccomi qui con le mie domande "strane".
    Sto facendo un applicativo ASP che dovrà girare tramite PWS su computer
portatili, o comunque si WIN 98/ME.
    L'applicativo praticamente è finito, gira bene, ed è anche carino, ma
c'è un però .........
    L'applicativo (cioè i 3 MDB da cui è costituito) dovrà essere aggiornato
periodicamente tramite l'invio di 3 file txt formattati in un certo modo, e
la paginetta che effettuerà tale aggiornamento dovrà fare le seguenti
operazioni:
    - eliminazione di tutti i dati dall'MDB.
    - apertura del file di testo tramite l'FSO.
    - lettura di una intera riga del file di testo.
    - lettura delle varie informazioni contenute nella riga di testo.
    - inserimento di tali dati nel MDB.
Questo blocco di operazioni sarà fatto per 3 volte su tre file diversi, ed
ogni file avrà circa 2000 record per volta.
    Sul mio server (Win 2000 professional) il tutto gira velocemente e senza
intoppi, ma quando vado a testare la procedura su un portatile (Win 98/ME),
dopo circa 7/8 secondi mi esce il tanto simpatico errore di windows che mi
dice che c'è stato un errore irreversibile nel kernel e che tutto sarà
terminato, mi si chiudono tutte le finestre aperte, e viene interrotto il
servizio PWS. Non solo, se cerco di far ripartire tale servizio sul
portatile, mi riesce subito l'errore del kernel, e l'unico modo per
risolvere il problema è quello di riavviare il PC (senza aver portato a
termine l'aggiornamento - simpatico come problema, vero ?).
    Riporto di seguito il codice della pagina incriminata:
<!-- ******************************************************** -->
<% Server.ScriptTimeout = 3600
Percorso = server.mappath("/") & "\CartellaApplicativo\" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
 <meta name="GENERATOR" content="R [ D / L ] + 1">
</head>
<body BGCOLOR="#FCF494">
 <div align="center"><b>Aggiornamento archivi in corso, l'operazione
potrebbe richiedere alcuni minuti, attendere prego ...</b></div>
 <TABLE WIDTH="100%" HEIGHT="80%" border=0>
  <tr>
   <TD>
    <% sub DistruggiVecchi(Tabella)
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL = "Delete * from " & tabella: SET Rs=OBJDBCONN.execute(SQL)
     SET Rs = nothing
     OBJdbConn.close: set OBJdbConn = nothing
    end sub
'***************************************************************************
*********************
    sub AggiornaCFG()
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL = "Select * from Clienti order by ragionesociale"
     SET Rs=OBJDBCONN.execute(SQL)
     IndiceC = 0
     do while not rs.eof
      IndiceC = IndiceC + 1
      rs.movenext
     loop
     rs.close: set Rs = nothing
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL = "Select * from Articoli order by Descrizione"
     SET Rs=OBJDBCONN.execute(SQL)
     IndiceA = 0
     do while not rs.eof
      IndiceA = IndiceA + 1
      rs.movenext
     loop
     rs.close: set Rs = nothing
     Const adUseClient = 3
     Const adOpenKeyset = 1
     Const adLockOptimistic = 3
     Set Rs = Server.CreateObject("ADODB.Recordset")
     Rs.CursorLocation = adUseClient
     Rs.CursorType = adOpenKeyset
        Rs.LockType = adLockOptimistic
     SQL= " Select * from CFG"
     Rs.open SQL, OBJDBCONN
     if not Rs.eof then
      rs("Clienti") = IndiceC
      rs("Articoli") = IndiceA
      rs.update
     end if
     OBJDBCONN.close
     set Rs = nothing: set OBJDBCONN = nothing
    end sub
'***************************************************************************
*********************
    sub AggiornaArticoli(Riga, ID)
     Articolo = replace(replace(left(Riga,6)," ","0"),"'","''")
     Descrizione = replace(trim(mid(Riga,7,40)),"'","''")
     Categoria = replace(trim(mid(Riga,47,25)),"'","''")
     IVAP = replace(trim(mid(Riga,72,2)),"'","''")
     TImballo1 = replace(trim(mid(Riga,74,2)),"'","''")
     DImballo1 = replace(trim(mid(Riga,76,15)),"'","''")
     Fattore1 = replace(trim(mid(Riga,91,5)),"'","''")
     TImballo2 = replace(trim(mid(Riga,96,2)),"'","''")
     DImballo2 = replace(trim(mid(Riga,98,15)),"'","''")
     Fattore2 = replace(trim(mid(Riga,113,5)),"'","''")
     TImballo3 = replace(trim(mid(Riga,118,2)),"'","''")
     DImballo3 = replace(trim(mid(Riga,120,15)),"'","''")
     Fattore3 = replace(trim(mid(Riga,135,5)),"'","''")
     TImballo4 = replace(trim(mid(Riga,140,2)),"'","''")
     DImballo4 = replace(trim(mid(Riga,142,15)),"'","''")
     Fattore4 = replace(trim(mid(Riga,157,5)),"'","''")
     TImballo5 = replace(trim(mid(Riga,162,2)),"'","''")
     DImballo5 = replace(trim(mid(Riga,164,15)),"'","''")
     Fattore5 = replace(trim(mid(Riga,179,5)),"'","''")
     MacroFam = replace(trim(mid(Riga,184,3)),"'","''")
     MicroFam = replace(trim(mid(Riga,187,3)),"'","''")
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL="INSERT INTO Articoli(ID, articolo, descrizione, categoria, iva,
timballo1, dimballo1, fattore1, " & _
             "timballo2, dimballo2, fattore2, timballo3, dimballo3,
fattore3, timballo4, " & _
             "dimballo4, fattore4, timballo5, dimballo5, fattore5,
macrofamiglia, microfamiglia)"
     SQL=SQL & " VALUES (" & ID & ",'" & articolo & "','" & descrizione &
"','" & categoria & "'," & _
          "'" & ivap & "','" & timballo1 & "','" & dimballo1 & "','" &
fattore1 & "'," & _
          "'" & timballo2 & "','" & dimballo2 & "','" & fattore2 & "','" &
timballo3 & "'," & _
          "'" & dimballo3 & "','" & fattore3 & "','" & timballo4 & "','" &
dimballo4 & "','" & fattore4 & "'," & _
          "'" & timballo5 & "','" & dimballo5 & "','" & fattore5 & "','" &
macrofam & "'," & _
          "'" & microfam & "')"
     SET Rs=OBJDBCONN.execute(SQL): OBJDBCONN.close
     set Rs = nothing: set OBJDBCONN = nothing
    end sub
'***************************************************************************
*********************
    sub AggiornaClienti(Riga, ID)
     CodiceCliente = replace(left(Riga,6),"'","''")
     RagioneSociale = replace(trim(mid(Riga,7,35)),"'","''")
     Indirizzo = replace(trim(mid(Riga,42,35)),"'","''")
     Localita = replace(trim(mid(Riga,77,25)),"'","''")
     Provincia = replace(trim(mid(Riga,102,2)),"'","''")
     CAP = replace(trim(mid(Riga,104,9)),"'","''")
     PIVA = replace(trim(mid(Riga,113,11)),"'","''")
     Telefono = replace(trim(mid(Riga,124,20)),"'","''")
     Fax = replace(trim(mid(Riga,144,20)),"'","''")
     Pagamento = replace(trim(mid(Riga,164,20)),"'","''")
     CodiceListino = replace(trim(mid(Riga,184,2)),"'","''")
     DescrizioneListino = replace(trim(mid(Riga,186,25)),"'","''")
     Sconto1 = replace(trim(mid(Riga,211,2) & "," &
mid(Riga,213,2)),"'","''")
     Sconto2 = replace(trim(mid(Riga,215,2) & "," &
mid(Riga,217,2)),"'","''")
     Sconto3 = replace(trim(mid(Riga,219,2) & "," &
mid(Riga,221,2)),"'","''")
     CodiceAgente = replace(trim(mid(Riga,223,3)),"'","''")
     Descrizioneagente = replace(trim(mid(Riga,226,25)),"'","''")
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL="INSERT INTO clienti(ID, CodiceCliente, ragionesociale, indirizzo,
localita, provincia, " & _
            "cap, piva, telefono, fax, pagamento, codicelistino, " & _
            "descrizionelistino, sconto1, sconto2, sconto3, codiceagente, "
& _
            "descrizioneagente)"
     SQL=SQL & " VALUES (" & ID & ",'" & codicecliente & "','" &
ragionesociale & "','" & indirizzo & _
          "','" & localita & "','" & provincia & "','" & cap & "','" & piva
& _
          "','" & telefono & "','" & fax & "','" & pagamento & "','" & _
          codicelistino & "','" & descrizionelistino & "','" & sconto1 & _
          "','" & sconto2 & "','" & sconto3 & "','" & codiceagente & "','" &
_
          descrizioneagente & "')"
     SET Rs=OBJDBCONN.execute(SQL): OBJDBCONN.close
     set Rs = nothing: set OBJDBCONN = nothing
    end sub
'***************************************************************************
*********************
    sub AggiornaListini(Riga, ID)
     CodiceListino = replace(left(Riga,2),"'","''")
     CodiceArticolo = replace(trim(mid(Riga,3,6)),"'","''")
     PrezzoLire = replace(trim(mid(Riga,9,6)),"'","''")
     PrezzoEuro = replace(trim(mid(Riga,15,5) & "," &
mid(Riga,20,2)),"'","''")
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL="INSERT INTO Listino(ID, codicelistino, codiceprodotto, prezzolire,
prezzoeuro)"
     SQL=SQL & " VALUES (" & ID & ",'" & CodiceListino & "','" &
CodiceArticolo & "','" & PrezzoLire & "'," & _
          "'" & PrezzoEuro & "')"
     SET Rs=OBJDBCONN.execute(SQL): OBJDBCONN.close
     set Rs = nothing: set OBJDBCONN = nothing
    end sub
'***************************************************************************
*********************
    sub AggiornaComunicazioni(Riga)
     DataComunicazione = left(riga,10)
     Comunicazione = replace(right(Riga,len(riga)-10),"'","''")
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" & path)
     Set Rs = Server.CreateObject("ADODB.Recordset")
     SQL="INSERT INTO Comunicazioni(data, messaggio)"
     SQL=SQL & " VALUES (#" & DataComunicazione & "#,'" & Comunicazione &
"')"
     SET Rs=OBJDBCONN.execute(SQL): OBJDBCONN.close
     set Rs = nothing: set OBJDBCONN = nothing
    end sub
   %>
    <TABLE WIDTH="100%" HEIGHT="100%" ALIGN="center" border="1">
     <TR>
      <TD WIDTH="100%" HEIGHT="100%" COLSPAN="100%" ALIGN="center"
VALIGN="middle">
       <% response.write("<HR WIDTH='65%' SIZE='2'>")
       Set fso = CreateObject("Scripting.FileSystemObject")
'***************************************************************************
*********************
       if fso.FileExists(percorso & "txt/articoli.txt") then
        call DistruggiVecchi("articoli")
        Set ts = fso.OpenTextFile(percorso & "txt/articoli.txt", 1, False)
        Indice = 1
        do until ts.AtEndOfStream
         Lettura = ""
         Lettura = ts.ReadLine
         if len(lettura)>2 then
           call AggiornaArticoli(Lettura, Indice)
         end if
         indice = indice + 1
        loop
        ts.Close
        response.write("Aggiornamento dell'archivio degli <FONT
SIZE='+2'><B>Articoli</B></FONT> effettuato con successo .....<br>")
       else
        response.write("<FONT color='red'>Nessun aggiornamento per gli <FONT
SIZE='+2'><B>Articoli</B></FONT></font>.")
       end if
       response.write("<HR WIDTH='65%' SIZE='2'>")
'***************************************************************************
*********************
       if fso.FileExists(percorso & "txt/Listini.txt") then
        call DistruggiVecchi("listino")
        Set ts = fso.OpenTextFile(percorso & "txt/Listini.txt", 1, False)
        indice = 1
        do until ts.AtEndOfStream
         Lettura = ""
         Lettura = ts.ReadLine
         if len(lettura)>5 then
          call AggiornaListini(Lettura, Indice)
         end if
         indice = indice + 1
        loop
        ts.Close
        response.write("Aggiornamento dell'archivio dei <FONT
SIZE='+2'><B>Listini</B></FONT> effettuato con successo .....<br>")
       else
        response.write("<FONT color='red'>Nessun aggiornamento per i <FONT
SIZE='+2'><B>Listini</B></FONT></font>.")
       end if
       response.write("<HR WIDTH='65%' SIZE='2'>")
'***************************************************************************
*********************
       if fso.FileExists(percorso & "txt/Anagra.txt") then
        call DistruggiVecchi("clienti")
        Set ts = fso.OpenTextFile(percorso & "txt/Anagra.txt", 1, False)
        indice = 1
        do until ts.AtEndOfStream
         Lettura = ""
         Lettura = ts.ReadLine
         if len(lettura) > 2 then
          call AggiornaClienti(Lettura, indice)
         end if
         indice = indice + 1
        loop
        ts.Close
        response.write("Aggiornamento dell'archivio dei <FONT
SIZE='+2'><B>Clienti</B></FONT> effettuato con successo<br>")
       else
        response.write("<FONT color='red'>Nessun aggiornamento per i <FONT
SIZE='+2'><B>Clienti</B></FONT></FONT>.")
       end if
       call AggiornaCFG()
       response.write("<HR WIDTH='65%' SIZE='2'>")
'***************************************************************************
*********************
       if fso.FileExists(percorso & "txt/Comunicazioni.txt") then
        Set ts = fso.OpenTextFile(percorso & "txt/Comunicazioni.txt", 1,
False)
        do until ts.AtEndOfStream
         Lettura = ""
         Lettura = ts.ReadLine
         if len(lettura) > 2 then
          call AggiornaComunicazioni(Lettura)
         end if
        loop
        ts.Close
        response.write("Aggiornamento dell'archivio delle <FONT
SIZE='+2'><B>Comunicazioni</B></FONT> effettuato con successo<br>")
       else
        response.write("<FONT color='red'>Nessun aggiornamento per le <FONT
SIZE='+2'><B>Comunicazioni</B></FONT></FONT>.")
       end if
       %>
      </TD>
     </TR>
    </TABLE>
   </TD>
  </TR>
 </TABLE>
 <div align="center"><b>Aggiornamento archivi completato, grazie !</b></div>
</body>
</html>
<!-- ******************************************************** -->
    Mi date una dritta (anche a livello di teoria) su come evitare di
danneggiare il povero kernel di Windows ?
Scusate per il messaggio enorme, ma il problema non è tanto "normale".
    Grazie 10.000 a chi mi risponde ......
        Ciao, Rocco

c'è un però .........
<CUT>
Non so dirti quanto possa aiutare ad evitare problemi , ma potresti
diminuire le "chiamate" al server evitando la creazione di recordset
nel caso in cui il comando SQL sia DELETE / INSERT / UPDATE , 
poichè in effetti execute non ti restituisce un recordset. 
Fai semplicemente un OBJDBCONN.execute(SQL)
es.
 <% sub DistruggiVecchi(Tabella)
     path=server.mappath("mdb/Archivio.mdb")
     SET OBJdbConn=Server.createobject("ADODB.Connection")
     OBJDBCONN.Open ("driver={Microsoft Access Driver (*.mdb)};dbq=" &
path)
      SQL = "Delete * from " & tabella
      OBJDBCONN.execute(SQL)
      OBJdbConn.close: set OBJdbConn = nothing
  end sub
ciao

> poichè in effetti execute non ti restituisce un recordset.
Execute ti restituisce un recordset.
Prova a fare qualcosa tipo:
Set rsPippo = oConn.Execute("Select * From CiccioPasticcio")
E dimmi se poi non vedi un recordset.
Forse, come soluzione, si potrebbero dividere i compiti in più pagine,
chiamando i vari compiti di volta in volta (manualmente o, automaticamente,
ma, forse, in questo secondo caso, equivarrebbe a fare tutto in una sola
pagina).
1. Eliminazione record
2. Inserimento record tabella1
3. Inserimento record tabella2
4. Inserimento record tabella3

 4. Inserimento record tabella3
    Penso che non sia possibile splittare la pagina i puù paginette, anche
perchè le operazioni devono essere fatte necessariamente in modo sequenziale
(e se volete saperla tutta, mi avevano chiesto di far fare l'aggiornamento
in automatico ogni volta che si apre l'applicativo .... ma con questi
presupposti, penso che non sia possibile :'-<  ).
    P.S.
        Ho fatto altre prove su un portatile (PII 400, 64 MB ram) e si è
verificato il solito problema del kernel con conseguente crash del sistema,
solo che questa volta il portatile non si è più riavviato, nel senso che
appena finisce la procedura di caricamento di windows (nel momento in cui si
abbandona la parte "dos" e compare la grafica "windows", il pc si
autoresetta - e questo è ancora più bello come problema ;-)
    Se qualcuno è in grado di darmi una mano, sarà ricordato nelle mie
preghiere della sera per tutta la vita ;-))
        Ciao, Rocco


a) mi sembra che io stessi parlando di  UPDATE INSERT DELETE e
   non di SELECT
' diminuire le "chiamate" al server evitando la creazione
di recordset
nel caso in cui il comando SQL sia DELETE / INSERT / UPDATE , 
poichè in effetti execute non ti restituisce un recordset.'
b) ribadisco che oConn.Execute("istruzioni sql che pare a te")
 NON restituisce un recordset se nella query hai DELETE o INSERT o
UPDATE
c) addiruttura  è anche possibile , se necessario, evitare di farsi
restituire un recordset anche con la SELECT , specificando un
parametro apposito del comando Execute
Il tutto si può tranquillamente leggere nella documentazione MS 
su msdn per esempio.
Saluti