CASELLA COMBINATA-rs.FindFirst se trova due record uguali rimane sul primo

Anonimo
2016-12-19T12:15:27+00:00

In una maschera ho inserito la seguente casella combinata

Private Sub CasellaCombinata324_AfterUpdate()

    ' Trova il record corrispondente al controllo

    Dim rs As Object

    Set rs = Me.Recordset.Clone

    rs.FindFirst "[COGNOMENOM] = '" & Replace(Me![CasellaCombinata324], "'", "''") & "'"

    If Not rs.EOF Then Me.Bookmark = rs.Bookmark

End Sub

nella lista ho due o più record uguali e rimane selezionato il primo record, come posso aprire il secondo ?

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

4 risposte

Ordina per: Più utili
  1. Anonimo
    2017-01-06T18:21:51+00:00

    Scusa ma l'influenza ...

    Dicevo aggiungi alla combo qualche altra informazione che possa discriminare i duplicati e comanda il tutto dall'Id.

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-12-20T18:09:02+00:00

    Ti ringrazio purtroppo si tratta di un vecchio database nel quale hanno messo le mani in molti, sarebbe necessario reimpostare tutto ma non mi è concesso e mi devo limitare ad inserire solo la semplice casella combinata in questione

    altrimenti fa TILT ed inoltre sono almeno 15 anni che non tocco più Access comunque proverò a rispolverare i ricordi seguendo i tuoi consigli.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-12-19T20:12:43+00:00

    ciao Alvaro,

    essendo la combo box che stai utilizzando un controllo della form sincronizzata direi che puoi appoggiarti alla proprietà recordSetClone anziché clonare il recordset della form stessa, che settato ad object rallenta un po' l'esecuzione.

    Ti consiglierei altresì di modificare il nome dei controlli che utilizzi quel CasellaCombinata324 ad access dice tutto ora  e te pure, tra due giorni navigherai nella form alla ricerca disperata della combo CasellaCombinata324 e se il numero finale dovesse corrispondere anche al numero di controlli della form ti auguro di essere molto fortunato nella ricerca o di avere molta memoria :-).

    Battute a parte qualora, la possibilità che i casi di omonimia dovessero essere molteplici, più di due, o N, a me è venuto in mente, post sincronizzazione della form di aprire una form sussidiaria mostrando tutti records omonimi.

    Chiaramente la form si apre solo nel caso in cui il cliente selezionato sia effettivamente un caso di omonimia.

    Siccome in questi giorni ce l'ho con gli eventi pubblici ho pensato di ri-sincronizzare la form chiamata su doppio click della listbox che mostra gli omonimi, la listbox è contenuta nella form sussidiaria.

    Sfruttando il fatto che le form sono classi, il recordSource della listbox è una proprietà della form chiamata stessa richiamata su caricamento della form sussidiaria ( si poteva agire anche in altro modo....)

    I records duplicati sono quelli rettagolati in rosso come da immagini che seguono :

    tutti gli altri sono singoli.

    questo codice su evento doppio click sincronizza la form, controlla e apre la form sussisidiaria in caso di duplicati :

    Private Sub cboCliente_AfterUpdate()

    With Me.RecordsetClone

        .FindFirst "idcust=" & Me.cboCliente.Column(2)

        If Not .NoMatch Then

            Me.Bookmark = .Bookmark

            If DCount("IDCliente", "clienti", "IDCliente='" & Me.cboCliente & "'") > 1 Then

                DoCmd.OpenForm "clientiDoppione", acNormal

            End If

        End If

    End With

    End Sub

    su caricamento della form sussidiaria assegni il rowSource alla listbox, verificando la che form main sia caricata :

    Private Sub Form_Load()

    If (SysCmd(acSysCmdGetObjectState, acForm, myForm) <> 0) Then

        Dim frm As Access.Form

        Set frm = Forms(myForm)

        Me.lstCustomer.RowSource = frm.myRowSource

        Set frm = Nothing

    End If

    End Sub

    questa la property della main form :

    Public Property Get myRowSource() As String

    Dim strSql As String

    strSql = "select idcliente, nomesocieta, idCust from clienti where idcliente='" & Me.cboCliente & "'"

    myRowSource = strSql

    End Property

    su doppio click della listbox :

    Private Sub lstCustomer_DblClick(Cancel As Integer)

    If (SysCmd(acSysCmdGetObjectState, acForm, myForm) <> 0) Then

        Forms(myForm).SetFocus

        RaiseEvent syncForm(Me.lstCustomer.Column(2))

    End If

    End Sub

    se la form main è caricata scateni l'evento passando ad esso l'ID univoco questa volta del cliente scelto, sincronizzando la main form ancora una volta :

    Private Sub frmC_syncForm(ByVal lngCustomer As Long)

        With Me.RecordsetClone

            .FindFirst "idcust=" & lngCustomer

            If Not .NoMatch Then

                Me.Bookmark = .Bookmark

            End If

        End With

    End Sub

    tutto questo lo trovi per semplicità e studio nella demo caricata qui .

    Apri la form cliente scegli uno dei due clienti duplicati, e risicronizza la form main nuovamente su doppio click,

    Ho mantenuto nella form e nella listbox gli idCust univoci in modo che tu possa effettivamente vedere che l'id scelto è quello giusto, è un'evidenza maggiore che si può anche eliminare.

    Ciao!

    Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-12-19T13:47:53+00:00

    Ciao,

    la tua combo dovrebbe basarsi su 2 campi (almeno), l'ID e COGNOMENOM. Il posizionamento lo devi effettuare utilizzando l'ID (che è un campo univoco).

    Ciao Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento