Maschera Access con istanze multiple

di il
20 risposte

Maschera Access con istanze multiple

In una maschera "tipo continua"di un dbLibri, ho una serie di record, ed a fianco del record, sulla destra, un pulsante "Apri Scheda".
Apro una scheda, e compare il relativo record; ma se apro un'altra scheda, la prima scheda scompare ed appare la seconda scheda aperta.
Vorrei poter aprire e visualizzare contemporaneamente più schede dalla maschera principale. Come si può fare ?

Ho trovato su internet vari tutorial (alcuni, forse colpa mia, non riesco a capirli quando spiegano) e codici VBA, ma questi ultimi non riesco ad adattarli alle mie esigenze.

Chi mi può aiutare ?

20 Risposte

  • Re: Maschera Access con istanze multiple

    Aprire istanze multiple di una Maschera non è complicato... ma nemmeno banale.
    Esempio:
    Dim frmMulti As Form
    Private Sub cmdNewInstance_Click()
        Set frmMulti = New Form_frmClient
        frmMulti.SetFocus
    End Sub
    
    Il problema, nel tuo caso ma anche per tutti, è che non usando più il comando OpenForm non potrai filtrare i dati passandoli come WHERECONDITION... servirà gestire un modo per passare il criterio... dovrai pertanto predisporre una Sub/Function public da invocare da fuori affinché gestisca il filtro.... se non lo fai aprirai istanze sempre sul 1° record e non su quello attivo nella prima form.

    La cosa di solito è più complessa se la si vuole gestire bene... serve una collection ed i metodi per recuperare le istanze... ma magari più avanti.
    Qui trovi un mio esempio abbastanza strutturato... non è semplicissimo :

    Puoi scaricare il demo rinominarlo con estensione ZIP e scompattarlo.

    Ora fai qualche passo per andare nella direzione giusta.
  • Re: Maschera Access con istanze multiple

    Sul pulsante "Apri Scheda" della maschera su cui voglio le istanze multiple, in Proprietà - Evento - Su Clic ho scritto il seguente codice:
    
    Option Compare Database
    Option Explicit
    Dim frmX As Form
        
    
    Private Sub cmdOpenNewBook_Click()
    
       Set frmX = New Form_ELENCO_LIBRI_ISTANZE_MULTIPLE
       frmX.SetFocus
    End Sub
    Funziona bene, nel senso che mi apre più volte la maschera principale.
    Ma a me interessa aprire la scheda del singolo record, relativo al singolo libro, e non tutta la maschera con tutti i record di tutti i libri.
    Ho anche creato una maschera "Apri Scheda" di tipo singola, affinché si apra questa cliccando sul pulsante "Apri Scheda".

    Dov'è il piccolo errore ?
  • Re: Maschera Access con istanze multiple

    Ti avevo spiegato esattamente questo nel mio post... rileggilo con attenzione... e ti ho pure dato la soluzione... perché essere superficiali...?
  • Re: Maschera Access con istanze multiple

    Sul web ho trovato il seguente codice VBA, che non so in che punto del VB lo devo mettere.
    (sulla scheda trovata su internet non è precisato !!)

    Questo codice vba serve per creare una collezione di maschere indipendenti tra loro
    
    Public MyCollection As New Collection
    
    Dim frm As Form
    Set frm = New Form_Clienti
    frm.Visible = True
    frm.Caption = "Clienti" & frm.Hwnd
    MyCollection.Add Item: = frm, Key: = CStr(frm.Hwnd)
    Set frm = Nothing
    
    All'evento Close della maschera secondaria va aggiunto il seguente codice vba:
    
    Dim obj As Object
    Dim Rimuovi As Boolean
    For Each obj In MyCollection
    	If obj.Hwnd = Me.Hwnd Then
    		Rimuovi = True
    	End If
    Exit For
    Next
    Set Obj = Nothing
    If Rimuovi = True Then
    	MyCollection.Remove CStr(Me.Hwnd)
    End If
    

    In entrambi i codici ci sono imprecisioni.
    Sono gradite correzioni.


    P.S.: il link postato al secondo messaggio, l'ho scaricato, rinominato, aperto i file, ma mi esce un avviso relativo ai sistemi a 64 bit e non riesce a leggere correttamente i files.

    Buona serata.
  • Re: Maschera Access con istanze multiple

    Ti rendi conto che quello che hai postato non ha nulla a che vedere con il tuo problema..?
    Quello che hai inutilmente scopiazzato e nemmeno capito, ma il bello è che ci vuoi pure le correzioni, serve solo per gestire le classi oggetto... e per te è sicuramente troppo avanzato ma nulla che può risolvere il tuo problema.

    Rifletti su quello che ti ho suggerito e cerca di capirlo... la soluzione è scritta li.
  • Re: Maschera Access con istanze multiple

    Da quello che ho capito, per risolvere questo caso devo:
    - creare una Public Sub in un modulo che abbia la seguente stringa di codice:
    in alto mettere:
    
    Option Compare Database
    Option Explicit
    Public clnLibri As New Collection
    
    e poi, tra le varie stringhe del codice aggiungere questa:
    
    clnLibri.Add Item:=frm, Key:=CStr(frm.Hwnd)
    
    Prima di completare la soluzione del caso, meglio studiare un pò di Visual Basic.

    Ho già tre libri su Access, due cartacei ed un e-book (di cui due sponsorizzati in una delle discussioni di questo forum), però in nessuno di quei libri si parla di come aprire tante maschere quante se ne vogliono, ed in modo indipendente tra loro, partendo dalla maschera principale.
    C'è qualche altra pubblicazione dove posso leggere/imparare ?
  • Re: Maschera Access con istanze multiple

    No, sei completamente fuori strada.
    Quel codice potrebbe proprio NON SERVIRE a NULLA nel tuo caso(come già ti ho scritto sopra), serve solo per avere sotto controllo le ISTANZE APERTE quando sono già aperte.
    Di fatto non si tratta di una gestione specifica nel caso di apertura di Maschere Multiple... per questo non troverai nulla nei libri, ma si tratta di un metodo STANDARD di gestione delle istanze delle CLASSI... e come classi intendo in senso generico Oggetti(di cui fanno parte i controlli, le Forms, i Reports, i moduli di classe ecc...).
    Quindi allargando un poco la mente, dopo aver la conoscenza teorica senza la quale ovviamente non possiamo parlare di queste cose, si può facilmente immaginare che questo metodo normale sia applicabile anche alle Maschere come Oggetti.
    Quindi si riempie una Collection di Oggetti e per ogni oggetto si sfrutta un Riferimento UNIVOCO per individuarla.
    Essendo sempre la Stessa Form, quella aperta, risulta ovvio non si possa usare il suo NOME per associare all'item della Collection una KEY... (devi sapere anche cosa sono le KEY delle collection)...!
    L'unico elemento UNIVOCO di una Form è il Puntatore o Handle(hWnd) che viene convertito in stringa ed usato come KEY... al fine di poter recuperare l'istanza dell'oggetto salvato nella Collection.
    Se non hai basi su questi concetti quello che ti ho scritto è inutile in quanto incomprensibile...

    Tu devi creare una Public Sub/Function, a seconda di come vuoi gestirla, nella Form che consenta di FILTRARE i dati con una condizione passata attraverso la chiamata della stessa ed un parametro...!
  • Re: Maschera Access con istanze multiple

    @Alex ha scritto:


    Tu devi creare una Public Sub/Function, a seconda di come vuoi gestirla, nella Form che consenta di FILTRARE i dati con una condizione passata attraverso la chiamata della stessa ed un parametro...!
    Questa Public Sub/Function va agganciata nella Form di tipo singola che mi visualizza il singolo record che voglio vedere, oppure nella Form di tipo continua dove ci sono tutti i record, tra cui posso scegliere chi visualizzare ?
  • Re: Maschera Access con istanze multiple

    Non va agganciata... non si agganciano...
    Una sub/Function è un metodo di un oggetto.
    Devi creare un metodo della maschera da aprire in MultiIstanza...
  • Re: Maschera Access con istanze multiple

    Una volta creata una Function, tipo OpenAClient() in una basPublic, poi questa va inserita negli eventi della maschera in corrispondenza del clic con questa dicitura: =OpenAClient()

    E se volessi gestire il tutto usando il comando Docmd.Openform per poi filtrare i dati ?
  • Re: Maschera Access con istanze multiple

    ProgrammD ha scritto:


    Una volta creata una Function, tipo OpenAClient() in una basPublic, poi questa va inserita negli eventi della maschera in corrispondenza del clic con questa dicitura: =OpenAClient()
    Cosa non ti è chiaro quando dico che deve essere un Metodo della Form..?
    Non va in un modulo esterno... devi creare una Public Sub/Function nel modulo di classe della Maschera... ed ovviamente deve avere il parametro contenente la WHERE condition che andrai ad applicare alla proprietà Filter...
    Volendo puoi direttamente usare la proprietà sull'istanza dell'oggetto.
    Ad esempio....
    
    Dim frm As Form
    Set frm = New Form_Clienti
    frm.Filter="idPk=" & Me!IdPk
    frm.FilterOn=true
    frm.Visible = True
    
    Poi cerca di capire il motivo per cui è indispensabile una collection.... e se veramente lo è...

    ProgrammD ha scritto:


    E se volessi gestire il tutto usando il comando Docmd.Openform per poi filtrare i dati ?
    Se, a questo punto del 3D tu dovessi fare una domanda simile direi che non hai capito per niente come si aprono istanze multiple e nemmeno del codice che hai copiao-incollato.
    Purtroppo siamo in difficoltà in 2... io che penso di parlare con chi capisce ciò che propone e tu che ascolti uno che ti dice cose che fatichi a gestire...
  • Re: Maschera Access con istanze multiple

    Non sono un ingegnere informatico né un esperto. Ho solo tre libri su Access su cui documentarmi, e purtroppo in tema di istanze multiple su maschera non c'era niente.
    Alcune discorsi fatti in questa discussione li ho anche capiti, però il mio limite è trasferirli nel VBA.
    Ci vorrà un pò di tempo.
    Saluti e grazie dell'interessamento alla mia discussione.
  • Re: Maschera Access con istanze multiple

    ProgrammD ha scritto:


    Non sono un ingegnere informatico né un esperto...
    Nemmeno io, faccio tutt'altro, in ogni caso questa non può essere la giustificazione.
    Se vuoi fare uso del VBA in un modo più avanzato, come sembra, c'è ben poco da fare... serve studiarlo, gli altri non possono sopperire alle lacune che ti impediscono di capire.
    L'alternativa è limitarsi alle macro ed all'uso base... ovviamente è una provocazione, io spero tu riesca a sfruttare la voglia di fare per migliorare.
  • Re: Maschera Access con istanze multiple

    @Alex ha scritto:


    
    Dim frm As Form
    Set frm = New Form_Clienti
    frm.Filter="idPk=" & Me!IdPk
    frm.FilterOn=true
    frm.Visible = True
    
    Ciao Alex,
    se ci sei ancora batti un colpo.
    Sto provando questo codice, ma ho l'impressione che i comandi .Filter e .FilternOn non vengano recepiti dalla istanza aperta.
    Ho notato che i filtri vengono applicati all'apertura dell'istanza successiva.
    Ma non capisco cosa sto sbagliando.
    Mi puoi aiutare?
    Grazie
Devi accedere o registrarti per scrivere nel forum
20 risposte