Newsgroup: it.comp.appl.access
Titolo: lanciare esecuzione di varie query in background senza bloccare il lavoro

Salve a tutti, ho un problema per il quale proprio non so come muovermi.
 
Ad ogni primo accesso di ogni giorno, il mio appl. A97, lancia un MDB dal 
quale vengono eseguite 4 query a cascata necessarie per l'aggiornamento 
(quotidiano appunto) di uno scadenzario globale.
Essendo tabelle molto voluminose, questa procedura risulta molto lenta, ed 
il primo utente che accede al sistema la mattina, si trova il pc impallato 
per un paio di minuti (l'applicativo iniziale e' bloccato finche' tutte le 
query non vengono eseguite).
E' possibile quindi eseguire l'mdb che genera lo scadenzario senza per 
questo bloccare l'esecuzione dell'mdb principale?
 
Grazie infiinite a chiunque possa aiutarmi.
Marco67
 
 

 ha scritto nel messaggio 
news:PO2Yr.200759$GZ3.1...@tornado.fastwebnet.it...

Usa il codice e quindi i recordset, sarà certamente più veloce.
Come mai ancora A97? Le tabelle sono allegate?
 
Ciao, Carlo 
 
 


Ho provato con il codice, ma non vedo miglioramenti, anzi:
Ho varie applicazioni su A97 e l'aggiornamento a nuove versioni mi 
comporterebbe, oltre all'aggiornamento delle licenze degli ut. finali, anche 
diverse modifiche ad alcune routine specifiche (credo).
Mi conefrmi quindi che non e' possibile far proseguire l'eleborazione 
dell'MDB iniziale mentre il 2o MDB sta lavorando?
 
Grazie 1000 Carlo
 
 


Non è così. Se l'aggiornamento viene fatto da un secondo mdb, il primo può lavorare. Chiaramente si deve gestire l'accesso contemporaneo ai dati.....

 ha scritto nel messaggio 
news:x27Yr.200830$GZ3....@tornado.fastwebnet.it...

Da quello che ho capito l'mdb dello scadenzario ha le tabelle condivise 
anche con l'mdb dell'applicativo principale.
Bench� sia possibile tenere aperti due mdb, in questo caso, le tabelle 
risultano bloccate perch� si stanno aggiornando.
Per quanto riguarda il codice se ben scritto dovrebbe essere pi� veloce e di 
molto.
Una domanda, ma non sarebbe conveniente aggiornare solo i dati modificati o 
nuovi?
Ciao, Carlo 
 
 

 ha scritto nel messaggio 
news:k0v6s5$dmg$1...@tdi.cu.mi.it...

E' proprio cosi' Carlo, in effetti le tabelle (su database remoto MySQL) non 
sono condivise, ma e' condivisa la 5a tabella che e' quella di destinazione 
delle 4 query (riguardanti 4 tabelle diverse) necessarie a fare la 
popolazione della 5a (contenente lo scadenzario giornaliero appunto).
La necessita' di fare l'aggiornamento la mattina e' questo:
Lo scadenzario viene visualizzato ad ogni utente (in base alla propria area 
di lavoro) ad ogni accesso al sistema.
Trattandosi di 4 diverse tabelle, l'aggiornamento prevede l'eliminazione di 
tutti i record di una 5 tabella (quella condivia tra i 2 MDB).
Il risultato visibile all'utente infatti, e' l'elenco dei record provenienti 
appunto dalle 4 tabelle diverse.
 
Che mi suggeriresti di fare?
Forse, attraverso un processo pianificato, potrei far lanciare l'MDB 
dell'aggiornamento durante la notte?
Grazie ancora Carlo
 
 
 
 

 
 
magari la faccio troppo semplice, ma potresti fare:
- su mysql crei la quinta tabella (stessa struttura di quella condivisa)
 
- sposti le 4 query su mysql
 
- nottetempo aggiorni la quinta tabella su mysql usando le 4 query
 
- all'avvio, il tuo mdb non esegue piu' le 4 query ma una semplice 
(rispetto alle 4 query) copia dei dati dalla quinta mysql sulla quinta 
mdb
 
a naso, potresti dover modificare leggermente le 4 query e aggiungere un 
campo alla quinta tabella su mysql.
 
-- 
Paolo opg
 
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 
cut

Decisamente enorme il tempo impiegato.
Si tratta di fare un delete all from ....e un successivo accodamento sempre 
da codice.
Spesso l'antivirus controlla l'mdb che viene aggiornato...prova a 
disattivarlo e vedi.
Se usi una vecchia scheda di rete sostituiscila.
In ultimo dai un'occhiata qui:
http://www.granite.ab.ca/access/performancefaq.htm
 
http://technet.microsoft.com/en-us/library/cc767939.aspx
 
http://support.microsoft.com/kb/112112
 
 
Ciao, Carlo 
 
 

>> Per quanto riguarda il codice se ben scritto dovrebbe essere piů veloce 

Avevo gia' fatto queste verifiche Carlo: un pc piu' performante migliora ma 
non di molto, cosiccome la disattivazione dell'antivirus che fa recuperare 
pochi secondi.
Da quel che ho capito dai suggerimenti ai link che mi hai proposto, rimane 
da ottimizzare le query ma, una cosa:
mi scrivi che e' bene eseguie le query da codice anziche' eseguirne una gia' 
salvata nel db: risulta piu' veloce?
 
 
 

 ha scritto nel messaggio 
news:XnsA0B67F280E050sp...@193.43.96.1...

Salve Paolo, in effetti, le 5 tabelle (4 + 1 generale) sono gia' in Mysql ed 
i 2 MDB vi si connettono attraverso odbc.
Probabilmente hai ragione, spostare le query in MySQL... ho provato 
attraverso 'stored procedure' (dove in questo modo si lascia alla parte 
server il compito dell'elaborazione), sicuramente risulterebbe piu' veloce.
Purtroppo ho provato ma ricevo sempre errore di sintassi o altri errori 
vari, che proprio nn capisco: evidentemente la sintassi SQL e' diversa da 
VBA.
Si tratta comunque di 4 query normalissime che utilizzano un solo filtro per 
accodare i dati delle 4 tabelle sulla 5a: la data di inizio e fine periodo, 
tutto qua.
 
Questo l'esempio di una delle 4 query, dove vengono accodati i record della 
tab. utenti_x allo scadenzario_auto, se gli utenti hanno data_spospensione 
nell'intervallo di tempo che va da 30 giorni fa a 30 gg. successivi ad oggi.
 
INSERT INTO scadenzario_auto ( Avviso, scadenza, Idsettore )
SELECT [Nominativo] & " - in Scadenza" AS Espr1, utenti_x.Data_Sospensione, 
7 AS Espr2
FROM utenti_x
WHERE (((utenti_x.Data_Sospensione) Between 
DateSerial(Year(Now()),Month(Now()),Day(Now())-30) And 
DateSerial(Year(Now()),Month(Now()),Day(Now())+30)));
 
Sapresti suggerirmi variazioni importanti da apportare alla versione MySQL?
Grazie 1000 Paolo
Un saluto
Marco67 
 
 

>>> Per quanto riguarda il codice se ben scritto dovrebbe essere pi� veloce 

Carlo, a titolo di esempio, ti giro una delle 4 query di accodamento che sto 
utilizzando:
In questo caso, vengono accodati i record della tab. utenti_x allo 
scadenzario_auto, se gli utenti hanno data_spospensione nell'intervallo di 
tempo che va da 30 giorni fa a 30 gg. successivi ad oggi.
 
INSERT INTO scadenzario_auto ( Avviso, scadenza, Idsettore )
SELECT [Nominativo] & " - in Scadenza" AS Espr1, utenti_x.Data_Sospensione, 
7 AS Espr2
FROM utenti_x
WHERE (((utenti_x.Data_Sospensione) Between 
DateSerial(Year(Now()),Month(Now()),Day(Now())-30) And 
DateSerial(Year(Now()),Month(Now()),Day(Now())+30)));
 
Grazie ancora
Marco
 
 
 
 

 
 
la tua query non e' in sql ma nel dialetto specifico di access; 
probabilmente sarebbe digerita da mssql, ma per adattarla a mysql ti 
conviene prenderti la documentazione e partire da li'.
 
le prime cose che saltano all'occhio:
- concatenazione: & viene usato da vb ma in sql si usa il +
- dateserial: funzione vb che non esiste in sql
- now: in sqlserver non esiste e al suo posto si usa getdate(), non so in 
mysql



 
No dicevo di usare i recordset da codice e non di lanciare una query da 
codice.
Ciao, Carlo
 
 

 ha scritto nel messaggio 
news:XnsA0B75B4E31DEAsp...@193.43.96.1...

Okkey Paolo, provo.
Grazie ancora
Marco 
 
 

 >>>> Per quanto riguarda il codice se ben scritto dovrebbe essere più veloce 

Dim db As Database
Dim rs As DAO.Recordset
 
Set db = CurrentDb
Set rs = db.OpenRecordset("scadenzario_auto")
 
With rs
  .AddNew
  !Avviso = "tuo_avviso"
  !scadenza = "tua_scadenza"
  !Idsettore = "tuo_Idsettore"
  .Update
End With
rs.Close
 
Set rs = Nothing
Set db = Nothing
 
ovviamente i dati da inserire li prendi aprendoti altro recordset della tua query:
 
SELECT [Nominativo] & " - in Scadenza" AS Espr1, utenti_x.Data_Sospensione, 7 AS
Espr2 FROM utenti_x WHERE (((utenti_x.Data_Sospensione) Between
DateSerial(Year(Now()),Month(Now()),Day(Now())-30) And
DateSerial(Year(Now()),Month(Now()),Day(Now())+30)));
 
 
-- 
------------
Pablitomf
Napoli sempre nel "Q"uore!
"mammasantissima" si nasce, non si diventa.
 

> >>>> Per quanto riguarda il codice se ben scritto dovrebbe essere pi� 

Ti ringrazio per l'aiuto. Una curiosita':
Ho notato che nella tua dichiarazione del recordset: Dim rs As 
DAO.Recordset, mi domandavo se la dichiarazione 'DAO' risulti piu' 
performante o sicura, o cos'altro: io abitualmente non lo inserisco nella 
sintassi: (ho sempre utilizzato 'Set rs as recordset')
Intanto faccio le prove
Grazie ancora
Marco67
 
 
 
 

 Marco67
 
Diciamo che ho forzato DAO perche' e' un metodo di accesso ai dati decisamente
piu' specifico e performante per Access, soprattutto per quelli come te che
hanno ancora la versione vecchia A97 (ho ritenuto opportuno farlo proprio per
questo)... ADO ha un grado di astrazione decisamente piï¿œ elevato del vecchio
fratello DAO (ADO libreria accesso dati generica - DAO libreria accesso dati
specifica), ma pur preferendolo, nel tuo caso, potrebbe darti lentezza (la
stessa che tu riscontri nel tuo post). Cmq, basta che fai prove e paragoni di
prestazioni mettendolo o togliendolo.


 ...
 
C'ï¿œ anche un effetto minimale di prestazione perchï¿œ
Access/VBA non deve cerchare nelle biblioteche.
Perï¿œ la ragione principale ï¿œ evitare problemi nelle versioni
dopo A97. Vedi: 
http://www.donkarl.com/it?FAQ7.11
 
 
-- 
Ciao
Karl
*********
Access FAQ:  
http://www.donkarl.com/it
 
 


Ho fatto il tutto tramite codice: in effetti noto un leggero miglioramento.
Ringrazio tutti per l'aiuto, la professionalita' e... la pazienza!
Marco67 
 
 

 ha scritto nel messaggio 
news:k1208n$601$1...@tdi.cu.mi.it...



> Ho fatto il tutto tramite codice: in effetti noto un leggero miglioramento.
 
leggero?????... no allora non hai fatto "tutto"... mi sa che ti e' rimasta
qualche query non da cosice...


 ha scritto nel messaggio 
news:201208250...@mynewsgate.net...

No No, le query le ho ho tutte elaborate via codice.
Ho voluto anche verificare la struttura delle tabelle di MySql interessate 
ed in effetti... ho aggiunto degli indici che sono serviti a migliorare 
ancora qualcosa.
 
Adesso per l'eliminazione completa dei record e l'accodamento dei 4 
scadenzari sulla tabella completa impiega circa 35-40 secondi.
Un ottimo risultato direi (Da considerare che trattasi di DB remoto MySQL su 
un server messo a disposizione senza una banda garantita, quindi soggetto al 
traffico).
Inoltre, questo risultato l'ottengo collegandomi attraverso un contratto 
Fastweb 'base' in connessione wireless e attraverso un pc 'niente di che'.
 
Mi ritengo piu' che soddisfatto, ma forse...
Se le mie 4 query di accodamento popolassero un db access in locale e solo 
successivamente eseguire l'accodamento su DB remoto, pensi si ottenga una 
migliore prestazione finale o no?
 
Cmq. grazie, grazie ancora
Marco67
 
 
 
 
 
 

 Cmq. grazie, grazie ancora
 
Figurati


 ha scritto nel messaggio 
news:201208261...@mynewsgate.net...

Eh eh, immaginavo che saremmo cascati sulle query pass-trough: ho provato 
piu' di una volta ad usarle ma mi sono proprio 'indigeste'.
Mi sa che mi dovro' mettere sotto.
A presto
Marco67
 
 

 A presto


 Ciao, Carlo
 
Mi sembrava che l'ordine crescente di velocità nel maneggiare recordset 
fosse:
query da codice
query da finestra database
codice VBA
 
Ci riprovo e poi ti dico.
 
Bruno
 
 

 Ci riprovo e poi ti dico.
 
Ho cancellato da una tabella di 89200 record tutti quelli riferentesi 
alla mia provincia (20591).
 
Query eseguita da VBA: 0.61 sec
Codice VBA: 1.36 sec
 
Suggerisci qualche altro esperimento?
 
Bruno