Newsgroup: it.comp.appl.access
Titolo: Accodamento di record da una serie di tabelle tmp su tab. definitive

Buongiorno a tutti,
ho un problema su una piccola procedura che si prefigge di accodare dati di
alcune tabelle (utilizzate in caso di lavoro OFFLINE, quindi su MDB
residente in locale), direttamente sulle tabelle 'reali' collegate ad un Db
Mysql.
Cio' si rende appunto necessario al momento in cui la linea torna nuovamente
disponibile.
 
Ho quindi pensato di procedere cosi':
- per prima cosa creare una tabella contenente, record x record, i nomi 
delle tabelle da allineare,  denominata '_LinkedMySQL'
- avvio un ciclo Do.. Loop,  nel quale mi scorro i nomi delle tabelle
- Con un altro ciclo al suo interno cerco di assegnare tutti i valori dei 
campi della tabella OffLine su quella della tabella Online sulla quale 
dovro' accodare i record.
 
Purtroppo, proprio in questa parte ricevo un errore, che cerco di spiegare 
meglio 'remmando' riga per riga il codice che ho creato.
 
Dim rs As Recordset, rsof As Recordset, rson As Recordset
Dim prpCiclo As Field, fldTemp As Field
 
' --- apro il recordset contenente i nomi di tabelle da allineare
Set rs = CurrentDb.OpenRecordset("SELECT [_LinkedMySQL].Name FROM 
_LinkedMySQL;")
 
' --- leggo una ad una le tabelle offline e aggiorna in elenco il tot. 
record e se necessario fare allineamento
Do Until rs.EOF
 
' --- apro il recordset 'offline' che ha lo stesso nome di quella reale 
'online' con l'aggiunta del suffisso '_Loc'
Set rsof = CurrentDb.OpenRecordset("SELECT * from " & rs![Name] & "_loc" & 
";")
 
' - apro il recordset della tabella 'Online'
Set rson = CurrentDb.OpenRecordset("SELECT * from " & rs![Name] & ";")
 
With rsof
Do Until .EOF
rson.AddNew '
'
' qua sto cercando di leggere i nomi dei singoli campi contenuti nella 
tabella per assegnarli a quelli dell'altra, ma ricevo l'errore n. 91:
'Variabile oggetto o variabile del blocco With non impostata'... ma non 
capisco proprio dove stia il problema
 
For Each prpCiclo In .Fields
fldTemp = .Name
rson(fldTemp) = rsof(fldTemp)
'
rson.Update
Next prpCiclo
.MoveNext
Loop
.Close
rson.Close
rs.MoveNext
End With
Loop
Set rsof = Nothing
Set rson = Nothing
Set rs = Nothing
 
Spero di essere riuscito a spiegare chiaramente il problema, grazie a tutti 
per l'aiuto
Un saluto
 
Marco67
 
 
 

 End With
CUT
 
mi sembra che ci sia molta confusione in questa routine.
Davvero non capisco cosa dovrebbe fare, soprattutto in questa parte di codice che ho riportato.
 
L'istruzione rson.Update  non va messo all'interno del ciclo, questo è senz'altro un errore, ma in realtà è la struttura del codice che non vedo.
 
Poi dici "I nomi nella tabella per assegnarli a quelli dell'altra" ma davvero non capisco cosa tu voglia fare, copiare i nomi dei campi o il loro contenuto, o qualcos'altro ancora?
 
Ciao

Ciao,
l'errore che descrivi è dovuto al fatto che la definizione di fldTemp è di tipo field ma la usi come fosse string: vi assegni la proprietà Name (che è una stringa) e la usi come chiave per accedere alla collection fields dei recordset.
Come ti ha già detto Davide devi spostare l'istruzione update all'esterno del ciclo for.
 
Ciao
Mat

 ha scritto nel messaggio 
news:9b53fa62-2ce4-4d6d...@googlegroups.com...

Ecco il problema,
che duro che so':
ciaramente volevo assegnare il valore di ogni campo nella prima sul 
rispettivo campo nell'altra.
ho quindi corretto tutto il codice:
 
For x = 1 To .Fields.count - 1
' --- il campo (0) lo salto perche' riguarda l'id contatore 
(autoincrementale) che ogni tabella gestisce autonomamente
If Not IsNull(.Fields(x)) Then
    rson.Fields(x) = .Fields(x)
End If
' =============================
Next x
rson.Update
 
Ora funziona.
Grazie 1000 per l'aiuto a entrambi!
un saluto
Marco67
 
 
 

 Marco67
Ciao,
prego.
Saltando l'elemento 0 in Fields non hai la certezza che sia il campo ID, è meglio che ne controlli il tipo ed eventualmente salti di conseguenza.
Potresti (magari non oggi ma le cose cambiano) avere una tabella con una chiave composta da più campi oppure senza chiave, nel primo caso la procedura andrebbe in errore, nel secondo perderesti il valore del primo elemento magari senza accorgertene.
Ciao,
Mat.
 

 Marco67
Ciao,
prego.
Saltando l'elemento 0 in Fields non hai la certezza che sia il campo ID, č 
meglio che ne controlli il tipo ed eventualmente salti di conseguenza.
Potresti (magari non oggi ma le cose cambiano) avere una tabella con una 
chiave composta da piů campi oppure senza chiave, nel primo caso la 
procedura andrebbe in errore, nel secondo perderesti il valore del primo 
elemento magari senza accorgertene.
Ciao,
Mat.
 
Verissimo Mat,
per adesso mi va bene cosi' perche' (proprio come dici tu), attualmente le 
tabelle hanno come la chiave primaria all'indice 0.
Per risolvere quindi, dovrei prima individuare quale sia il nome del campo 
chiave per ogni tabella.
Non conosco se esista una funzione che me la individui, diciamo, 'al volo'.
Oppure dovrei aggiungere un campo (contenente il nome della chiave) nella 
tabella contenente l'elenco delle tab. da aggiornareIn questo modo potrei 
subito filtrare, quindi saltare, l'assegnazione di quel campo, giusto? 
 
 

 [CUT]
 
Pensavo piuttosto a verificare la proprietà Attributes dell'oggetto field (presente sia in ADO che DAO).
Tramite quella puoi determinare se il campo è aggiornabile o chiave primaria o "contatore".
 
Ciao
Mat.