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.