ms-access - selezione - usare una maschera per filtrare una query in access




Origine riga personalizzata per casella combinata in formato continuo in Access (9)

Ho cercato in giro, e sembra che questa sia una limitazione in MS Access, quindi mi chiedo quali soluzioni creative hanno trovato in questo puzzle.

Se si dispone di un modulo continuo e si desidera che un campo sia una casella combinata di opzioni specifiche per tale riga, Access non riesce a recapitare; l'origine della riga della casella combinata viene solo interrogata una volta all'inizio del modulo e quindi mostra le opzioni errate per il resto del modulo.

Il prossimo passo che cercheremo, ovviamente, è di utilizzare l'evento onCurrent per richiedere la casella combinata, che in effetti limita le opzioni alla riga specificata. Tuttavia, a questo punto, Access impazzisce e riepiloga tutte le caselle combinate, per ogni riga, e il risultato è spesso quello di scomparire e riapparire le opzioni in altre righe, a seconda che abbiano scelto un'opzione valida per sorgente riga del record corrente.

L'unica soluzione che ho trovato è solo elencare tutte le opzioni disponibili, sempre. Qualche risposta creativa là fuori?

Modifica Inoltre, dovrei notare che il motivo per la casella combinata è di avere una query come tabella di ricerca, il valore reale deve essere nascosto e memorizzato, mentre la versione leggibile è visualizzata ... più colonne nella riga della casella combinata fonte. Pertanto, la modifica del limite all'elenco non aiuta, poiché gli ID che non sono nella query sorgente corrente non avranno una parte leggibile dall'uomo corrispondente.

In questo caso particolare, le forme continue hanno molto senso, quindi per favore non dirmi che è la soluzione sbagliata. Sto chiedendo risposte creative.


Lo incontriamo anche molto nelle nostre applicazioni. Ciò che abbiamo trovato è una buona soluzione: mostra solo tutte le righe nelle caselle combinate. Quindi, non appena l'utente inserisce il compobox in una riga specifica, regola l'origine di righe (con il filtro per quella riga). Quando la casella combinata perde lo stato attivo, è possibile reimpostare l'origine righe per visualizzare tutto.


È anche possibile rendere il valore della casella combinata in un campo di testo non modificabile e quindi avviare una finestra a comparsa / modale per modificare tale valore. Tuttavia, se lo facessi, potrei essere incline a modificare l'intero record in una di quelle finestre.


Disclaimer: Odio l'accesso con passione.

Non usare moduli continui. Sono un'aringa rossa per quello che vuoi realizzare. Le forme continue sono la stessa forma ripetuta più volte con dati diversi. È già un difetto della normale modalità operativa di Access poiché non è possibile avere lo stesso modulo aperto più volte. Il comportamento che stai vedendo è "come progettato" in Access. Ciascuno di questi controlli ComboBox è in realtà lo stesso controllo. Non puoi influenzarne uno senza influenzare gli altri.

Fondamentalmente, ciò che hai fatto qui viene eseguito nell'area in cui Access non è più adatto per il tuo progetto (ma non può abbandonare perché rappresenta già una grande quantità di lavoro).

Quello che sembra essere il corso più probabile di azione qui è quello di fingere molto bene. Esegui una query sui dati e quindi crea gli elementi del modulo a livello di codice in base ai risultati. Questa è una buona dose di lavoro, poiché duplicherete voi stessi un bel po 'della funzionalità di gestione dei dati di Access.

Rispondi a Modifica:
Ma così come sono, le forme continue non possono realizzare ciò che vuoi. Ecco perché ho suggerito di simulare i tuoi moduli continui, perché le forme continue hanno dei limiti reali in ciò che possono fare. Non rimanere così bloccato su una particolare implementazione che non puoi lasciare andare quando cessa di funzionare.


Non credo che i moduli continui di Access debbano essere condannati a tutti, ma credo fermamente che dovrebbero essere evitati per EDITARE I DATI. Funzionano alla grande per le liste e offrono sostanzialmente più capacità di formattazione di una semplice listbox (e sono anche molto più facili da utilizzare, anche se non consentono la selezione multipla, ovviamente).

Se si desidera utilizzare un modulo continuo per la navigazione nei record per la modifica, utilizzare una sottomaschera che visualizza i dati dettagliati per la modifica e utilizzare il valore PK dalla sottomaschera per il campo del collegamento. Ciò può essere eseguito con un modulo continuo in cui si posiziona una sottomaschera di dettaglio nell'intestazione o nel piè di pagina, collegato sul PK della tabella dietro il modulo continuo.

Oppure, se si utilizza un modulo continuo per visualizzare i dati secondari in un modulo padre, è possibile collegare la sottomaschera dettaglio con un riferimento al PK nella sottomaschera continua, ad esempio:

[MySubForm].[Form]!MyID

Questa sarebbe la proprietà principale del collegamento e MyID sarebbe la proprietà figlio del collegamento.


Meglio...

Imposta la casella combinata Origine controllo su una colonna nella query in cui verranno memorizzati i valori della casella combinata.


Per Me penso che il modo migliore e il modo più semplice sia creare una tabella temporanea che abbia tutti i campi associati più un campo extra che è un campo yeas / no.

quindi si utilizzerà questa tabella come origine dati per il continuo per. Puoi usare onLoad per riempire la tabella temporanea con i dati che desideri.

Penso che sia facile dopo averlo fatto in loop per le scelte, basta un piccolo loop per leggere il campo yeas / no della tabella temporanea.

Spero che questo ti possa aiutare


Questo sembra funzionare bene. CBOsfrmTouchpoint8 è una casella combinata abbreviata con il solo riquadro a discesa. CBOsfrmTouchpoint14 è una casella di testo che costituisce il resto dello spazio. Mai dire mai:

  Private Sub CBOsfrmTouchpoint8_Enter()  

  If Me.CBOsfrmTouchpoint8.Tag = "Yes" Then  
  CBOsfrmTouchpoint14.SetFocus  
  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Exit Sub  
  End If  

  Me.CBOsfrmTouchpoint8.Tag = "No"  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  Me.CBOsfrmTouchpoint8.SetFocus  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_GotFocus()  
  Me.CBOsfrmTouchpoint14.Width = 0  
  Me.CBOsfrmTouchpoint8.Width = 3420  
  Me.CBOsfrmTouchpoint8.Left = 8580  
  Me.CBOsfrmTouchpoint8.Dropdown  
  End Sub

  Private Sub CBOsfrmTouchpoint8_LostFocus()  
  Me.CBOsfrmTouchpoint8.RowSource = "XXX"  
  Me.CBOsfrmTouchpoint8.Requery  
  End Sub 

  Private Sub CBOsfrmTouchpoint8_Exit(Cancel As Integer)  
  Me.CBOsfrmTouchpoint14.Width = 3180  
  Me.CBOsfrmTouchpoint8.Width = 240  
  Me.CBOsfrmTouchpoint8.Left = 11760  
  Me.CBOsfrmTouchpoint8.Tag = "Yes"  
  End Sub

usa le forme continue .. sicuramente. In effetti puoi costruire intere applicazioni con un'interfaccia utente grande e intuitiva costruita su moduli continui. Non ascoltare Toast!

La tua soluzione di elencare tutte le opzioni disponibili è quella giusta. In effetti non esiste un'altra soluzione pulita. Ma hai torto quando dici che Acccess impazzisce. Su un modulo continuo, è possibile visualizzare ciascuna riga come un'istanza della sezione di dettaglio, in cui la casella combinata è una proprietà comune a tutte le istanze della sezione di dettaglio. È possibile aggiornare questa proprietà per tutte le istanze, ma non è possibile impostarla per un'istanza specifica. Questo è il motivo per cui Access DEVE visualizzare gli stessi dati nella casella combinata per tutti i record!

Se è necessario accettare solo valori specifici del record in questa casella combinata, utilizzare l'evento beforeUpdate per aggiungere una procedura di controllo. Nel caso in cui un nuovo valore non possa essere accettato, è possibile annullare l'aggiornamento dei dati, riportando il valore precedente nel campo.

Non è possibile impostare la proprietà limitToList su "No" dove i dati collegati (quello memorizzato nel controllo) sono nascosti. Questo è logico: come può la macchina accettare l'input di una nuova riga di dati quando il campo collegato (non visibile) rimane vuoto?


Ho un modo più semplice di andare rispetto a Gilligan. Sembra un sacco di lavoro, ma in realtà non lo è. La mia soluzione richiede di avere il mio modulo continuo come un foglio dati di sottomaschera. Nella mia sottomaschera ho due combobox di ricerca, tra gli altri, chiamati Equipment and Manufacturer. Entrambi contengono semplicemente una chiave Integer lungo nell'origine dati. Il produttore deve essere filtrato in base a quanto selezionato in Equipment. L'unica volta che filtro Manufacturer.RowSource è nell'evento Manufacturer_GotFocus.

Private Sub Manufacturer_GotFocus ()

If Nz(Me.Equipment, 0) > 0 Then
    Me.Manufacturer.RowSource = GetMfrSQL()  '- gets filtered query based on Equipment
Else
    Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"
End If

End Sub

In Manufacturer_LostFocus ho resettato anche Manufacturer.RowSource a tutti i produttori. È necessario eseguire questa operazione poiché quando si fa clic sulla sottomaschera per la prima volta, gli eventi di GotFocus vengono attivati ​​per tutti i controlli, incluso il produttore, anche se in realtà non si sta aggiornando alcun campo.

Private Sub Manufacturer_LostFocus ()

Me.Manufacturer.RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

End Sub

Nell'evento Enter del produttore, è necessario verificare se l'apparecchiatura è stata selezionata, se non è stata impostata la messa a fuoco sull'attrezzatura.

Private Sub Manufacturer_Enter ()

If Nz(Me.EquipmentID, 0) = 0 Then
    '-- Must select Equipment first, before selecting Manufacturer
    Me.Equipment.SetFocus
End If

End Sub

È inoltre necessario richiedere la casella combinata Produttore in evento Form_Current (ad esempio Me.Manufacturer.Requery) e impostare la proprietà Cycle di questa sottomaschera su "Current Record".

Sembra abbastanza semplice, ma non hai ancora finito. È inoltre necessario ripristinare Manufacturer.RowSource per tutti i produttori nell'evento SubForm_Exit nel formato padre nel caso in cui l'utente si colleghi alla casella combinata Produttore ma non effettui una selezione e fa clic in qualche punto sul modulo padre. Esempio di codice (in formato padre):

Private Sub sFrmEquip_Exit (Annulla come intero)

Me.sFrmEquip.Controls("Manufacturer").RowSource = "SELECT MfgrID, MfgrName FROM tblManufacturers ORDER BY MfgrName"

End Sub

C'è ancora un pezzo di questo che non è pulito. Quando fai clic su Produttore e disponi di più righe nella griglia del foglio dati, il campo Produttore diventerà vuoto in altre righe (i dati al di sotto delle caselle combinate sono ancora intatti) mentre stai modificando il produttore nella riga corrente. Una volta usciti da questo campo, il testo negli altri campi Manufacturer riapparirà.