Newsgroup: it.comp.appl.access
Titolo: Dsum nel corpo di una maschera continua con 6000 record

Buonasera!
Secondo voi, in una maschera continua con 6000 record, se metto un controllo
in ogni record con una formula di questo tipo
=IIf([id cgv]>0;DSum("[qta]";"cgv mov";"[id cgv]=" & [id cgv]);"")
dove la tabella "cgv mov" contiene tutti questi record (praticamente per
ogni record mi calcola la giacenza basata sulla somma delle quantità di
tutti i 6000 movimenti che hanno lo stesso id cgv), la visualizzazione della
maschera diventerà troppo lenta?
Nella maschera vengono visualizzati 15 record contemporaneamente.
Grazie a chi avrà l'esperienza necessaria e la buona volontà di rispondermi.
Ciao ciao.
Ps: non posso provare perché al momento non ho ancora i 6000 movimenti.... è
solo una previsione.

 solo una previsione.
Il numero di 6000 records non è altissimo, quindi ritengo che
sia perfettamente gestibile con la soluzione che hai POSTATO.
Potresti però pensare ad un'alternativa alla Funzione DSUM che
rallenta discretamente le cose.
Una variante più efficiente è l'utilizzo di DAO e dei Recordset aperto
con un'istruzione SQL.
Si tratterebbe di realizzare una Funzione nella Form nella quale
inserisci
la variante alla tua citata IIF.....
Io ti consiglio anche di evitare IIF, se utilizzi una Funzione dedicata
sostituiscilo con If .... Else ... END if è più veloce.
Con pochi record non si nota la differenza tra DSUM  e SQL-Recordset,
ma quando le cifre cominciano a salire è notevolmente differente.
Forse però 6000 è ancora accettabile.
Alessandro.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:634afb7727af988669...@mygate.mailgate.org...


 
Si tratta di applicare quello che consigliavi nel tuo post
su From Filtrate, solo quì non apri nessuna Form.
 Function calcgiac (id_cgv as integer) as Long 'Consiglio LONG
 dim rst as Recordset
 dim strSQL as string
 if id_cgv > 0 then
    strSQL="SELECT Sum([qta]) AS SommaQta FROM cgv mov " & _
           "WHERE [id cgv]=" & id_cgv
    set rst=currentdb.Openrecordset(strSQL)
    if not rst.BOF AND rst.EOF then
      Calcgiac=rst.field(0)
    else
      calcgiac=0
    end if
 end if
 end function
Intendevo una roba del genere....!


 ha scritto nel messaggio
news:93d6fdd5fd69afb58f...@mygate.mailgate.org...

Ciao!
Minchia... ma... c'è il fuso orario o soffri d'insonnia anche tu?
Ho compreso più o meno tutto ma vorrei farti alcune domande.
Perché long? Sapendo che la giacenza per articolo non sarà mai superiore a
10, cambia qualcosa o c'è una motivazione particolare?
Ho visto che la stringa Sql può essere inserita direttamente nella riga
Set rst=currentdb.Openrecordset("select sum... ")
Ci sono pro e contro?
Non bisogna chiudere il recordset? O rimane in memoria per ogni esecuzione
della funzione? Beh... però è diverso per ogni giacienza, quindi la
differenza
è che alla fine del calcolo di tutte le giacienze non viene chiuso, o no?
Pensa che ho provato a scriverlo senza sbirciare e ci sono riuscito al
secondo errore.
Prima avevo dimenticato di chiudere una parentesi e poi avevo tralasciato un
"set".
Funziona perfettamente a parte una cosa:
Nel nuovo record nel campo giacenza mi mette Error.
Ho provato a mettere altre condizioni nella funzione su idcgv come
isnull(idcgv)=false ma niente.
L'unico modo per toglierlo è mettere la condizione nel controllo:
=iif([id cgv]>0; calgiac([id cgv]);"")
Mi avevi detto di evitare iif, ma si può usare if... then... else... in
un'espressione?
Grazie ancora della disponibilità.
Ciao ciao!
Figata!!!
Me la sto cavando abbastanza bene con i recordset.
Ho scritto anche questa:
Function riempi()
Dim rst As Recordset
Dim csl As Integer
Dim tot As Integer
Dim v As Integer
Set rst = CurrentDb.OpenRecordset("select[id cgv] from cgv")
rst.MoveLast
tot = rst.RecordCount
For v = 1 To 4000
csl = Int((tot - 1) * Rnd) + 1
rst.MoveFirst
rst.Move csl
[id cgv] = rst.Fields(0)
If [giac] > 0 Then [qta] = -1 Else [qta] = 1
DoCmd.GoToRecord acDataForm, "cgv mov", acNewRec
Next
End Function
Ho creato prima 6000 movimenti con segno positivo e poi questi 4000.
Ho provato sia con il dsum, sia con la funzione calgiac: risultato identico.
Il tempo di calcolo è lo stesso e secondo me effettua il calcolo solo per i
record visualizzati. Quindi utilizzerò il dsum perché più flessibile.
In ogni caso la funzione calgiac è stata utilissima: ho imparato tantissime
cose.
Adesso mi uccidi... però avrei alcune domande!
Ad esempio, perché bisogna spostarsi all'ultimo record per eseguire il
recordcount?
E perché bisogna spostarsi al primo per eseguire il move?
Con calma, quando hai tempo, tanto in questi giorni ho imparato tante di
quelle cose che avrei da smanettare per qualche giorno!
Volevo archiviare le immagini delle copie dei documenti dei clienti e fare
un pulsantino per mio padre, affinché possa zipparsi il suo programma di
contabilità senza tanti problemi.
Sono proprio contento!
Ciao e grazie!

 Ciao e grazie!
No, non soffro d'insonnia, anzi, è solo che sono rientrato presto
e ho dato un'occhiata...!
Per evitare l'errore nel Nuovo Record verifica che non sia un Nuovo
Record Me.NewRecord.
Sulla velocità come ti dicevo su 6000 non è visibile.
Per il LONG non sapevo l'entità del valore...!
Per il RecordCount pare sia questione di aggiornamento Recordset
si è notato che alcune volte fa cilecca, quindi con MoveLast aggiorna
al MaxCount Corretto.
Idem per MoveFirst.....!
Per esperienza personale io utilizzerei la Funzione CalcGiac, questa
è più Flessibile..! soprattutto nell'ottica Futura
non darà problemi mai, puoi affinarla ulteriormente, parere personale.
Se vuoi vedere la Velocità reale inserisci un Time all'inizio e uno
alla Fine delle 2 Procedure e riesci a valutare la differenza.
Solo IIF al posto di "IF then Else End if" ha un risparmio del 20%
se provato su 100.000 records.
Ciao.


 ha scritto nel messaggio
news:e6072704666fb45722...@mygate.mailgate.org...

Ok, lascierò calgiac.
Però non ho capito cosa intendi per me.newrecord.
Il time cos'è? intendi t0 e t1 ai quali devo assegnare il valore now e poi
fare la differenza?
E come faccio a valutare la velocità dell'espressione dsum?
La inserisco in una funzione?
E poi, se non riesco a risolvere il problema dell'errore nel nuovo record,
come faccio a usare if then else?
A parte che già 6000 movimenti forse è esagerato e testato con 10000 va
benissimo...
Comunque... tanto per sapere...

 Comunque... tanto per sapere...
Innanzitutto Timer è la funzione che restituisce il Tempo, vedi Help.
Quindi se la leggi all'inizio della Funzione e alla Fine fai la Diff,
e trovi quant'è trascorso in entrambe le Funzioni.
Ovviamente se usi il DSUM dovrai fare una Funzione CalcGiac1.
Per il nuovo record come ti dicevo se leggi la proprietà Me.NewRecord
diventa vera solo se stai lavorando sul nuovo Record, quindi SKippi
la procedura di calcolo giacenze.
Come fai ad usare If Tehn Else...???
IIF(A=0;X=1;X=2)   'Questa è chiara...??
E' la stesa cosa ma è più veloce.
If a=0 then 
   x=1
else
   x=2
end if


 ha scritto nel messaggio
news:c35b16228405326bed...@mygate.mailgate.org...

Ok, tutto chiaro a parte iif:
nel codice ok, uso sempre if... then... else...
ma nei controlli non me lo accetta.
E' quello il problema, comunque con me.newrecord non sussiste.
Ciao e grazie!