Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22

Oggetto Querydef non aggiornabile se transazione attiva con maschera continua

  1. #1
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Access2013 32Bit
    Applicazione con Be Access, Fe MySQL e driver ODBC

    Ho creato una maschera non associata con una sottomaschera anch'essa non associata.
    La maschera serve per impostare dei filtri e per scegliere la tabella alla quale applicarli (ovviamente tramite query costruita da codice). La sottomaschera non contiene alcun controllo, è inserita nel corpo della maschera e quando diventa visibile mostra i record in modalità griglia.
    Per rendere l'idea di cosa ottengo nel caso non fosse chiaro : ottengo una vista a griglia di una query in modo da avere la possibilità di modificare i record. Lo scopo principale è quello di poter avere a disposizione in modalità manutentiva quando l'applicazione verrà eseguita tramite il runtime la possibilità di modificare direttamente dei record.
    Dopo aver visto che il metodo funziona ho pensato che avrei potuto anche utilizzarlo per far visualizzare (magari anche aggiornare) alcune tabelle di servizio nelle maschere di gestione dei dati.

    Questa è la parte saliente del codice che mi permette di gestire tramite una coppia Maschera/Sottomaschera qualsiasi tabella decida di accedere :
    CurrentDb.QueryDefs("DummyExportQuery").SQL = "Select * From LaTabellaCheVoglioModificare"
    Me.SM_Continuous.SourceObject = "Query.DummyExportQuery"
    
    Di fatto imposto la query che mi serve e la passo al SourceObject della sottomaschera.
    Questo approccio funziona senza alcun problema nelle seguenti condizioni :
    - apro la maschera principale dall'elenco delle maschere
    - utilizzo DoCmd.OpenForm su un pulsante da una maschera (senza aver avviato alcuna transazione)
    - utilizzo DoCmd.OpenForm su un pulsante da una maschera singola(avendo avviato una transazione)
    Questo approccio NON funziona se provo ad avviare la maschera da una sottomaschera continua la cui maschera singola ha avviato una transazione.
    Ovvero succede che, sebbene il codice aggiorni la query (dell'ogggetto QueryDef) in realtà la query non viene aggiornata, sembra quasi che l'aggiornamento avvenga su una copia dell'oggetto QueryDef.
    Se provo a cancellare e poi ricreare l'oggetto querydef non ottengo alcun errore e mi ritrovo la query che voglio (in debug tramite ? CurrentDb.QueryDefs("DummyExportQuery").SQL prima e dopo) peccato la cancellazione NON cancella la query dall'elenco delle query di Access e che quindi il SourceObject continui ad utilizzare quanto memorizzato ignorando quanto parrebbe essere eseguito da codice.
    Se faccio 2 cancellazioni in sequenza della query, ottengo errore alla seconda (not found - ovvio), comunque la query continua ad esistere nell'elenco delle query (anche dopo Application.RefreshDatabaseWindow o QueryDefs.Refresh)
    Se, quando sono nella condizione che la query NON viene aggiornata anche se sembra che l'aggiorni, vado a modificare direttamente la query da Access allora ottengo errore (3188 - Impossibile aggiornare - Bloccato da altra sessione su questo computer).

    Onestamente non riesco a capire quale possa essere la causa del blocco, in prima battuta pensavo fosse la transazione attiva ma a quanto pare il vincolo potrebbe essere la transazione attiva ma con richiamo da maschera continua ...
    Suggerimenti e consigli sono ben accetti.

  2. #2
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Dimenticavo :
    se dalla maschera continua, prima di chiamare DoCmd.OpenForm faccio un Rollback (o un Commit) della transazione tutto funziona!
    Ovviamente non posso fare un Commit o RollBack in quanto queste azioni le eseguo sui pulsanti Aggiorna/Chiudi.

  3. #3
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Per completezza aggiungo alcune prove effettuate
    On Error Resume Next
    Dim wrkAcc      As dao.Workspace
    Dim dbs         As dao.Database
                
    ' Create a new Microsoft Access workspace.
    Set wrkAcc = CreateWorkspace("ANCF_Wrk", "admin", "", dbUseJet)
    Set dbs = wrkAcc.OpenDatabase(DBEngine.Workspaces(0).Databases(0).Name)
    dbs.QueryDefs.Delete "DummyExportQuery"
    Application.RefreshDatabaseWindow
    On Error GoTo 0
    dbs.QueryDefs.Refresh
    dbs.CreateQueryDef "DummyExportQuery", "SELECT * ...."
    Set dbs = Nothing
    Set wrkAcc = Nothing
    
    oppure
    Dim qd          As dao.QueryDef
    Debug.Print "Prima : " & CurrentDb.QueryDefs("DummyExportQuery").SQL
    Set qd = CurrentDb.QueryDefs("DummyExportQuery")
    qd.SQL = "SELECT * FROM ...."
    Debug.Print "Dopo  : " & qd.SQL
    qd.Close
    Set qd = Nothing
    Debug.Print "Close : " & CurrentDb.QueryDefs("DummyExportQuery").SQL
    
    Questi 2 spezzoni di codice sono alternativi a
    CurrentDb.QueryDefs("DummyExportQuery").SQL = "SELECT * FROM ...."
    
    Tutti funzionano regolarmente tranne quando NON funzionano
    ovvero apertura maschera da sottomaschera continua con transazione attiva.

  4. #4
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Tutti funzionano regolarmente tranne quando NON funzionano
    Lamaxriserviano, direi.
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    ovvero apertura maschera da sottomaschera continua con transazione attiva.
    Questo mi è oscuro, dopo aver letto il thread più volte.
    Non voglio rubare la tecnica di redazione dei post ad Osvaldo ma potresti fare un esempio con qualche nome, perché mi sono perso tra maschera principale, sottomaschera, continua o non, che apre una maschera che ha una sottomaschera?

  5. #5
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Cerco di esplicitare meglio il problema riscontrato (indicando solo le parti essenziali).

    Maschera (Form_Grid) con un controllo combobox che contiene un elenco di nomi di tabelle e con pulsante (Applica). Entrambi i controlli sono posizionati nell'intestazione pagina.
    Nel corpo ho inserito una sottomaschera continua (Form_Grid_SM denominata SM_Continuous quando inserita in Form_Grid). La sottomaschera non contiene alcun controllo ed ha la visualizzazione 'Foglio Dati' come predefinita (e unica).
    Proprietà RecordSource per Form_Grid e Form_Grid_SM non impostata così come LinkMasterFields e LinkChildFields.
    Ho una query (DummyExportQuery) che contiene una banale : Select * From UnaTabellaQualsiasi
    Non è importante cosa fa la query : mi serve una query

    Operatività :
    - seleziono la tabella che voglio visualizzare in modalità Foglio Dati
    - costruisco la query : Select * From LaTabellaCheVoglioModificare
    - clicco sul pulsante Applica che esegue il seguente codice :
    CurrentDb.QueryDefs("DummyExportQuery").SQL = "Select * From LaTabellaCheVoglioModificare"
    Me.SM_Continuous.SourceObject = "Query.DummyExportQuery"
    
    La prima istruzione aggiorna immediatamente la query, la seconda permette di impostare 'indirettamente' il RecordSource della sottomaschera SM_Continuous.
    Questo è quello che ottengo eseguendo direttamente Form_Grid :
    Nome:   Form_Grid.jpg
Visite:  47
Grandezza:  98.2 KB

    Il passo successivo diventa richiamare il Form_Grid da altri form tramite :
    DoCmd.OpenForm "Form_GRID", acNormal, , , , acDialog
    
    Giusto per evitare puntalizzazioni : il comportamento con acDialog o senza è lo stesso.
    Se lo richiamo da una maschera singola (con o senza transazione attiva) Form_Grid funziona (ovvero riesco a cambiare la tabella che voglio visualizzare agendo sulla query DummyExportQuery come da codice precedentemente indicato).
    Ora io ho una maschera singola (Form_Customer) che contiene una sottomaschera continua (Form_Customer_Address) con un pulsante che mi permette di aprire la Form_Grid.
    La Form_Customer avvia una transazione, quindi quando premo sul pulsante per aprire la Form_Grid ho una transazione attiva. L'unione di maschera continua e transazione attiva provoca il problema che ho esposto ovvero che la query DummyExportQuery non si aggiorna.
    Se richiamo Form_Grid da Form_Customer (con o senza transazione attiva) tutto funziona.
    Se richiamo Form_Grid da Form_Customer_Address disattivando la transazione prima del comando di apertura del form tutto funziona.

    Spero che sia un po' più chiara l'origine del problema.

    Come ho risolto (bypassato) l'ostacolo?
    Nel Form_Customer, prima di avviare la transazione, aggiorno la query che voglio utilizzare in Form_Grid (inibendo la scelta della tabella dal combobox).
    Siccome in realtà nella sottomaschera Form_Customer_Address ho più pulsanti per aprire diverse tabelle ho dovuto utilizzare una query specifica per ogni pulsante passando tramite openargs al Form_Grid la query che mi serve.

  6. #6
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Spero che sia un po' più chiara l'origine del problema.
    Ora è chiarissimo. Per spiegazioni-soluzioni... un attimo, anzi due. Facciamo tre.

  7. #7
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    ...
    Maschera (Form_Grid) ... una sottomaschera continua (Form_Grid_SM denominata SM_Continuous quando inserita in Form_Grid). ...
    DoCmd.OpenForm "Form_GRID", acNormal, , , , acDialog
    
    ...
    Ora io ho una maschera singola (Form_Customer) che contiene una sottomaschera continua (Form_Customer_Address)
    Come fai ad avere nomi di maschere che iniziano per "Form_"?
    A me non lo permette: se non vado errato era consentito nelle vecchissime versioni di Access, quando il modulo di classe collegato alla maschera non era generato con il prefisso "Form_" seguito dal nome della maschera.
    (intanto vado avanti con normali frm, nelle prove)

  8. #8
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Phil ho messo dei nomi di maschera significativi per spiegare il problema (ANCF_GRID il vero nome mi sembrava poco appropriato) ... solo ora scopro che Form_ è un prefisso riservato

    Se riesco posto un minidemo, anche se per farlo devo eliminare tantissime parti di codice, classi, OBDC, etc ...

  9. #9
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Phil ho messo dei nomi di maschera significativi ...
    Ah!!! erano nomi fittizi. Non c'ero arrivato.
    Quote Originariamente inviato da Max.Riservo Visualizza il messaggio
    Se riesco posto un minidemo ...
    Ho anche una mezza idea di chi ha messo in mente questa cosa. Nel frattempo con un po' di dati del Northwind (e la mente più lucida dei giorni precedenti) i test stanno dando i loro frutti, anche se i risultati non sono proprio identici ai tuoi. Continuo per "la mia strada". Se puoi pubblicare qualcosa molto molto meglio.

  10. #10
    Non ho potuto provare con BE su MySQL, sono rimasto in un unico file accdb.

    Con la versione
    CurrentDb.QueryDefs("DummyExportQuery").SQL = "Select * From LaTabellaCheVoglioModificare"
    Me.SM_Continuous.SourceObject = "Query.DummyExportQuery"
    
    in apertura autonoma di "Frm_Grid" non c'è alcun problema (come nella tua situazione).
    Ecco invece dove cambia: il problema si presenta sia quando apro la maschera "frm_Grid" (nel mio test l'ho chiamata così, non Form_Grid) da una maschera singola (nel mio test "frm_Clienti") sia dalla relativa sottomaschera continua che si trova nella maschera singola (nel mio test "frm_ClientiOrdini")

    Con questo codice nell'evento click del pulsante "ApplicaFiltro" di frm_Grid sembra funzionare tutto
    Dim strTabella As String
    strTabella = Me.cmbTabelle.Value
    
    Dim wrkAcc      As DAO.Workspace
    Dim dbs         As DAO.Database
                 
    ' Create a new Microsoft Access workspace.
    Set wrkAcc = DBEngine.CreateWorkspace("ANCF_Wrk", "admin", "", dbUseJet)
    Set dbs = wrkAcc.OpenDatabase(DBEngine.Workspaces(0).Databases(0).Name)
    dbs.QueryDefs("DummyExportQuery").SQL = "Select * From [" & strTabella & "]"
    'CurrentDb.QueryDefs("DummyExportQuery").SQL = "Select * From [" & strTabella & "]"
    Me.SM_Continuous.SourceObject = "Query.DummyExportQuery"
    
    Set dbs = Nothing
    Set wrkAcc = Nothing
    
    La transazione è aperta nell'evento Load e chiusa con un Commit nel Close di frm_Clienti e ho sempre aparto frm_Grid in modalità acDialog

    Allego il file che ho usato per i test. Non va considerato nemmeno come esempio per fare qualcosa di diverso, non c'è la gestione degli errori eccetera eccetera. I dati li ho presi da un vecchissimo Northwind (con i nomi delle tabelle in italiano e i prezzi in Lire), giusto per aver qualcosa su cui provare.
    DBTest.zip
    (tutto su A2016 32bit, Windows10 64bit)

+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Verifica completamento campi maschera prima di transazione
    Da RaoulDuke nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 28-12-2020, 13:46
  2. Risposte: 5
    Ultimo Post: 31-01-2015, 10:33
  3. Maschera attiva all'apertura
    Da joseph76_2004 nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 10-10-2014, 22:11
  4. Maschera attiva all'apertura
    Da joseph76_2004 nel forum Microsoft Word
    Risposte: 3
    Ultimo Post: 10-10-2014, 21:01
  5. Leggere campo di una maschera/sottomaschera non attiva
    Da Arcor nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 21-04-2011, 21:20