Chiarimenti su DoCmd.OpenForm

di il
10 risposte

Chiarimenti su DoCmd.OpenForm

Salve a tutti!
Con questo Post vorrei chiedervi un consiglio su quale sia il modo migliore per ottenere un certo risultato.

Premessa: Mrs_A e Msr_B sono nomi di maschere
Supponiamo che io mi trovo in Msr_A e voglio aprire la Msr _B dove il campo ID di Msr _B è uguale al campo ID di Msr_A. In questo caso il codice potrebbe essere:
DoCmd.OpenForm "Msr _B", acNormal, , "[ID] =" & Me.ID.Value
Oppure:
DoCmd.OpenForm "MascheraElencoDetenuti", acNormal, , "[IDDETENUTO] =" & [Forms]![ Msr _A]![ID]
Apro solo una curiosità riguardo le due sintassi:
[Forms]![ Msr _A]![ID]
Form_ Msr _A.ID
Credo che siano due modi diversi per definire la stessa cosa ma volevo solo la conferma perché non si sa mai

Ora passiamo alla domanda:
quando scrivo
DoCmd.OpenForm "Msr _B", acNormal, , "[ID] =" & Me.ID.Value
mi apre Msr_B e sul campo ID trovo lo stesso record di Msr_A però non posso spostarmi tra i record successivi e precedenti in quanto la Form è filtrata.
Per ovviare a questo io scrivo:
   DoCmd.OpenForm "Msr _B", acNormal
    Dim rst As Object
    Set rst = Form_ Msr _A.RecordsetClone
    rst.FindFirst "[ID]=" & Me.ID.Value
    Form_ Msr _B.Bookmark = rst.Bookmark
    Set rst = Nothing
Tutto questo per dire che non voglio aprire una maschera filtrata su quel record ma voglio aprire la Msr_B in modo tale che si porti direttamente allo stesso ID di Msr_A consentendomi sempre gli spostamenti tra i Record precedenti e successivi.
Detto questo, ci sono altri modi per ottenere lo stesso risultato, caso mai scrivendo anche qualcosa in meno?

Grazie a tutti per il supporto!!

10 Risposte

  • Re: Chiarimenti su DoCmd.OpenForm

    I primi 2 codici sono "sostanzialmente" equivalenti. "Me" significa "oggetto in cui "io controllo" mi trovo". Di solito Me è la maschera stessa da cui parte il comando. L'altra sintassi è quella completa/estesa. Generalmente si preferisce per brevità e comodità la prima.

    Occhio a scrivere correttamente [Msr_A] o [Msr _A]...lo spazio prima di Msr mi sembra sbagliato/inopportuno.

    kris9951 ha scritto:


    Supponiamo che io mi trovo in Msr_A e voglio aprire la Msr _B dove il campo ID di Msr _B è uguale al campo ID di Msr_A.
    Cosa vuol dire per te "campo ID uguale a"? Tutto il discorso che avresti impiantato sembrerebbe far leva sulla presupposizione che Msr_B sia maschera collegata a Msr_A e gerarchicamente di livello inferiore, ossia B dovrebbe essere tabella figlia di A.

    kris9951 ha scritto:


    mi apre Msr_B e sul campo ID trovo lo stesso record di Msr_A però non posso spostarmi tra i record successivi e precedenti in quanto la Form è filtrata.
    È ovvio. Cosa vorresti ottenere altrimenti?
  • Re: Chiarimenti su DoCmd.OpenForm

    Ciao Osvaldo!
    Grazie per la risposta.

    Voglio ottenere e lo ottengo scrivendo
     DoCmd.OpenForm "Msr _B", acNormal
        Dim rst As Object
        Set rst = Form_ Msr _A.RecordsetClone
        rst.FindFirst "[ID]=" & Me.ID.Value
        Form_ Msr _B.Bookmark = rst.Bookmark
        Set rst = Nothing
    In parole povere apro la Form B nello stesso rerecord della Form A (entrambe le form fanno riferimento alla stessa query)

    In questo modo posso anche passare da un Record all’altro in quanto la Form non è stata filtrata.
    Volevo sapere se c’erano altri modi per ottenere lo stesso risultato
  • Re: Chiarimenti su DoCmd.OpenForm

    Non capisco quello che vuoi ottenere, ma mi pare che vada bene così. Magari scriverei questa riga
    rst.FindFirst "[ID]=" & Me.ID.Value
    così
    rst.FindFirst Me.ID.Value
  • Re: Chiarimenti su DoCmd.OpenForm

    Osvaldo, no credo proprio... lascia la riga di codice come l'avrebbe scritta lui che è giusto, tu hai inventato una cosa sbagliata.
  • Re: Chiarimenti su DoCmd.OpenForm

    Faccio 2 osservazioni:
    1) solitamente si lascia che l'oggetto da aprire sia autonomo
    2) il codice che usi, se la maschera fosse modale non funzionerebbe

    Quindi passa alla form B come parametro ARGS il valore del puntatore Me!ID.Value e su evento LOAD nella form B
    
    Private sub Form_Load()
        if len(Me.OpenArgs)>0 then
            With me.recordsetclone
                 .FindFirst "[ID]=" & Me.OpenArgs
                 If not .Nomatch then Me.Bookmark =.bookmark 
            End with
        End if
     End sub 
    Saluti
  • Re: Chiarimenti su DoCmd.OpenForm

    Bene!
    Grazie Alex!

    Non ho capito gran che ma la colpa è mia perché:
    - non so cosa sia una maschera modale (oppure non la conosco sotto questo termine)
    - non conosco OpenArgs e quindi non so a che serva

    Quindi devo necessariamente andarmeli a vedere
    Una volta averli capiti probabilmente riuscirò anche a comprendere il codice da mettere nell’evento Load.
    A prima vista, considerato che quel codice va messo nell’evento load della maschera che devo aprire (maschera B) non capisco dove si trova l’informazione del campo ID della maschera A...
  • Re: Chiarimenti su DoCmd.OpenForm

    OpenArgs è l'ultimo argomento di DoCmd.OpenForm. È una proprietà che si gestisce solo in VBA (non esiste nella lista proprietà di maschera e/o controlli). Detto questo OpenArgs svolge una funzione di "passa-testimone", ossia Msr_A passa a Msr_B una "informazione-stringa" che Msr_B accoglierà "dentro" di sè...nel proprio Me.OpenArgs.
  • Re: Chiarimenti su DoCmd.OpenForm

    Grazie Osvaldo!
    Ho capito perfettamente

    Ora passiamo alla riga successiva (abbi pazienza )
     If not .Nomatch then Me.Bookmark =.bookmark
    Vediamo se ho capito:
    se non è vero che il RecordsetClone non ha trovato riscontro allora la Form che viene aperta deve assumere il “segnaposto” del RecordsetClone

    Potrebbe essere giusto?
  • Re: Chiarimenti su DoCmd.OpenForm

    Si... altrimenti si apre al primo record... mentre tu devi spostarti in corrispondenza a quello passato in OpenArgs.
    Il recordsetclone consente di muoversi nel recordset di maschera senza disturbare l'interfaccia grafica che rallenterebbe molto... quando e se lo trova allora aggiorna il record attivo di maschera allineandolo a quello trovato nel recordsetclone.
  • Re: Chiarimenti su DoCmd.OpenForm

    Grande!
    Ho capito!!

    Grazie ragazzi!!
    Alla prossima!
Devi accedere o registrarti per scrivere nel forum
10 risposte