Newsgroup: it.comp.appl.access
Titolo: Ricompilare un campo con VBA

Ciao Ragazzi,
in un db su Access 2000, possiedo una tabella con l'elenco dei miei prodotti 
ordinati con la chiave primaria IDProdotto. Questa tabella possiede anche la 
colonna Giacenze, con le relative quantità, per prodotto, restanti in 
magazzino. Ogni volta che viene compilato un ordine inserendo i prodotti e 
le relative quantità, ho bisogno che si aggiornino le Giacenze nella tabella 
Prodotti.
Mi hanno consigliato due vie: o creare una Query SQL, o un codice.
Riguardo al codice, ho pensato di fare:
"Ogni volta che dall'ordine, viene selezionato un prodotto, e poi la 
relativa quantità dalla colonna "Quantità", si aggiorna anche la relativa 
giacenza nella tabella Prodotti"
Il che vuol dire fare pressappoco così:
------
Private Sub Quantità_AfterUpdate()
On Error GoTo Err_Quantità_AfterUpdate
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("Prodotti")
Do While Not rs.EOF
If rs.Fields("IDProdotto").Value = Me!IDProdotto Then
    rs.Fields("Giacenze").Value = CCur(rs.Fields("Giacenze").Value - 
Me!Quantità)
End If
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Esci_Quantità_AfterUpdate:
    Exit Sub
Err_Quantità_AfterUpdate:
    MsgBox Err.Description
    Resume Esci_Quantità_AfterUpdate
End Sub
-----
Ora, appurato che il calcolo CCur forse non è valido, ho messo un valore 
numerico a caso, tanto per provare.
L'errore datomi è sempre lo stesso, all'aggiornamento del campo Quantità, si 
apre solo una Box che mi dice "Tipo non corrispondente".
1) Che vuol dire quell'errore? (Come faccio a interpretare errori simili se 
dalla guida non sono rintracciabili?)
2) Qual è l'errore?
3) Qualche link utile a farmi capire come posso gestire le Giacenze con 
delle Query SQL (che non so bene cosa siano)?
Grazie mille :-) 

 2) Qual è l'errore?
Ciao,
La funzione CCur deve essere utilizzata per eseguire conversioni da un tipo 
di dati a un sottotipo Currency che tengano in considerazione le diverse 
impostazioni internazionali. Separatori decimali o delle migliaia diversi, 
ad esempio, sono riconosciuti correttamente in base alle impostazioni 
internazionali del sistema.
Nell'esempio seguente la funzione CCur viene utilizzata per convertire 
un'espressione nel tipo di dati Currency:
  Dim MyDouble, MyCurr
  MyDouble = 543.214588
  ' MyDouble è un valore di tipo Double
  MyCurr = CCur(MyDouble * 2)
  ' Converte il risultato di MyDouble * 2 (1086,429176)
  ' in un valore di tipo Currency (1086,4292)
  ----------
  Nel tuo caso essendo "Giacenze" di tipo numerico e non di tipo Currency ti 
dà quell'errore.
  Molti errori non vanno "interpretati" bensì letti con attenzione! ;-)

[CUT]
Ciao,
per lq query inizia con un link del genere 
http://www.csai.unipa.it/cossentino/access/
  - trovi molto materiale sul 
sito comune e links ad esso associati!
Alla prossima :-) 

[CUT]
http://www.cerca-manuali.it/manuale-guida/sql.htm
 ...penso che per una buona 
mezz'oretta  possa bastare ! ;-) 

 numerico a caso, tanto per provare.
L'errore non è dato dalla funzione CCur, perché l'ho tolta apposta perché
sapevo che da problemi e la sto aggiustando intanto che un problema
maggiore.
Ti ringrazio intanto per il link. 

[CUT]
Ciao,
prova a commentare la gestione degli errori
-----------
'On Error GoTo Err_Quantità_AfterUpdate
'Esci_Quantità_AfterUpdate:
    'Exit Sub
'Err_Quantità_AfterUpdate:
    'MsgBox Err.Description
    'Resume Esci_Quantità_AfterUpdate
------------
e vedi dove ti si blocca il programma.
Di nulla x i links -> sono gratuiti ! ;-)

[CUT]
Non è che x caso ti sei dimenticato ad attivare i riferimenti ? Menu 
strumenti -> riferimenti etc... 

[CUT]
Prova un pò a dare 1 occhiata qui -> 
http://www.sviluppoisi.com/Corsi/Tutorial%20Access/Tutorial%2014/Esempio1.htm
Buona serata :-) 

A dire il vero non so cosa siano: quali devono essere abilitati? 

[CUT]
Si tratta di librerie che ti consentono di accedere agli oggetti (database, 
recordset etc...) x manipolarli -> vai sul sito di Karl 
http://www.donkarl.com/it/index.htm?/it/FAQ/FAQ7Bug.htm
 -> 7.11 Dim DB As 
Database produce un errore 

[CUT]
Qualche links su cui lavorare c'č l'hai...buona serata! :-) 

 Riguardo al codice, ho pensato di fare:
[cut]
Ciao Slam,
non ho visto i link che ti ha consigliato il grande Gaspare (con i quali
avrai anche già risolto magari ...).
Ti chiedo queste cose : hai una sola tabella per gestire gli ordini, i
prodotti e le quantità ?
Perche vuoi memorizzare un campo calcolato in una tabella ?
Ho l'impressione che il tuo Db debba essere normalizzato ...
La giacenza è un valore derivato dalla somma algebrica di valori positivi e
negativi che generalmente è >0 ( se non fanno "casino" in magazzino....) :
sembra che nel tuo caso tu gestisca solamente le "vendite" ?
Se ti sembra che non abbia capito nulla, fai conto che non ti abbia risposto
:-)
Ciao, Sandro

Ho creato un db da zero prendendo come modello il db di Northwind, l'esempio 
di Access 2000. Nel mio db mancano Fornitori, Impiegati e Corrieri, ho 
aggiunto dei dati come l'IVA negli ordini, la Partita IVA per i clienti ma 
sostanzialmente la base č quella.
Tuttavia come vedi, nell'esempio le Scorte per ogni prodotto non vengono 
calcolate ordine per ordine, non vengono proprio calcolate, in invece ho 
bisogno di sapere sempre quanta merce ho ancora in magazzino, altrimenti 
faccio un ordine e poi scopro che non o piů quel prodotto.
Tutto qui :) 

 ha scritto nel messaggio
news:431c7796$0$8486$5fc...@news.tiscali.it...


 ha scritto nel messaggio
news:431c7796$0$8486$5fc...@news.tiscali.it...

Il campo Giacenze che tipo è?Nell'esempio è numerico.
A che te serve CCur?
Perchè fai un ciclo?
Una traccia....
SunRex
 Dim db as Dao.Database
 Dim rs As Dao.Recordset
Dim strSQL as String
Dim intProdotto as Integer
Dim intDaEvadere as Integer
Set db = CurrentDb
intProdotto=Me!IDProdotto
intDaEvadere= Me.Quantità
strSQL = "SELECT * FROM tblProdotti WHERE IDProdotto = " & intProdotto & ";"
Set rs=db.OpenRecordset(strSQL)
rs.Edit
rs.Fields("Giacenza") = rs.Fields("Giacenza") - intDaEvadere
rs.Update



Ciao, Slam
ti posso proporre questo tipo di soluzione in base a quanto farei io.
Credo che la cosa migliore sia  calcolare la differenza tra la somma delle
scorte presenti nella tabella Prodotti e la somma della quantità della
tabella Dettagli ordini. In questo modo nel momento in cui insersci un nuovo
prodotto nella sottomaschera ordini se la quantità inserita è inferiore alla
differenza sopra citata ok, prosegui con l'inserimento altrimenti ti
cancella la riga appena inserita, visualizzando un messaggio. Il controllo
lo farei così e non ordine per ordine.
esempio:
idprodotto scorta
 5                100
inserisco 50 nel'ordine 1 ok
inserisco poi 51 in un altro ordine visualizzo messaggio che mi avverte che
posso inserire al massimo 50 e annullo il record inserito.
Ti passo la routine : ho eliminato nel NorthWind i vincoli nelle tabelle (
valido se e messaggio errore)
prima di aggiornare del campo quantita della sottomaschera della maschera
ordini e dopo aggionamento del idprodotto:
controlloDisponibilità
e sotto copia questa routine :
Sub controlloDisponibilità()
Dim totScortaProdotto As Integer, totQtaCompl As Integer, disponibilità As
Integer
totScortaProdotto = Nz(DSum("scorte", "prodotti", "idprodotto=" &
Me.IDProdotto), 0)
totQtaCompl = Nz(DSum("quantità", "[Dettagli ordini]", "idprodotto=" &
Me.IDProdotto), 0)
disponibilità = totScortaProdotto - totQtaCompl
If disponibilità < Me.Quantità Then
    MsgBox (vbCrLf & "La quantità che hai digitato supera la disponibilità !
Per questo prodotto è :") _
             & disponibilità, vbExclamation
    Me.Undo
End If
If Me.Quantità = 0 Then MsgBox ("la quantità digitata deve essere maggiore
di zero")
End Sub
Questo per iniziare. Se poi i record nelle tabelle sono tante potresti
notare un rallentamento nell'esecuzione della stessa, vedremo allora di
modificarla aprendo 2 recordSet per fare i calcoli.
In alternativa a questo ( che è la cosa più facile) potresti cercare di
utilizzare la straordinaria classa fatta da @Alex :
 Classi ed Eventi Public di Classi
 Validazione DataEntry(uso avanzato Classi)
per controllare l'inserimento, ma ti dico subito che è un po' difficilotta.
Resta il fatto che NothWind non è adattissimo per gestire una movimentazione
magazzino cos' come è impostato : va bene ( diciamo così) per lo scarico, ma
se devi gestire anche il carico ( acquisti) bisogne metterci un po' mano.
Ciao, fai un po' di prove e poi in caso ci risentiamo.
Notte, Sandro

Grazie molte per avermi ricordato che bisogna anche mettere l'alert se la 
giacenza è negativa, e soprattutto per il codice di esempio fornitomi.
Mi piacerebbe giusto per conoscenza, approdondire l'alternativa che hai 
specificato, se magari hai qualche link etc.
NorthWind l'ho usato più che altro come spunto: credo che, nei loro limiti, 
i programmi office abbiano delle potenzialità che nemmeno i creatori possono 
immaginare, e bisogna essere molto elastici mentalmente e creativi per 
sfruttare al meglio tutto. Se non si è esperti - più che altro nel sensò 
d'età di utilizzo -, si rischia di fare tante di quelle inutilità che le 
potenzialità possono eliminare, spero di essermi spiegato :)
Già che ci siamo, giusto due domandine:
1) Che differenza c'è tra Me.Prodotto e Me!Prodotto?
2) Le parentesi quadre che hai utilizzato per il Dettagli ordini, servono 
solo perché c'è uno spazio nel nome della tabella/query oppure hanno anche 
altre utilità?
Grazie e ciao. 

 Grazie e ciao.
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

 Grazie e ciao.
 prego, ciao, Sandro.

Grazie mille e riciao :)