Newsgroup: it.comp.lang.visual-basic
Titolo: Istruzione Update

Buonasera a tutti, spero possiate darmi lumi.
Trasferendo i dati di una tabella da un db ad un altro, ho riservato un
campo da impostare come numero di riferimento del record.
Una volta effettuata la migrazione, dovrei far si che questi numeri siano
progressivi da 1 ad n (numero finale dei record) ma non trovo la soluzione.
Avevo pensato di fare un ciclo do / loop in cui N è l'absoluteposition del
record, ma quando utilizzo l'istruzione update Tabella set Riga = N
ovviamente il comando vale per tutti i record e me li ritrovo tutti con il
numero finale...(grrrr)
A qualcuno viene in mente qualcosina di piu ehm ..efficace!??
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 numero finale...(grrrr)
Devi avere un identificativo del rigo.
Immagino avrai un contatore o roba simile...
Adocn è la connessione e Rs il recordset.
rs.source "SELECT IDTABELLA FROM TABELLA WHERE tuofiltro"
i=1
do until rs.eof
  adocn.execute "UPDATE TABELLA SET RIGA=" & i & " WHERE IDTABELLA=" &
rs("IDTABELLA").Value
  i=i+1
loop
rs.close

 rs.close
Ciao Andrea e grazie. Il problema č che nel db non ho impostato un campo
contatore, altrimenti la selezione where che hai adottato tu, sarebbe
stata immediatamente utilizzata.
Io utilizzo Dao 3.60 e il db ha una tabella in cui esistono campi di testo
e questo campo riga che č variabile e temporaneo.
E al momento non ho soluzioni. Non ho un riferimento a cui attribuire
l'absoluteposition del recordset...
Alrre idee?


 Alrre idee?
Non ricordo per niente dao, ma penso tu possa avere un recordset a cui
assegnare un valore ad un campo.
Se ho capito bene tu sai quali sono almeno i record della tabella su cui
settare il contantore? Puoi definire anche l'ordine di questi record?
In caso positivo ti basta fare una cosa del genere
Con ADO potresti fare una cosa del genere.
Rs.CursorType = adOpenKeyset
Rs.LockType = adLockOptimistic
rs.source "SELECT FLAG FROM TABELLA WHERE tuofiltro"
i=1
do until rs.eof
  rs("IDTABELLA").Value=i
  Rs.UpdateBatch adAffectCurrent
  i=i+1
loop
rs.close
Se devi fare con update la tabella deve avere almeno una chiave, anche se
composta da più campi, quindi io farei:
rs.source "SELECT * FROM TABELLA WHERE tuofiltro"
i=1
do until rs.eof
  adocn.execute "UPDATE TABELLA SET RIGA=" & i & " WHERE CAMPO1=" &
rs("CAMPO1").Value & " AND  CAMPO2=" & rs("CAMPO2").Value 'ecc
  i=i+1
loop
rs.close

Andrea ha scritto:









Ok, fantastico... ti ringrazio, ma mentre aspettavo che qualcuno mi
illuminasse, ho continuato a lavorare e mi è venuta in mente una soluzione:
Ho creato un campo contatore autoincrease ovviamente nel db temporaneo e
solo in quello.
Quando dopo avere manipolato i dati, li riporto nei db originali, utilizzo
l'istruzione insert into, ma questa volta senza select * bensì indicando i
nomi di tutti i campi eccetto quello del contatore che non è presente
negli altri db.
Non sarà forse il massimo dello stile (!) ma il target è stato raggiunto!
Piuttosto... è possibile da codice aprire quando lo desidero questo
database e riportare a 0 il valore del contatore autoincrementante?!
Grazie Andrea 


 database e riportare a 0 il valore del contatore autoincrementante?!
Dipende dal database.
In firebird i contatori sono generatori.
Quindi lo faresti con un comando
SET GENERATOR "NOME" TO valore;
Credo che sia in qualche tabella di sistema di access.

Andrea ha scritto:




Si, il mio database è access, ma la procedura che propone
è lunga (almeno in access).
Sono certo che ci sarà qualcosa da vb meno laborioso.


 Sono certo che ci sarà qualcosa da vb meno laborioso.
Infattamente (diceva qualcuno...) sgooglando qui e li
ho appreso che bisogna svuotare la tabella ed eseguire
il metodo compactdatabase.
E il gioco l'è fatto!
Grazie a tutti.
