MS Access VBA – display costruiti dinamicamente i risultati SQL sottomaschera in visualizzazione foglio dati

Ho diversi anni di esperienza con VBA in applicazioni di MS Office (per l’automazione e processi ETL), ma non hanno avuto il bisogno di pasticciare con le Forme in MS Access fino a poco tempo fa. Sto stabilisce la progettazione semplice estrazione di dati moduli per un database ho creato e sto appeso su quello che sembra essere un compito semplice.

Obiettivo: ho bisogno di un foglio dati della sottomaschera per visualizzare i record restituiti da una dinamicamente integrato istruzione SQL da controlli sul form principale.

Sul mio form principale, ho un pulsante che, quando un utente fa clic sul pulsante per compilare le informazioni specificate dall’utente in altri controlli del form in una query SQL, e quindi eseguire la query in modo che una sottomaschera visualizza i record risultanti.

Non importa quello che faccio, non riesco a farlo funzionare. Io continuo a ricevere (la maggior parte del tempo comunque) microsoft visual basic errore di run-time “‘2467’: L’espressione che hai inserito si riferisce a un oggetto che è chiuso o non esiste.” Questo è l’errore che ottengo con il codice riportato di seguito. Io non riesco a capire se in qualche modo ho bisogno per iniziare la sottomaschera appena il codice viene eseguito, o che cosa. Ho provato alcune altre varianti di codice che non hanno lavorato da altro codice forum, ma mi sembra di aver trovato diversi thread del forum tra cui alcuni su Stack Overflow che suggeriscono che il codice che ho seguito dovrebbe funzionare.

L’immagine allegata mostra che la base principale forma assomiglia. Ho etichettato il pulsante che l’utente dovrà fare clic (btnDisplaySWData) per compilare il codice SQL che viene da creare ancora-a-essere-inclusi i controlli, ma non è questo il problema. Sto solo hard-codifica un’istruzione SQL come mostrato nel frammento di codice nel tentativo di capire questo problema. Come detto voglio il record da visualizzare nella sottomaschera denominato dataDisplaySubform. “SPAZZATURA” è una tabella nel database di Access che mi può legittimamente query con SQL seguente codice che sto usando solo per scopi di test fino a quando ho capire questo fuori. Tutto il codice nel modulo dati visualizzati (denominato frmDataExtract) è costituito da quello che è nella finestra del codice di seguito.
MS Access VBA - display costruiti dinamicamente i risultati SQL sottomaschera in visualizzazione foglio dati

Option Compare Database
Option Explicit
Public Sub btnDisplaySWData_Click()
    Dim pSQL As String
    pSQL = "SELECT JUNK.agency_ID, JUNK.agency_desc FROM JUNK"
    Me.dataDisplaySubform.Form.RecordSource = pSQL
End Sub

Il modulo denominato dataDisplaySubform, come illustrato nella seguente schermata delle proprietà della sottomaschera selezionato.

MS Access VBA - display costruiti dinamicamente i risultati SQL sottomaschera in visualizzazione foglio dati

Questo è ciò che la forma complessiva del layout sembra

MS Access VBA - display costruiti dinamicamente i risultati SQL sottomaschera in visualizzazione foglio dati

Ho raschiato diversi forum e siti hanno anche provato ogni variazione delle condizioni con la ricerca di Overflow dello Stack per trovare possibili soluzioni per il mio problema, ma nessuno ha lavorato anche quando il thread originale è stato segnato risolto con la persona che l’ha inviato. Ho passato troppo tempo, circa 2 giorni lavorativi, cercando di capire che cosa sto facendo di sbagliato e non sono ancora stati in grado di.

Apprezzo chiunque che può aiutare a guidare me nella giusta direzione, questo mi sta facendo impazzire.

grazie,
–TB

SOLUZIONE MODIFICA DA TURKISHGOLD

Io la penso così, l’ho capito sulla mia se HansUp ha contribuito a portare giù il percorso, con l’indicazione della sottomaschera Oggetto di Origine non avendo assegnato. Nel mio caso, assegnando l’Oggetto di Origine di una forma non era la soluzione corretta, che è quello che HansUp stava suggerendo. Invece di una query salvata sembra fare quello che voglio.

Non sono sicuro se c’è un modo migliore per fare questo, ma sembra che è necessario impostare un manichino, quasi segnaposto query, è possibile impostare la sottomaschera Oggetto di Origine in VBA.
Un segnaposto query come questa:

SELECT * FROM JUNK WHERE JUNK.agency_ID ="_";

Sopra query di Access viene salvato con il nome “TESTQUERY”. Non visualizza nulla, ma soddisfa l’esigenza di avere Origine un Oggetto assegnato a qualcosa di essenzialmente la creazione di istanze della sottomaschera quando si guarda la forma principale in visualizzazione maschera. Così, con il segnaposto query salvata, è quindi possibile riassegnare la proprietà RecordSource qualunque Stringa SQL è mettere insieme il via i controlli dell’interfaccia utente nella maschera principale, come questo:

Public Sub btnDisplaySWData_Click()
    Dim pSQL As String
    pSQL = "SELECT JUNK.agency_ID, JUNK.agency_desc FROM JUNK"
    Me.dataDisplaySubform.SourceObject = "Query.TESTQUERY"
    Me.dataDisplaySubform.Form.RecordSource = pSQL
    Me.dataDisplaySubform.Requery
End Sub

che quando il Modulo è in fase di produzione, l’hard-coded istruzione SQL stored in pSQL variabile stringa sarà messo insieme tramite l’input dell’utente in materia di controlli sulla form principale.

Così ora, quando il btnDisplaySWData è cliccato, fa quello che stavo cercando di fare e di visualizzare i record.
MS Access VBA - display costruiti dinamicamente i risultati SQL sottomaschera in visualizzazione foglio dati

Nome del sub la forma non ha NULLA a che fare con la forma di display. Schermata mostra CHIARAMENTE nessun modulo per il sub forma di controllo. Un sub modulo di controllo può essere inserito in un modulo, ma non visualizzerà alcuna forma FINO a quando si imposta l’oggetto di origine di proprietà di una legittima (esistente) forma. Senza un modulo per visualizzare, quindi nessuna fonte di dati può essere impostato. Quindi il fatto di avere il sub modulo di controllo nome corretto è discutibile finché si sceglie un modulo dall’elenco a discesa si vede in origine di proprietà di oggetto. Non c’è bisogno di usare o creare un manichino query qui. È necessario impostare la sorgente oggetto di proprietà = forma giuridica.

OriginaleL’autore turkishgold | 2014-01-21

4 Replies
  1. 1

    Se il “oggetto che è chiuso o non esiste” errore si verifica il Me.dataDisplaySubform.Form.RecordSource linea, è probabile che la sottomaschera controllo non è nominato dataDisplaySubform.

    È possibile esaminare i nomi di tutti i tuoi modulo controlli sottomaschera con questa modifica temporanea al codice …

    'Me.dataDisplaySubform.Form.RecordSource = pSQL
    Dim ctl As Control
    For Each ctl In Me.Controls
        If TypeName(ctl) = "SubForm" Then
            Debug.Print ctl.Name, TypeName(ctl)
        End If
    Next
    Stop

    Il Stop istruzione trigger di debug (pausa) modalità e prendere immediatamente la finestra in cui è possibile visualizzare i nomi di un modulo del controllo sottomaschera(s).

    Immagine che hai aggiunto alla domanda conferma che si sta utilizzando il nome corretto per il controllo della sottomaschera. Tuttavia, che la sottomaschera non ha nulla nel suo Oggetto di Origine proprietà. Poiché non vi è alcuna forma, la seconda parte del messaggio di errore, “non esiste”, si applica. Non c’è alcun tipo di riferimento Me.dataDisplaySubform.Form

    Ho modificato la mia domanda di cui sopra e mostra il Nome della Proprietà con la sottomaschera, che mostra denominata dataDisplaySubform. Ho anche eseguito il codice e ha ottenuto lo stesso risultato: nella finestra Immediata il nome del controllo è “dataDisplaySubform”.
    Mettere il nome di un modulo in Source Object proprietà.
    Il solo nome del modulo che posso mettere in Origine di proprietà di Oggetto è il nome del form padre che è frmDataExtract, che è la forma che la dataDisplaySubform si trova. Quando lo faccio e passare alla Visualizzazione Maschera, ho un avviso che indica che non È possibile inserire un modulo (o report) dentro di sé. Selezionare o immettere una diversa maschera o di un report per servire come una sottomaschera o sottoreport”. Se ho quindi fare clic su OK e quindi fare clic sul pulsante per eseguire il codice, ho la stessa 2467 errore evidenziando Me.dataDisplaySuform.Forma.RecordSource = pSQL linea. Si specifica qualcosa in Origine di proprietà di Oggetto?
    È la vostra intenzione di modificare l’attuale forma del RecordSource? Se è così, Me.RecordSource = pSQL io sono sicuro di quello che stai dopo, ma almeno abbiamo il messaggio di errore di diagnosi. 🙂
    Scusa per il ritardo nella risposta, connessione internet al lavoro è stato sollevato oggi. Il mio obiettivo che ho citato sopra è quello di ottenere il foglio dati secondario il nome dataDisplaySubform per visualizzare i record restituiti da una dinamicamente integrato istruzione SQL che viene creato tramite l’input dell’utente nei controlli (ancora per essere collocato sul padre frmDataExtract. Lei ha parlato di “modificare l’attuale forma di origine Record” – si riferisce il genitore frmDataExtract che la sottomaschera è inserita? Se sì, come faccio a modificare il genitore frmDataExtract e ottenere cambiamenti di propagare la sottomaschera? Non può essere la comprensione

    OriginaleL’autore HansUp

  2. 0

    Chiarire alcuni punti per gli altri lettori:

    Una vista di dettaglio della sottomaschera sourceObject proprietà determina le colonne/campi vengono visualizzati. Così, si potrebbe impostare una tabella o di una query, quindi, in alternativa, utilizzare un filtro per restituire nessun record (se si desidera che il recordset essere inizialmente vuoto) o come alternativa all’utilizzo di recordSource per SQL personalizzato.

    Il recordSource può essere una tabella, una query, SQL, ma la sottomaschera saranno visualizzati solo i campi con nomi che corrispondono a sourceObject campi. Questo può essere fonte di confusione se, per esempio, è possibile impostare il sourceObject di una tabella, quindi il record di una query con parziale sovrapposizione di nomi di campo (Accesso visualizzare tutte le colonne, ma solo quelle sovrapposte i dati in loro).

    Avere una forma che consente di visualizzare un arbitrario istruzione SELECT o permette all’utente di scegliere il tavolo(s) per SELEZIONARE on, uno potrebbe salvare il loro ingresso come una nuova query (o hanno già nominato uno per sovrascrivere), quindi impostare il sourceObject di che (il modulo dovrà essere chiuso e poi riaperto per le nuove colonne da visualizzare, così si potrebbe desiderare di aprire un pop-up o una nuova scheda per visualizzare i risultati).

    OriginaleL’autore cowb0y

  3. 0

    Utilizzare un CreateQueryDef e poi

    Me.dataDisplaySubform.SourceObject = "Query.NewqueryName"

    NewQueryName è il nome dato quando vengono creati con createQueryDef

    OriginaleL’autore user4408803

  4. 0

    breve e dolce. Ecco il codice per il pulsante che crea la stringa sql dinamica, chiude l’oggetto corrente (solo nel caso in cui il suo aperto), elimina un temporaneo definizione della query (perché abbiamo bisogno l’uno), crea una nuova query di definizione con il nuovo sql, cambia il recordsource e il gioco era fatto.

    Private Sub btnRunSQL_Click()
      'my subform is called datasheet, i know -- dumb name.
      'a dynamic sql needs to be saved in a temporoary query. I called my qtemp
      Dim sql As String
      sql = "select * from client order by casename asc"
      'in case there is something kicking around, remove it first, otherwise we can't delete the temp query if it is still open
      Me!Datasheet.SourceObject = ""
      'delete our temporary query. Note, add some err checking in case it doesn't exist, you can do that on your own.
       DoCmd.DeleteObject acQuery, "qtemp"
      'lets create a new temporary query
      Dim qdf As QueryDef
    
      Set qdf = CurrentDb.CreateQueryDef("qtemp", sql)
      'set the subform source object
      Me!Datasheet.SourceObject = "query.qtemp"
      'and it should work.
    End Sub
    

    OriginaleL’autore Dean

Lascia un commento