Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

Filtro su casella combinata altera record in subform

  1. #1
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Buongiorno a tutti.
    Sto progettando una maschera per l'immissione dei prodotti in una subform che si avvale di due combobox per la selezione dell'ID Prodotto e della quantità.
    Una routine che intercetta l'evento click di un pulsante si occupa di compilare i controlli della subform in un nuovo record.

    Ecco un'immagine:



    Questo è il codice relativo al pulsante:

    Private Sub cmdInserisci1_Click()
        'Ricava descrizione Prodotto
        Dim DescrizioneProdotto As String
            DescrizioneProdotto = DLookup("Descrizione", "tabProdotti", "IDProdotto = " & Me.cboIDProdotto1)
            
        'Ricava IDListino
        Dim Listino As Integer
            Listino = DLookup("IDListino", "tabClienti", "IDCliente =" & [Forms]![frmNuovaPrestazione]![cboIDCliente])
           
        'Se la sottomaschera è vuota creo un nuovo record
        Dim Count As Long
        Count = DCount("[IDDettaglioPrestazione]", "qryDettagliPrestazioni", "[IDPrestazione] = " & Me.IDPrestazione)
        If Count = 0 Then
            Me!subfrmDettaglioPrestazioni1.SetFocus
            Me!subfrmDettaglioPrestazioni1.Form!Descrizione.SetFocus
            DoCmd.GoToRecord , , acNewRec
        End If
        
        'Compilo i campi della SubForm e vado ad un nuovo record
        With Me![subfrmDettaglioPrestazioni1]
            
            ![PrezzoUnitarioEff] = retrieveIdPrezzoUnitario(Me.cboIDProdotto1, Listino, Me.Data)
            ![IDPrestazione] = Me.IDPrestazione
            ![IDPaziente] = Me.cboIDPaziente1
            ![IDProdotto] = Me.cboIDProdotto1
            ![Quantità] = Me.cboQuantita1
            ![Descrizione] = DescrizioneProdotto
            ![SubTotaleApllicato] = Round(![PrezzoUnitarioEff] * ![Quantità], 1)
        End With
        
        Me!subfrmDettaglioPrestazioni1.SetFocus
        Me!subfrmDettaglioPrestazioni1.Form!Descrizione.SetFocus
        DoCmd.GoToRecord , , acNewRec
    End Sub
    
    L'ho testata a fondo e funziona tutto correttamente.

    Ho successivamente agito sulla combobox che si occupa di selezionare l'IDProdotto dal menu a tendina.
    Siccome avrò un numero molto elevato di prodotti in catalogo, vorrei che alla digitazione di caratteri all'interno della combobox vengano elencati non solo i prodotti che iniziano, ma anche quelli che contengono la stringa digitata.

    Per farlo ho utilizzato questo codice che intercetta l'evento KeyUp

    Private Sub cboIDProdotto1_KeyUp(KeyCode As Integer, Shift As Integer)
        Dim strSQL As String
        strSQL = "SELECT tabProdotti.IDProdotto, tabProdotti.Descrizione" & _
                    " FROM tabProdotti" & _
                    " WHERE [Descrizione] LIKE '*" & Me.cboIDProdotto1.Text & "*'" & _
                    " ORDER By tabProdotti.Descrizione;"
    
        Me.cboIDProdotto1.RowSource = strSQL
        Me.cboIDProdotto1.Dropdown
    End Sub
    
    La cosa strana a cui non riesco a dare una spiegazione, è che implementando questa funzionalità ora al digitare di una stringa nella combobox tutti i record della subform spariscono.
    Non riesco a trovare una spiegazione a questo comportamento e quindi non so come sistemarlo.

    Avete idee?

    Grazie infinite!

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,751
    Like Inviati  
    0
    Like Ricevuti  
    20
    La questione combo... è assurda detta così... a meno che non sia oggetto di criterio di qualche cosa...

    Ti do tuttavia un suggerimento per la parte di inserimento in quanto ancorché funzionante il metodo è tecnicamente errato.
    Mi spiego, stai usando l'interfaccia utente per compilare dei dati... cosa inutile a tutti i livelli oltre che essere lenta e generare possibili sfarfalliiiiii

    Poi non comprendo quanti livelli di subform hai... il primo dcount su quale subform agisce ed il relativo addnew non è lo stesso che esegui dopo... in cui prima compili e poi vai al nuovo... boh

    Dico inutile in quanto anche se avessi inserito criteri di validazione sui controlli, se compilati da VBA non avrebbero effetto.
    Poi usi il DCOUNT per contare i records della subform... non serve, hai già la subform.
    Ti butto giù velocemente un possibile codice corretto poi se vorrai lo adatti:
    Non sibusa MAI l'interfaccia per gestire inserimenti da codice... non ha senso... pensa se l'inserimento fosse di più records... vedresti sfarfallio tutto.
    With Me![subfrmDettaglioPrestazioni1].RecordsetClone
         .Addne w
            ' ovviamente do per scontato che il nome controllo=nonecampo
            ![PrezzoUnitarioEff] = retrieveIdPrezzoUnitario(Me.cboIDProdotto1, Listino, Me.Data)
            ![IDPrestazione] = Me.IDPrestazione
            ![IDPaziente] = Me.cboIDPaziente1
            ![IDProdotto] = Me.cboIDProdotto1
            ![Quantità] = Me.cboQuantita1
            ![Descrizione] = DescrizioneProdotto
            ![SubTotaleApllicato] = Round(![PrezzoUnitarioEff] * ![Quantità], 1)
           .update
            Me![subfrmDettaglioPrestazioni1].Bookmark=.Bookmark
        End With
    
    Al posto del DCOUNT su una query... leggi la proprietà RecordCount sempre del Refordsetclone della SubForm...

    Insomma devi, per quanto possibile, evitare di interagire con la maschera, ed andare diretto sui dati.
    ℹ️ Leggi di più su @Alex ...

  3. #3
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Ciao Alex e grazie mille per i suggerimenti, che diventano preziosissimi insegnamenti.

    Capisco ciò che dici e sto provando ad attuare i correttivi.
    Solo una piccola precisazione. Nel mio codice originale ho inserito un acNewRec dopo la compilazione dei controlli perché altrimenti non viene aggiornato il totale che si trova nel piè di pagina della SubForm. Il passaggio al nuovo record aggiorna quello appena immesso e di conseguenza anche il totale. Sicuramente ci sono strade più consone.

    Ho comunque capito perfettamente che devo intervenire sui dati, senza passare dalla maschera. Ho quindi iniziato a modificare il codice secondo i tuoi suggerimenti.


    Mi sono però subito imbattuto in un problema:

    Ottengo un errore relativo a

    With Me![subfrmDettaglioPrestazioni1].RecordsetClone
         .Addnew
    
    Errore di run.time 438
    Proprietà o metodo non supportati dall'oggetto.
    Idem se provo a richiamare il RecordsetClone.RecordCount della subfrm.

    Anche qui non capisco perché.

  4. #4
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Ho risolto il primo problema con

     With Me!subfrmDettaglioPrestazioni1.Form.RecordsetClone
         .AddNew
    
    Vado avanti con il resto

  5. #5
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,751
    Like Inviati  
    0
    Like Ricevuti  
    20
    Per aggiornare controlli con calcoli si usa Recalc...
    Ho dimenticato il riferimento alla Form... così si riferiva al Container.
    Questo va bene:
    With Me![subfrmDettaglioPrestazioni1].Form.RecordsetClone
    
    ℹ️ Leggi di più su @Alex ...

  6. #6
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Esatto, i nostri due messaggi si sono accavallati.
    Grazie per il recalc!

  7. #7
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Ora il problema riguarda

    .Update
    
    Non mi è permesso farlo perché nella tabella della form Madre (tabPrestazioni) non ci sono ancora record correlati (le tabelle che sottostanno alle due maschere madre e figlia sono in relazione uno a molti).

    Impossibile aggiungere o modificare il record. Nella tabPrestazioni è necessario un record correlato.

    Ho poi una questione di fondo sull'utilizzo del RecordsetClone.
    La prima domanda è perché non utilizzare il Recordset direttamente?

    Poi, da quello che ho capito, il RecodsetClone crea una copia del Recordset corrente in modalità di solo lettura. Ciò significa che i record del Recordset non vengono aggiungi/corretti/eliminati, ma queste operazioni avvengono solo attraverso l'interazione dell'utente con la form?

  8. #8
    L'avatar di RaoulDuke
    RaoulDuke ora è in linea Scolaretto
    Post
    141
    Like Inviati  
    3
    Like Ricevuti  
    0
    Faccio un attimo un passo indietro spiegando meglio il contesto.

    tabPrestazioni (LATO UNO): IDPrestazione (PK), IDCliente, Data, ecc
    tabDettaglioPrestazioni (LATO MOLTI): IDDettaglioPrestazione(PK), IDPrestazione (FK), IDPaziente, IDProdotto, Descrizione, PrezzoUnitarioDef, Quantità, SubTotale, Sconto

    La mia prima idea è stata quella di creare una struttura Form - SubForm classica con SubForm in modalità foglio dati o maschera continua e interazione con l'utente direttamente nei controlli della SubForm.
    Una combobox per la scelta del Prodotto, una per la quantità e compilazione automatica degli altri campi.

    In questo caso tutto funziona, ma ho delle necessità particolari che mi hanno spinto a pensare ad un'altra struttura. Il problema riguarda la combobox per la scelta del Prodotto. L'origine dati ha due colonne (IDProdotto e Descrizione). Ho bisogno di poter leggere l'IDProdotto ma nel caso alterare la Descrizione del prodotto secondo le necessità del momento. Ho provato con due controlli separati, ma la soluzione non mi piace esteticamente.

    Così ho pensato alla struttura che sto cercando di portare avanti: le combobox per la scelta di Prodotto e quantità sono state portare fuori dalla subform. Il click del comando recupera le informazioni e le immette nella subform (mimando quello che succederebbe all'introduzione di un nuovo record nella subform), dove poi possono essere eventualmente alterati.

    Non so ancora se sia un approccio tecnicamente corretto e fattibile. Gli errori che incontro con il codice consigliato da Alex mi danno dei dubbi al riguardo.

    Avete delle osservazioni a tal riguardo?

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 9
    Ultimo Post: 26-11-2020, 14:17
  2. filtro con casella combinata
    Da undertaker nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 10-07-2018, 19:08
  3. Risposte: 9
    Ultimo Post: 17-08-2015, 08:47
  4. Filtro su casella combinata
    Da antoniopisa nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 21-02-2014, 19:23
  5. Filtro su casella combinata
    Da X_Files nel forum Microsoft Access
    Risposte: 10
    Ultimo Post: 19-04-2012, 16:40