Ciao Phil e grazie per la risposta.
Nel frattempo ho fatto un po' di debug ed ho scoperto una cosa interessante. A causare la perdita di focus sul record attuale della subform centrale (per la scelta del paziente) non è il requery dell'altra sottomaschera, bensì il codice che ho associato all'evento "su modifica" di una combobox che serve alla scelta del prodotto da immettere.
Come ho già spiegato in altri post, vorrei che l'utente possa digitare una stringa nella combobox e trovare tutti i prodotti che iniziano con quella stringa ma anche quelli che la contengono.
A tale scopo ho scritto questo codice:
Private Sub cboIDProdotto1_Change()
Dim strR As String
Dim strSQL As String
'Me!cboIDProdotto1.SetFocusstrR = Me!cboIDProdotto1.Text
If Not IsNull(Me!cboIDProdotto1.Text) Then
strSQL = "SELECT tabProdotti.IDProdotto, tabProdotti.Descrizione" & _
" FROM tabProdotti" & _
" WHERE (tabProdotti.Descrizione LIKE " & Chr$(34) & "*" & strR & "*" & Chr$(34) & ")" & _
" ORDER BY tabProdotti.Descrizione; "
Me!cboIDProdotto1.RowSource = strSQL
Me.cboIDProdotto1.Dropdown
End If
End Sub
Se rinuncio a questo codice, il problema non si presenta più. Avevo già in mente di provare a trovare sistemi alternativi a questo metodo, li proverò e vedrò se la cosa risolve anche la perdita del focus.
Detto questo, mi piacerebbe comunque capire cosa non funziona.
Per rispondere alle tue domande.
Il codice che ho linkato prima parte al click del pulsante Inserisci (controllo posto nella maschera principale frmNuovaPrestazione). L'utente sceglie il prodotto dal menu della combobox e poi clicca il pulsante che fa partire l'inserimento del nuovo record nella maschera.
Il tuo procedimento lo capisco, ed è esattamente quello che tento di fare.
Ho adattato il mio codice originale seguendo i tuo consigli.
Ecco la situazione attuale:
Private Sub cmdInserisci1_Click()
'Verifico compilazione Prodotto e Quantità
If IsNull(Me.cboQuantita1) Then
MsgBox "Inserire una quantità!", vbExclamation + vbOKOnly, "Quantità mancante"
Else
If IsNull(Me.cboIDProdotto1) Then
MsgBox "Scelgiere un prodotto dalla lista!", vbExclamation + vbOKOnly, "Prodotto mancante"
Else
'Ricavo Descrizione Prodotto
Dim DescrizioneProdotto As String
DescrizioneProdotto = DLookup("Descrizione", "tabProdotti", "IDProdotto = " & Me.cboIDProdotto1)
'Ricavo IDListino
Dim Listino As Integer
Listino = DLookup("IDListino", "tabClienti", "IDCliente =" & Me.cboIDCliente)
'Ricavo Prezzo Unitario
Dim Prezzo As Double
Prezzo = retrieveIdPrezzoUnitario(Me.cboIDProdotto1, Listino, Me.Data)
'Ricavo IDTipoIVA
Dim TipoIVA As Integer
TipoIVA = DLookup("IDTipoIva", "tabProdotti", "IDProdotto =" & Me.cboIDProdotto1)
'Ricavo SubTotale
Dim SubToto As Double
'Casi particolari
If Me.cboIDProdotto1 = 226 Or Me.cboIDProdotto1 = 235 Or Me.cboIDProdotto1 = 236 Or Me.cboIDProdotto1 = 239 Or Me.cboIDProdotto1 = 240 Then
SubToto = Round(Prezzo * Me.cboQuantita1 + 11, 1)
Else
SubToto = Round(Prezzo * Me.cboQuantita1, 1)
End If
'Inizio inserimento nuovo record
Dim wrk As DAO.Workspace
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim Prestazione As Long
Set wrk = DBEngine.Workspaces(0)
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tabDettagliPrestazioni")
'Passo il focus sulla subformDettaglioPrestazioni per forzare l'immissione del record nella tabPrestazioni (la tabella della main form)
Me.SubForm1.SetFocus
'Creo il nuovo record in Tabella Dettagli Prestazioni
rst.AddNew
rst![PrezzoUnitarioDef] = Prezzo
rst![IDIntestazionePrestazione] = Forms!frmNuovaPrestazione!subfrmPazientiFrmNuovaPrestazione.Form.IDIntestazionePrestazione
rst![IDProdotto] = Me.cboIDProdotto1
rst![Quantita] = Me.cboQuantita1
rst![Descrizione] = DescrizioneProdotto
rst![SubTotale] = SubToto
rst![IDTipoIva] = TipoIVA
rst![IDPrestazione] = Me.IDPrestazione
rst.Update
'Mi sposto sull'ultimo record
Me.SubForm1.Form.Requery
DoCmd.GoToRecord , , acLast
'Pulisco le combobox per la scelta Prodotto
Me.cboIDProdotto1 = ""
Me.cboIDProdotto1.RowSource = "SELECT tabProdotti.IDProdotto, tabProdotti.Descrizione FROM tabProdotti ORDER BY tabProdotti.Descrizione;"
Me.cboQuantita1 = ""
rst.Close
dbs.Close
wrk.Close
Set rst = Nothing
Set dbs = Nothing
Set wrk = Nothing
'Qui vorrei riposizionarmi sul record corretto della subfrmPazientiFrmNuovaPrestazione
Dim longIDIntestazione As Long
Me!SubForm1.Form.RecordsetClone.Bookmark = Me!SubForm1.Form.RecordsetClone.LastModified
longIDIntestazione = Me!SubForm1.Form.RecordsetClone![IDIntestazionePrestazione].Value
Me!subfrmPazientiFrmNuovaPrestazione.Form.RecordsetClone.FindFirst "[IDIntestazionePrestazione] =" & longIDIntestazione
Me!subfrmPazientiFrmNuovaPrestazione.Form.Recordset.Bookmark = Me!subfrmPazientiFrmNuovaPrestazione.Form.RecordsetClone.Bookmark
End If
End If
Exit Sub
End Sub
Continuo comunque ad ottenere lo stesso errore, la riga evidenziata è la prima riguardante il tentativo di riposizionamento, cioè
Me!SubForm1.Form.RecordsetClone.Bookmark = Me!SubForm1.Form.RecordsetClone.LastModified