Discussione:
(post lungo) aggiornamento recordset mentre lo si sta leggengo
(troppo vecchio per rispondere)
Luciano996
2004-01-04 15:29:29 UTC
Permalink
ciao a tutti
come si fa a far si che mentre sto scorrendo un recordset di tabella, i
record che vado ad aggiungere non finiscano in fondo rispetto al cursore che
ho aperto ?

mi spiego
ho realizzato del codice VBA per allineare due tabelle; o meglio possiedo la
tabella A che contiene un elenco di record con cui devo aggiornare la
tabella B (già popolata dall'utente) andando a:
1) inserire in B quello che manca rispetto al nuovo elenco completo di A
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati" del
record contiene dei valori digitati dall'utente;
Lo so che potrei portare prima in A (a paritò di chiave) tutti i dati
digitati dall'utente in B per poi sostituire integralmente la tabella B con
la A, ma questa soluzione non mi piace e vorrei capire se è possibile fare
altro.

Il problema che incontro è il seguente:
al termine dell'allineamento (scorrimento accademico di due elenchi
sequenziali senza accessi random) il risultato è nullo per i nuovi valori
inquanto tutti i nuovi record di A che a mano a mano vado ad inserire in B,
finiscono in fondo e quindi continuando ad elaborare prima vengono inseriti
in B questi nuovi record di A, ma poi vengono cancellati perchè
l'ordinamento dei record è avvenuto solo all'apertura del recordset e quindi
poi coninuando a scorrere B mi trovo delle chiavi di valore più basso
rispetto ad A (sono a fine file di A e in B trovo i nuovi record) e quindi
vengono cancellati
es:
valori recordset A prima di iniziare ad elaborare: 1, 3, 15, 30
valori recordset B prima di iniziare ad elaborare 1, 2, 5, 15, 30

durante l'elabborazione viene cancellato in B il 2 e il 5 ed aggiunto il 3;
ma il 3 viene aggiunto alla fine per cui continuando ad elaborare poi mi
trovo A=finefile e B=3 e quindi il programma mi va a camcellare il 3

avrei bosogno invece che (come per gli indexed) il 3 vada subito al suo
posto che quindi ingnorerei visto che lo vado ad inserire quando mi trovo
con A=3 e B=5

grazie
SR
2004-01-04 16:12:58 UTC
Permalink
Post by Luciano996
1) inserire in B quello che manca rispetto al nuovo elenco completo di A
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati" del
record contiene dei valori digitati dall'utente;
Scusa, so che non è una risposta diretta, ma fare due query no? Sono più
veloci e ci metti meno.
Luciano996
2004-01-04 17:24:19 UTC
Permalink
Post by SR
Post by Luciano996
1) inserire in B quello che manca rispetto al nuovo elenco completo di A
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati" del
record contiene dei valori digitati dall'utente;
Scusa, so che non è una risposta diretta, ma fare due query no? Sono più
veloci e ci metti meno.
comunque devo scorrermeli perchè ci devo fare dei ragionamenti (e modificare
i record uquali..avvertire l'utente con un report)
però effettivamente posso fare una Query per l'Iinsert che è quella che mi
da i problemi (Insert in B di select A where non In B...)

comunque era anche per sentire qualche altra esperienza in merito
ciao grazie
SR
2004-01-04 20:46:17 UTC
Permalink
Post by Luciano996
Post by SR
Post by Luciano996
1) inserire in B quello che manca rispetto al nuovo elenco completo di A
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati"
del
Post by SR
Post by Luciano996
record contiene dei valori digitati dall'utente;
Scusa, so che non è una risposta diretta, ma fare due query no? Sono più
veloci e ci metti meno.
comunque devo scorrermeli perchè ci devo fare dei ragionamenti (e modificare
i record uquali..avvertire l'utente con un report)
Forse i ragionamenti li puoi fare da query, utilizzando iif, switch e choose

Inserendo un campo timestamp con la data di modifica record, hai poi un
criterio per il report
Luciano996
2004-01-04 21:06:59 UTC
Permalink
Post by Luciano996
Post by Luciano996
Post by SR
Post by Luciano996
1) inserire in B quello che manca rispetto al nuovo elenco completo
di
Post by Luciano996
A
Post by Luciano996
Post by SR
Post by Luciano996
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati"
del
Post by SR
Post by Luciano996
record contiene dei valori digitati dall'utente;
Scusa, so che non è una risposta diretta, ma fare due query no? Sono più
veloci e ci metti meno.
comunque devo scorrermeli perchè ci devo fare dei ragionamenti (e
modificare
Post by Luciano996
i record uquali..avvertire l'utente con un report)
Forse i ragionamenti li puoi fare da query, utilizzando iif, switch e choose
Inserendo un campo timestamp con la data di modifica record, hai poi un
criterio per il report
giusto grazie
mi sta più simpatico fare coding in vba piuttosto che nelle query
comunque ho risolto, con il vba ho fatto delete e changhe
poi le insert massive le ho fatte con una query di inserimento (che è anche
meglio inserire molti record via query piuttosto che con tante insert)
Roberto da casa
2004-01-04 16:38:15 UTC
Permalink
Post by Luciano996
ciao a tutti
come si fa a far si che mentre sto scorrendo un recordset di tabella, i
record che vado ad aggiungere non finiscano in fondo rispetto al cursore che
ho aperto ?
mi spiego
ho realizzato del codice VBA per allineare due tabelle; o meglio possiedo la
tabella A che contiene un elenco di record con cui devo aggiornare la
1) inserire in B quello che manca rispetto al nuovo elenco completo di A
2) cancellare in B quello che c'è in più rispetto al nuovo elenco di A
Non sustituisco B direttamente con A perchè ovviamente la parte "dati" del
record contiene dei valori digitati dall'utente;
Lo so che potrei portare prima in A (a paritò di chiave) tutti i dati
digitati dall'utente in B per poi sostituire integralmente la tabella B con
la A, ma questa soluzione non mi piace e vorrei capire se è possibile fare
altro.
al termine dell'allineamento (scorrimento accademico di due elenchi
sequenziali senza accessi random) il risultato è nullo per i nuovi valori
inquanto tutti i nuovi record di A che a mano a mano vado ad inserire in B,
finiscono in fondo e quindi continuando ad elaborare prima vengono inseriti
in B questi nuovi record di A, ma poi vengono cancellati perchè
l'ordinamento dei record è avvenuto solo all'apertura del recordset e quindi
poi coninuando a scorrere B mi trovo delle chiavi di valore più basso
rispetto ad A (sono a fine file di A e in B trovo i nuovi record) e quindi
vengono cancellati
valori recordset A prima di iniziare ad elaborare: 1, 3, 15, 30
valori recordset B prima di iniziare ad elaborare 1, 2, 5, 15, 30
durante l'elabborazione viene cancellato in B il 2 e il 5 ed aggiunto il 3;
ma il 3 viene aggiunto alla fine per cui continuando ad elaborare poi mi
trovo A=finefile e B=3 e quindi il programma mi va a camcellare il 3
avrei bosogno invece che (come per gli indexed) il 3 vada subito al suo
posto che quindi ingnorerei visto che lo vado ad inserire quando mi trovo
con A=3 e B=5
grazie
Apri i due recordset e scorrili una prima volta per camcellare solamente i
record del file B che non hanno corrispondenza nel file A, ma non inserire
in B i record di A che non trovano corrispondenza; a questo chiudi e riapri
i due recordset, riscorrili da capo e questa volta effettua in B
l'inserimento dei record A che non esistono in B.
--
Roberto

---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
Luciano996
2004-01-04 17:19:03 UTC
Permalink
Post by Roberto da casa
Apri i due recordset e scorrili una prima volta per camcellare solamente i
record del file B che non hanno corrispondenza nel file A, ma non inserire
in B i record di A che non trovano corrispondenza; a questo chiudi e riapri
i due recordset, riscorrili da capo e questa volta effettua in B
l'inserimento dei record A che non esistono in B.
--
Roberto
---------------------------------------------
http://www.sitocomune.com
---------------------------------------------
il problema resta perchè è proprio inserendo un record in B, che questo va
in fondo
di fatto aggiungendo un record è come se invalidassi la "order by" che ho
nella direttiva di OpenRecordset
perchè i nuovi record vanno in fondo e li incontrerò (quindi è come se il
recordset diventasse disordinato)
teoricamente dovrei ciudere e riaprire il recordset ad ogni inserimento

questi sono i cursori:
Set rstA = CurrentDb.OpenRecordset("select * from [strutture campi
allineamento] order by id_struttura, campo, [tipo campo]")
Set rstB = CurrentDb.OpenRecordset("select * from [strutture campi] order by
id_struttura, campo, [tipo campo] ", , dbDenyWrite)

questo è la pseudo di quello che faccio (abbinamento di due sequenziali)
Do
If KA > KB Then 'campo obsoleto da cancellare
'cancello record B
'se B non è già a fine file lo rileggo (a fine file metto HIGH in
chiave)
Else
If KA < KB Then 'nuovo campo da aggiungere
'inserisco record B
'se A non è già a fine file lo rileggo (a fine file metto
HIGH in chiave)
Else
If A <> fineFile Then 'sono uguali e non è fine file
'faccio solo dei controlli e delle modifiche
'se A non è già a fine file lo rileggo (a fine file
metto HIGH in chiave)
'se B non è già a fine file lo rileggo (a fine file
metto HIGH in chiave)
End-If
End-If
End-If
If KA = HIGHvalue AND KB = HIGHvalue Then Exit DO
Loop


Al momento mi salvo il valore della prima chiave inserita in B e quando lo
incontrerò considero fine file di B
Ma non mi piace, dovrei (come da teoria e prendendo anche spunto da quello
che dici te) creare un terzo file/tabella ad hoc che contenga solo i record
da inserire in B.
Quindi con l'abbinamento sequenziale faccio le cancellaizoni e le modifiche
direttamente in B e scriverò un file contenente solo i nuovi record.
Poi farò una upload in B dei nuovi record dal nuovo file. Così lo
scorrimento gira una una sola volta e le insert posso farle con una l'upload
esterna senza singole insert (che non è male).
Ciao Grazie dello spunto

PS ho imparato che non si scorre un recordset e contemporaneamente ci si
fanno delle insert
Roberto da casa
2004-01-05 10:38:18 UTC
Permalink
Post by Roberto da casa
Post by Roberto da casa
Apri i due recordset e scorrili una prima volta per camcellare solamente i
record del file B che non hanno corrispondenza nel file A, ma non inserire
in B i record di A che non trovano corrispondenza; a questo chiudi e
riapri
Post by Roberto da casa
i due recordset, riscorrili da capo e questa volta effettua in B
l'inserimento dei record A che non esistono in B.
--
Roberto
---------------------------------------------
http://www.sitocomune.com
---------------------------------------------
il problema resta perchè è proprio inserendo un record in B, che questo va
in fondo
di fatto aggiungendo un record è come se invalidassi la "order by" che ho
nella direttiva di OpenRecordset
perchè i nuovi record vanno in fondo e li incontrerò (quindi è come se il
recordset diventasse disordinato)
teoricamente dovrei ciudere e riaprire il recordset ad ogni inserimento
Set rstA = CurrentDb.OpenRecordset("select * from [strutture campi
allineamento] order by id_struttura, campo, [tipo campo]")
Set rstB = CurrentDb.OpenRecordset("select * from [strutture campi] order by
id_struttura, campo, [tipo campo] ", , dbDenyWrite)
questo è la pseudo di quello che faccio (abbinamento di due sequenziali)
Do
If KA > KB Then 'campo obsoleto da cancellare
'cancello record B
'se B non è già a fine file lo rileggo (a fine file metto HIGH in
chiave)
Else
If KA < KB Then 'nuovo campo da aggiungere
'inserisco record B
'se A non è già a fine file lo rileggo (a fine file metto
HIGH in chiave)
Else
If A <> fineFile Then 'sono uguali e non è fine file
'faccio solo dei controlli e delle modifiche
'se A non è già a fine file lo rileggo (a fine file
metto HIGH in chiave)
'se B non è già a fine file lo rileggo (a fine file
metto HIGH in chiave)
End-If
End-If
End-If
If KA = HIGHvalue AND KB = HIGHvalue Then Exit DO
Loop
Al momento mi salvo il valore della prima chiave inserita in B e quando lo
incontrerò considero fine file di B
Ma non mi piace, dovrei (come da teoria e prendendo anche spunto da quello
che dici te) creare un terzo file/tabella ad hoc che contenga solo i record
da inserire in B.
Quindi con l'abbinamento sequenziale faccio le cancellaizoni e le modifiche
direttamente in B e scriverò un file contenente solo i nuovi record.
Poi farò una upload in B dei nuovi record dal nuovo file. Così lo
scorrimento gira una una sola volta e le insert posso farle con una l'upload
esterna senza singole insert (che non è male).
Ciao Grazie dello spunto
PS ho imparato che non si scorre un recordset e contemporaneamente ci si
fanno delle insert
A quanto pare non sono riuscito a spiegarmi bene; il mio suggerimento era
quello di aprire e chiudere i recordset due volte: la prima volta è per
eliminare i record di B che non esitono in A e la seconda volta per inserire
in B i record di A che non esistono in B. Poiché i record dei due recordset
li scorri logicamente e non fisicamente (non a caso hai usato la clausola
ORDER BY), non ha alcuna importanza se *fisicamente* i nuovi record verranno
inseriti in coda, in quanto poi, quando riaprirai i recordset, verranno
letti nell'ordine logico che tu hai stabolito con le ORDER BY. Anche se
l'inserimento lo effettuerai con delle query di inserimento, i nuovi record
inseriti verranno accodati in fondo alla tabella B e poi te li ritroverai al
loro posto *logico* per effetto dell'ordinamento che hai stabilito con le
ORDER BY al momento della riapertura del recordset B. Quindi, fermo restando
che puoi risolvere il problema come meglio desideri, la mia soluzione
dovrebbe comunque funzionare.
Inoltre non vedo proprio quale sia il problema a scorrere un recordset e
contemporaneamente inserire in esso nuovi record; eventualmente il problema
è quello di mantenere in un determinato ordine logico i nuovi record, ed è
per questo che ti suggerivo di dividere le cancellazioni dagli inserimenti,
riaprendo ogni volta i due recordset.
--
Roberto

---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
Luciano996
2004-01-05 19:25:36 UTC
Permalink
si ora ho capito cosa volevi dire
si certo funziona

comunque ho preso la strada di cancellare via Vba o modificare mentre socco
il recordset
e poi mandare in eseguzione una query di inserimento
questa la preferisco perchè se i record da inserire sono molti forse la
query fa prima delle singole insert

grazie
Antonio Biso
2004-01-05 20:58:14 UTC
Permalink
Post by Luciano996
si ora ho capito cosa volevi dire
si certo funziona
Non funziona niente, perchè non hai lasciato parte del quoting e quindi non
si capisce nulla!!!

Antonio

Continua a leggere su narkive:
Loading...