Sto avendo dei problemi nella gestione delle maschere relative a due tabelle in relazione uno a molti. Dei problemi ne sto parlando in questo 3D ma la discussione è andata abbondantemente off topic, per cui continuo qui.
Tali problemi mi fanno sorgere il dubbio che ci sia un errore di base nelle relazioni tra le tabelle, quindi vorrei gentilmente chiedere il vostro parere a tal proposito.
Tabelle:
- tabPrestazioni (LATO UNO): IDPrestazione (PK), IDCliente, Data, Sconto, ecc
- tabDettagliPrestazioni (LATO MOLTI): IDDettagliPrestazione (PK), IDPrestazione(FK), IDPaziente, IDProdotto, Descrizione, PrezzoUnitarioDef, Quantità, SubTotale, Sconto
La tabPrestazioni rappresenta in sostanza la testata della fattura, mentre la tabDettagliPrestazioni le singole righe.
Si tratta di prestazioni generate da un ambulatorio veterinario e questo complica leggermente le cose, dato che l'intestazione fattura fa riferimento al Cliente (il proprietario dell'animale), mentre i dettagli al Paziente (l'animale, ragione per la quale compare IDPaziente nella tabDettagliPrestazioni).
Il problema nasce al momento in cui l'utente vuole immettere nuove prestazioni, creando record nelle rispettive tabelle.
Ho creato un classico sistema Form - SubForm.
Quindi l'utente dovrà immettere nuovi record nel Form (una nuova testata) e al contempo nuovi record nel subfrom (le singole righe).
Se uso un sistema di immissione dati con controlli associati nella form e nella subform l'inserimento procede senza problemi.
Vorrei invece poter utilizzare un pulsante nella form che crei un nuovo record nella subform (nel suo recordset) dopo aver raccolto i dati da controlli non associati. In questo caso ottengo diversi errori.
Ho provato con il metodo
Recordset.AddNew
...
...
...
RecordSet.Update
Se agisco solo sul recordset della tabella figlia, non mi fa fare l'update e ricevo come messaggio di errore
Impoossibile aggiungere o modificare il record. Nella tabella tabPrestazioni è necessario un record correlato.
Questo, credo io, perchè la tabelle sono collegate da una relazione che utilizza la chiave primaria della tabella madre, che al momento dell'interazione del pulsante nella maschera non è ancora stata immessa in tabella.
Ho perciò provato a inserire prima un nuovo record nel Recordset della tabella tabPrestazioni, recuperare l'IDPrestazione così generato e inserire poi il record nel Recordset della tabella figlia:
Private Sub cmdInserisci_Click()
'Ricava Descrizione Prodotto
Dim DescrizioneProdotto As String
DescrizioneProdotto = DLookup("Descrizione", "tabProdotti", "IDProdotto = " & Me.cboIDProdotto)
'Ricava IDListino
Dim Listino As Integer
Listino = DLookup("IDListino", "tabClienti", "IDCliente =" & Me.cboIDCliente)
'Ricava Prezzo Unitario
Dim Prezzo As Double
Prezzo = retrieveIdPrezzoUnitario(Me.cboIDProdotto, Listino, Me.Data)
Dim wrk As DAO.Workspace
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim rst2 As DAO.Recordset
Dim Prestazione As Long
Set wrk = DBEngine.Workspaces(0)
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tabDettagliPrestazioni")
Set rst2 = dbs.OpenRecordset("tabPrestazioni")
'Tabella Prestazioni
rst2.AddNew
rst2![IDCliente] = Me.cboIDCliente
rst2![Data] = Me.Data
rst2.Update
rst2.Bookmark = rst2.LastModified
Prestazione = rst2!IDPrestazione
'Tabella Dettagli Prestazioni
rst.AddNew
rst![PrezzoUnitarioDef] = Prezzo
rst![IDPrestazione] = Prestazione
rst![IDPaziente] = Me.cboIDPaziente
rst![IDProdotto] = Me.cboIDProdotto
rst![Quantità] = Me.txtQuantita
rst![Descrizione] = DescrizioneProdotto
rst![SubTotale] = Round(rst![PrezzoUnitarioDef] * rst![Quantità], 1)
rst.Update
Me.frmDettaglioPrestazioniProva.Form.Requery
rst.Close
dbs.Close
wrk.Close
Set rst = Nothing
Set dbs = Nothing
Set wrk = Nothing
Exit Sub
End Sub
In questo modo i record vengono correttamente aggiornati nelle tabelle, ma il requery finale della subform non mi mostra i nuovi record.
Questa è la ragione che mi fa sospettare un problema di base nelle relazioni tra le due tabelle, ma dopo molto tempo passato a ragionare mi sono perso.
Avrei bisogno del vostro aiuto.
Grazie a chiunque voglia leggere il romanzo e darmi una mano.