[RISOLTO] REQUERY SOTTOMASCHERA

di il
15 risposte

[RISOLTO] REQUERY SOTTOMASCHERA

Ciao a tutti.

Ho un problemino di natura tecnica.

Ho una maschera principale in cui è presente una sottomaschera.
Questa sottomaschera cambia il SourceObject al verificarsi di alcune condizioni.

Nella maschera principale ho due chiavi di ricerca: una per codice fiscale (ricerca esatta) ed una per parte di denominazione (prende tutte le anagrafiche che hanno la parola indicata all'interno).

Se la funzione dcount, conta solo un record con tali caratteristiche, allora mi si visualizza direttamente la scheda anagrafica, altrimenti mi cambia il sourceobject e mi fa vedere quindi un'altra sottomaschera.

Il problema ce l'ho quando ho più di un'anagrafica con la stessa parola (ad esempio rossi) :
quando effettuo la prima ricerca, non mi trova niente nonostante la query mi riporta l'esatto risultato

questo è il comando che viene eseguito dopo l'aggiornamento della "casella" di ricerca
Private Sub txt_den_AfterUpdate()
If Not IsNull(Me.txt_cuaa) Then Me.txt_cuaa = vbNullString

If Not IsNull(Me.txt_den) Then
    If DCount("IDANAGRAFICA", "q_ricercascheda") > 1 Then
        Call ricercadenominazione(Me.txt_den)
        Call ricercadenominazione(Me.txt_den)
        Me.txt_den = ""
    ElseIf DCount("IDANAGRAFICA", "q_ricercascheda") = 0 Then
        MsgBox "Non esiste alcuna anagrafica con la parola '" & Me.txt_den & "' al suo interno!", vbCritical
        Me.txt_den = vbNullString
        Me.txt_den.SetFocus
    Else
        Me.subform.SourceObject = "subform"
        Call ricerca(Me.txt_den)
    End If
End If
End Sub
questa invece è la sub che richiamo da quell'evento
Sub ricercadenominazione(testo As String)


        Me.pul_RicAz.Visible = -1
        Me.subform.Visible = True
        
        Me.subform.SourceObject = "subfrmAnagrafiche"
        Me.subform.Form.RecordSource = "Q_RICERCASCHEDA"
        

        Me.subform.LinkChildFields = ""
        Me.subform.LinkMasterFields = ""
        Me.subform.Form.Requery
        Me.subform.Form.Requery
        
        Me.txt_den = vbNullString
        Me.txt_cuaa = vbNullString
        
        Me.Section(acHeader).Visible = False
End Sub
La query "Q_RICERCASCHEDA" ha il seguente SQL:
SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE
FROM tblAnagrafiche
WHERE (((tblAnagrafiche.DENOMINAZIONE) Like "*" & [Maschere]![frmDB]![txt_den] & "*"));

Al momento, come potete vedere dall'evento afterupdate, ho risolto richiamando per due volte consecutive la stessa sub.
Mi piacerebbe, tuttavia, sapere se c'è un'altra soluzione.

Scusate il papiro e spero di essermi fatto capire

15 Risposte

  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:


    Ho una maschera principale in cui è presente una sottomaschera.
    Puoi fornire i loro nomi propri?

    Marcdreamer ha scritto:


    Nella maschera principale ho due chiavi di ricerca: una per codice fiscale (ricerca esatta) ed una per parte di denominazione (prende tutte le anagrafiche che hanno la parola indicata all'interno).
    Quindi la maschera principale si chiama Anagrafiche?

    Marcdreamer ha scritto:


    Se la funzione dcount, conta solo un record con tali caratteristiche, allora mi si visualizza direttamente la scheda anagrafica, altrimenti mi cambia il sourceobject e mi fa vedere quindi un'altra sottomaschera.
    Io qui mi perdo, non capisco a cosa ti riferisci.

    Marcdreamer ha scritto:


    Il problema ce l'ho quando ho più di un'anagrafica con la stessa parola (ad esempio rossi) :
    quando effettuo la prima ricerca, non mi trova niente nonostante la query mi riporta l'esatto risultato
    Dici che non trova niente, ma poi riporta l'esatto risultato. A cosa ti riferisci (sempre nomi propri)?
    Riepilogo quello che capisco io. Tu fai una ricerca con Rossi e trovi 4 record: Rossi Mario, Rossi Antonio, Rossi Carlo, Rossi Emilio. Questi 4 Rossi la maschera principale li espone? Poi...non capisco il resto.

    Più in generale non capisco lo scopo di quello che vuoi fare.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Ciao Osvaldo

    allora la maschera principale si chiama "frmdb" mentre le due sottomaschere che cambiano si chiamano "subform" (ha una struttura a schede al suo interno, ma non credo sia rilevante ed è quella che io "erroneamente" ho indicato come scheda anagrafica) e "subfrmAnagrafiche" (maschera continua che prende i dati dalla stringa strSql)
    SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE
    FROM tblAnagrafiche
    WHERE (((tblAnagrafiche.DENOMINAZIONE) Like "*" & [Maschere]![frmDB]![txt_den] & "*"));
    Dici che non trova niente, ma poi riporta l'esatto risultato. A cosa ti riferisci (sempre nomi propri)?
    Riepilogo quello che capisco io. Tu fai una ricerca con Rossi e trovi 4 record: Rossi Mario, Rossi Antonio, Rossi Carlo, Rossi Emilio. Questi 4 Rossi la maschera principale li espone? Poi...non capisco il resto.
    quei quattro nominativi dovrebbero essere visualizzati all'interno della "subfrmanagrafiche" che come detto si appoggia al predicato SQL.

    Ho fatto dei test, sia aprendo la "subfrmanagrafiche" sia aprendo direttamente la query. Il risultato è che quando apro la query, mi ritrovo i 4 nominativi, se invece apro la "subfrmanagrafiche" i nominativi non li vedo (nonostante il predicato SQL sia lo stesso! )
    Più in generale non capisco lo scopo di quello che vuoi fare.
    Quello che voglio fare è cercare di utilizzare la stessa maschera principale senza dover aprire una maschera in popup (che mi fa visualizzare i dati) per poi richiuderla.

    SUBFORM.jpg
    SUBFORM.jpg

    Questa si apre quando esiste solo un'anagrafica con quella parte di testo. Ad esempio, se cerco cerci, mi trovo solo cercino sorcina


    SUBFRMANAGRAFICHE.jpg
    SUBFRMANAGRAFICHE.jpg

    Questa, invece, si dovrebbe aprire al posto dell'altra se ci sono più nominativi con la stessa parte di denominazione.
    Una volta effettuato il doppio click sull'anagrafica desiderata, riappare l'altra sottomaschera "subform"

    Se non è ancora chiaro qualcosa, provo a fare un demo senza dati compromettenti e lo condivido
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Ehm! Considera che per me c'è un che di "farraginoso" in tutta la tua progettazione...quindi faccio fatica a comprendere il motivo di certe scelte. In altre parole...dico che non ho capito vari passaggi. Non so se vado "fuori logica", ma considera anche che il CONTAINER della tua sottomaschera ha sempre lo stesso nome, anche se tu gli dici che vuoi ora "subform", ora "subfrmanagrafiche" che sono i nomi delle maschere prese singolarmente. La sintassi:
    Forms![NomeMascheraPrincipale]![NomeSottomaschera]
    riguardo NomeSottomaschera stiamo parlando del container e non della sottomaschera. Potrebbe essere questo il punto di confusione di tutto il tuo progetto.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Il passaggio dall'una all'altra maschera lo fa ... senza problemi
    Quello che non fa è mostrare i risultati della query.

    Cioè ... l'intestazione appare ma senza nominativi (ed io so esattamente che ci dovrebbero essere)

    Che cosa ci sarebbe di farraginoso?
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:


    Che cosa ci sarebbe di farraginoso?
    1. Hai preferito gestire sta cosa con maschera/sottomaschera, là dove l'anima del meccanismo si svolge quasi esclusivamente nella sottomaschera la quale deve sottostare a sintassi "indirette" e "fastidiose".
    2. Metti in gioco una serie di Call...Boh!
    3. Scrivi nei vari codici VBA 2 volte
    Call ricercadenominazione(Me.txt_den)
    e
    Me.subform.Form.Requery
    4.
    Me.txt_den = ""
    Non è che questa assegnazione impedisce alla query di "esprimersi"?

    Brancolo in tutta la logica...io non farei mai cose del genere.

    Per me sarebbe tutto più comodo con 2 "maschere collegate". La 2a maschera si "esprime" in base al "filtro" digitato dentro frmdb, sfruttando la "query parametrica", con codici VBA ridotti al minimo indispensabile, senza tutti quei Call che rendono il "giochetto" più lungo e farraginoso.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Ciao

    ti rispondo per punti:
    1. Hai preferito gestire sta cosa con maschera/sottomaschera, là dove l'anima del meccanismo si svolge quasi esclusivamente nella sottomaschera la quale deve sottostare a sintassi "indirette" e "fastidiose".
    Non capisco il punto ... soprattutto il termine fastidiose.
    2. Metti in gioco una serie di Call...Boh!
    Lo faccio perché altrimenti scriverei lo stesso codice due o addirittura tre volte.
    3. Scrivi nei vari codici VBA 2 volte
    Al momento, come potete vedere dall'evento afterupdate, ho risolto richiamando per due volte consecutive la stessa sub
    Purtroppo, funziona solo qualche volta.
    Con due requery mi fa visualizzare i dati "ognitanto", con uno solo mai!
    4.

    Me.txt_den = ""
    Non è che questa assegnazione impedisce alla query di "esprimersi"?
    ci ho pensato anche io, ma anche togliendolo il problema non si risolve
    Per me sarebbe tutto più comodo con 2 "maschere collegate". La 2a maschera si "esprime" in base al "filtro" digitato dentro frmdb, sfruttando la "query parametrica", con codici VBA ridotti al minimo indispensabile, senza tutti quei Call che rendono il "giochetto" più lungo e farraginoso.
    E' quello che sto facendo adesso con la maschera popup .... vorrei (e ripeto è un mio capriccio) che non ci fossero popup dal momento che si può cambiare l'origine oggetto del container.

    Comunque dal momento che il programma lo dovrò "distribuire" tra i miei colleghi solo da settembre in avanti, non ho problemi a fare ulteriori prove

    In ogni caso, ti ringrazio per l'interessamento
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:



    La query "Q_RICERCASCHEDA" ha il seguente SQL:
    
    SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE
    FROM tblAnagrafiche
    WHERE (((tblAnagrafiche.DENOMINAZIONE) Like "*" & [Maschere]![frmDB]![txt_den] & "*"));
    
    La query, sebbene formalmente corretta (se funziona), è sbagliata perché include un parametro dipendente da una maschera che DEVE quindi essere aperta.

    Marcdreamer ha scritto:


     
     Me.subform.SourceObject = "subfrmAnagrafiche"
     Me.subform.Form.RecordSource = "Q_RICERCASCHEDA"
    
    Io, invece di richiamare la query, costruirei direttamente da VBA il predicato SQl ovviamente utilizzando il campo della maschera (e non il riferimento alla collezione Forms).
    Quindi :
    
    Me.subform.SourceObject = "subfrmAnagrafiche"
    Dim sSql as string
    sSql = "SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE"
    sSql = sSql & " FROM tblAnagrafiche"
    sSql = sSql & " WHERE (((tblAnagrafiche.DENOMINAZIONE) Like '*" & me.txt_den & "*'";"
    '
    ' Fare DEBUG :
    ' verificare cosa contiene sSql e me.txt_den
    ' prestare attenzione agli spazi, agli apici, ai doppi apici
    ' fare un SANO debug.print sSQl, visualizzare la finestra immediata, copiare il contenuto e vedere con QBE se 
    ' la query creata da codice è sintatticamente corretta e restituisce i risultati attesi !
    
    Me.subform.Form.RecordSource = sSql
    
    
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    max.riservo ha scritto:


    Marcdreamer ha scritto:



    La query "Q_RICERCASCHEDA" ha il seguente SQL:
    
    SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE
    FROM tblAnagrafiche
    WHERE (((tblAnagrafiche.DENOMINAZIONE) Like "*" & [Maschere]![frmDB]![txt_den] & "*"));
    
    La query, sebbene formalmente corretta (se funziona), è sbagliata perché include un parametro dipendente da una maschera che DEVE quindi essere aperta.

    Marcdreamer ha scritto:


     
     Me.subform.SourceObject = "subfrmAnagrafiche"
     Me.subform.Form.RecordSource = "Q_RICERCASCHEDA"
    
    Io, invece di richiamare la query, costruirei direttamente da VBA il predicato SQl ovviamente utilizzando il campo della maschera (e non il riferimento alla collezione Forms).
    Quindi :
    
    Me.subform.SourceObject = "subfrmAnagrafiche"
    Dim sSql as string
    sSql = "SELECT tblAnagrafiche.IDANAGRAFICA, tblAnagrafiche.CUAA, tblAnagrafiche.DENOMINAZIONE"
    sSql = sSql & " FROM tblAnagrafiche"
    sSql = sSql & " WHERE (((tblAnagrafiche.DENOMINAZIONE) Like '*" & me.txt_den & "*'";"
    '
    ' Fare DEBUG :
    ' verificare cosa contiene sSql e me.txt_den
    ' prestare attenzione agli spazi, agli apici, ai doppi apici
    ' fare un SANO debug.print sSQl, visualizzare la finestra immediata, copiare il contenuto e vedere con QBE se 
    ' la query creata da codice è sintatticamente corretta e restituisce i risultati attesi !
    
    Me.subform.Form.RecordSource = sSql
    
    
    ciao Max

    Ho seguito il tuo consiglio di scrivere il predicato SQL direttamente da VBA. L'avevo già fatto, ma non avevo utilizzato i singoli apici ... e così funziona (ho fatto diversi test)

    Ho solo una domanda, dal momento che la maschera "frmdb" è sempre aperta perché da VBA con la sintassi me.txt_den funziona e con la query no (o almeno non fa visualizzare i dati nella maschera)?

    Grazie mille
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:


    Ho solo una domanda, dal momento che la maschera "frmdb" è sempre aperta perché da VBA con la sintassi me.txt_den funziona e con la query no (o almeno non fa visualizzare i dati nella maschera)?
    L'unica risposta sincera che posso darti, visto che NON uso riferimenti a maschere nelle query è NON LO SO
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:


    Ho solo una domanda, dal momento che la maschera "frmdb" è sempre aperta perché da VBA con la sintassi me.txt_den funziona e con la query no (o almeno non fa visualizzare i dati nella maschera)?

    Grazie mille
    Se ho capito bene la domanda..., ma non ne sono certo, temo tu abbia una grande confusione tra le varie cose che gestisce Access.
    Un conto è il Modello ad Oggetti del VBA, altra cosa la sintassi SQL.

    Se inserisci in SQL il riferimento [Me.txt_den] il motore di JET, o meglio il driver per il motore, come fa a sapere chi è quel [Me]...?
    Me è il riferimento Esplicito dell'Oggetto in cui gira il codice VBA stesso, all'esterno della Form ad esempio [Me] non ha alcun senso di esistere..., cioè se io in un Modulo standard scrivo [Me.txt_den] ottengo una pernacchia...

    Già trovo assurdo che il motore di JET possa risolvere i riferimenti agli Oggetti del DB... cosa che non fa nessun motore di Database... e questo consente ai meno esperti di infilare delle cavolate assurde nei predicati SQL.... soprattutto nei criteri, senza nemmeno capire cosa si stia facendo...

    Quindi non mixare tutto insieme perchè sono cose molto distinte.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Ciao Alex

    Nella query, il riferimento è completo:
    [maschere]![frmDb]![txt_den]
    In VBA
    me.txt_den
    Il ME si riferisce alla maschera frmDb.

    Per questo la domanda.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Nella "Sub ricercadenominazione" appaiono molti Me. In quale modulo hai messo questa Sub? Se è esterno alla maschera, ha ragione @Alex, Access non sa di cosa si tratta.
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    È all'interno della maschera.

    Comunque dal momento che il quesito principale ha trovato la soluzione, metto risolto al posto

    Grazie a tutti dell'aiuto
  • Re: [RISOLTO] REQUERY SOTTOMASCHERA

    Marcdreamer ha scritto:


    Ciao Alex

    Nella query, il riferimento è completo:
    [maschere]![frmDb]![txt_den]
    In VBA
    me.txt_den
    Il ME si riferisce alla maschera frmDb.

    Per questo la domanda.
    No, il [Me] si riferisce alla frmDb SOLO dentro al codice del modulo di Classe della Form, quindi il [Me] se messo fuori dal codice di Maschera non significa NULLA.
Devi accedere o registrarti per scrivere nel forum
15 risposte