Routine da editor VBA funziona, da evento_click inibisce mouse

di il
6 risposte

Routine da editor VBA funziona, da evento_click inibisce mouse

Ciao e buon Santo Stefano a tutti,

ho creato questa routine che mi crea una query al volo costruendo una stringa SQL e me la apre come foglio dati, viene poi distrutto il queryDef quando il foglio dati viene chiuso.

se faccio partire il codice dall'editor VBA funziona tutto benissimo, se invece faccio partire la routine con l''evento click di un pulsante di una form il foglio dati si apre ma non mi è permesso selezionare nulla con il mouse, la tastiera invece funziona.

Selezionando un'altra app (anche il desktop) e tornando ad access il mouse torna a lavorare correttamente, non ho trovato molto in rete al riguardo ma forse non ho fatto le ricerche giuste.

Sembrerebbe che il focus vada sul navigationPane (ho dovuto infatti dopo la creazione del queryDef nasconderlo perchè veniva aperto)

qualche dritta?

grazie in aticipo
Public Sub genQdfAndOpen()


Dim strSQL As String
Dim strQueryName As String

'=============================================================================================================================
'inizio stringa SQL
'=============================================================================================================================

strSQL = "SELECT "

If (Forms!maschera_accesso!GidProduzione.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDproduzione, "
End If

If (Forms!maschera_accesso!GidOrdine.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDordine, "
End If

If (Forms!maschera_accesso!Glotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.lotto, "
End If
    
If (Forms!maschera_accesso!Gaddetto.Value) = True Then
    strSQL = strSQL & "DB_produzione.addetto, "
End If
    
If (Forms!maschera_accesso!Gmese.Value) = True Then
    strSQL = strSQL & "DB_produzione.mese, "
End If

If (Forms!maschera_accesso!Gsettimana.Value) = True Then
    strSQL = strSQL & "DB_produzione.settimana, "
End If

If (Forms!maschera_accesso!Gturno.Value) = True Then
    strSQL = strSQL & "DB_produzione.turno, "
End If
    
If (Forms!maschera_accesso!Gdata.Value) = True Then
    strSQL = strSQL & "DB_produzione.data, "
End If

If (Forms!maschera_accesso!Gprodotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.codiceSAP, "
    strSQL = strSQL & "DB_prodotti_terni.denominazioneProdotto, "
End If

strSQL = strSQL & "DB_produzione.reparto, "
strSQL = strSQL & "Sum(DB_produzione.pezziProdotti) AS pezzi, "
strSQL = strSQL & "Sum(DB_produzione.pezziScarto) AS pzScarto, "
strSQL = strSQL & "Sum(DB_produzione.pezziTotali) AS pzTot, "
strSQL = strSQL & "round(Sum(DB_produzione.tonProdotte),2) AS Ton, "
strSQL = strSQL & "round(Sum(DB_produzione.tonScarto),2) AS TonScarto, "
strSQL = strSQL & "round(Sum(DB_produzione.tonTotali),2) AS TonTotali, "
strSQL = strSQL & "round(Avg(DB_produzione.peso),3) AS MediaDipeso, "
strSQL = strSQL & "round(IIf([DB_produzione].[reparto] <> ""Verde Terni"", Sum([pezziProdotti]/[DB_produzione].[pezziCarro]), Null), 2) AS carri, "
strSQL = strSQL & "round(IIf([DB_produzione].[reparto] = ""Verde Terni"" or [DB_produzione].[reparto] = ""Secco Terni"", Sum([pezziProdotti]/[DB_produzione].[pezziCarrello]), Null), 2)  AS carrelli, "
strSQL = strSQL & "round(IIf([DB_produzione].[reparto] = ""Cotto Solaio Terni"" or [DB_produzione].[reparto] = ""Cotto Forati Terni"", Sum([pezziProdotti]/[DB_produzione].[pezziPacco]), Null), 2) AS pacchi, "
strSQL = strSQL & "round((Sum(pezziScarto)/Sum(pezziProdotti))*100, 2) AS scarto "

strSQL = strSQL & "FROM "

strSQL = strSQL & "DB_produzione LEFT JOIN DB_prodotti_terni ON (DB_produzione.codiceSAP = DB_prodotti_terni.codiceSap) "

strSQL = strSQL & "GROUP BY "
    
If (Forms!maschera_accesso!GidProduzione.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDproduzione, "
End If

If (Forms!maschera_accesso!GidOrdine.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDordine, "
End If
    
If (Forms!maschera_accesso!Glotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.lotto, "
End If

If (Forms!maschera_accesso!Gaddetto.Value) = True Then
    strSQL = strSQL & "DB_produzione.addetto, "
End If

If (Forms!maschera_accesso!Gmese.Value) = True Then
    strSQL = strSQL & "DB_produzione.mese, "
End If

If (Forms!maschera_accesso!Gsettimana.Value) = True Then
    strSQL = strSQL & "DB_produzione.settimana, "
End If
    
If (Forms!maschera_accesso!Gturno.Value) = True Then
    strSQL = strSQL & "DB_produzione.turno, "
End If
    
If (Forms!maschera_accesso!Gdata.Value) = True Then
    strSQL = strSQL & "DB_produzione.data, "
End If

If (Forms!maschera_accesso!Gprodotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.codiceSAP, "
    strSQL = strSQL & "DB_prodotti_terni.denominazioneProdotto, "
End If

strSQL = strSQL & "DB_produzione.reparto "

strSQL = strSQL & "ORDER BY "
If (Forms!maschera_accesso!GidProduzione.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDproduzione DESC, "
End If

If (Forms!maschera_accesso!GidOrdine.Value) = True Then
    strSQL = strSQL & "DB_produzione.IDordine DESC, "
End If
    
If (Forms!maschera_accesso!Glotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.lotto DESC, "
End If

If (Forms!maschera_accesso!Gaddetto.Value) = True Then
    strSQL = strSQL & "DB_produzione.addetto DESC, "
End If

If (Forms!maschera_accesso!Gmese.Value) = True Then
    strSQL = strSQL & "DB_produzione.mese DESC, "
End If

If (Forms!maschera_accesso!Gsettimana.Value) = True Then
    strSQL = strSQL & "DB_produzione.settimana DESC, "
End If
    
If (Forms!maschera_accesso!Gturno.Value) = True Then
    strSQL = strSQL & "DB_produzione.turno DESC, "
End If
    
If (Forms!maschera_accesso!Gdata.Value) = True Then
    strSQL = strSQL & "DB_produzione.data DESC, "
End If

If (Forms!maschera_accesso!Gprodotto.Value) = True Then
    strSQL = strSQL & "DB_produzione.codiceSAP, "
    strSQL = strSQL & "DB_prodotti_terni.denominazioneProdotto DESC, "
End If

strSQL = strSQL & "DB_produzione.reparto DESC; "

'=============================================================================================================================
'fine stringa SQL
'=============================================================================================================================


strQueryName = "DB_produzione_qry"

Call deleteQdfIfExist(strQueryName)

Set db = CurrentDb
Set qdf = db.CreateQueryDef(strQueryName, strSQL)

DoCmd.OpenQuery strQueryName, acViewNormal, acReadOnly
'DoCmd.SetWarnings False

DoCmd.SelectObject acQuery, strQueryName, True

'SendKeys "%{TAB}"

Call nascondiRiquadroSpostamento

While (SysCmd(acSysCmdGetObjectState, acQuery, strQueryName)) 'cicla finchè la query è aperta
    DoEvents
Wend

db.QueryDefs.Delete strQueryName

'DoCmd.SetWarnings True

Set qdf = Nothing
Set db = Nothing

End Sub

6 Risposte

  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    Nel tuo codice ci sono molte cose discutibili concettualmente...
    Hai verificato il predicato SQL da QBE... prima di eseguirla...?

    Fai un test, che puoi condividere per aiutarci:
    
    Set db = CurrentDb
    Set qdf = db.CreateQueryDef(strQueryName, strSQL)
    Debug.print strSQL
    Poi posta quanto è il predicato SQL stampato in finestra immediata..

    P.S. se la Query cambia nome... credo sia un massacro, non la cancelli mai... perchè non memorizzi il Vecchio Nome ma cerchi sempre il NUOVO... se non cambia nome, è assurdo CANCELLARLA... per ricrearla...!
    
    Dim qdf As DAO.QueryDef
    Set dqf=DbEngione(0)(0).QueryDefs(NomeQuery)
    qdf.SQL=NuovoSQL
    qdf.Execute ' se è una query Action, mentre è assurdo aprire una Query SELECT
  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    Ciao Alex,

    @Alex ha scritto:


    Nel tuo codice ci sono molte cose discutibili concettualmente...
    sicuro e certo perchè è uscito dalla mia testa..

    @Alex ha scritto:


    Hai verificato il predicato SQL da QBE... prima di eseguirla...?
    si, certo, la query funziona.. almeno sembra così perchè ci ho lavorato e non mi ha dato problemi.

    @Alex ha scritto:


    Fai un test, che puoi condividere per aiutarci:
    
    Set db = CurrentDb
    Set qdf = db.CreateQueryDef(strQueryName, strSQL)
    Debug.print strSQL
    Poi posta quanto è il predicato SQL stampato in finestra immediata..
    ho formattato il seguente codice per renderlo più leggibile, dimmi se è meglio che lo posti com'era
    SELECT 
    DB_produzione.lotto, 
    DB_produzione.data, 
    DB_produzione.reparto, 
    Sum(DB_produzione.pezziProdotti) AS pezzi, 
    Sum(DB_produzione.pezziScarto) AS pzScarto, 
    Sum(DB_produzione.pezziTotali) AS pzTot, 
    round(Sum(DB_produzione.tonProdotte),2) AS Ton,
    round(Sum(DB_produzione.tonScarto),2) AS TonScarto, 
    round(Sum(DB_produzione.tonTotali),2) AS TonTotali, 
    round(Avg(DB_produzione.peso),3) AS MediaDipeso, 
    round(IIf([DB_produzione].[reparto] <> "Verde Terni", Sum([pezziProdotti]/[DB_produzione].[pezziCarro]), Null), 2) AS carri, round(IIf([DB_produzione].[reparto] = "Verde Terni" or [DB_produzione].[reparto] = "Secco Terni", Sum([pezziProdotti]/[DB_produzione].[pezziCarrello]), Null), 2)  AS carrelli,
    round(IIf([DB_produzione].[reparto] = "Cotto Solaio Terni" or [DB_produzione].[reparto] = "Cotto Forati Terni", Sum([pezziProdotti]/[DB_produzione].[pezziPacco]), Null), 2) AS pacchi, 
    round((Sum(pezziScarto)/Sum(pezziProdotti))*100, 2) AS scarto 
    FROM 
    DB_produzione LEFT JOIN DB_prodotti_terni ON (DB_produzione.codiceSAP = DB_prodotti_terni.codiceSap) 
    GROUP BY 
    DB_produzione.lotto, 
    DB_produzione.data, 
    DB_produzione.reparto 
    ORDER BY 
    DB_produzione.lotto DESC, 
    DB_produzione.data DESC, 
    DB_produzione.reparto DESC; 
    

    @Alex ha scritto:


    P.S. se la Query cambia nome... credo sia un massacro, non la cancelli mai... perchè non memorizzi il Vecchio Nome ma cerchi sempre il NUOVO... se non cambia nome, è assurdo CANCELLARLA... per ricrearla...!
    la query è una SELECT e ha sempre lo stesso nome harcodato. Ho voluto fare un controllo se la query è già definita ed eventualmente eliminarla perchè altrimenti
    
    Set qdf = db.CreateQueryDef(strQueryName, strSQL)
    
    si arrabbiava e mi diceva che (se c'era) era già definita una query con quel nome.. (devo ancora gestire gli errori, ogni tanto mi rimaneva la query definita)
    
    Dim qdf As DAO.QueryDef
    Set dqf=DbEngione(0)(0).QueryDefs(NomeQuery)
    qdf.SQL=NuovoSQL
    qdf.Execute ' se è una query Action, mentre è assurdo aprire una Query SELECT
    ho provato alla ceca il codice qui sopra ma questo
    
    Set qdf=DBEngine(0)(0).QueryDefs(strQueryName)
    
    mi dice errore di runtime 3265 "elemento non trovato in questa raccolta
    devo studiare quel DBEngine(0)(0) che non ho idea di cosa sia

    da zappa quale sono non ho capito perchè dici che è assurdo aprire una SELECT..

    in sostanza sto creando una SELECT strutturandola in base alla selezione di alcuni OptionButton su una maschera.
    non mi sono venute in mente altre idee per fare questa cosa senza scrivere 100 query diverse.
  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    Se la cancelli è evidente che non venga trovata... creala una volta e lasciala stare poveretta cosa ti avrà fatto di male che la vuoi continuamente cancellare e rifare...?

    Se prendi quel predicato SQL che hai postato e lo incolli in QBE e provi ad eseguirlo restituisce i records che soddisfano il risultato oppure no...?
  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    @Alex ha scritto:


    Se la cancelli è evidente che non venga trovata... creala una volta e lasciala stare poveretta cosa ti avrà fatto di male che la vuoi continuamente cancellare e rifare...?
    in realtà per provare quel pezzo di codice che hai postato avevo creato la query e la ho lasciata dov'era, quindi la query esisteva ma, ripeto, non ho idea del funzionamento di quel codice quindi per ora bon...

    praticamente la cancellavo perchè non avevo idea che si potesse cambiare la definizione della query mantenendo lo stesso oggetto
    (immagino con questo)
    qdf.SQL=NuovoSQL
    la query viene generata ogni volta per contenere o meno i campi selezionati da una maschera (optionButton)

    @Alex ha scritto:


    Se prendi quel predicato SQL che hai postato e lo incolli in QBE e provi ad eseguirlo restituisce i records che soddisfano il risultato oppure no...?
    si, la stringa SQL funziona, ho già lavorato sui dati e non mi ha dato problemi.
  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    Prova a commentare tutto quanto segue la chiamata OPENQUERY... credo possa avere a che fare con quello che non mostri: nascondiRiquadroSpostamento
    La cosa più semplice è appunto non eseguirlo e vedere
  • Re: Routine da editor VBA funziona, da evento_click inibisce mouse

    @Alex ha scritto:


    Prova a commentare tutto quanto segue la chiamata OPENQUERY... credo possa avere a che fare con quello che non mostri: nascondiRiquadroSpostamento
    La cosa più semplice è appunto non eseguirlo e vedere
    ho commentato tutto il commentabile ma il problema è rimasto, temo che sia dovuto a questo, dove il doEvents non fa il lavoro sperato.
    While (SysCmd(acSysCmdGetObjectState, acQuery, strQueryName)) 'cicla finchè la query è aperta
        DoEvents
    Wend
    
    insegnandomi come ridefinire una query già esistente hai risolto il problema.

    Non sapendo come intercettare la chiusura della query(foglio dati) per eliminare la query stessa avevo pensato di avviare un loop che avrebbe continuato finchè il foglio dati non fosse stato chiuso,(per poi eliminare la query creata) usando doEvents con la speranza di riavere il controllo di access.

    mi sembrava strano dover fare un artefizio del genere..
    potendo fare a meno di eliminare la query ora posso far terminare la sub ed eliminare gli oggetti creati, senza tanti casini.

    beh, il codice è diventato questo che segue (meno la generazione della stringa SQL), perfettamente funzionante

    ho dovuto usare il currentDb al posto del DBEngine perchè non so come funziona..
    Public Sub genQdfAndOpen()
    
    Dim strSQL As String
    Dim strQueryName As String
    
    strSQL = "SELECT ............stringa SQL SELECT funzionante...........
    
    strQueryName = "DB_produzione_qry"
    
    Dim db As Database
    Dim qdf As DAO.QueryDef
    Set db = CurrentDb
    Set qdf = db.QueryDefs(strQueryName)
    qdf.sql = strSQL
    
    DoCmd.OpenQuery strQueryName, acViewNormal, acReadOnly
    
    Set qdf = Nothing
    Set db = Nothing
    End Sub
    bene, mi piacerebbe imparare un paio di cose da questa cosa (mi sento un po' scemo ora che ho risolto haha)

    1) DoEvents, il metodo del loop e DoEvents per tenere una routine aperta è una cosa sicura in certi casi?

    2) perchè caspita se eseguo la routine dall'editor VBA continuo ad avere il controllo dell'applicazione, se invece chiamo la routine da un pulsante di una maschera no??

    3) esiste un sistema semplice per capire dove se ne va il focus di Windows, di Access o altro in questi casi? (non so di cosa sto parlando)


    Grazie Alex per l'illuminazione, risolto
Devi accedere o registrarti per scrivere nel forum
6 risposte