Newsgroup: it.comp.appl.access
Titolo: funzioni in campi di query

Query1 e' composta dalle colonne:
    Val1: Calc1        Val2: Calc2
dove Calc1 e Calc2 sono funzioni.
Il report Report1 rappresenta i risultati di Query1
ed e' composto dalle seguenti caselle di testo:
    txtVal1        txtVal2        txtTot                ==> nome
    Val1            Val2            txtVal1+txtVal2   ==> campo ass.
Con un po di debug scopro che per ogni riga del report
le funzioni Calc1 e Calc2 vengono richiamate
rispettivamente due volte Quindi anche un riferimento indiretto
ad un  campo associato ad una funzione, provoca l'esecuzione
della funzione stessa.
Non c'e' nessun modo per evitare che questo accada?
Non e' possibile eseguire una sola volta la funzione
e riferirci succesivamente al suo risultato senza doverla
rieseguire ogni volta che questo ci serve?
Grazie
---
leo_duca

 rieseguire ogni volta che questo ci serve?
Perchè non la esegui dentro il report invece di scomodare la query?
Antonio

 Perchč non la esegui dentro il report invece di scomodare la query?
L'impressione era che la query fosse piu' veloce.
Per verificare l'esecuzione delle funzioni ho piazzato, alla fine di ogni
funzione:
    Debug.Print "Eseguito Calc?"
Se il report presenta solo le caselle txtVal1 e txtVal2 mi ritrovo con
(query con una sola riga)
    eseguito Calc1
    eseguito Calc2
Se aggiungo anche la casella txtTot ottengo invece
    eseguito Calc1
    eseguito Calc2
    eseguito Calc1
    eseguito Calc2
A meno che questo non succeda solo in fase di debug?!?!
---
leo_duca

 L'impressione era che la query fosse piu' veloce.
LA query č piů veloce per l'SQL, per l'esecuzione della funzione il tempo č
sempre quello
Antonio

 parametri!!!
viene rieseguita piu' volte nella stessa riga:
p.e. :
    Val1:Calc1    Val2: Val1 + 1
richiama due volte Calc1 per ogni record
---
leo_duca

 richiama due volte Calc1 per ogni record
Bene... mi sembra di nuovo un comportamento razionale. Ad ogni chiamata con
un certo parametro, corrisponde un'esecuzione differente.
Forse sarebbe meglio che tu spieghi che fanno 'ste funzioni, in modo da
vedere se c'è un'alternativa (ma che ti farà comunque l'esecuzione doppia di
una funzione?!?)
Antonio

 una funzione?!?)
sto sempre lavorando al calcolo del preventivo di cui abbiamo discusso
su un precedente 3d.
Dopo aver calcolato i costi delle varie lavorazioni a cui e' sottoposto un
prodotto,
li visualizzo in un report e un una casella calcolo la loro somma, riga per
riga.
Quest'ultima operazione mi provoca la riesecuzione delle funzioni di calcolo
---
leo_duca

 ha scritto nel messaggio
news:ww7A9.20884$8E3.6...@twister2.libero.it...

Embè?
Perchè devi usare una sub?
Se devi fare un totale di riga, sommi i vari campi ottenenendo un campo
calcolato.
Antonio

 "Perchč non la esegui dentro il report invece di scomodare la query?"
via le funzioni di calcolo dalla query e le richiamo nel report.
Questa soluzione risolve il mio problema e, se dici che non ci rimetto in
velocita'
quando vado su con il numero di record (vedremo ;P ), la trovo pure piu'
pulita.
L'unico neo e' txtTotalePreventivo: prima facevo un DSum nella query
ma ora che i conti li faccio nel report....
---
leo_duca

 ma ora che i conti li faccio nel report....
Purtroppo non ho afferrato il problema nella sua interezza...
Antonio

> Purtroppo non ho afferrato il problema nella sua interezza...
Il costo di un prodotto e' dato dalla somma dei costi
delle n lavorazioni a cui e' sottoposto.
    CostoProd = CostoLav1 + ... + CostoLavn
Il costo delle varie lavorazioni NON e' fisso ma dipende dalle
caratteristiche del prodotto (dimensioni, materiale, ecc...).
Dati:
- tabella tblA composta dai campi IdProd e Qta
  (che supponiamo contenere tutti e soli i prodotti, con relative quantita',
    di cui vogliamo calcolare il costo)
-funzioni CalcLav1(IdProd), ..., CalcLavn(IdProd)
 (che restituiscono CostoLav1, ..., CostoLavn, cioe' i costi
  delle n lavorazioni a cui e' sottoposto il prodotto IdProd)
Si vuole ottenere un report che presenti le seguenti informazioni
per ogni elemeto di tblA:
IdProd  Qta  CostoLav1  ...  CostoLavn  CostoProd  CostoProd*Qta
Il report inoltre dovra' riportare il costo totale di tutti i prodotti di
tblA
tenendo conto delle relativa quantita'  (TotPreventivo = somma(CostoProd *
Qta))
Soluzioni:
1) Query qryA composta dalle seguenti colonne:
    IdProd
    Qta
    CostoLav1: CalcLav1(IdProd)
    ...
    CostoLavn: CalcLavn(IdProd)
    CostoProd: CostoLav1+...+CostoLavn
    CostoPerQta: CostoProd*Qta
    Il report si ottiene semplicemente visualizzando il contenuto della
query.
    Inotre si avra' txtTotPreventivo = DSum("[CostoPerQta]","qryA")
2) Nel report associo alle caselle:
    - txtIdProd il valore di IdProd
    - txtQta il valore di Qta
    - txtCostoLav1, ..., txtCostoLavn le funzioni CalcLav1, ..., CalcLavn
    - txtCostoProd la somma di txtCostoLav1, ..., txtCostoLavn
    - txtCostoPerProd il prodotto txtCostoProd*Qta
    - txtTotPreventivo il valore txtCostoPerProd settando il campo
      'Somma Parziale' a valore 'Su tutto'
'Problemi' presentati dalle due soluzioni:
1) OGNI funzione CalvLav? e' richiamata DUE volte per ogni RIGA di qryA
     (una quando calcolo CostoLav? e una quando calcolo CostoProd)
1) OGNI funzione CalcLav? e' richiamata DUE volte per ogni RIGA del report
    (una quando calcolo CostoLav? e una quando calcolo txtTotPreventivo)
Da quanto tu mi hai spiegato, visto come lavora Access non ci sono
alternative 'pulite'.
Ciao
---
leo_duca

Bingo!
---
leo_duca

 leo_duca
Ci sei riuscito?
Mi ero lasciato il tuo problema per quando avevo piů tempo, ma se non serve
piů...
Antonio

 ha scritto nel messaggio
news:Rl3B9.32416$8E3.9...@twister2.libero.it...

La soluzione e' cmq arrivata dai tuoi chiarimenti.
Gradirei cmq una tua opinione sulla soluzione.
Ho provato rimaneggiare i dati in piu' modi, sia facendo le elaborazioni
nella query che direttamente nel report, ma, per un motivo o per l'altro,
mi ritrovavo sempre con le varie funzioni di calcolo richiamate almeno
due volte per ogni riga (tra l'altro mi sono rimasti ancora perecchi dubbi
su come Access si comporta in casi come questo).
Ora utilizzo una query nella quale richiamo le varie funzioni, senza pero'
effettuare nessuna somma o altro calcolo con i valori da queste ritornati.
La query e' una query di accodamento su una tabella risiedente nel FE.
Nel report, che basera' su quest'ultima, effettuo somme parziali e totali.
In questo modo sono sicuro (anche perche l'ho gia' verificato ;) ) che
le varie funzioni verranno chiamate una sola volta per ogni riga della
query;
Inoltre, facendo risiedere la tabella su FE (ora vedo se crearla e
distrugerla
dinamicamente) eseguo le elaborazioni in locale senza rimeterci troppo
in prestazioni.
---
leo_duca