CREARE UNA MASCHERA POPUP CHE RICERCHI UN RECORD IN UNA MASCHERA

Anonimo
2016-09-03T15:33:18+00:00

Buongiorno a tutti.

Vorrei copiare la maschera di access trova e sostituisci senza la scheda sostituisci.

Ho la mia maschera "clienti" aperta .

Con un azione vbkey sul campo "RagioneSocialeCliente apro una maschera popup "MascheraCerca" non associata dove ho una casella di testo "txtRicerca" e un pulsante "cerca"

Inserendo nella  "txtRicerca" il nome del cliente , vorrei che il codice sull'evento click del pulsante "cerca" mi trovi il record corrispondente nella maschera "clienti".

Il problema che la maschera popup la uso per diverse maschere e non posso dare nel codice riferimenti di nome maschera e controllo dove poi effettuare la ricerca.

Ci vorrebbe un codice che faccia la ricerca sul campo attivo della maschera clienti e trovi il valore contenuto nel campo "txtRicerca" .

grazie

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
Risposta accettata dall'autore della domanda
Anonimo
2016-09-13T18:07:11+00:00

ciao Cristian_boy,

si molto più chiaro ora, devo dire che con un pizzico di intuizione in più avrei potuto capirlo...ma....vabbè....

procederei in questo modo...

modulo pubblico :

Option Compare Database

Option Explicit

Public myControlSource As String

Public myControlName   As String


modulo di classe clsControls ( chiamalo proprio clsControls)

Option Compare Database

Option Explicit

Private WithEvents mytxt As Access.TextBox

Public Sub getTxtBox(ByVal txt As Access.TextBox)

    Set mytxt = txt

    mytxt.OnGotFocus = "[event procedure]"

End Sub

Private Sub mytxt_GotFocus()

    myControlSource = mytxt.ControlSource

    myControlName = mytxt.Name

End Sub


evento load della form Clienti1:

Private Sub Form_Load()

Dim cls As clsControls

Dim Ctl As Control

Set col = New VBA.Collection

For Each Ctl In Me.Controls

    If TypeName(Ctl) = "textBox" Then

       Set cls = New clsControls

       cls.getTxtBox Ctl

       col.Add cls, Ctl.Name

    End If

Next

Set Ctl = Nothing

Set cls = Nothing

End Sub

ed in testa al modulo di classe della form clienti1 dichiari :

Option Compare Database

Option Explicit

Private WithEvents fmrCustomer As Form_trova

Private col As VBA.Collection

evento su scaricamento della form clienti1 :

Private Sub Form_Unload(Cancel As Integer)

Dim i As Long

DoCmd.Close objecttype:=acForm, _

            objectname:="trova"

For i = col.Count To 1 Step -1

    col.Remove i

Next

Set col = Nothing

End Sub

ed infine evento di classe della form client1 da modificare come segue :

Private Sub fmrCustomer_findCustomer(strCliente As String)

Dim fld As DAO.Field

Dim strFld As String

With Me.RecordsetClone

        .FindFirst myControlSource & "=""" & strCliente & """"

        If .NoMatch Then

             VBA.MsgBox "Nessuna corrispondenza individuata", vbCritical, "Warning!"

        Else

            Me.Controls(myControlName).SetFocus

            Me.Bookmark = .Bookmark

            DoCmd.Close objecttype:=acForm, objectname:="trova"

        End If

End With

End Sub

sostanzialmente, aprendo la form client1 e la form trova, scrivi quello che devi cercare nella textBox della form trova, ti sposti sul controllo ( non sul campo, controlli nelle forms e reports, campi in tabelle e queries), in quel mentre memorizzi il controlSource del controllo indicato e se trovi la corrispondenza clicclando sul command button preposto, la form si chiude,ti sposti il focus su quel controllo e sincronizzi il bookmark.

Se non trovi la corrispondenza, ottieni un messaggio di avviso.

La classe clsControls si occupa di gestire l'evento su attivazione (onGotFocus) ereditandone l'evento.

Ovviamente può essere esteso ad altri tipi di controllo intervenendo opportunamente.

HTH.

Ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2016-09-13T13:19:33+00:00

Ciao,

nella maschera di tipo continuo, dovresti attivare la funzione di ricerca passandogli il control-source del campo corrente

nel tuo esempio RagioneSocialeCliente.

Nella funzione di ricerca acquisisci ila stringa da ricercare quindi utilizzi parmField che ti è stato passato.

With Screen.ActiveForm.RecordsetClone

        .FindFirst parmField & " = '" & strValore & "'"

        If .NoMatch Then

             VBA.MsgBox "Nessuna corrispondenza individuata", vbCritical, "Warning!"

             Exit Function

        End If

        Screen.ActiveForm.Bookmark = .Bookmark

End With

Non l'ho provata.

Ciao Mimmo

P.s. All'attivazione della funzione (prima di aprire la maschera popup) aggiungi:

 Dim myForm As Form

  Set myForm = Screen.ActiveForm

quindi utilizzi myForm.RecordsetClone

La risposta è stata utile?

0 commenti Nessun commento

4 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-09-12T21:43:43+00:00

    Ciao Sandro

    Scusami ma non sono stato chiaro , il mio era un esempio quando facevo riferimento al cliente. Vorrei ricercare un valore contenuto in un campo della maschera dove ho il focus prima di perderlo nell'aprire la maschera trova.

    Se ho 30 campi nella maschera mi posiziono su uno qualsiasi , apro la maschera trova, compilo il campo e il db mi ricerca il valore sulla maschera cliente , fornitore , agente, contatto ecc ecc.

    E' possibile?

    grazie anche per l'esempio.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-09-12T17:39:42+00:00

    Ciao Sandro

    Sono rientrato oggi, provo e ti faccio sapere.

    Per il momento grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-09-04T07:11:18+00:00

    ciao Christian_boy,

    prova a sincronizzare la form oggetto di ricerca con un evento di classe:

    codice della form oggetto di ricerca:

    Option Compare Database

    Option Explicit

    Private WithEvents fmrCustomer As Form_trova

    '

    Private Sub cmdTrova_Click()

    If Not CurrentProject.AllForms("trova").IsLoaded Then

           DoCmd.OpenForm FormName:="trova", _

                          View:=acNormal

           Set fmrCustomer = Forms!trova

    End If

    End Sub

    Private Sub fmrCustomer_findCustomer(strCliente As String)

    With Me.RecordsetClone

            .FindFirst "idcliente='" & strCliente & "'"

            If .NoMatch Then

                 VBA.MsgBox "Nessuna corrispondenza individuata", vbCritical, "Warning!"

            End If

            Me.Bookmark = .Bookmark

    End With

    End Sub

    Private Sub Form_Unload(Cancel As Integer)

    DoCmd.Close objecttype:=acForm, _

                objectname:="trova"

    End Sub

    codice della form chiamata :

    Option Compare Database

    Option Explicit

    Public Event findCustomer(strCliente As String)

    '

    Private Sub cmdFindCustomer_Click()

        RaiseEvent findCustomer(Me.txtCliente)

    End Sub

    qui trovi una demo.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento