We continue our program for the creation of the warehouse Calus 2012 seeing how to insert windows to management of loading and unloading goods. Here’s how we create our window, in particular use the main pattern and detail.
To build this type of window we need a main form that contains a sub-form for details. In addition to fields such as number and date of movement, the main window has to filter the data, here is the VBA code:
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 "Double click the field to enter a new unit of measurement!" Response = acDataErrContinue End Sub