Continuiamo la creazione del nostro programma per magazzino Calus 2012 vedendo come inserire delle finestre per la gestione del carico e scarico merci. Ecco come dobbiamo creare la nostra finestra, in particolare utilizzare il modello principale e dettaglio spiegato in un articolo di qualche tempo fa.
Per costruire questo tipo di finestra abbiamo bisogno di un form principale che contiene un sotto-form per i dettagli. Oltre ai campi come numero e data del movimento, la finestra principale deve filtrare i dati, ecco il codice VBA:
Option Compare Database
Private Sub Anno_Change()
If Not IsNull(Me.Anno.Text) Then
If IsNumeric(Me.Anno.Text) And Me.Anno.Text <> "" Then
Dim strDate As String
strDate = "01/01/" & Me.Anno.Text
If IsDate(strDate) Then
Me.FilterOn = True
Me.Filter = "Data BETWEEN #01/01/" & Me.Anno.Text
& "# AND #31/12/" & Me.Anno.Text & "#"
Dim myData As dao.Database
Dim myRec As dao.Recordset
Set myData = CurrentDb
Set myRec = myData.OpenRecordset("Scelte")
With myRec
.Edit
!AnnoCar = CLng(Me.Anno.Text)
.Update
.Close
End With
Set myData = Nothing
Exit Sub
End If
End If
End If
End Sub
Private Sub Cognome_DblClick(Cancel As Integer)
On Error GoTo Err_Fornitore_DblClick
Dim lFor As Long
lFor = 0
If Not IsNull(Me!IDFornitore) Then
lFor = Me!IDFornitore
DoCmd.OpenForm "Fornitori", , , , , acDialog, Me!IDFornitore
Else
DoCmd.OpenForm "Fornitori", , , , , acDialog, "GoToNew"
End If
lFor = CLng(GetSetting("Calus", "RetVal", "Last", 0))
DeleteSetting "Calus", "RetVal"
If lFor <> 0 Then Me!IDFornitore = lFor
Me.Cognome.Requery
Me.Nome.Requery
Exit_Fornitore_DblClick:
Exit Sub
Err_Fornitore_DblClick:
MsgBox Err.Description
Resume Exit_Fornitore_DblClick
End Sub
Private Sub Form_Unload(Cancel As Integer)
Forms![Pannello comandi].Visible = True
End Sub
Private Sub Nome_DblClick(Cancel As Integer)
Cognome_DblClick (Cancel)
End Sub
Private Sub Form_Load()
Dim myData As dao.Database
Dim myRec As dao.Recordset
Set myData = CurrentDb
Set myRec = myData.OpenRecordset("Scelte")
Me.Anno = myRec!AnnoCar
myRec.Close
Set myData = Nothing
If Not IsNull(Me.Anno) Then
If IsNumeric(Me.Anno) And Me.Anno <> "" Then
Dim strDate As String
strDate = "01/01/" & Me.Anno
If IsDate(strDate) Then
Me.FilterOn = True
Me.Filter = "Data BETWEEN #01/01/" & Me.Anno &
"# AND #31/12/" & Me.Anno & "#"
DoCmd.GoToRecord acDataForm, "Carichi", acLast
Exit Sub
End If
End If
End If
Me.Filter = ""
Me.FilterOn = False
DoCmd.GoToRecord acDataForm, "Carichi", acLast
End Sub
La maschera dei dettagli invece deve aggiornare l’imponibile e l’iva, ma anche la giacenza del materiale, ecco il codice per fare tutto questo:
Option Compare Database
Option Explicit
Private Sub Descrizione_Articolo_AfterUpdate()
Matricola_Articolo_AfterUpdate
End Sub
Private Sub Descrizione_Articolo_DblClick(Cancel As Integer)
Matricola_Articolo_DblClick (Cancel)
End Sub
Private Sub Descrizione_Articolo_NotInList(NewData As String,
Response As Integer)
Matricola_Articolo_NotInList NewData, Response
End Sub
Private Sub Codice_a_Barre_AfterUpdate()
Matricola_Articolo_AfterUpdate
End Sub
Private Sub Codice_a_Barre_DblClick(Cancel As Integer)
Matricola_Articolo_DblClick (Cancel)
End Sub
Private Sub Codice_a_Barre_NotInList(NewData As String,
Response As Integer)
Matricola_Articolo_NotInList NewData, Response
End Sub
Private Sub Iva_AfterUpdate()
Dim vVal, vImposta, vTotale As Currency
vVal = 0#
vImposta = 0#
vTotale = 0#
If Not IsNull(Me!IDArticolo) Then
vVal = Me.Prezzo
If Not IsNull(Me.Quantità) And Me.Quantità <> "" Then
vVal = vVal * CSng(Me.Quantità)
vImposta = vVal * Me.Iva
vTotale = vVal + vImposta
End If
End If
Me.Importo = vVal
Me.Imposta = vImposta
Me.Totale = vTotale
End Sub
Private Sub Prezzo_AfterUpdate()
Dim vVal, vImposta, vTotale As Currency
vVal = 0#
vImposta = 0#
vTotale = 0#
If Not IsNull(Me!IDArticolo) Then
vVal = Me.Prezzo
If Not IsNull(Me.Quantità) And Me.Quantità <> "" Then
vVal = vVal * CSng(Me.Quantità)
vImposta = vVal * Me.Iva
vTotale = vVal + vImposta
End If
End If
Me.Importo = vVal
Me.Imposta = vImposta
Me.Totale = vTotale
End Sub
Private Sub Quantità_AfterUpdate()
Dim myData As dao.Database, strSQL As String, dGia As Single
Dim myCar As dao.Recordset, mySca As dao.Recordset,
myRese As dao.Recordset
Set myData = CurrentDb
strSQL = "SELECT Sum(SottoCarichi.Qt) AS TotCar
FROM SottoCarichi " _
& "WHERE SottoCarichi.IDArticolo = " & Me!IDArticolo
Set myCar = myData.OpenRecordset(strSQL)
strSQL = "SELECT Sum(SottoScarichi.Qt) AS TotSca
FROM SottoScarichi " _
& "WHERE SottoScarichi.IDArticolo = " & Me!IDArticolo
Set mySca = myData.OpenRecordset(strSQL)
strSQL = "SELECT Sum(SottoRese.Qt) AS TotRese
FROM SottoRese " _
& "WHERE SottoRese.IDArticolo = " & Me!IDArticolo
Set myRese = myData.OpenRecordset(strSQL)
dGia = 0#
If Not IsNull(myCar!TotCar) Then
dGia = dGia + myCar!TotCar
End If
If Not IsNull(mySca!TotSca) Then
dGia = dGia - mySca!TotSca
End If
If Not IsNull(myRese!TotRese) Then
dGia = dGia + myRese!TotRese
End If
mySca.Close
myCar.Close
myRese.Close
Set myData = Nothing
If Not IsNull(Me.Quantità.Text) Then
If Me.Quantità.Text <> "" Then
Me.Giacenza = dGia + CSng(Me.Quantità.Text)
Else
Me.Giacenza = dGia
End If
Else
Me.Giacenza = dGia
End If
Dim vVal, vImposta, vTotale As Currency
vVal = 0#
vImposta = 0#
vTotale = 0#
If Not IsNull(Me!IDArticolo) Then
vVal = Me.Prezzo
If Not IsNull(Me.Quantità) And Me.Quantità <> "" Then
vVal = vVal * CSng(Me.Quantità)
vImposta = vVal * Me.Iva
vTotale = vVal + vImposta
End If
End If
Me.Importo = vVal
Me.Imposta = vImposta
Me.Totale = vTotale
End Sub
Private Sub Matricola_Articolo_AfterUpdate()
If IsNull(Me!IDArticolo) Then Exit Sub
Dim lVal As Long, fScorta As Single
lVal = DLookup("IDUM", "Articoli",
"IDArticolo = " & Me!IDArticolo)
If Not IsNull(lVal) Then
Me.Unità_di_Misura = lVal
End If
fScorta = DLookup("ScortaMin", "Articoli",
"IDArticolo = " & Me!IDArticolo)
If IsNull(fScorta) Then
fScorta = 0#
End If
Dim myData As dao.Database, strSQL As String, dGia As Single
Dim myCar As dao.Recordset, mySca As dao.Recordset,
myRese As dao.Recordset
Set myData = CurrentDb
strSQL = "SELECT Sum(SottoCarichi.Qt) AS TotCar
FROM SottoCarichi " _
& "WHERE SottoCarichi.IDArticolo = " & Me!IDArticolo
Set myCar = myData.OpenRecordset(strSQL)
strSQL = "SELECT Sum(SottoScarichi.Qt) AS TotSca
FROM SottoScarichi " _
& "WHERE SottoScarichi.IDArticolo = " & Me!IDArticolo
Set mySca = myData.OpenRecordset(strSQL)
strSQL = "SELECT Sum(SottoRese.Qt) AS TotRese
FROM SottoRese " _
& "WHERE SottoRese.IDArticolo = " & Me!IDArticolo
Set myRese = myData.OpenRecordset(strSQL)
dGia = 0#
If Not IsNull(myCar!TotCar) Then
dGia = dGia + myCar!TotCar
End If
If Not IsNull(mySca!TotSca) Then
dGia = dGia - mySca!TotSca
End If
If Not IsNull(myRese!TotRese) Then
dGia = dGia + myRese!TotRese
End If
mySca.Close
myCar.Close
myRese.Close
Set myData = Nothing
Me.Giacenza = dGia
Me.Scorta_Minima = fScorta
Me.Prezzo = DLookup("Prezzo", "Articoli",
"IDArticolo = " & Me!IDArticolo)
Me.Iva = DLookup("Iva", "Articoli",
"IDArticolo = " & Me!IDArticolo)
Dim vVal, vImposta, vTotale As Currency
vVal = 0#
vImposta = 0#
vTotale = 0#
If Not IsNull(Me!IDArticolo) Then
vVal = Me.Prezzo
If Not IsNull(Me.Quantità) And Me.Quantità <> "" Then
vVal = vVal * CSng(Me.Quantità)
vImposta = vVal * Me.Iva
vTotale = vVal + vImposta
End If
End If
Me.Importo = vVal
Me.Imposta = vImposta
Me.Totale = vTotale
End Sub
Private Sub Matricola_Articolo_DblClick(Cancel As Integer)
On Error GoTo Err_Codice_DblClick
Dim lArt As Long
lArt = 0
If Not IsNull(Me!IDArticolo) Then
lArt = Me!IDArticolo
DoCmd.OpenForm "Articoli", , , , , acDialog, Me!IDArticolo
Else
DoCmd.OpenForm "Articoli", , , , , acDialog, "GoToNew"
End If
lArt = CLng(GetSetting("Calus", "RetVal", "Last", 0))
DeleteSetting "Calus", "RetVal"
If lArt <> 0 Then
Me!IDArticolo = lArt
Dim lUM As Long
lUM = DLookup("IDUM", "Articoli", "IDArticolo = " & lArt)
If Not IsNull(lUM) And lUM > 0 Then
Me!IDUM = lUM
Me.Unità_di_Misura.Requery
End If
End If
Me.Descrizione_Articolo.Requery
Me.Matricola_Articolo.Requery
Exit_Codice_DblClick:
Exit Sub
Err_Codice_DblClick:
MsgBox Err.Description
Resume Exit_Codice_DblClick
End Sub
Private Sub Matricola_Articolo_NotInList(NewData As String,
Response As Integer)
MsgBox "Fare doppio click sul campo per inserire
un nuovo articolo!"
Response = acDataErrContinue
End Sub
Private Sub Unità_di_Misura_DblClick(Cancel As Integer)
On Error GoTo Err_UniMis_DblClick
Dim lUM As Long
lUM = 0
If Not IsNull(Me!IDUM) Then
lUM = Me!IDUM
DoCmd.OpenForm "UnMis", , , , , acDialog, Me!IDUM
Else
DoCmd.OpenForm "UnMis", , , , , acDialog, "GoToNew"
End If
lUM = CLng(GetSetting("Calus", "RetVal", "Last", 0))
DeleteSetting "Calus", "RetVal"
If lUM <> 0 Then Me!IDUM = lUM
Me.Unità_di_Misura.Requery
Exit_UniMis_DblClick:
Exit Sub
Err_UniMis_DblClick:
MsgBox Err.Description
Resume Exit_UniMis_DblClick
End Sub
Private Sub Unità_di_Misura_NotInList(NewData As String,
Response As Integer)
MsgBox "Fare doppio click sul campo per inserire
una nuova unità di misura!"
Response = acDataErrContinue
End Sub
Il codice proposto sembra chiaro e conciso, ma se aveste bisogno di aiuto vi invito ad iscrivervi nel nostro forum e chiedere ai nostri esperti.
<< Lezione Precedente - Lezione Successiva >>


