Ricerca 
it-ITen-US
Registrazione
Accedi
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Stampa     


DotNetWork Forums
Update, Max, Last
Ultimo Post 08 gen 2009 08.39 by dobrey. 30 Risposte.
Stampa immediata
Ordina:
PrevPrev ProssimoProssimo
Non sei autorizzato ad inviare una risposta.
Autore Messaggi

Posts:30

--
01 gen 2009 17.38  
Salve,

base lavoro = db access Mdb e DAO.

Ho bisogno di rilevare valori residenti in una tabella ed immettere il risultato in un'altra tabella.

Tali riporti da una tabella ad altra si riferiscono:
1) Il valore più alto abbinato ad un elemento;
2) Il valore registrato in ordine di tempo (cioè la prima o ultima registrazione) abbinato allo stesso elemento.
(Più semplicemente: Costo massimo e Costo ultimo).

Attualmente opero con Do Loop e Select

Naturalmente usando (al fine di essere più rapido in esecuzione) :
Db.Execute "UPDATE Tab2 SET Tab2.campo6 = '" etc............

o qualcosa di meglio.

Spero qualcuno possa e voglia aiutarmi.

Ringrazio in anticipo,
Rag Gennaro Nardi Pescara



Posts:662

--
01 gen 2009 20.52  
Potresti usare un comando di insert into:

INSERT INTO TabellaDestinazione(Campo1, Campo2, Campo3, Campo4)
SELECT Campo1, Campo2, Campo3, Campo4 FROM TabellaOrigine
Where (Campo1 = ....);
HTH
Alberto.



Posts:30

--
02 gen 2009 15.04  
INSERT INTO TabellaDestinazione(Campo1, Campo2, Campo3, Campo4)
SELECT Campo1, Campo2, Campo3, Campo4 FROM TabellaOrigine
Where (Campo1 = ....);


Salve Alberto,

fino ad ora ho considerato INSERT INTO per immettere nuovo ed UPDATE per aggiornare.

Spero che il tuo invito sia valido e funzionale.
Vado a provare e comunicherò l'esito dopo.

Intanto grazie
Rag Gennaro Nardi Pescara



Posts:30

--
02 gen 2009 20.18  
Salve Alberto,

Purtroppo non ho saputo sfruttare la tua indicazione e non ho soddisfatto la mia necessità.

Resto in attesa di qualche altra dritta,
Saluti
Gennaro Nardi



Posts:662

--
02 gen 2009 22.52  
Ciao Gennaro,
probabilemnte non ho capito bene cosa devi fare. Puoi cercare di spiegare + nel dettaglio il tuo problema?
Grazie,
Alberto.



Posts:662

--
02 gen 2009 22.52  
Ciao Gennaro,
probabilemnte non ho capito bene cosa devi fare. Puoi cercare di spiegare + nel dettaglio il tuo problema?
Grazie,
Alberto.



Posts:30

--
03 gen 2009 14.44  

Salve Alberto,

Quello di cui ho bisogno è di immettere, con un unico comando, il valore massimo residente in una serie di campi di una tabella, in un campo di un'altra tabella.
I valori sono relativi all'acquisto di beni e/o servizi, effettuati in momenti diversi (naturalmente) ed ho bisogno di rilevare il costo massimo o minimo o ultimo in ordine di data di acquisto.
NB. Il recordset da aggiornare è già presente e non può essere eliminato perchè vi risiedono altri dati elaborati.

Poichè UPDATE non vuole MAX, SUM, TOP 1 etc.. attualmente uso:

Set rs1 = db.openrecordset("Select ID From Tab1 Where campo1 = quelcheserve",2)
Do until rs1.eof

Set rs2 = db.openrecordset("Select Max(campo10) From Tab2 Where ID = '" & rs1(0) & "'",2)

db."UPDATE Tab1 SET campo2 = '" & rs2(0) & "' Where ID = '" & rs1(0) & "';"

rs1.movenext
loop

Sperando di essere stato esplicito,
saluto
Gennaro Nardi



Posts:662

--
03 gen 2009 16.38  
Bene, la cosa è alquanto complicata lavorando con Access. In SQL avrei semplicemente fatto una query join di Update, ovvero:
UPDATE Tabella1 SET Campo1 = Max(Valore) FROM Tabella1 AS A Inner join
Tabella2 As B ON A.ID = B.ID
Questo però in Access non è possibile perchè non si possono fare query di raggruppamento in operazioni di Update perchè il motore Jet analizza la query come fosse un intero recordset e quindi vuole che sia raggruppata anche la tabella da aggiornare. Se provi a fare un raggruppamento Jet ti blocca ugualmente perchè le query raggruppate (giustamente non sono aggiornabili). Come risolvere, allora, il problema?
O fai un ciclo come hai descritto sopra (che cmq. è dispendioso) oppure ti crei una tabella ulteriore dove vai ad inserire i valori ID Max Min che la query di selezione ti tira fuori. Una volta fatto questo esegui l'aggiornamento con l'inner join sulla tabella1 attraverso la tabella3. Quindi:
1) DELETE FROM Tabella3 (Pulisci i valori sulla tabella di appoggio)
2) INSERT INTO Tabella3 (ID, Max, Min) SELECT ID, Max(Valore), Min(Valore) FROM Tabella2
3) UPDATE DISTINCTROW Tabella1 AS t1 INNER JOIN Tabella3 AS t3 ON t1.ID=t3.ID SET t1.Valore1 = t3.maxValore, t1.Valore2 = t3.minvalore;
In totale richiami 3 command invece che N command a seconda del numero di righe da aggiornare...
Lavorando in Access non vedo altre soluzioni. Se hai problemi fai un fischio. ;)
HTH
Alberto



Posts:30

--
03 gen 2009 17.24  

Salve Alberto,

Grazie per le indicazioni, spero di riuscire.

Appena fatto confermo.
Saluti
Gennaro Nardi



Posts:30

--
04 gen 2009 09.50  
2) INSERT INTO Tabella3 (ID, Max, Min) SELECT ID, Max(Valore), Min(Valore) FROM Tabella2


Salve Alberto,

purtroppo, anche dopo reiterati tentativi, non sono riuscito a distinguere il valore MAX in quanto è proprio MAX(valore) che non accetta.

Sperando in altre soluzioni,
Ringrazio e Saluto
Gennaro Nardi



Posts:662

--
04 gen 2009 09.56  
I campi di cui vuoi ottenere il valore massimo come si chiama? La tabella com'è fatta?



Posts:30

--
04 gen 2009 10.31  
I campi di cui vuoi ottenere il valore massimo come si chiama? La tabella com'è fatta?

Salve Alberto,

Il campo si chiama A10.
La tabella ha solo campi Text, si chiama c4 ed è residente in un db diverso da quello cui si deve aggiornare.

Ciao
Gennaro Nardi



Posts:662

--
04 gen 2009 10.45  
Allora devi castare il valore di testo ad un valore numerico altrimenti lui trova il max confrontando la stringa di testo. Ma chi è che scrive i db memorizzando in un campo di testo dei valori numerici? MAH! Max(CDbl(A10))



Posts:30

--
04 gen 2009 10.50  
Max(CDbl(A10))


Già fatto prima.
Nulla.
Mi da errore 3122.



Posts:662

--
04 gen 2009 10.53  
Probabilmente ci sono dei valori con formato non valido, tipo una virgola al posto del punto o qualcosa del genere...



Posts:30

--
04 gen 2009 11.00  


Ho sperato fosse vero.

UPDATE c4 SET A10 = '0' Where IsNull(A10) Or Not IsNumeric(A10);

Stesso errore



Posts:662

--
04 gen 2009 11.04  
Puoi allegare un file con i dati esportati dalla tabella?



Posts:30

--
04 gen 2009 11.07  


In quale formato ?



Posts:14

--
04 gen 2009 11.12  
Ciao
Fermi restando i problemi che ha riscontrato Alberto, tu puoi crearti la query con i valori pronti e poi inserirli nel recordset che ti sei aperto.
Non ho capito benissimo la tua base dati ma puoi fare

Dim db as DAO.Database
Dim rs as DAO.Recordset
Dim rsDest as DAO.Recordset
Dim strTua as string

StrTua = "SELECT id, TuoMax FROM TuaTabella as T LEFT JOIN (SELECT TOP 1 id, TuoValore as TuoMax FROM TuaTabella IN C:\TuaDir\TuoDb.mdb) as M ON T.id = M.id"

set db = currentDb
set rs = db.Openrecordset(strtua, 2, 512)
set rsDest = db.openrecorset("tuaTabDestinazione")
With rs
rsdest.addnew
rsdest!TuoMax = !TuoMax
rsdest.Update
End With
rs.close: set rs = nothing
rsdest.close : set rsdest = nothing
db.close: set db = nothing

o qualcosa del genere



Posts:662

--
04 gen 2009 11.16  
txt è ok. oppure puoi fare un copia/incolla qui sopra...



Posts:30

--
04 gen 2009 11.27  
Salve Massimiliano,

la tua indicazione è corretta ma prevede un ciclo ed è proprio quello che intendo correggere utilizzando altri metodi.

Salve Alberto,

Il terminale con cui stò comunicando non è lo stesso su cui lavoro.

Ho bisogno di qualche minuto per predisporre il file.

TimeOut

Gennaro Nardi



Posts:662

--
04 gen 2009 11.30  
Inviato da MA on 04/01/2009 12.12.51
Ciao
Fermi restando i problemi che ha riscontrato Alberto, tu puoi crearti la query con i valori pronti e poi inserirli nel recordset che ti sei aperto.
Non ho capito benissimo la tua base dati ma puoi fare

Dim db as DAO.Database
Dim rs as DAO.Recordset
Dim rsDest as DAO.Recordset
Dim strTua as string

StrTua = "SELECT id, TuoMax FROM TuaTabella as T LEFT JOIN (SELECT TOP 1 id, TuoValore as TuoMax FROM TuaTabella IN C:\TuaDir\TuoDb.mdb) as M ON T.id = M.id"

set db = currentDb
set rs = db.Openrecordset(strtua, 2, 512)
set rsDest = db.openrecorset("tuaTabDestinazione")
With rs
rsdest.addnew
rsdest!TuoMax = !TuoMax
rsdest.Update
End With
rs.close: set rs = nothing
rsdest.close : set rsdest = nothing
db.close: set db = nothing

o qualcosa del genere



Mi stavo giusto chiedendo quando saresti intervenuto... :) Dobrey, ti lascio in ottime mani Massimiliano è uno dei maggiori esperti Access in Italia ed è con grande orgoglio che lo ritieniamo, ormai, un nostro collaboratore... ;)



Posts:14

--
04 gen 2009 11.38  
Se vuoi fare dei cicli allora la strada può essere diversa
Ti crei una Funzione e la mettti come campo della query del rs

Function fctValoreMax(intId as Integer) as Currency 'o altro tipo di dato

dim rs as dao.recordset
set rs = currentdb.openrecordset("SEELCT tuocampo FROM TuaTabella WHERE tuoid = " & intId, 2 ,512)

with rs
if .EOF then
fctValoreMax = 0
else
fctValoreMax !tuocampo
end if
end with

end function


così la tua stringa del rs diventa
SELECT id, fctValoreMax(id) as MioMax...
e tutto resta uguale







Inviato da Alberto (DNW TEAM) on 04/01/2009 12.30.26
Inviato da MA on 04/01/2009 12.12.51
Ciao
Fermi restando i problemi che ha riscontrato Alberto, tu puoi crearti la query con i valori pronti e poi inserirli nel recordset che ti sei aperto.
Non ho capito benissimo la tua base dati ma puoi fare

Dim db as DAO.Database
Dim rs as DAO.Recordset
Dim rsDest as DAO.Recordset
Dim strTua as string

StrTua = "SELECT id, TuoMax FROM TuaTabella as T LEFT JOIN (SELECT TOP 1 id, TuoValore as TuoMax FROM TuaTabella IN C:\TuaDir\TuoDb.mdb) as M ON T.id = M.id"

set db = currentDb
set rs = db.Openrecordset(strtua, 2, 512)
set rsDest = db.openrecorset("tuaTabDestinazione")
With rs
rsdest.addnew
rsdest!TuoMax = !TuoMax
rsdest.Update
End With
rs.close: set rs = nothing
rsdest.close : set rsdest = nothing
db.close: set db = nothing

o qualcosa del genere



Mi stavo giusto chiedendo quando saresti intervenuto... <img src=" border=0> Dobrey, ti lascio in ottime mani Massimiliano è uno dei maggiori esperti Access in Italia ed è con grande orgoglio che lo ritieniamo, ormai, un nostro collaboratore... <img src=" border=0>






Posts:30

--
04 gen 2009 11.47  
Salve Massimiliano,

forse non sono stato chiaro.

Sono i cicli che voglio eliminare.

Allego mdb di appoggio in cui sono inseriti i dati risultanti dalla query priva di MAX().

Fammi sapere
Gennaro Nardi

Attachment: 11447502971.zip


Posts:662

--
04 gen 2009 12.04  
Il problema è che cerchi di inserire un valore numerico (Max(Cdbl([A1]))) in un campo Testo, devi ricastarlo ulteriormente:
CStr(Max(CDbl([A1])))



Posts:30

--
04 gen 2009 12.20  
Nulla da fare.

la seguente mi dà il risultato del mdb allegato in precendenza.


Db(2).Execute "INSERT INTO d2 (A0, A1) Select c4.A1, " _
& "CStr(CDbl([c4.A10])/CDbl([c4.A6])" _
& ") FROM [;database=" & q(94) & "].c4, [;database=" & q(94) _
& "].h4 Where c4.A1 <> '.' And h4.A0 = '035' & c4.A1 And h4.A27 = '1' And c4.A4 = '02141' " _
& "And CDbl(c4.A6) <> 0;"


dove va MAX ??



Posts:14

--
04 gen 2009 16.25  
Mi sa che ancora non ho capito fino in fondo il tutto
Ma se fai un SELECT DISTINCT A0, TuoMax FROM D2 as d
LEFT JOIN (SELECT TOP 1 A0, A1 FROM D2) as M ON M.A0 = d.A0

Dovresti avere il max sulla stessa tabella e poi lo gestisci



Posts:30

--
04 gen 2009 17.13  
Salve Massimiliano.

Obiettivo da raggiungere:

Aggiornare il campo di una tabella ottenendo il risultato da dati residenti in un'altra tabella.

Il comando da utilizzare è UPDATE (se non ce ne sono di migliori) affinchè con una sola stringa possa aggiornare tutta la tabella di destinazione.

Esempio:

Per ottenere la somma degli acquisti:
1) ho azzerato i campi da aggiornare h4.A1 ed ho aggiornato tutta la tabella con

2) UPDATE h4, c4 SET h4.A1 = 0 + h4.A1 + c4.A10 Where h4.A0 = c4.A1;

In questo modo non ho dovuto usare SUM() e quindi UPDATE non dà errore.

Dovendo, invece, usare MAX() o MIN() o LAST() per individuare un solo dato da utilizzare, Alberto mi ha consigliato di popolare con INSERT INTO una tabella d'appoggio e poi riempire i campi da aggiornare con questi ultimi dati.

Sperando di esser stato esplicito,
Saluto e attendo
Gennaro Nardi



Posts:30

--
07 gen 2009 11.11  
Salve ad Alberto e Massimiliano,

sono in attesa da giorni.

Devo considerare chiusa la parentesi ?

Saluti
Gennaro Nardi



Posts:662

--
07 gen 2009 12.21  
Salve ad Alberto e Massimiliano,

sono in attesa da giorni.

Devo considerare chiusa la parentesi ?
Ciao Gennaro, dopotutto abbiamo tutti degli impegni e non possiamo sempre essere pronti e disponibili, comunque se tu rileggi tutto il thread hai in mano tutti gli elementi per poter risolvere il tuo problema. Purtroppo hai una base dati molto "atipica" (valori numerici registrati come stringhe) ed aiutarti non è cosa immediata. Io, con i dati che tu mi hai mandato sono riuscito a fare ciò che ti serve e ti ho scritto come fare, quindi credo che anche tu ci riesca tranquillamente. Riassumendo:
1) Crei una tabella di appoggio con dentro le colonne ID MIN e LAST
2) Ogni volta elimini i record dalla tabella di apoggio e la popoli con una query di INSERT dei relativi valori della tabella di dettaglio
3) Esegui una query Join di UPDATE dalla tabella temporanea a quella Principale facendo un inner join sui campi ID.
Ricordati di eseguire il casting dei valori altrimentio il MIN, LAST e MAX te li calcola analizzando i numeri come fossero stringhe ovvero 9 è maggiore di 10.
HTH
Alberto.



Posts:30

--
08 gen 2009 08.39  
Salve Alberto,

non era mia intenzione sollecitare interventi.
Se questo è ciò che si evince dalla mia richiesta, chiedo scusa.

Il punto è che, data la mia relativa ignoranza del linguaggio e del suo potenziale utilizzo, non ho ancora realizzato la soluzione alla mia esigenza.

Cercherò di capire quanto mi avete prospettato e quindi di applicare quanto è possibile.

Vi ringrazio e saluto
Rag Gennaro Nardi Pescara.


Non sei autorizzato ad inviare una risposta.

Active Forums 4.1
       
Articoli
Panoramica delle Proprietà Subordinate (Dependency Properties)
Come iniziare a capire WPF Parte 6
2007/11/22 | Autore: Patrizia Cosolo
Fritto Misto - Classi di uso comune (Parte 6)
Helper: Alcuni metodi per organizzarci nell'uso del file System
2007/10/28 | Autore: Sabrina Cosolo
L'Albero degli elementi
Come iniziare a capire com'è fatto WPF (parte 3)
2007/08/13 | Autore: Patrizia Cosolo
Fritto Misto - Classi di uso comune(parte 4)
Helper: Una classe per il log di eventi, con evento, event handler, enumerazione.
2007/10/24 | Autore: Sabrina Cosolo
Iniziare da zero con WPF (Parte 3)
Litigi, Divinità, Pennelli e Frigoriferi. (seconda parte)
2007/11/22 | Autore: Sabrina Cosolo
Lavorare con i Generic - Led Control
Creare un controllo che simula i moduli LED
2007/11/11 | Autore: Alberto De Luca
.NET e l'Interoperabilità COM
Come utilizzare Dll non referenziabili per convertire un documento Word in PDF
2008/07/05 | Autore: Massimo Lofrano
SQL Server Nozioni base (parte 1)
Come creare un database in SQL Server Usando Sql Management Studio
2008/03/09 | Autore: Sabrina Cosolo
    Stampa     
Home|Forums|Blogs|Mappa del sito
© 2007-2012 by DotNetWork  .:.  Condizioni d'uso  .:.  Privacy  .:.  Accedi  .:.