Programmazione: eseguire calcoli e controlli con Visual Basic for Application
In questo articolo spiego come sia
possibile utilizzare uno strumento importante e potente
come il Visual Basic all'interno di Access senza essere
per forza dei programmatori.
Ad esempio, eseguendo dei controlli su dei calcoli.
Ipotiziamo di aver un database che contiene il ciclo di lavorazione di un articolo (Fig.1): se arriva un ordine da 1000 pezzi come faccio a calcolare il tempo di produzione?
Fig.1
Dobbiamo fare in modo che il sistema riconosca
le lavorazioni in cui il tempo e' espresso per lotto
(nel record deve esserci questa informazione) e che
utilizzi una formula diversa per fare i conti.
Il comdando If......Then risultera' particolarmente
utile.
Il ragionamento e' questo: se il tempo indicato
e' per la produzione di un pezzo, bisogna moltiplicare
10 secondi per 1000 pezzi e dividere per 3600 per
trovare le ore di lavoro; se il tempo indicato e' per
lotto e' necessario dividere la quantita' in ordine 1000
per i 100 pezzi del lotto e moltiplicare il risultato
ottenuto per 30.
Per ottenere il tempo in ore e' necessario dividere
ancora per 60.
Nell' esempio ogni articolo
ha il suo ciclo di lavoro.
Per convenzione diciamo che se il numero di pezzi per
lotto e' 0 il tempo di lavoro si intende per pezzo.
Il database di esempio visto prima e' basato sulla seguente tabella (Fig.2):
Fig.2
Nella tabella c'e' un campo (Ore_Calcolate) in
cui verra' salvato il risultato del calcolo.
Inoltre se il campo Min_Sec e' -1 (spuntato) il tempo
viene considerato in minuti.
Il tasto Inserisci articoli esegue una routine su click (DoCmd.OpenForm "Nome della maschera") che apre la maschera di Fig.3 dove bisogna inserire il numero di articoli.
Fig.3
Il tasto Calcola esegue la routine che riporto e commento qui sotto, esegue i conteggi e salva i risultati nel campo Ore_Calcolate della tabella vista in precedenza.
On Error GoTo Fine
La
riga sopra fa in modo che se il programma trova un
errore,
anziche' bloccarsi, invia alla routine di nome Fine
'---------------------------------------------------------------
'Apre il database e le tabelle necessarie
'---------------------------------------------------------------
Dim db As Database, rst0 As Recordset
Dim Tempo As Double, Misura As Integer, Ordinato As
Double
Dim Lotto As Double, Risultato As Double
Set db = CurrentDb
Set rst0 = db.OpenRecordset("Cicli", dbOpenDynaset)
' "Cicli" e' il nome della tabella in cui
salvo i risultati
'---------------------------------------------------------------
'Legge dalla maschera quanti articoli sono in ordine
'---------------------------------------------------------------
Ordinato = Me![Ordinato] 'Nome del campo
un cui inserisco il numero di articoli
'---------------------------------------------------------------
'Legge i dati dalla tabella cicli
'---------------------------------------------------------------
Vai al primo record
rst0.MoveFirst
Do Until rst0.EOF
Edit ci
serve perche' dovremo scrivere nella tabella
rst0.Edit
Tempo = 0
If Not IsNull(rst0("tempo")) Then Tempo = rst0("tempo")
If Not
IsNull e' stato scritto per evitare che, nel caso in cui
nel campo tempo non vi siano dati e
quindi vi sia il valore nullo, il programma non generi
errori. In pratica la variabile Tempo viene forzata
a 0 e, se nel campo tempo della tabella cicli non vi e'
un valore nullo, la variabile prende tale valore.
Lotto = 0
If Not IsNull(rst0("Lotto")) Then Lotto = rst0("Lotto")
Misura = rst0("Min_Sec")
If Misura = -1 Then Tempo = Tempo * 60
Abbiamo visto sopra che se il campo min_sec della
tabella cicli vale -1 (Vero il tempo in minuti
viene trasformato in secondi.
Sotto
invece si eseguono i calcoli in ore in funzione della
lavorazione, ovvero del numero di pezzi
per lotto
If Lotto = 0 Then
Risultato = (Tempo * Ordinato) / 3600
If Lotto > 0 Then Risultato = (Tempo / Lotto) * Ordinato
/ 3600
Fatto il
calcolo si salvano i dati nella tabella, prima
scrivendoli nel campo e poi usando il metodo update
rst0("Ore_Calcolate") = Risultato
rst0.Update
Si
passa a nuovo record per un nuovo calcolo fino al
termine della tabella
rst0.MoveNext
Loop
rst0.Close
db.Close
Apriamo la maschera e vediamo i calcoli
DoCmd.OpenForm "Cicli_Calcolo"
Fine:
Close
MsgBox Err.Description
Exit Sub
End Sub
A questo punto verra' visualizzata la maschera riassuntiva di sola lettura (Fig.4) che mostra i risultati dei calcoli.
Fig.5
Buon lavoro.