Oppure

Loading
21/11/12 15:30
Sì ma perché non aggiungi semplicemente i record?
21/11/12 17:03
piter123
perfetto. solo che invece di aggiungerli sotto i 5000 ho bisogno di aggiungerli
sopra.

Nuovo record ho bisogno che diventi id 1 e gli altri vecchi che aumentino di 1 il loro id.
aaa
21/11/12 17:57
Postato originariamente da piter123:

perfetto. solo che invece di aggiungerli sotto i 5000 ho bisogno di aggiungerli
sopra.


Non esiste un "sotto" o un "sopra" in un DB.

Nuovo record ho bisogno che diventi id 1 e gli altri vecchi che aumentino di 1 il loro id.


Mi sembra una gestione assurda dei dati e sicuramente, conoscendo tutta la problematica, ci sarà un'altra soluzione "sensata" ... In genere un campo Id è un "identificatore" del record intero e come tale NON dovrebbe essere modificato.

In ogni caso, dovresti operare con due frasi SQL

1) per aggiornare gli ID

UPDATE Tabella SET Id = Id+1;

2) per inserire il nuovo record con Id a 1

INSERT INTO Tabella ...

è inutile che scrivo il resto
Ultima modifica effettuata da 21/11/12 17:59
21/11/12 18:37
piter123
già fatto.
se devo aggiungere esempio 3 record :
1) elimino gli ultimi 3 record " delete .....
2) rinomino gli id con id+3 " update....
3) inserisco i nuovi record con relativi campi " insert into

risultato : la procedura è più lenta che non riscrivere tutti i 5000 record.

per quando riguarda il sotto o il sopra, l'id mi serve per identificare la sequenza.
I campi del record id=1 sono più recenti dei campi del record id=2 e così via verso id=5000 , in questo modo non devo fare nessun tipo di ordinamento e la loro eventuale verifica visiva utilizzando access risulta immediata.

Cercavo una soluzione del tipo copia incolla in blocco i campi per esempio da id 1 a id 5000 nella posizione
iniziale id=4 perdendo gli ultimi 3 record (cosa fattibile in manuale all'interno di access), lasciando così liberi di essere riscritti solo i primi 3 record nell'esempio specifico e mantenere così la sequenza id=1 più recente di id=2 e così via.

Potrei ribaltare gli id della serie il più alto è il più recente, quindi basterebbe aggiungere i nuovi record e basta, ma mi troverei nel giro di qualche giorno una tabella di 20000-30000 record, dopo un mese non sarebbe più gestibile.


Ultima modifica effettuata da piter123 21/11/12 18:43
aaa
21/11/12 18:41
Postato originariamente da piter123:
risultato : la procedura è più lenta che non riscrivere tutti i 5000 record.


Ma no ... bisogna vedere cosa fai.

per quando riguarda il sotto o il sopra, l'id mi serve per identificare la sequenza.
I campi del record id=1 sono più recenti dei campi del record id=2 e così via verso id=5000


Allora non inserire questo Id ma un timestamp. Quando fai la INSERT scrivi in un campo data e ora.
In questo modo avrai sempre e automaticamente i record con l'indicazione della loro "età" ...

21/11/12 18:46
piter123
5 minuti e posto i codici
aaa
21/11/12 18:51
piter123
copia tutto la matrice (5000 dati)
'COPIA TUTTO LO STORICO SU TABELLA ACCESS
For I = 1 To 5000
cmd.CommandText = "UPDATE " & NomeTab & " SET " _
& "C1 = '" & Sto(1, 1, I, 1) & "', " _
& "C2 = '" & Sto(1, 1, I, 2) & "', " _
& "C3 = '" & Sto(1, 1, I, 3) & "', " _
& "C4 = '" & Sto(1, 1, I, 4) & "' " _
& "WHERE ID = " & I
cmd.ExecuteNonQuery()
Next
***********************************************************************

elimino ultimi 3 record della tabella, rinomino id con id=id+3, inserisco 3 nuovi record e relativi campi con id da 1 a 3


qtadati=3
'CANCELLA ULTIME RIGHE IN BASE ALLA QTà DI RIGHE DATI DA INSERIRE
For I = 5000 To qtadati+1 Step -1
cmd.CommandText = "DELETE * FROM " & NomeTab & " WHERE ID = " & I
cmd.ExecuteNonQuery()
Next
'RINOMINA ID RIGHE PARTENDO DAL BASSO VERSO L'ALTO
For I = 5000- qtadati To 1 Step -1
IdNuovaRiga = I + qtadati
cmd.CommandText = "UPDATE " & NomeTab & " SET ID = " & IdNuovaRiga & " WHERE ID = " & I
cmd.ExecuteNonQuery()
Next
'INSERISCE RIGHE AGGIORNAMENTO
For I = 1 To qtadati
cmd.CommandText = "INSERT INTO " & NomeTab & " (ID, C1, C2, C3, C4) VALUES " _
& "(" & I & ", '" & Sto(K, X, I, 1) & "', '" & Sto(K, X, I, 2) & "', '" _
& Sto(K, X, I, 3) & "', '" & Sto(K, X, I, 4) & "') "
cmd.ExecuteNonQuery()
Next

aaa
21/11/12 19:03
Ma certo che è più lento !

A parte che fai le DELETE in un ciclo quando ne basta una sola (elimina quel for !), che senso ha fare l'UPDATE di righe che sono state cancellate ??

Ti faccio notare che, ad esempio fai la DELETE della riga con Id 4900 e poi l'UPDATE della riga con Id 4900 !

Ultima modifica effettuata da 21/11/12 19:11