Newsgroup: it.comp.appl.access
Titolo: sommare un campo  e poi  eliminare e una riga in un recordset

Salve,
sono Fanciullo
 
ho una tabella con questa situazione
 
FARINA   KG   2
FARINA   KG   3
UOVA     N    10
LATTE    LT   2
ZUCCHERO KG   0,5
ZUCCHERO KG   1
 
vorrei sommare la quantità degli ingredienti doppi
 
quindi eliminare poi un record al fine di otterere questo
 
FARINA KG  5
UOVA   N   10
LATTE  LT  2
ZUCCHERO   1,5
 
so che ci devo arrivare con i DAO ma non riesco a immaginare 
neanche un inizio
 
grazie per l'aiuto

vitof...@gmail.com
 was thinking very hard :

Sarà meglio arrivarci con delle query...
===============================================
Private Sub Command11_Click()
Dim SQL As String, i, Field(1 To 3) As String, WS As dao.Workspace
Dim db As dao.Database, TableName As String
 
'---  Definizioni  ---------------
TableName = "T_1"
Field(1) = "Ingredienti"
Field(2) = "UM" ' Unità di misura
Field(3) = "Q"  ' Quantità
'---------------------------------
 
On Error Resume Next
DoCmd.DeleteObject acTable, TableName & "_Temp"
On Error GoTo 0
 
Set WS = DBEngine.Workspaces(0)
Set db = CurrentDb
 
' Crea tabella temporanea con raggruppamento e somma
SQL = "SELECT " & TableName & "." & Field(1) & ", "
SQL = SQL & TableName & ".UM, Sum(" & TableName & ".Q) AS SumOfQ "
SQL = SQL & "INTO " & TableName & "_Temp FROM " & TableName & " "
SQL = SQL & "GROUP BY " & TableName & "." & Field(1) & ", "
SQL = SQL & TableName & "." & Field(2) & ";"
db.Execute SQL
 
WS.BeginTrans
' Svuota la tabella originale
SQL = "DELETE " & TableName & ".* FROM " & TableName & ";"
db.Execute SQL
 
' Inserisce nella tabella originale i record della temporanea
SQL = "INSERT INTO " & TableName & " "
SQL = SQL & "( " & Field(1) & ", " & Field(2) & ", " & Field(3) & " )"
SQL = SQL & "SELECT " & TableName & "_Temp." & Field(1) & ", "
SQL = SQL & TableName & "_Temp." & Field(2) & ", "
SQL = SQL & TableName & "_Temp.SumOfQ "
SQL = SQL & "FROM " & TableName & "_Temp;"
db.Execute SQL
 
On Error GoTo Roll_Back
WS.CommitTrans
 
' Elimina la tabella temporanea
On Error Resume Next
DoCmd.DeleteObject acTable, TableName & "_Temp"
 
Exit_Sub:
    Exit Sub
 
Roll_Back:
    WS.Rollback
    MsgBox Err.Number & vbCrLf & Err.Description
    Resume Exit_Sub
 
End Sub
========================================
 
Bruno


Grandissima risposta,
però non ho aggiunto che nella tabella di partenza di sono altri record che non devo cancellare, mi spiego con un esempio (si tratta di programmazione di una scuola alberghiera)
 
PROF_MALACHIN  BURRO     KG  5
PROF_MALACHIN  LATTE     LT  2
PROF_MALACHIN  ZUCCHERO  KG  2
PROF_MALACHIN  UOVA      N   20
 
PROF_FANCIIULLO  FARINA   KG   2
PROF_FANCIIULLO  FARINA   KG   3
PROF_FANCIIULLO  UOVA     N    10
PROF_FANCIIULLO  LATTE    LT   2
PROF_FANCIIULLO  ZUCCHERO KG   0,5
PROF_FANCIIULLO  ZUCCHERO KG   1
 
da raggruppare e sommare sono solo i record del prof Fanciullo, quindi non posso svuotare la tabella originale, però posso eliminare solo i record di fanciullo vero?
 
Grazie Bruno

vitof...@gmail.com
 expressed precisely :

Non è così semplice.
Considera che bisogna raggruppare e sommare nella tabella
temporanea SOLO i record di un determinato insegnante,
poi gli stessi eliminare dalla tabella originaria
ed infine copiare quelli della tabella temporanea
sulla tabella originaria.
 
======================================
Private Sub Command11_Click()
Dim SQL As String, i, Field(0 To 3) As String, WS As DAO.Workspace
Dim db As DAO.Database, TableName As String, Insegnante As String
 
'---  Definizioni  ---------------
TableName = "T_1"
Field(0) = "Insegnante"
Field(1) = "Ingredienti"
Field(2) = "UM" ' Unità di misura
Field(3) = "Q"  ' Quantità
Insegnante = "AAA"
'---------------------------------
 
' Elimina la tabella temporanea
On Error Resume Next
DoCmd.DeleteObject acTable, TableName & "_Temp"
On Error GoTo 0
 
Set WS = DBEngine.Workspaces(0)
Set db = CurrentDb
 
' Crea tabella temporanea contenente raggruppamento e somma
SQL = "SELECT " & TableName & "." & Field(0) & ", "
SQL = SQL & "" & TableName & "." & Field(1) & ", "
SQL = SQL & "" & TableName & "." & Field(2) & ", "
SQL = SQL & "Sum(" & TableName & "." & Field(3) & ") AS SumOfQ "
SQL = SQL & "INTO " & TableName & "_Temp "
SQL = SQL & "FROM " & TableName & " "
SQL = SQL & "WHERE (((" & TableName & "." & Field(0) & ")='" & 
Insegnante & "')) "
SQL = SQL & "GROUP BY " & TableName & "." & Field(0) & ", "
SQL = SQL & "" & TableName & "." & Field(1) & ",  "
SQL = SQL & "" & TableName & "." & Field(2) & ";"
db.Execute SQL
 
WS.BeginTrans
' Svuota la tabella originale
SQL = "DELETE " & TableName & ".* "
SQL = SQL & "FROM " & TableName & " "
SQL = SQL & "WHERE (((" & TableName & "." & Field(0) & ")='" & 
Insegnante & "'));"
db.Execute SQL
 
' Inserisce nella tabella originale i record della temporanea
SQL = "INSERT INTO " & TableName & " "
SQL = SQL & "( " & Field(0) & ", "
SQL = SQL & Field(1) & ", "
SQL = SQL & Field(2) & ", "
SQL = SQL & Field(3) & " ) "
SQL = SQL & "SELECT " & TableName & "_Temp."
SQL = SQL & Field(0) & ", "
SQL = SQL & TableName & "_Temp."
SQL = SQL & Field(1) & ", "
SQL = SQL & TableName & "_Temp."
SQL = SQL & Field(2) & ", "
SQL = SQL & TableName & "_Temp.SumOfQ "
SQL = SQL & "FROM " & TableName & "_Temp;"
db.Execute SQL
 
On Error GoTo Roll_Back
WS.CommitTrans
 
' Elimina la tabella temporanea
On Error Resume Next
DoCmd.DeleteObject acTable, TableName & "_Temp"
 
Exit_Sub:
    Exit Sub
 
Roll_Back:
    WS.Rollback
    MsgBox Err.Number & vbCrLf & Err.Description
    Resume Exit_Sub
 
End Sub
============================================
 
Bruno

Il giorno giovedì 22 ottobre 2015 21:58:57 UTC+2, 
vitof...@gmail.com
 ha scritto:

grazie ho appena testato tutto. Funziona.
Poi per sfizio intellettuale ci provo anche con un recordset. Ho pensato così come idea:
1)faccio un recordset.clone della maschera 
2)scorro i record
3)per ogni record prendo il valore del campo alimento
4)setto un secondo recordset e questo lo filtro sull'alimento  del primo, a questo punto mi trovo il secondo recordset filtrato
5) controllo che i record siano più di uno (se è vero vuol dire che farina è presente due volte)
5) sul secondo recordset filtrato su farina scorro e sommo la quantità, torno sul primo dei due record e assegno la somma, passo sul secondo e cancello i record.
6) vado avanti nel primo recordset di uno e ripeto l'operazione.
Pensi che possa essere una strada? 
Scusami se insisto su questo argomento

After serious thinking 
vitof...@gmail.com
 wrote :

Certamente sì, lavorare con recordset oppure con array
è la prima cosa che viene alla mente ed è anche la più
facile da realizzare.
Ma poi quando devi fare scansioni sull'HD (tabelle) e/o
in RAM (array e recordset cloni) il fattore "numero record"
gioca un ruolo importante.
Intanto se i record sono tanti molto di quello che
per natura (recordset cloni, array) dovrebbe stare in RAM
finisce sull'HD, poi il sistema di scansione (in RAM o sull'HD)
realizzato in semplice VBA è incredibilmente più lento di quello
realizzabile con l'SQL Language integrato nel VBA.
Per contro quest'ultima via richiede tempi di programmazione
notevolmente più lunghi.
Certo per "un pugno di record" queste considerazioni non
hanno alcun valore, ma questo per me non ha molta importanza.
Opinioni... naturalmente.
 
Bruno
 
Bruno