Autore Topic: [risolto] edit database  (Letto 4306 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
[risolto] edit database
« il: 14 Marzo 2010, 00:14:03 »
ciao raga

ho un problema nel far eseguire dei calcoli su un database sqlite3

in pratica in una tabella cassa ci sono tre campi "entrate, uscite,cassa"

ogni tanto o per un errore di inserimento devo aggiornare il campo cassa, mi devo collegare al database e per ogni record devo leggere i valori dei campi "entrate  e uscite" sommarli e salvarli nel campo cassa.

il problema è che finche avevo decine di record funzionava bene, ora che i record sono centinaia mi blocca il pc per una decina di minuti, mi chiedo quando i record saranno migliaia?

Codice: [Seleziona]
sqll = "select * from cassa order by idcassa"  
   MyRSl = MODMain.MyConn.Exec(sqll)
   IF MyRSl.Available THEN
   MyRSl.MoveFirst
    MyCa = 0
  
   FOR ix = 1 TO MyRSl.Count
      
    IdRecA = Str(MyRSl!idcassa)
    MyEN = MyRSL!entrate
    MyUs = MyRSL!uscite
    
    MyRS = ModMain.MyConn.edit("cassa", "idcassa=" & IdRecA) '<< qui si rallenta il pc
          
    MyCa = MyCa + MyEN - MyUs
    MyRS!cassa = MyCa
        
    MyRS.update
    MyRSl.MoveNext
   NEXT
  
   ENDIF

come posso snellire l'operazione e impiegare meno risorse?
« Ultima modifica: 15 Marzo 2010, 00:12:59 da dex »

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: edit database
« Risposta #1 il: 14 Marzo 2010, 00:36:44 »
Ciao,
Se su tutti i record il valore cassa deve essere (entrate - uscite) io farei così
Citazione
UPDATE cassa SET cassa = (entrate - uscite)
..ma forse non ho colto bene

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: edit database
« Risposta #2 il: 14 Marzo 2010, 00:40:50 »
ciao golia

su tutti i record il valore cassa deve essere:
record precedente cassa + entrate - uscite

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: edit database
« Risposta #3 il: 14 Marzo 2010, 00:43:10 »
allora dovrebbe bastare così
Codice: [Seleziona]
' 
sql= "UPDATE cassa SET cassa = (cassa + entrate - uscite)"
MyRS = MODMain.MyConn.EXEC(sql) 

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: edit database
« Risposta #4 il: 14 Marzo 2010, 00:49:50 »
oopss
precedente..adesso ho capito

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: edit database
« Risposta #5 il: 14 Marzo 2010, 00:52:56 »
golia
il tuo codice funziona ma i tempi non cambiano, il pc si blocca per vari minuti

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: edit database
« Risposta #6 il: 14 Marzo 2010, 01:02:10 »
Ho notato anch'io un pò di lentezza nell'aprire i record del listino.
Ho un listino con 22.000 record com mysql. per aprirlo ci vuole 30 secondi. ho dovuto filtrarli, praticamente quando li cerco con il codice la ricerca parte dopo la terza lettera in modo da toglierne già parecchi. Purtroppo devo dire che access era più veloce.

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: edit database
« Risposta #7 il: 14 Marzo 2010, 01:09:37 »
Ho notato anch'io un pò di lentezza nell'aprire i record del listino.
Ho un listino con 22.000 record com mysql. per aprirlo ci vuole 30 secondi. ho dovuto filtrarli, praticamente quando li cerco con il codice la ricerca parte dopo la terza lettera in modo da toglierne già parecchi. Purtroppo devo dire che access era più veloce.

vero access era molto più veloce, con visualbasic e access usavo lo stesso codice per aggiornare la cassa  e con migliaia di record ci metteva pochi secondi

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: edit database
« Risposta #8 il: 14 Marzo 2010, 09:31:22 »
Scusate se mi intrometto, ma sono curioso :)

ho creato una tabella in sqlite3 con quattro campi: id, cassa, entrate, uscite.
ho inserito a casaccio circa 1400 record poi ho eseguito i seguenti test:

1° test: eseguo l'update come suggerito da Golia ed effettivamente ci mette parecchio: 1'40'' circa
2° test: eseguo l'update passando al database 200 sql per volta (ho notato che su db come postgres migliora di molto i tempi di esecuzione): purtroppo qui siamo sempre intorno ai 1'40'' circa
3° test: faccio un backup della tabella e la riscrivo completamente con 200 INSERT per volta (ovviamente ricalcolando la cassa come deve fare dex): tempo 1 sec circa.

Il tempo del terzo test sicuramente cambiera' con l'aumentere dei campi, ma non credo che si arrivi al 1'40'' dell'UPDATE.

allego test

« Ultima modifica: 14 Marzo 2010, 09:41:41 da milio »

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: edit database
« Risposta #9 il: 14 Marzo 2010, 09:54:10 »
Ho eseguito il test anche sul mio vecchio portatile:

1° test: 2 min e 13 sec
2° test: 2 min e 17 sec
3° test: 1,37 sec.

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: edit database
« Risposta #10 il: 14 Marzo 2010, 15:49:04 »
Ma che sia un problema del database o gambas?
MySQL dicono sia molto veloce..ma non mi sembra :(

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: edit database
« Risposta #11 il: 14 Marzo 2010, 16:12:29 »
domani sul posto di lavoro faro' gli stessi test su mysql, postgresql e firebird. volendo anche su m$sql e access... vi faro' sapere....

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: edit database
« Risposta #12 il: 14 Marzo 2010, 16:17:23 »
A  me il tuo programma di prova non funziona ..va in un loop infinito al primo test , quello dopo la creazione del db

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: edit database
« Risposta #13 il: 14 Marzo 2010, 16:19:08 »
a me funziona... ho provato anche sul portatile... ti da errore?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: edit database
« Risposta #14 il: 14 Marzo 2010, 16:45:53 »
neesun errore solo non porta mai a termine la prima prova