Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

elimina e somma campi access

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

elimina e somma campi access

Postdi miko » 25/06/11 18:10

ciao,
sto provando a realizzare un progetto in access mediante vba, ma sto incontrando molte difficoltà dal momento che da poco ho iniziato il suo studio e non riesco a realizzare le cose più semplici.
Ho importato un txt in una tabella, ARCHIVIO, con i seguenti campi:
ID NC DATA n1 n2 n3 .... n9 n10
poi ho costruito una seconda tabella, SOMME, con gli stessi campi della precedente ed aggiungendo un campo finale che deve contenere le somme dei valori dei campi per ciascun records.
manipolando una macro di flash sono riuscito a creare la tabella SOMME:
Codice: Seleziona tutto
Private Sub Form_Load()
Dim criterio As String
    Set db = CurrentDb
Set db = CurrentDb
Set ds = db.OpenRecordset("SELECT Count(DATA) AS Conteggio FROM ARCHIVIO")
URA = ds!conteggio
ds.Close
    criterio = "INSERT INTO SOMME (DATA, NC, n1, n2, n3, n4, n5, n6,n7,n8,n9,n10) "
    criterio = criterio & "SELECT Dateserial(Mid(DATA,7,4),Mid(DATA,4,2), Mid(DATA,1,2)), NC, n1, n2, n3, n4, n5, n6,n7,n8,n9,n10 "
    criterio = criterio & "FROM ARCHIVIO"
    db.Execute criterio
    db.Close
End Sub

mi sono bloccato poichè non riesco a calcolare le somme dei campi, n1...n10, e ad inserire i valori nel campo somma della tabella SOMME;
ho provato a completare con il seguente codice:
Codice: Seleziona tutto
Private Sub Comando0_Click()
Dim S As Integer
Set db = CurrentDb
S = DSum("[n1]", "[SOMME]", "[n2]")
End Sub

Ma nonostante giorni di lettura su argomenti relativi non riesco ad andare oltre le linee di codice che ho scritto.
ho poi realizzato, con la macro Form_Load, una terza tabella,SOMMAmin_max, con gli stessi campi della tabella ARCHIVIO, ed aggiungendo alla fine altri 2 campi, somma min e somma max.
Per determinare i valori da inserire nei campi, somma min e somma max devo procedere in questo modo:
1) consideriamo il primo record della tabella ARCHIVIO, ed i suoi campi n1...n10;
2) eliminiamo, solo momentaneamente, da tutti i campi, n1...n10, dei records successivi i valori uguali a quelli dei campi del primo record;
3) calcoliamo le somme, in orizzontale, dei valori nei campi di ciascun records, escludendo quei records che hanno campi, n1...n10, tutti vuoti e quei records in cui non ci sono campi vuoti.
4) inseriamo i valori min e max di tali somme nei campi, somma min e somma max, della tabella SOMMAmin_max in corrispondenza del records esaminato, primo record;
5) ripristiniamo la tabella ARCHIVIO con tutti i suoi valori iniziali;
consideriamo il record successivo, 2° record;
ripetiamo il calcolo dal punto 2) eliminando i valori a partire dal primo record e poi da quelli successivi al secondo fino all’ultimo;
calcoliamo le somme come al punto 3);
4) inseriamo i valori min e max di tali somme nei campi, somma min e somma max, della tabella SOMMAmin_max in corrispondenza del records esaminato, secondo record;
ripetiamo il punto 5);
passiamo al terzo record, e così fino all'ultimo records contenuto fino a quel momento nella tabella ARCHIVIO.
Se la tabella ARCHIVIO, contiene inizialmente 10 records ad esempio, e successivamente ne aggiungiamo-accodiamo altri 5, è inutile ripetere il calcolo per i primi 10, calcolo già eseguito in precedenza, ma è sufficiente eseguire il calcolo:
1) eliminando i valori dei primi 10 dagli ultimi 5, ed aggiornare i valori nei campi somma min e somma max, della tabella SOMMAmin_max in corrispondenza di ciascun records;
2) eseguire il calcolo degli ultimi 5 con tutti i rimanenti 14 records presenti in tabella, ed aggiungere i nuovi risultati nei campi precedenti in corrispondenza di ciascun dei 5 records.
Spero vivamente nei vostri contributi o suggerimenti perché, da solo, non so come poter realizzare diversamente questo progetto.
saluti e grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: elimina e somma campi access

Postdi Flash30005 » 25/06/11 20:05

Prima di usare il VBA per fare le somme dei campi record
ti consiglio di usare gli "strumenti" standard di Access, in questo caso una query
Fai la procedura guidata dove selezioni i campi da importare poi pubblica lo script della query
Vedrò di modificarla per farti ottenere ciò che cerchi
poi, vediamo come impiegare quello script nel VBA
Altrimenti oltre a prenderti "un'indigestione" di nozione e non risolvere rischi di stare anche male :D

ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Postdi archimede » 27/06/11 07:44

Potrebbe anche essere interessante, visto che sei all'inizio con Access, capire perché hai bisogno di una tabella con 10 campi: che dati devi memorizzarci (cioè, cosa rappresentano i singoli campi)? Qual è la chiave primaria? Magari si scopre che ti basta una tabella tipo ID NC DATA n.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Re: elimina e somma campi access

Postdi miko » 27/06/11 17:44

buonasera;
seguendo le tue indicazioni ho creato un db con le varie tabelle e query;
forse i nomi sono un pò lunghi, ma permettono di capire il loro uso;
non ho inserito nel form_load tutta la macro precedente poichè ad ogni apertura della maschera si introducono nelle altre tabelle sempre gli stessi valori, mentre ciò deve verificarsi solo ad ogni aggiornamento della tabella principale ARCHIVIO.
una delle query è anche incompleta nel codice poichè ho sempre errore di sintassi nel completarla.
è evidente che nomi, tabelle e query possono essere modificate in base alle necessità che riterrete più opportune.
invio anche un piccolo txt, sia per visionare la struttura che per eventuali prove:
https://rapidshare.com/files/1889496267/PROVA.mdb
https://rapidshare.com/files/3140354322/ARCHIVIO_WINFORLIFE.Txt
forse con questi file riesco anche a rispondere alle domande di archimede.
ciao, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 27/06/11 19:25

Veramente non riesco a capire il "Min somma non eliminati" rispetto alla "Max somma non eliminati" e alla "Somma" di Somma_Tutti
In quanto hanno tutti gli stessi valori :roll:
Per quanto riguarda la query che ti dava errore
Query MIN_E_MAX_SOMME_NON_ELIMINATI

Codice: Seleziona tutto
SELECT Min([MIN SOM NON ELIM]) AS MinSNE, Max([MIN SOM NON ELIM]) AS MAXSNE
FROM SOMME_NON_ELIMINATI;


Hai fatto bene a non lasciare spazi nei nomi delle tabelle ma perché hai lasciato i nomi campi con lo spazio?
questo ti scostringe a mettere le parentesi quadre che racchiudono il nome
parentesi che puoi fare a meno se il nome non ha spazi ;)

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: elimina e somma campi access

Postdi miko » 27/06/11 21:41

ciao,
...Hai fatto bene a non lasciare spazi nei nomi...

vedendo alcune tue macro e leggendo alcuni argomenti sto incominciando a capire piccole cose, ma è troppo presto per realizzare qualcosa di concreto.
per quanto riguarda il tuo dubbio se consideri la tabella SOMMA_TUTTI, tutti i campi di ciascun record contengono valori non nulli.
se esegui la somma di tutti i campi di ciascun record avrai la somma dei records, che inseriamo nel campo somma in corrispondenza di ciascun record;
di tutte queste somme poi consideri il min ed il max che troviamo nella query e che compaiono nei 2 textbox della maschera.
es:
Immagine

se invece consideri la tabella SOMME_NON_ELIMINATI, prima devi eliminare i valori comuni, secondo quanto ho scritto dai punti 1) a 4) del post precedente;
poi esegui le somme dei campi di ciascun record, che ora avranno anche campi nulli;
ci possono essere records con tutti campi nulli se una combinazione si è ripetuta,
e records con tutti i campi pieni se una combinazione ha tutti i numeri differenti.
dal calcolo delle somme si deveno escludere questi 2 tipi di records.
anche in questo caso avremo dei valori min e max delle somme, che sono diverse da quelle ottenute nella tabella SOMMA_TUTTI, e che sono relativi al record dal quale abbiamo preso i valori per eseguire l'eliminazione dei valori comuni dagli altri records, e che perciò andremo ad inserire nei relativi campi a fianco del record.
se consideri un record diverso ed esegui la eliminazione dei valori uguali, dagli altri records, e poi esegui le somme avrai altri valori delle somme, ed altri min e maX.
forse le immagini possono chiarire meglio il procedimento per la tabella SOMME_NON_ELIMINATI:
FIG.1
Immagine

FIG.2
Immagine

FIG.3
Immagine

come puoi vedere i valori delle somme e quelli dei min e max sono diversi tra loro;
i valori che ho inserito nei campi somma min e max della tabella SOMME_NON_ELIMINATI del mdb sono solo un esempio di come deve essere strutturata la tabella e forse ho creato confusione nell'inserire gli stessi valori nelle 2 tabelle.
sperando nella mia chiarezza vi auguro una buona notte
ciao
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 27/06/11 23:03

Ok adesso è più chiaro
cosa che non mi è ancora chiara è se a te occorrano solo i valori min max di ogni processo come da te descritto
oppure vorresti avere anche le tabelle es
tab2 come fig2
Tab3 come fig3

Perché nel primo caso si può pensare ad una tabella temporanea (sempre quella) che esegue il processo calcola il min e max, lo inserisce un una tabella fisica
resetta la tabella temporanea per eseguire e processare la seconda riga etc

nel secondo caso significa riempire il database di n tabelle quante sono le estrazioni esaminate :eeh:

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: elimina e somma campi access

Postdi miko » 28/06/11 09:36

ciao,
non è necessario
...riempire il database di n tabelle quante sono le estrazioni esaminate...

poichè quello che interessa sono solo i valori min e max delle somme accanto a ciascun record.
quindi va bene la soluzione con la tabella temporanea, come da te descritto per il primo caso, ed ottenere come risultato finale una unica tabella che riporti i vari records con i campi NC; DATA; n1...n10; ed i 2 campi somma min e max.
se, non ti è troppo disturbo, puoi commentare brevemente quelle linee di codice che ritieni più complicate da capire, in modo che posso comprendere il procedimento, non esistendo in access lo steep by syeep.
saluti, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 28/06/11 13:30

Quello che chiedi non è semplice da realizzare
ci penserò su e trovare una soluzione veloce da realizzare
il tempo in questo periodo è molto poco.
Essendo la discussione aperta a tutti,
spero sempre che altri utenti intervengano a fornirti una soluzione adeguata


Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: elimina e somma campi access

Postdi miko » 28/06/11 17:20

salve,
forse la seconda soluzione da te indicata,
...riempire il database di n tabelle quante sono le estrazioni esaminate..

è più semplice da realizzare?
se si allora procediamo in questo modo e poi se mai copiamo in una tabella definitiva i valori che ci interessano ed eliminiamo tutte le n tabelle.
o forse la difficoltà è proprio nel calcolo, eliminazione e somma, qualunque sia il procedimento adottato?
alla luce del tuo ultimo post spero anche io che gli amici del forum possano dare qualche suggerimento.
ciao, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Postdi archimede » 28/06/11 17:34

Anche a me pare un po' un bordello ma, soprattutto, non ho capito a cosa servono quei min e max (ignoranza mia, ovviamente: so a malapena cosa sia win for life).

E poi nelle immagini esemplificative in alcune righe le sostituzioni non sono state fatte (ad es. il 5 nella settima riga): è perché si trattava solo di esempi o c'è un'ulteriore logica dietro?

Alessandro

PS: e per processare i records secondo un certo ordine (come mi pare di capire sarebbe necessario) bisogna anche sapere quale criterio usare per ordinarli.
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Re: elimina e somma campi access

Postdi miko » 28/06/11 18:48

ciao,
mi rendo conto che sia difficile spiegare, comprendere e realizzare..
Anche a me pare un po' un bordello...

ma in pratica si tratta di effettuare delle somme per righe di quei numeri che non sono stati eliminati;
immaginate di avere fin dall'inizio una tabella con alcuni campi vuoti e di eseguire la somma dei campi per ogni records;
sarebbe la stessa cosa del mio progetto;
il problema è come ottenere questa tabella con alcuni campi vuoti, cioè come velocizzare l'operazione di eliminazione e rendere alcuni campi vuoti in base alle condizioni che ho prospettato.
i valori min e max di conseguenza sono soltanto i valori min e max che derivano dalla somma dei campi.
le immagini che ho inserito sono solo un esempio visivo di quello che vorrei ottenere e quindi ho evidenziato poche righe senza celare ulteriori logiche del progetto.
ciao, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 29/06/11 01:20

Tanto per iniziare...

Copia la tua tabella archivio con i dati e chiamala ArchTemp
vai nella struttura e inserisci 3 campi numerici
Somma
Min
Max

Ora copia questa tabella senza dati e chiamala SommeMinMax
se vuoi puoi cancellare il campo Somma (qui non serve)
nel menu inserisci un pulsante di comando
e nel suo codice di evento inserisci questa macro
Codice: Seleziona tutto
Private Sub Comando108_Click()
Dim criterio As String
Set db = CurrentDb

'<<<< qui in un secondo tempo
' si devono cancellare i record della tabella ArchTemp e riempire di nuovo con tutti i record dell'archivio


criterio = "UPDATE ArchTemp SET n1 = '" & 0 & "' WHERE ID <> " & 1 & " and (n1 = " & 1 & " Or n1 = " & 5 & " Or n1 = " & 6 & " Or n1 = " & 7 & " Or n1 = " & 8 & " Or n1 = " & 10 & " Or n1 = " & 12 & " Or n1 = " & 13 & " Or n1 = " & 17 & " Or n1 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n2 = '" & 0 & "' WHERE ID <> " & 1 & " and (n2 = " & 1 & " Or n2 = " & 5 & " Or n2 = " & 6 & " Or n2 = " & 7 & " Or n2 = " & 8 & " Or n2 = " & 10 & " Or n2 = " & 12 & " Or n2 = " & 13 & " Or n2 = " & 17 & " Or n2 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n3 = '" & 0 & "' WHERE ID <> " & 1 & " and (n3 = " & 1 & " Or n3 = " & 5 & " Or n3 = " & 6 & " Or n3 = " & 7 & " Or n3 = " & 8 & " Or n3 = " & 10 & " Or n3 = " & 12 & " Or n3 = " & 13 & " Or n3 = " & 17 & " Or n3 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n4 = '" & 0 & "' WHERE ID <> " & 1 & " and (n4 = " & 1 & " Or n4 = " & 5 & " Or n4 = " & 6 & " Or n4 = " & 7 & " Or n4 = " & 8 & " Or n4 = " & 10 & " Or n4 = " & 12 & " Or n4 = " & 13 & " Or n4 = " & 17 & " Or n4 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n5 = '" & 0 & "' WHERE ID <> " & 1 & " and (n5 = " & 1 & " Or n5 = " & 5 & " Or n5 = " & 6 & " Or n5 = " & 7 & " Or n5 = " & 8 & " Or n5 = " & 10 & " Or n5 = " & 12 & " Or n5 = " & 13 & " Or n5 = " & 17 & " Or n5 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n6 = '" & 0 & "' WHERE ID <> " & 1 & " and (n6 = " & 1 & " Or n6 = " & 5 & " Or n6 = " & 6 & " Or n6 = " & 7 & " Or n6 = " & 8 & " Or n6 = " & 10 & " Or n6 = " & 12 & " Or n6 = " & 13 & " Or n6 = " & 17 & " Or n6 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n7 = '" & 0 & "' WHERE ID <> " & 1 & " and (n7 = " & 1 & " Or n7 = " & 5 & " Or n7 = " & 6 & " Or n7 = " & 7 & " Or n7 = " & 8 & " Or n7 = " & 10 & " Or n7 = " & 12 & " Or n7 = " & 13 & " Or n7 = " & 17 & " Or n7 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n8 = '" & 0 & "' WHERE ID <> " & 1 & " and (n8 = " & 1 & " Or n8 = " & 5 & " Or n8 = " & 6 & " Or n8 = " & 7 & " Or n8 = " & 8 & " Or n8 = " & 10 & " Or n8 = " & 12 & " Or n8 = " & 13 & " Or n8 = " & 17 & " Or n8 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n9 = '" & 0 & "' WHERE ID <> " & 1 & " and (n9 = " & 1 & " Or n9 = " & 5 & " Or n9 = " & 6 & " Or n9 = " & 7 & " Or n9 = " & 8 & " Or n9 = " & 10 & " Or n9 = " & 12 & " Or n9 = " & 13 & " Or n9 = " & 17 & " Or n9 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET n10 = '" & 0 & "' WHERE ID <> " & 1 & " and (n10 = " & 1 & " Or n10 = " & 5 & " Or n10 = " & 6 & " Or n10 = " & 7 & " Or n10 = " & 8 & " Or n10 = " & 10 & " Or n10 = " & 10 & " Or n10 = " & 12 & " Or n10 = " & 13 & " Or n10 = " & 17 & " Or n10 = " & 20 & ")"
db.Execute criterio
criterio = "UPDATE ArchTemp SET Somma = n1+n2+n3+n4+n5+n6+n7+n8+n9+n10 WHERE ID <> " & 1
db.Execute criterio
Set ds = db.OpenRecordset("SELECT Min(SOMMA) AS MINS, Max(SOMMA) AS MAXS From ArchTemp")
MaxSomma = ds!MaxS
MinSomma = ds!MinS
ds.Close
criterio = "UPDATE ArchTemp SET Min = " & MinSomma & ", Max = " & MaxSomma & " WHERE ID = " & 1
db.Execute criterio
'MsgBox MinSomma & " " & MaxSomma

    criterio = "INSERT INTO SommeMinMax (Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, Min, Max) "
    criterio = criterio & "SELECT Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, Min, Max "
    criterio = criterio & "FROM ArchTemp Where ID = " & 1
    db.Execute criterio

End Sub


Come vedi è stato processato il primo record (Tabella Archivio che hai postato)
e lo troverai nella tabella SommeMinMax
I valori che ora sono fissi dovranno divenire variabili
cioè assumere i valori di ogni record (l'ID e gli n1...n10)

Se riesci da solo ok
altrimenti alla prossima ;)
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: elimina e somma campi access

Postdi miko » 29/06/11 17:23

buon pomeriggio,
mentre tu realizzavi la macro, io ho studiato un pò di access e modificando alcune macro di flash ho raggiunto piccoli risultati;
uno di questi è la eliminazione di records o della intera tabella;
Codice: Seleziona tutto
Private Sub Comando0_Click()
Dim criterio As String
Set DB = CurrentDb
criterio = "DELETE FROM ARCHIVIO WHERE n10 = 78"
DB.Execute (criterio)
'per eliminare tutti i records eseguire il seguente codice
'criterio = "DELETE FROM ARCHIVIO"
'DB.Execute (criterio)
End Sub

può essere efficace inserire il precedente codice nella parte di listato da te postata:
Private Sub Comando108_Click()
......
'<<<< qui in un secondo tempo
' si devono cancellare i record della tabella ArchTemp e riempire di nuovo con tutti i record dell'archivio
........

faccio delle prove così come seguendo le istruzioni testerò il resto del codice;
avviso se incontro difficoltà.
saluti, grazie
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 29/06/11 17:45

Io sono andato avanti e dopo la macro dimostrativa di funzionamento con una "miriade" di update
ho inserito l'update della tabella in un ciclo for...next
inoltre ho messo la condizione di effettuare il calcolo di tutte le precedenti estrazioni già elaborate solo con le estrazioni aggiunte e quelle aggiunte con tutte le estrazioni in tabella

quindi la macro finale, per il momento è questa

Codice: Seleziona tutto
Private Sub Comando108_Click()
Dim criterio As String
Dim DBCOrrente As DAO.Database
Dim Tabella As DAO.Recordset
Dim TabellaT As DAO.Recordset
Set db = CurrentDb
    Set ds = db.OpenRecordset("SELECT Max(ID) AS IDA From SommeMinMax")
        IDAT = ds!IDA
    ds.Close

    Set ds = db.OpenRecordset("SELECT Max(ID) AS IDW From ARCHIVIO_WINFORLIFE")
        IDAW = ds!IDW
    ds.Close
If IDAT >= IDAW Then
MsgBox " Archivio già elaborato"
db.Close
Exit Sub
End If

Set Tabella = db.OpenRecordset("ARCHIVIO_WINFORLIFE", dbOpenDynaset)
Set TabellaT = db.OpenRecordset("ArchTemp", dbOpenDynaset)
Do Until Tabella.EOF
    criterio = "delete from ArchTemp"
    db.Execute criterio
   
    criterio = "INSERT INTO ArchTemp (Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10) "
    criterio = criterio & "SELECT Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10 From ARCHIVIO_WINFORLIFE"
    db.Execute criterio
    TabellaT.FindNext "ID >" & IDAT
    IDM = Tabella("ID")
    N1M = Tabella("n1")
    N2M = Tabella("n2")
    N3M = Tabella("n3")
    N4M = Tabella("n4")
    N5M = Tabella("n5")
    N6M = Tabella("n6")
    N7M = Tabella("n7")
    N8M = Tabella("n8")
    N9M = Tabella("n9")
    N10M = Tabella("n10")

If IDM < IDAT Then

    For NC = 1 To 10
        criterio = "UPDATE ArchTemp SET n" & NC & " = " & 0 & " WHERE ID >= " & IDAT & " And (n" & NC & " = " & N1M & " Or n" & NC & " = " & N2M & " Or n" & NC & " = " & N3M & " Or n" & NC & " = " & N4M & " Or n" & NC & " = " & N5M & " Or n" & NC & " = " & N6M & " Or n" & NC & " = " & N7M & " Or n" & NC & " = " & N8M & " Or n" & NC & " = " & N9M & " Or n" & NC & " = " & N10M & ")"
        db.Execute criterio
    Next NC
   
    criterio = "UPDATE ArchTemp SET Somma = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10 WHERE ID >= " & IDAT
    db.Execute criterio
   
    Set ds = db.OpenRecordset("SELECT Min(SOMMA) AS MINS, Max(SOMMA) AS MAXS From ArchTemp  WHERE ID >= " & IDAT)
        MaxSomma = ds!MaxS
        MinSomma = ds!MinS
    ds.Close
   
    criterio = "UPDATE ArchTemp SET Min = " & MinSomma & ", Max = " & MaxSomma & " WHERE ID = " & IDM
    db.Execute criterio
        criterio = "UPDATE SommeMinMax SET Min = " & MinSomma & " WHERE ID = " & IDM & " and Min > " & MinSomma
       db.Execute criterio
        criterio = "UPDATE SommeMinMax SET Max = " & MaxSomma & " WHERE ID = " & IDM & " and Max < " & MaxSomma
    db.Execute criterio
Else
    For NC = 1 To 10
        criterio = "UPDATE ArchTemp SET n" & NC & " = '" & 0 & "' WHERE ID <> " & IDM & " And (n" & NC & " = " & N1M & " Or n" & NC & " = " & N2M & " Or n" & NC & " = " & N3M & " Or n" & NC & " = " & N4M & " Or n" & NC & " = " & N5M & " Or n" & NC & " = " & N6M & " Or n" & NC & " = " & N7M & " Or n" & NC & " = " & N8M & " Or n" & NC & " = " & N9M & " Or n" & NC & " = " & N10M & ")"
        db.Execute criterio
    Next NC
   
    criterio = "UPDATE ArchTemp SET Somma = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8 + n9 + n10 WHERE ID <> " & IDM
    db.Execute criterio
   
    Set ds = db.OpenRecordset("SELECT Min(SOMMA) AS MINS, Max(SOMMA) AS MAXS From ArchTemp  WHERE ID <> " & IDM)
        MaxSomma = ds!MaxS
        MinSomma = ds!MinS
    ds.Close
   
    criterio = "UPDATE ArchTemp SET Min = " & MinSomma & ", Max = " & MaxSomma & " WHERE ID = " & IDM
    db.Execute criterio
    criterio = "INSERT INTO SommeMinMax (Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, Min, Max) "
    criterio = criterio & "SELECT Id, NC, DATA, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, Min, Max "
    criterio = criterio & "FROM ArchTemp Where ID = " & IDM
    db.Execute criterio
   

End If
    Tabella.MoveNext
Loop

TabellaT.Close
Tabella.Close
db.Close
End Sub

Chiaramente va messa con il codice appropriato del pulsante creato che a me è 108 ma il numero dipende dagli oggetti utilizzati, quindi creare il pulsante e inserire l'intero codice senza la prima riga e l'End sub (esistente già nel generatore di codice del pulsante)

Ciao

P.s. Mi piacerebbe sapere i tempi per 1000 estrazioni e poi con 1010 (aggiungendo 10 estrazioni)
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: elimina e somma campi access

Postdi miko » 29/06/11 21:26

ciao,
stavo studiando la prima macro e facendo ricerche;
non ho notato che avevi già provveduto ad un aggiornamento;
domani con calma rivedo l'ultimo codice e informo.
grazie, saluti
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 29/06/11 22:54

Appena puoi fammi sapere...

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Postdi archimede » 30/06/11 09:31

Puoi forse provare in questo modo (SE&O):

1) Crea la seguente query chiamandola UNA_COLONNA:
Codice: Seleziona tutto
SELECT ID, n1 AS N FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n2 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n3 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n4 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n5 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n6 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n7 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n8 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n9 FROM ARCHIVIO_WINFORLIFE
UNION
SELECT ID, n10 FROM ARCHIVIO_WINFORLIFE;
2) Crea la seguente funzione in un modulo:
Codice: Seleziona tutto
Public Function Conta(ID_to_Check As Long, tipo As String) As Long
    Dim SQLstr As String
    Dim rs As ADODB.Recordset

    On Error GoTo Conta_Error
   
    SQLstr = "SELECT SUM(N) AS Somma FROM (" & _
             "    SELECT DISTINCT b.* " & _
             "      FROM (SELECT * FROM UNA_COLONNA WHERE ID=" & ID_to_Check & ") a " & _
             "RIGHT JOIN (SELECT * FROM UNA_COLONNA WHERE ID>" & ID_to_Check & ") b " & _
             "        ON a.N = b.N " & _
             "     WHERE a.n IS NULL)" & _
             "GROUP BY ID"

    Set rs = New ADODB.Recordset

    If tipo = "MIN" Then
        SQLstr = "SELECT MIN(Somma) FROM (" & SQLstr
    Else
        SQLstr = "SELECT MAX(Somma) FROM (" & SQLstr
    End If
    SQLstr = SQLstr & ")"

    rs.Open SQLstr, CurrentProject.Connection
    rs.MoveFirst
    Conta = rs.Fields(0).Value

    rs.Close
    Set rs = Nothing
    Exit Function

Conta_Error:
    Conta = -1

End Function
3) Crea la seguente query:
Codice: Seleziona tutto
SELECT w.*, conta(w.ID, "MAX") AS Massimo, conta(w.ID, "MIN") AS Minimo
FROM ARCHIVIO_WINFORLIFE w;
4) Controlla i risultati di quest'ultima query

Le performances mi sa che non saranno un gran che: puoi creare un indice per ciascuna della 10 colonne della tabella principale per tentare di migliorarle. In alternativa puoi provare a modificare la struttura delle tue tabelle in modo da rendere la query UNA_COLONNA inutile.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Re: elimina e somma campi access

Postdi miko » 01/07/11 10:26

buon giorno a tutti,
non ho avuto molto tempo per dedicarmi al problema di questo post,
ma dopo qualche prova ho constatato che il codice realizzato da flash
funziona perfettamente;
ho notato che se vengono eliminati tutti i records delle tabelle, per ricominciare dall'inizio, il programma si blocca compare un messaggio:
" ERRORE DI SINTASSI (OPERATORE MANCANTE) NELL'ESPRESSIONE.
ed il debug evidenzia la linea:
Codice: Seleziona tutto
.....
TabellaT.FindNext "ID >" & IDAT
....

ho capito che il problema si trova nel valore della variabile IDAT della tabella SommeMinMax;
quest'ultima deve contenere almeno qualche records, e che perciò bisogna calcolare, manualmente, i primi records ed inserirli in tabella;
inserendo un timer ho poi potuto verificare che, se in archivio sono già presenti 10 records e questi sono stati processati, aggiungendo altri 990, per un tot. di 1000, il tempi di elaborazione per 1000 records è dell'ordine di 2min e 27 sec;
mentre inserendo altre 10, per un tot. di 1010 il tempo è di 1 min e 07 sec.
immagino che i tempi aumenteranno all'aumentare dei records inseriti.
forse è possibile velocizzare maggiormente l'elaborazione?
grazie

per archimede:
come scritto all'inizio non avuto molto tempo libero e perciò non ho potuto provare la tua macro;
essendo poi poco esperto di access i miei tempi di verifica sono anche elevati;
mi riprometto di seguire anche le tue indicazioni, anche se non ho capito molto:
Le performances mi sa che ......
.......la query UNA_COLONNA inutile.

ma vedrò cosa riesco a concretizzare.
intanto ti saluto e ti ringrazio per il tuo contributo.
ciao e grazie a tutti
windows xp-office 2003
miko
Utente Senior
 
Post: 422
Iscritto il: 29/12/09 10:44

Re: elimina e somma campi access

Postdi Flash30005 » 01/07/11 12:36

Si,
trovando la tabella somme vuota (che ho usato per il confronto Id esistenti e da aggiungere va in errore
quindi è suffciente
mettere queste due linee di codice prima e dopo la riga che fornisce l'errore
Codice: Seleziona tutto
   
On Error Resume Next                 '<<<<<<<< aggiungere
TabellaT.FindNext "ID >" & IDAT  '<<<<<<< esistente
On Error GoTo 0                         '<<<<<<<<< aggiungere



Per quanto riguarda i tempi non mi interessa il caricamento di 1000 o più record che farai solo la prima volta
ma solo l'aggiornamento di una giornata quindi circa 10 o 15 (non me ne intendo di quante ne effettuano)
perché è quello il tempo effettivo
Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "elimina e somma campi access":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti