Newsgroup: it.comp.appl.access
Titolo: DocCmd.CopyObject

Uso il comando di cui sopra per copiare alcuni oggetti dal DB corrente ad un
altro.
Succede una cosa strana.
Questo comando viene chiamato da una funzione che legge gli oggetti da
esportare da una query.
Facico partire la funzione, copia il primo oggetto, arriva al secondo, prova
a copiare e mi dice:
Errore di run-time '3420':
Object invalid or no longer set.
Ok, c'è qualche problema. Provo a premere F8 e questa volta va.
Premo F5, processa il record successivo e si blocca di nuovo a quello subito
dopo.
Ho pensato che fosse un problema di velocità di elaborazione: magari l'altro
DB era ancora aperto.
Allora ho messo uno "sleep 5000" (funzione presa dalle API), ma il problea
persiste.
Come posso fare?
Tanto per completezza: questo DB mi serve per aggiornare un altro DB con le
nuove versioni di Maschere o altri oggetti, senza dover inviare sempre tutto
il Front-End.

 Come posso fare?
Togli Sleep e metti
DoEvents
dopo l'istruzione che copia.
Ciao, Sib

 dopo l'istruzione che copia.
Non posso.
Senza quel comando, quando si torna una seconda volta sul docmd.copyobject,
Access dice che il DB è in uso (evidentemente perchè il docmd precedente sta
ancora lavorando o il DB deve ancora chiudersi).

"Andrea Sciamanna" <andrea.s...@libero.it.cancellami> ha scritto nel
messaggio news:8pqhva$lkq$1...@serv1.iunet.it...

Scusa, ma hai provato?
DoEvents serve proprio a fermare la routine fino a quando il sistema non ha
finito di elaborare tutta la sua coda, proprio per evitare sovrapposizioni
di procedure.
Ciao, Sib

 di procedure.
E' ovvio che ho provato, ma viene proprio fuori l'errore che ti ti ho appena
detto.

Andrea Sciamanna <andrea.s...@libero.it.cancellami> wrote in message
8psh52$smi$1...@serv1.iunet.it...

Ok, posta il codice cosi' approfondiamo la cosa
Ciao, Sib
--
------------------------------------------------------
il sito comune di it.comp.database.access:
http://members.xoom.it/it_db_access
------------------------------------------------------
4000 anni fa', il saggio egizio Ptahhotep scrisse:
"... perche' non esistono saggi per nascita."
------------------------------------------------------
Saturiamo ECHELON:
bomba saddam attentato medio oriente

> Ok, posta il codice cosi' approfondiamo la cosa
Segue codice + commento.
---8<--------------snip--------8<--------------------snip--------------8<---
-----------
Sub Patch()
    Dim rs As RecordSet
    Dim strSource As String
    Dim strTarget As String
    Dim stato As Boolean
    Set rs = CurrentDb.OpenRecordset("QRY_Patch")
    If Not rs.EOF Then
        strSource = rs("filepath") & rs("filename")
        strTarget = rs("filepath") & "~" & Left(rs("filename"),
Len(rs("filename")) - 3) & "mdb"
        'Cambio l'estensione in mdb, perchè, lavoro su la copia che viene
importata ogni volta
        'che i vari utenti accendono la loro macchina.
        'La copia ha estensione ".bak"
        'E' un classico sistema per avere sempre il FE compattato
        'Credo che il DoCmd.CopyObject funzioni anche se il DB non ha
estensione .mdb, comunque
        stato = VBAbackup(strSource, strTarget, True)
        'Routine che copia un file da strSource a strTarget (crea un file
temporaneo)
        If stato Then
            DoCmd.SetWarnings False    'Questa per evitare i msg di
sovrascrittura
            Do Until rs.EOF
                    DoCmd.CopyObject strTarget, rs("ObjectName"),
rs("ObjectType"), rs("ObjectName")
                    'DoEvents    'Togliendo il commento qui, la riga
successiva non ha effetto
                    Sleep 2000   'Questo evita il msg d'errore del tipo "Il
file è in uso" o roba del genere
                rs.MoveNext
            Loop
            DoCmd.SetWarnings True
            stato = VBAbackup(strTarget, strSource)
            'Copia il temporaneo nel definitivo
            If stato = False Then
                MsgBox "Non è stato possibile copiare il file aggiornato!" &
vbCrLf _
                    & "Contattare il supporto tecnico.", vbExclamation +
vbOKOnly, "Errore!"
            End If
        Else
            MsgBox "Non è stato possibile creare il file temporaneo!" &
vbCrLf _
                & "Contattare il supporto tecnico.", vbExclamation +
vbOKOnly, "Errore!"
        End If
    End If
    rs.Close
    Set rs = Nothing
End Sub
---8<--------------snip--------8<--------------------snip--------------8<---
-----------

 estensione .mdb, comunque
[cut]
Mi pare di capire che il recordset rs contiene l'elenco di tutti gli oggetti
e il loro tipo.
Io, per provare rapidamente il codice, ho modificato la routine cosi':
Sub Patch()
    Dim tdf As TableDef
    DoCmd.SetWarnings False
                For Each tdf In CurrentDb.TableDefs
                    If tdf.Attributes = 0 Then DoCmd.CopyObject
"c:\documenti\db1.mdb", tdf.Name, acTable, tdf.Name
                    'DoEvents    'Togliendo il commento qui, la riga
successiva non ha effetto
                    'Sleep 2000   'Questo evita il msg d'errore del tipo "Il
file č in uso" o roba del genere
                Next tdf
    DoCmd.SetWarnings True
End Sub
quindi manca tutta la parte relativa al ripescaggio del file e relative
operazioni che, in teoria, non dovrebbero avere legami col tuo problema,
inoltre questa routine copia solo le tabelle.
Questa routine mi funziona perfettamente, ora non so dirti se e' perche'
lavora solo sulle tabelle, ma provala anche tu, cosi' capiamo se e' un
problema legato a questo o se e' qualcos'altro.
Ciao, Sib

 problema legato a questo o se e' qualcos'altro.
Funziona perfettamente anche a me, cosě com'č.