Come aggiornare massivamente i prodotti via maschera di Access

Oggi impariamo come aggiornare massivamente i prodotti via maschera di Access. Certo, potremmo usare una query di aggiornamento, ma la maschera è il modo più semplice per consentire all’utente meno esperto di lavorare con i dati. In fondo, le maschere, il concetto stesso di interfaccia mirano proprio a questo: semplificare l’accesso e controllare ciò che fa l’utente. Un utente che possa accedere via query a una tabella potrebbe causare danni irreversibili al mio database. Se costruisco un’interfaccia di front-end controllata via codice VBA, il risultato finale è garantito.

Oggi impariamo come eseguire un’istruzione SQL di aggiornamento senza usare una query, ma lavorando con una maschera di Access. SQL è il linguaggio che usa la query. Nel nostro caso ci serve un’istruzione di UPDATE (corrisponde alla query di aggiornamento in Access). La sintassi è semplice:

UPDATE nometabella SET nomecampo = nuovovalore

se voglio eseguire l’aggiornamento soltanto su alcuni record, dovrò opportunamente filtrarli, ossia in linguaggio SQL aggiungere una WHERE:

UPDATE nometabella SET nomecampo = nuovovalore 
WHERE nomecampo = valore

per esempio, aggiorno solo i prodotti di una certa categoria ecc.

Vogliamo aggiornare il prezzo dei nostri prodotti. Per svolgere l’esercizio è sufficiente avere una tabella Prodotti e un campo PrezzoUnitario. La maschera Access è molto semplice:

maschera aggiornamento

Una casella di testo, txtAumentoPrezzo, e un pulsante, cmdUpdate. Ho aggiunto poi un’etichetta con il simbolo della percentuale, perché sia chiaro all’utente che deve inserire i valori in percentuale, es. 5 e non 0,05.

Cosa accade quando l’utente preme il pulsante Aggiorna? Viene eseguito il codice relativo all’evento Su clic. In particolare:
1) devo calcolare la percentuale di aumento, nel caso 5 / 100 = 0,05
2) costruire l’istruzione SQL
3) eseguire l’istruzione

Dim curPercentualeAumento As Currency
curPercentualeAumento = CCur(Me.txtAumentoPrezzo / 100)

Creo una variabile di tipo Currency (sarebbe Valuta nella struttura di una tabella). Alla variabile assegno il risultato di:
valore casella di testo / 100
Tale valore viene convertito in valuta con la funzione CCur. Così assegno alla variabile il valore nel tipo corrispondente a quello della variabile stessa.

NB. Naturalmente dovrei controllare che l’utente inserisca solo cifre all’interno della casella dell’aumento… ma questo sarà oggetto di un altro post.

Ora creo una variabile di tipo stringa, a cui assegnare l’istruzione SQL

Dim strSQL As String

L’istruzione SQL di UPDATE deve aumentare il prezzo attuale del 5%. Perciò sarebbe come dire:
prezzo unitario = prezzo unitario * 105%
ossia
prezzo unitario = prezzo unitario * 1,05
ossia
prezzo unitario = prezzo unitario * (1+ valore di aumento)
ossia
prezzo unitario = prezzo unitario * (1+ curPercentualeAumento)

Scrivendo la formula in tal modo, possiamo sia aumentare, sia diminuire i prezzi, sia lasciarli invariati. La formula non darà mai errori. Perciò…

UPDATE Prodotti SET [PrezzoUnitario]=[PrezzoUnitario]*(1+" & curPercentualeAumento & ")"

La & è un operatore di concatenamento (vedi Excel). Attenzione, però! L’istruzione sopra indicata non è ancora corretta. Il problema è che l’istruzione SQL si aspetta come separatore decimale il punto e non la virgola. Ma se eseguiamo il codice in un pc con le impostazioni internazionali “Italia”, il separatore è la virgola. In fase di esecuzione del codice, l’istruzione da noi creata risulterebbe:

UPDATE Prodotti SET [PrezzoUnitario]=[PrezzoUnitario]*(1+0,05)

ma non funzionerebbe, perché c’è scritto 0,05. Il computer vuole 0.05!
La soluzione è di utilizzare una funzione che sostituisca la virgola con il punto. La funzione è

Replace(espressione,valore_vecchio,valore_nuovo)

Per noi sarà (attenzione a copiare con cura!):

Replace(curPercentualeAumento, "," , ".")

L’istruzione corretta per assegnare alla variabile l’SQL da eseguire è la seguente:

strSQL = "UPDATE Prodotti SET [PrezzoUnitario]=[PrezzoUnitario]*(1+" & Replace(curPercentualeAumento, ",", ".") & ")"

Infine, dobbiamo solo eseguire l’istruzione per ottenere l’aggiornamento dei dati:

CurrentDb.Execute strSQL

Riepilogando, il codice completo è il seguente:

Private Sub cmdUpdate_Click()
Dim curPercentualeAumento As Currency
curPercentualeAumento = CCur(Me.txtAumentoPrezzo / 100)
Dim strSQL As String
strSQL = "UPDATE Prodotti SET [PrezzoUnitario]=[PrezzoUnitario]*(1+" & Replace(curPercentualeAumento, ",", ".") & ")"
CurrentDb.Execute strSQL
End Sub