Newsgroup: it.comp.appl.access
Titolo: Velocizzare esecuzione

Per ogni prodotto appartenete della tabella tblProdotti
devo calcolare il costo delle n lavorazioni a cui viene sottoposto.
Per fare questo ho scritto una query su tblProdotti le cui righe
sono cosi' costituite:
    IdProd    CostoLav1(IdProd)    ...    CostoLavn(IdProd)
dove CostoLav1 e' la chiamata ad una funzione che ritorna
il costo della lavorazione Lav1 effettuata sul prodotto IdProd.
Lo stesso per CostoLav2, ..., CostoLavn
La funzione CostoLav?, per svolgere il proprio compito, ha
bisogno di conoscere il valore di  piu' parametri, valori
che si deve inevitabilmente 'DLookUppare' da qualche tabella.
Da quest'ultima operazione nasce un problema, in quanto ne
consegue un notevole numero di interrogazioni al BE, con
conseguente allungamento dei tempi di esecuzione della query.
Dato che alcune di queste DLookUp sono spesso ripetitive
(per ogni riga leggo sempre lo stesso valore dalla stessa tabella)
viene spontaneo pensare di effettuarle una sola volta, prima di
eseguire la query, mantenendo il valore letto in una variabile globale
a disposizione delle varie funzioni.
Generalizzando posso pensare di creare un modulo di classe
che in Class_Initialize ricava i valori costanti di cui sopra, da mettere
a dispozione delle funzioni  CostoLav?,  presenti come 'Property Get'
della classe stessa.
Dato che i risultati della query devono essere presentati con un report,
instanziero' un'oggetto in corrispondenza dell'evento Open,
creandone poi dinamicamente l'origine dati.
Che ne pensate? E' corretto??
Grazie.
(spero di essere stato abbastanza confuso ;)  )
---
leo_duca

 (per ogni riga leggo sempre lo stesso valore dalla stessa tabella)
Direi che allora la soluzione di leggere una volta per tutte questi valori e
sbatterli in variabili globali mi sembra abbastanza corretta.
Antonio

 Antonio
E neanche stavolta riesco a metterci in mezzo una classe.... :)
Con la mia domanda pero' cercavo anche la risposta ad un secondo quesito:
posso, in una query o nei campi di origine controllo, riferirmi a
proprieta' o metodi di un oggetto? P.e. nel mio caso la query si
trasformerebbe in:
    IdProd    Obj!CostoLav1(IdProd)    ...    Obj!CostoLavn(IdProd)
Corretto?!?
---
leo_duca

 sbatterli in variabili globali mi sembra abbastanza corretta.
Tnk!
E se invece di usare n variabili globali dichiaro
un recordset con un origine dati che mi fornisce
campi contenenti i valori utili?
E un po' la stessa cosa ?!?
---
leo_duca

 ha scritto nel messaggio
news:B5ry9.701$8E3....@twister2.libero.it...

Puoi creare delle funzioni che richiami nelle query e che ti restituiscono
il valore delle proprietą
Per i metodi la domanda mi sembra sbagliata: un metodo esegue un'operazione,
non ritorna valori
Antonio

 ha scritto nel messaggio
news:kfry9.762$Zn2....@twister1.libero.it...

Beh, direi di sì. A quel punto poi dovrai rifare delle dlookup o delle
findfirst, ma le faresti su tabelle di pochi record e non si dovrebbe
sentire
Antonio

 sentire
Mi stai dicendo che quando uso un recordset Access mi crea
una tabella temporanea?? Io supponevo la creazione di una struttura
in memoria dinamica (e quindi, molti o pochi che siano i record,
eventuali dlookup o findfirst risulterebbero praticamente veloci
come un riferimento ad una variabile!).
---
leo_duca

 non ritorna valori
infatti questo e', appunto, il 'compito' delle proprieta' ;).
Quello che mi interessava sapere e' se, volendo, posso accedere
direttamente ad un oggetto; Stando a quanto mi dici, la risposta e' no,
o meglio lo posso fare solo indirettamente tramite la chiamata
ad una funzione.
Grazie
---
leo_duca

 proprieta' o metodi di un oggetto
La seconda possibilitą non torna, no?
Antonio

 ha scritto nel messaggio
news:Doty9.1260$8E3....@twister2.libero.it...

Aspč: un recordset aperto te lo scorri in maniera molto piů veloce di un
dlookup. Ma come fai ad aprire un recordset se non hai una tabella su cui
basarlo?
Antonio


Perche?? Supponendo di poter riferirci direttamente
ad un oggetto, non potrei chiamare un metodo del tipo
Obj.Push(MyValue) per  crearmi una lista di valori
da utilizzare dopo l'esecuzione della query?
---
leo_duca

 basarlo?
No, no, no... mi son spiegato male.... ci riprovo
Perche' un recordset aperto lo si scorre piů velocemente di un dlookup?
La mia supposizione e' (senza star li a far troppe precisazioni):
perche' quando apro un recordset Access si carica la relativa tabella in
RAM.
Quindi se io scrivo:
Dim rst As DAO.Recordset
Public Sub PrimaDiQuery()
  Set rst = CurrentDb.OpenRecordset("SELECT [ClasseProdotto],
[Maggiorazione] FROM tblA;")
End Sub
Public Function CostoLav1(CostoBase As Currency, ClasProd As Byte) As
Currency
  rst.FindFirst "[ClasseProdotto]=" & str(ClasProd)
  CostoLav1 = CostoBase* rst!Maggiorazione
End Function
Public Sub DopoQuery()
  rst.Close
End Sub
Risutera' piu' veloce la query con la colonna
    CostoLav1([CostoBase];[ClasProd])
piuttosto che la query con la colonna
    [CostoBase] * DLookup("[Maggiorazione]";"tblA";"[ClasseProdotto]=" &
Str([ClasProd]))
(nel caso in cui il nr di righe della query sia maggiore del nr di
'ClassiProdotto',
ecchecazz... almeno una di precisazione la dovevo fare :)) )
giusto?
---
leo_duca

 RAM.
Esatto. Quindi le considerazioni successive sono corrette!!!
Antonio

 ha scritto nel messaggio
news:H_vy9.1981$Zn2....@twister1.libero.it...

Ora che c'ho bevuto sopra un caffe' mi son reso conto della str****
rrrvederci!!! :)))
---
leo_duca

 ha scritto nel messaggio
news:H_vy9.1981$Zn2....@twister1.libero.it...

Ma non puoi farlo in una query.
Puoi da query chiamare una funzione che esegue il metodo e poi ritorna un
valore che eventualmente non userai.
Antonio


E che sei supeman??? (+ veloce della ecc... ecc... :))
Spero di averti anticipato nell'atro thread :))))
Grazie ancora
---
leo_duca

> Spero di averti anticipato nell'atro thread :))))
Come non detto!! :(
---
leo_duca