Newsgroup: it.comp.appl.access
Titolo: Access2003 : tabella bloccata?

Ciao,
son da poco passato a Access2003 e in questi giorni sto verificando la
compatibilità con i miei applicativi vecchi realizzati in ambiente 97 o
2000.
Uno di questi applicativi mi da un errore di run-time, cosa che prima,usando
il 2000, non dava.
L'errore è il seguente:
Errore di run-time: '3211'
Il modulo di gestione di database non può bloccare la tabella "SISTEMI"
perchè in uso da un altro utente o processo.
Qualcuno saprebbe spiegarmene il motivo?
Perchè prima con Access2000 funzionava perfettamente mentre ora da questo
tipo di errore?
Debugando ho bloccato il codice l'istruzione prima di crashare, ho provato
ad aprire la tabella e non mi pare risulti bloccata, l'ho aperta
tranqueillamente senza msg di apertura in sola lettura perchè già in uso.
Quindi, anche a fronte di questo non capisco proprio tale errore.
Grazie in anticipo e buon pomeriggio.
Fabio
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Quindi, anche a fronte di questo non capisco proprio tale errore.
Prova a postare il codice che usi per aprire la tabella.
Inserendo anche se lo fai con una maschera, modulo bas o se hai altre
maschere aperte.
Ciao,
Massimo
-- 
web: 
www.piubelli.net
Vuoi il mio indirizzo? Togli _cut_ per rispondermi


Ciao,
scusa se ti rispondo soltanto ora ma ho avuto diversi problemi con internet
in questi ultimi giorni.
La tabella non viene mai aperta, almeno non direttamente.
Viene usata una volta per copiare il suo contenuto in un'altra tabella e
un'altra volta in una query.
Uso una maschera per la ricerca di dati, quindi uso molto l'evento
AfterUpdate.
Il problema è che non riesco a capire in quale preciso istante la tabella
inizia a essere usata da un altro processo.
Nel senso che alla fine di una routine , facendo due prove, mi sono accorto
che è ancora accessibile, mentre appena viene chiamata la routine
successiva, la tabella risulta già bloccata da un altro processo? Ma quale?
Cosa può succedere tra una routine e l'altra e soprattutto come faccio a
scoprirlo? Ho provato con lo stack di chiamata ma visualizza (come forse è
giusto che sia) solo l'ultima chiamata della routine terminata.
Di seguito ti posto il codice delle routine che usano la tabella,
nell'ordine in cui vengono eseguite.
Private Sub ric1_AfterUpdate()
DoCmd.CopyObject , "SISTEMI", acTable, "SISTEMI_PC"
Me![COD].Enabled = True
End Sub
Private Sub ric2_AfterUpdate()
Set wdb = CurrentDb()
Set wset = wdb.OpenRecordset("SISTEMI_PC", DB_OPEN_DYNASET)
wric = "[ID]=" & """" & Me![txt_ID] & """"
wset.FindFirst wric
If wset.NoMatch = False Then
    Me![Nome] = wset![Nome]
    Me![COD].Enabled = True
    Me![txt_tele] = wset![INDICE_TELE]
End If
wset.Close
End Sub
Private Sub CercaDati_Click()
Dim str_id, str_cod, str_nome, str1, wric As String
Dim i As Integer
str_id = IIf(IsNull([ID]), "", Me![txt_ID])
str_cod = IIf(IsNull([COD]), "", Me![COD])
str_nome = IIf(IsNull([Nome]), "", Me![Nome])
g_str_ptn = ""
If str_id <> "" Then g_str_ptn = str_id
g_all = ""
If str_cod <> "" Then g_all = str_cod
wric = ""
If FlagTratto = False Then
    str1 = "X"
    wric = " [RIS] <> " & """" & str1 & """"
End If
wric_stampa = wric
DoCmd.OpenQuery "QSISTEMI_PC"
DoCmd.OpenForm "elenco_sistemi", , , wric
End Sub
E questo è il contenuto della Query QSISTEMI_PC
SELECT SISTEMI_PC.* INTO SISTEMI
FROM SISTEMI_PC
WHERE (((SISTEMI_PC.Nome) Like [Forms]![analisi_per_id]![ID] & "*");
E questo è tutto.
Grazie mille e buon pomeriggio.


....nessuno mi sa dare una mano?




Vado a naso non conoscendo l'inizio del problema; forse la tabella è origine
dati di qualche maschera/report/query aperta?
Ciao.
-- 
Sergio MAZZA


Esatto, è come dici te.
Dopo numerose prove di debug, credo d'aver individuato la query che provoca
l'errore sulla tabella.
E' una query che viene lanciata da una casella combinata per ricavare i dati
da visualizzare col menù a tendina.
Ora, il problema mio è che non so come fare a chiudere una query che nome
non ha, in quanto viene generata da "Origine riga" ogni volta che viene
selezionato la casella combinata.
LA cosa strana è che Access 2000 questo problema non lo dava, eppure la
tabella sarà risultata bloccata dalla query, no?
Qualche controllo in più nella nuova versione?
Una soluzione potrebbe essere quella di crearmi al posto delle righe, delle
query da lanciare e chiudere successivamente.
Però non avendo fatto io questo programma, diventa un pò laborioso e
"pericoloso" per me stravologere il tutto, in quanto sono molte le pagine
che fanno uso di questo metodo.
Qualcuno saprebbe come fare per poter cambiare il meno possibile ?
Grazie e buona serata.




Il problema non è la query (in questo caso l'istruzione sql) che viene
eseguita ma il fatto che un altro oggetto sta bloccando la stessa tabella;
probabilmente è la tabella di origine della form che contiene la casella
combinata.
Quello che è strano è che una query di selezione dati inceppi il programma;
è sicuro che la query sia di selezione è non tenti di modificare i dati in
tabella?
Ciao.
-- 
Sergio MAZZA


Ho controllato, la query è di selezione.
Ecco la stringa SQL:
SELECT DISTINCT SISTEMI_PC.COD, SISTEMI_PC.DESCR, SISTEMI_PC.PROG FROM
SISTEMI_PC ORDER BY SISTEMI_PC.COD;
Non credo sia colpa della form, ho controllato ma non usa nessuna tabella
d'origine. La finestra è composta da due caselle combinate ed entrambe usano
la stessa tabella SISTEMI_PC.
Pensavo potesse rimanere bloccata a causa della prima casella combinata ma
ho provato a cancellarla subito dopo la selezione e me la lascia
tranquillamente cancellare. Ora, correggimi se sbaglio, ma se risultasse
bloccata non dovrei riuscirci.
Ho provato a fare la stessa operazione sulla seconda casella combinata e in
questo caso la tabella non viene cancellata, dando un errore di tabella
bloccata.
Non riesco a capire il momento in cui viene bloccata questa tabella e
soprattutto da cosa viene bloccata.



La caselle combinate sono associate?
Ciao.
-- 
Sergio MAZZA


Scusa, mi sono accorto di aver scritto un'inesatezza.
Ti avevo detto che entrambe le caselle usavano la stessa tabella.FALSO.
Usano due tabelle diverse.
E la seconda tabella(quella incriminata) viene generata dopo la selezione
della prima casella attraverso un CopyObject.
Quando finisce l'evento della prima casella la tabella SISTEMI_PC risulta
libera (avevo ipotizzato che magari il CopyObject potesse tenerla
occupata... ma niente), si blocca non appena il focus passa alla seconda
casella.
Ciao!


 Ciao!
E il copyobject quando lo fai? Perché fai un copyobject poi?
Ciao.
-- 
Sergio MAZZA


Il CopyObject viene fatto all'interno della sub della prima casella
combinata. Ti posto il codice sia della prima che della seconda:
Private Sub ric1_AfterUpdate()
DoCmd.CopyObject , "SISTEMI", acTable, "SISTEMI_PC"
Me![COD].Enabled = True
End Sub
Private Sub ric2_AfterUpdate()
Set wdb = CurrentDb()
Set wset = wdb.OpenRecordset("SISTEMI_PC", DB_OPEN_DYNASET)
wric = "[ID]=" & """" & Me![txt_ID] & """"
wset.FindFirst wric
If wset.NoMatch = False Then
    Me![Nome] = wset![Nome]
    Me![COD].Enabled = True
    Me![txt_tele] = wset![INDICE_TELE]
End If
wset.Close
End Sub
Dopo aver effettuato la scelta si deve cliccare su "Ricerca" e a quel punto
parte questa procedura:
Private Sub CercaDati_Click()
Dim str_id, str_cod, str_nome, str1, wric As String
Dim i As Integer
str_id = IIf(IsNull([ID]), "", Me![txt_ID])
str_cod = IIf(IsNull([COD]), "", Me![COD])
str_nome = IIf(IsNull([Nome]), "", Me![Nome])
g_str_ptn = ""
If str_id <> "" Then g_str_ptn = str_id
g_all = ""
If str_cod <> "" Then g_all = str_cod
wric = ""
If FlagTratto = False Then
    str1 = "X"
    wric = " [RIS] <> " & """" & str1 & """"
End If
wric_stampa = wric
DoCmd.OpenQuery "QSISTEMI_PC"
DoCmd.OpenForm "elenco_sistemi", , , wric
End Sub
Il perchč sia stato scelto di usare un CopyObject non te lo so dire, questo
applicativo l'ho ereditato dal mio collega precedente. E quello che sto
facendo in questi giorni č proprio quello di comprendere ed eventualmente
correggere parti dell'applicativo poco chiare.



Non è chiaro cosa deve succedere; provo a riassumere:
Allora ci sono due caselle combinate (ric1 e ric2) e un bottone CercaDati.
ric1 ha come origine record la tabella Sistemi e ric2 la tabella Sistemi_pc
che poi ha la stessa struttura e dati della prima; che senso ha? Io non
capisco se ric2 deve presentare dei dati (presi da Sistemi) filtrati in base
a ric1.
No, lascia perdere l'errore di tabella bloccata e iniziamo a rivedere la
procedura che è complicata.
Descrivi passo passo cosa devi fare con ric1/ric2/CercaDati e cosa vuoi
ottenere...
Ciao.
-- 
Sergio MAZZA


Sì, hai ragione.
Per semplificare le cose (ma mi sa che te le ho complicate ) in questo post
ho eliminato uno switch (in realtà ce lo devo ancora mettere, al momento nel
codice è presente un if con più else) nella prima sub.
L'originale è così:
Private Sub ric1_AfterUpdate()
G_VAR = IIf(IsNull([txt_scelta]), "", Me![txt_scelta])
If G_VAR = "PC" Then
    DoCmd.CopyObject , "SISTEMI", acTable, "SISTEMI_PC"
    Me![ESWBS].Enabled = True
Else
    If G_VAR = "RETE" Then
        DoCmd.CopyObject , "SISTEMI", acTable, "SISTEMI_RETE"
        Me![ESWBS].Enabled = True
    Else
        If G_VAR = "OTHER" Then
            DoCmd.CopyObject , "SISTEMI", acTable, "SISTEMI_OTHER"
            Me![ESWBS].Enabled = True
        Else
            MsgBox "ATTENZIONE CAMPO OBBLIGATORIO"
            Me![ESWBS].Enabled = False
        End If
    End If
End If
End Sub
Ecco com'è in realtà la struttura.
Anche io sto ancora cercando di capire alcune parti del codice (non avendolo
scritto io), per questo preferirei stravolgerlo il meno possibile, tenendo
conto che questo programma serve sopratutto per fare dei calcoli anche
complessi e quindi mi risulterebbe alquanto difficile verifircarne
l'esattezza.
Tornando alle procedure, dunque nella prima devo poter fare una scelta tra 3
diversi sistemi (PC, RETE, OTHER) e in base alla scelta effettuata nella
seconda casella vi saranno dei valori filtrati.
Infine si dovrà premere sul tasto ricerca che corrisponde alla sub
CercaDati.
Questa aprirà una query di selezione sulla tabella selezionata in precedenza
e quindi aprirà una form con tali valori filtrati.
Spero di essere stato un pò più chiaro.
Ciao e grazie mille!!!




L'avevo immaginato;
- la prima casella (ric1) avrà nell'evento "dopo aggiornamento"  un requery della seconda (ric2):
es.
me!ric2.requery
- la seconda (ric2) ha come base dati una select sulla tabella SISTEMI con una condizione where che punta a ric1:
es.
Select * From SISTEMI Where id = forms!nomeForm!ric1
Così hai definito il comportamento delle due caselle combinate...
Ciao.
-- 
Sergio MAZZA