Riprendo questa vecchia discussione solamente per porre la parola [Risolto].
Ieri, dopo tanto tempo, ho ripreso la parte di programma dove avrei voluto utilizzare all'epoca l'istruzione SQL si SQLite3 "ALTER TABLE". Allora non riuscii, nemmeno coi suggerimenti ricevuti, ad impiegare l'istruzione a causa di errori ottenuti durante l'esecuzione.
Cosa sia accaduto esattamente allora non ricordo più, ma sicuramente la mia inesperienza nell'utilizzo di SQLite3, ha influito enormemente.
Ieri, ripeto, allo scopo di ridurre notevolmente i tempi di rsequenziazione dei record di ciascuna tabella del mio DB, ho ripreso coraggio ed ho voluto ripetere la prova. Ebbene, è andato tutto liscio come l'olio, le tabelle sono state risequenziate copiandole, nell'ordine dovuto, in tabelle di transito che, dopo avere cancellato quelle d'origine, sono state rinominate ciascuna col suo nome originario. É stato finalmente un ottimo risultato che mi ha permesso praticamente di dimezzare il tempo di lettura e scrittura della tabelle.
Per completezza d'informazione riporto il concetto di risequenziazione vecchio:
1) lettura della 1
a tabella del DB e scrittura della stessa, record dopo record, in una tabella transitoria
Try RecTab = ApriDB.DBConnection.Exec("SELECT * FROM piancont ORDER BY NumVoce")
If RecTab.Available = False Then
Message.ERROR("Attenzione! -> " & ERROR.Text & Chr(10) & Chr(10) & "durante la lettura della Tabella '" & ApriDB.$_DbNome & "!piancont'" & Chr(10) & Chr(10) & " il programma verrà chiuso")
Quit
Endif
iId = 0
For Each RecTab
iId += 1
Try ApriDB.DBConnection.EXEC("INSERT INTO piancont2 VALUES(" & RecTab!IdPiaCon & ", '" & RecTab!NumVoce & "', '" & RecTab!NomeVoce & "', '" & RecTab!ContrPartSiNo & "', '" & RecTab!DtPrimoUso & "')")
If ( Error ) Then
Message.ERROR("Attenzione! ERRORE --> '" & ERROR.Text & "'" & Chr(10) & "alla riga " & Error.Where & Chr(10) & Chr(10) & "durante la registrazione della '" & ApriDB.$_DbNome & "!piancont2'" & Chr(10) & Chr(10) & Space$(30) & " IL PROGRAMMA VERRÀ CHIUSO")
Quit
Endif
2) svuotamento della tabella originaria e riscrittura della stessa coi record precedentemente inseriti nella tabella transitoria. Di questo passo riporto solamente l'istruzione di svuotamento della tabella originaria, perchè quella di scrittura è uguale a quella del passo1, coi nomi delle tabelle invertiti:
Try ApriDB.DBConnection.EXEC("DELETE FROM piancont")
3) cancellazione della tabella transitoria.
Il nuovo passo 2) è:
Try ApriDB.DBConnection.EXEC("DROP TABLE piancont") 'Cancellazione della Tabella 'ContabFamdb.piancont', a fine ordinamento
If ( Error ) Then
Message.ERROR("Attenzione! ERRORE --> '" & ERROR.Text & "'" & Chr(10) & "alla riga " & Error.Where & Chr(10) & Chr(10) & "durante la cancellazione della tabella 'piancont' a fine riordino" & Chr(10) & Chr(10) & Space$(30) & " IL PROGRAMMA VERRÀ CHIUSO")
Quit
Endif
'------------------------------------------------------------------------------------------------------------------------------------------------------------
ApriDB.DBConnection.Close
ApriDB = New OpenDB
ApriDB.DBConnection.EXEC("ALTER TABLE piancont2 RENAME To piancont")
Il tempo guadagnato è stato tantissimo, perchè attualmente il DB contiene circa 41000 record ed una sola tabella ne contiene 18000. Non sono tantissimi, ma la procedura di lettura e scrittura di quella più corposa impiega circa 35' . Ciò significa che prima della modifica il tempo di risequenziazione dei detta tabella era di circa: h 1:10:00. Sono perciò assai soddisfatto del grande risultato ottenuto ieri.