Newsgroup: it.comp.appl.access
Titolo: ESEGUIRE UNA QUERY FINO A CHE LA SOMMA DI UN CAMPO E'...:

Come posso comporre una query che mi estragga i record da un tbl fino a
quando la somma di un campo di questi record raggiunge un determinato
importo? Facendo però una sola query e non 2 query in cascata!!!
Esempio:
tbl PROVA
CodPro     Data                Importo
1               01/01/2000     700.000
2               02/01/2000       50.000
3               03/01/2000     150.000
4               04/01/2000     100.000
5               05/01/2000     250.000
Estrarre tutti i record di prova fino ad un Importo totale di £. 1.000.000.
Dovrebbe estrarmi i primi quattro record.
---
Grazie.
U.J.

 Dovrebbe estrarmi i primi quattro record.
Non č sicuramente le miglior soluzione o la piů veloce, ma a questo ho
pensato!
Mettiamo che la tabella in questione si chiami Prodotti, utilizzi questa
funzioncina:
Public Function Incremento(id)
 Dim Dbs As Database
 Dim Rst As Recordset
 Dim StrCriteri As String
 Dim posizione As Long, i As Integer
 Set Dbs = CurrentDb
 Set Rst = Dbs.OpenRecordset("prodotti", dbOpenDynaset)
  StrCriteri = "[CodPro]=" & id
  Rst.FindFirst StrCriteri
     If Rst.NoMatch Then
        MsgBox ("Record non trovato!")
     Else
        posizione = Rst.AbsolutePosition + 1
     End If
     Rst.MoveFirst
     For i = 1 To posizione
        Incremento = Rst!importo + Incremento
        Rst.MoveNext
     Next i
  Rst.Close
  Set Dbs = Nothing
End Function
Dopodic ti crei codesta query:
SELECT Prodotti.CodPro, Prodotti.Data, Prodotti.Importo,
Sum(incremento([codpro])) AS som
FROM Prodotti
GROUP BY Prodotti.CodPro, Prodotti.Data, Prodotti.Importo
HAVING (((Sum(Incremento([CodPro])))<=1000000));
Con qualche centinaio di record la lentezza non č esasperante.
Ciao da RoDAgo

 U.J.
Credo che una strada percorribile possa essere la seguente:
Prima di tutto crea una tabella di appoggio che chiamerai IMPORTI.
Poi una query che si alimenta dalla tabella che tu desideri e che contenga i
campi "Codice", e "Importo" più quelli che vuoi.
Crea una funzione così fatta:
Public Function DeterminaImporto() As Double
Dim db As DATABASE, RCS As Recordset, i As Long
Dim MiaSomma As Double
Dim RCSAppoggio As Recordset
Set db = CurrentDb
Set RCS = db.OpenRecordset("Prova")
Set RCSAppoggio = db.OpenRecordset("Importi")
'imposto a false gli avvisi ed eseguo una query di eliminazione
'di tutti gli importi accodati precedentemente alla tabella di appoggio
DoCmd.SetWarnings False
DoCmd.OpenQuery "EliminaImporti"
DoCmd.SetWarnings True
RCS.MoveLast
RCS.MoveFirst
RCSAppoggio.AddNew
MiaSomma = 0
'ciclo su tutti i record di rcs
For i = 1 To RCS.RecordCount
MiaSomma = MiaSomma + RCS!Importo
'Accodo i valori trovati alla tabella di appoggio
RCSAppoggio!Codice = RCS!Codice
RCSAppoggio!Importo = RCS!Importo
RCSAppoggio.Update
RCSAppoggio.AddNew
If MiaSomma >= 20000 Then
'metti qui il codice che ti serve qualora la cifra raggiunta sia quella
voluta.
MsgBox "Raggiunta la somma desiderata"
Exit For
End If
RCS.MoveNext
Next i
DeterminaImporto = MiaSomma
RCSAppoggio.Close
RCS.Close
Set db = Nothing
End Function
Ovviamente otterrai una tabella con solo i valori fino al raggiungimento
della somma desiderata. Ti sarà sufficiente utilizzarla nel modo che più di
piace.
Ciao, Carlo

>importo? Facendo però una sola query e non 2 query in cascata!!!
e perche'?
--
il sito comune di it.comp.appl.access:
http://members.xoom.it/it_db_access/

Ad una strada simile avevo effetti già pensato. Anzi l'avrei anche già
provata.
Volevo solo vedere se riuscivo a farlo senza scrivere codice.
Mi serve per insegnarlo ad un cliente che più delle query non va...
Grazie
U.J.