Autore Topic: [Risolto] rinominare tabella SQlite3 da programma  (Letto 3728 volte)

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
[Risolto] rinominare tabella SQlite3 da programma
« il: 27 Marzo 2010, 11:10:24 »
SQLite ha colpito ancora! :o
Sarebbe il caso di dire: Non ne posso più! ... Ma vado al dunque: Dall'idea fissa di mantenere il contenuto di ciascuna tabella ordinato in base alla mia configurazione originaria di chiave primaria (costituita da una sola colonna o da più colonne, a seconda delle necessità), ho inserito come prima colonna di ciascuna tabella il codice id autoincrement, però ho anche inserito una gestione semiautomatica di ordinamento; infatti essa può scattare in seguito ad una segnalazione su eventuali nuovi inserimenti nelle varie tabelle, consigliando il riordino di quelle che abbiano subito, per es., più 100 accodamenti.  Dall'apposita Form di avvertimento, l'utente può avviare l'ordinamento o rimandarlo ad un momento successivo. La procedura di ordinamento prevede:
1) la creazione di una tabella transitoria;
2)  la trascrizione nella nuova tabella di tutte le righe lette dalla prima col criterio "ORDER BY";
3)  la cancellazione della tabella originaria;
4) la ridenominazione della tabella transitoria, attribuendole il nome della tabella appena cancellata.
le istruzioni utilizzate sono le seguenti:
Codice: [Seleziona]
1) CREATE TABLE "NomeTabellaTransito "('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'Colonna2' INTEGER, 'Colonna3' VARCHAR(50) DEFAULT NULL, 'Colonna4' CHAR(1) DEFAULT NULL, 'Colonna5' INTEGER );
2) RecTab = DB_Connection.Edit("NomeTabellaOrigine")
    RecTab = DB_Connection.Exec("SELECT * FROM NomeTabellaOrigine ORDER BY Colonna2")
    FOR EACH RecTab
       i_id += 1
       DB_Connection.EXEC("INSERT INTO NomeTabellaTransito VALUES(" & i_id & ", '" & RecTab!Colonna2 & "', '" & RecTab!Colonna3 & "', '" & RecTab!Colonna4 & "', '" & RecTab!Colonna5 & "')")
    NEXT
    DB_Connection.Commit
    DB_Connection.Close
3) DB_Connection.EXEC("DROP TABLE NomeTabellaOrigine ")
4) DB_Connection.EXEC("ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine'")
Dopo l'esecuzione delle suddette istruzioni, sembra che tutto sia andato bene, però proseguendo ottengo un errore, attraverso il quale rilevo che:
la tabella rinominata non viene riconosciuta dall'istruzione
Codice: [Seleziona]
IF NOT DB_Connection.Tables.Exist("NomeTabellaOrigine") 
, mentre viene trovata tranquillamente da "Sqliteman", però il passo 4), di ridenominazione, l'ha completamente svuotata del suo contenuto.
Chi mi potrebbe spiegare perchè succede tutto ciò? >:( :'(
Ciao a tutti.

« Ultima modifica: 24 Settembre 2013, 00:12:08 da Picavbg »
:ciao:

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #1 il: 27 Marzo 2010, 15:32:37 »
invece di cambiargli nome perchè non la riscrivi in una nuova tabella con il nome corretto?

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #2 il: 27 Marzo 2010, 16:46:02 »
invece di cambiargli nome perchè non la riscrivi in una nuova tabella con il nome corretto?
Un pò, perchè ho l'indole del programmatore pigro,  :D un pò perchè pensavo di abbreviare i tempi di esecuzione con una sola trascrizione dalla TabellaOriginaria alla TabellaTransitoria. Infatti ottenuta la nuova Tabella, ordinata a mio piacimento, cancellando l'originaira e ridenominado la Transitoria col nome di origine, avrei evitato proprio tutta la seconda trascrizione per riportare i dati nell'Originaria. Chissà perchè, ma ogni volta che provo un percorso fuori dallo standard, anche se citato nella guida sql, vado sempre ad incappare in problematiche pratiche che non dovrebbero assolutamente manifestarsi. Magari penserai che io ce l'ho con SQLite; io invece penso che è SQLite ad avercela con me! ;)
Comunque, ho gia avviato la correzione del programma aggiungendo l'intera ritrascrizione dalla TabellaTransitoria alla TabellaOriginaria. Ho solamente aggiunto una riga SQL per lo svuotamento del contenuto della TabellaOriginaria ed ha funzionato:
Codice: [Seleziona]
DB_Connection.EXEC("DELETE FROM TabellaOriginaria")
Si, direi, dato che col tuo invito, mi dai conferma di avere incontrato un ostacolo insormontabile, il problema segnalato sia proprio irrisolvibile.  :-X :)
Ciao.
:ciao:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #3 il: 27 Marzo 2010, 16:58:37 »
la tabella rinominata non viene riconosciuta dall'istruzione
Codice: [Seleziona]
IF NOT DB_Connection.Tables.Exist("NomeTabellaOrigine") 
, mentre viene trovata tranquillamente da "Sqliteman", però il passo 4), di ridenominazione, l'ha completamente svuotata del suo contenuto.
Chi mi potrebbe spiegare perchè succede tutto ciò? >:( :'(
Ciao a tutti.




L'istruzione che hai scritto ti ritorna TRUE se la tabella non esiste...
Era quello che volevi fare?
« Ultima modifica: 27 Marzo 2010, 17:01:03 da milio »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #4 il: 28 Marzo 2010, 23:16:03 »
la tabella rinominata non viene riconosciuta dall'istruzione
Codice: [Seleziona]
IF NOT DB_Connection.Tables.Exist("NomeTabellaOrigine") 
, mentre viene trovata tranquillamente da "Sqliteman", però il passo 4), di ridenominazione, l'ha completamente svuotata del suo contenuto.
Chi mi potrebbe spiegare perchè succede tutto ciò? >:( :'(
Ciao a tutti.
L'istruzione che hai scritto ti ritorna TRUE se la tabella non esiste...
Era quello che volevi fare?
/quote]
No, il problema non è quello; L'istruzione di test sull'esistenza della tabella funziona benissimo. Quella che non funziona è l'istruzione di ridenominazione della tabella già valorizzata con gli elementi provenienti dalla TabellaOriginaria. Essa
Codice: [Seleziona]
DB_Connection.EXEC("ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine'") 
infatti produce due effetti incredibili:
1) Modifica il nome della tabella, ma poi l'istruzione di test usata in Gambas non la trova, mentre il gestore di DB Sqliteman (io uso Fedora), la tabella viene riconosciuta col nuovo nome (TabellaOriginaria)
2) Svuota completamente il contenuto della tabella,

Se la mia  "ALTER TABLE" è stata scritta correttamente, il risultato finale è assolutamente illogico. Spero di essere riuscito  chiararti il problema incontrato  e l'annesso mio concetto.
Ciao.
:ciao:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #5 il: 29 Marzo 2010, 04:40:36 »
Ho fatto il seguente test:
Codice: [Seleziona]
PUBLIC SUB QueryTest()
DIM Sql AS String
DIM Nx AS Integer
DIM Res AS Result

  ' Funzione che mi ritorna la connessione al db (non sono stato li a postarla)
  conn = MDatabase.CreateDatabase()

  ' la seguente sql mi crea la tabella e ci inserisce i dati dentro dalla tabella di origine
  Sql = "CREATE TABLE NomeTabellaTransito AS SELECT * FROM NomeTabellaOrigine ORDER BY cassa;"
  conn.Exec(Sql)

  ' cancello la tabella di origine
  Sql = "DROP TABLE NomeTabellaOrigine"
  conn.Exec(Sql)

  ' Rinomino la tabella di transito
  Sql = "ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine';"
  conn.Exec(Sql)
  
  ' Test: Se la tabella NomeTabellaOrgine esiste mi esegue il test
  IF conn.Tables.Exist("NomeTabellaOrigine") THEN
    Sql = "SELECT * FROM NomeTabellaOrigine;"
    Res = conn.Exec(Sql)
    FOR Nx = 0 TO Res.Max
      Res.MoveTo(Nx)
      FMain.TextArea1.Text &= Res[0] & ";" & Res[1] & ";" & Res[2] & ";" & Res[3] & Chr(10)
    NEXT
  ENDIF

END

Il test viene eseguito perfettamente e mi ritorna nella mia textarea i record separati da ;

quello che volevo dire io e' che se metti

Codice: [Seleziona]
IF conn.Tables.Exist("NomeTabellaOrigine") THEN 

gambas esegue le istruzioni se la tabella esiste, invece se

Codice: [Seleziona]
IF NOT conn.Tables.Exist("NomeTabellaOrigine") THEN 

come hai scritto tu nel primo post, esegue le istruzioni se la tabella NON esiste...



« Ultima modifica: 29 Marzo 2010, 05:30:43 da milio »

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #6 il: 30 Marzo 2010, 10:16:10 »
Scusa,  milio, ma non ho capito cosa mi vuoi dimostrare con la tua prova. La prima parte di essa coincide con le istruzioni utilizzate da me, per cui fino alla "ALTER TABLE" siamo sulla stessa linea. Infatti io  ho scritto:
Codice: [Seleziona]
CREATE TABLE "NomeTabellaTransito "('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'Colonna2' INTEGER, 'Colonna3' VARCHAR(50) DEFAULT NULL, 'Colonna4' CHAR(1) DEFAULT NULL, 'Colonna5' INTEGER );
RecTab = DB_Connection.Edit("NomeTabellaOrigine")
RecTab = DB_Connection.Exec("SELECT * FROM NomeTabellaOrigine ORDER BY Colonna2")
FOR EACH RecTab
       i_id += 1
       DB_Connection.EXEC("INSERT INTO NomeTabellaTransito VALUES(" & i_id & ", '" & RecTab!Colonna2 & "', '" & RecTab!Colonna3 & "', '" & RecTab!Colonna4 & "', '" & RecTab!Colonna5 & "')")
NEXT
    DB_Connection.Commit
    DB_Connection.Close
DB_Connection.EXEC("DROP TABLE NomeTabellaOrigine ") DB_Connection.EXEC("ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine'")
DB_Connection.EXEC("ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine'")
mentre tu hai scritto:
Citazione
Ho fatto il seguente test:
Codice: [Seleziona]
  Sql = "CREATE TABLE NomeTabellaTransito AS SELECT * FROM NomeTabellaOrigine ORDER BY cassa;"
  conn.Exec(Sql)
  ' cancello la tabella di origine
  Sql = "DROP TABLE NomeTabellaOrigine"
  conn.Exec(Sql)
  ' Rinomino la tabella di transito
  Sql = "ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine';"
  conn.Exec(Sql)
Stabilito ciò, quello che bisognerebbe capire è perchè a te il test
Codice: [Seleziona]
 IF conn.Tables.Exist("NomeTabellaOrigine") THEN 
si conclude con "TRUE", mentre a me  si conclude con "FALSE" e, poi, perchè tu ritrovi, nella tabella rinominata, tutti i record copiati precedentemente, mentre io mi ritrovo la tabella vuota. :o
La risposta a codeste domande non è facilmente fornibile, perchè operiamo in ambienti operativi diversi (tu usi Ubuntu ed io Fedora), e probabilmente tu usi una versionme di Gambas diversa dalla mia che è la 2.19. Potrebbero proprio i motori su cui girano i nostri programmai a produrre, non so per quale motivo, effetti diversi. Un'altra considerazione potrebbe essere: l'ambiente su cui gira il mio programma è teoricamente non responsabile, però l'anomalia che mi si verifica dipende dall'assenza nell'ide del mio Gambas di qualche componente preposto a svolgere correttamente le funzioni che ho richiamate.
Ti ringrazio per l'aiuto e mi complimento con te per la tua conoscenza di SQLite3; ho visto come usi le istruzioni SQL anche in altre discussioni  e non posso che fare tesoro dei tuoi consigli. Mi dispiace solo che non possa trarne vantaggio in questo momento. Ciao.
:ciao:

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: rinominare tabella SQlite3 da programma
« Risposta #7 il: 30 Marzo 2010, 10:45:38 »
Milio ti sta dicendo che il test che esegui tu domanda al DB se NON esiste la tabella. Siccome la tabella esiste, ti restituisce False perché il test non è andato a buon fine (cioè la tabella esiste).

Quel "NOT" significa proprio questo: inverti il senso (o risultato) del test.
La tabella SQLiteMan la vede proprio perché c'è.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #8 il: 30 Marzo 2010, 14:35:01 »
Milio ti sta dicendo che il test che esegui tu domanda al DB se NON esiste la tabella. Siccome la tabella esiste, ti restituisce False perché il test non è andato a buon fine (cioè la tabella esiste).
Quel "NOT" significa proprio questo: inverti il senso (o risultato) del test.
La tabella SQLiteMan la vede proprio perché c'è.
>:( >:( >:(
Carissimo Leo, forse invece non è chiaro il mio problema, perchè credo di  sapere benissimo che IF not ... exist è esattamente l'opposto di  IF  ... exist e so bene anche quale codice viene eseguito a seconda che si verifichi l'una o l'altra condizione. Io non vado  a scuola di programmazione per cui ho bisogno di avere spiegato che cosa sia una  "if" e quale sia l'effetto sul programma , a seconda che si verifichi una condizione o la sua opposta. Credo invece che nessuno di quelli che avete letto i miei post, a parte fsurfing, vi siate ancora resi conto di quello che non funziona.
Ho detto dal mio primo post che, dopo avere rinominato la tabella, gambas non la riconosce come tabella esistente col nuovo nome;
Ho detto anche che, dopo avere rinominato la tabella, dentro di essa non esiste più il suo contenuto e l'ho appurato anche tramite sqliteman.
Ci vuole tanto a capire quello che voglio dire? A volte, prima di rispondere, occorre leggere tutta la discussione, perchè la lettura dell'ultimo post può portare molto, ma molto fuori strada.
Mi dispiace di avere risposto in maniera irriguardevole, ma non posso accettare di passare per un pivello apprendista che non sappia distinguere la mano destra dalla sinistra.
Ho guardato il codice provato da Milio ed ho evidenziato la quasi specchiabilità di quello col mio, proprio per evidenziare che il problema non è nel codice, ma nell'effetto prodotto nel mio ambiente.
Allora, è chiaro quello che voglio dire?
Citazione
Perchè dopo avere rinominato una tabella qualsiasi in SQLite3, perdo il suo contenuto?
Perchè, , pur esistendo, la tabella, secondo Gambas 2.19, invece non esiste?
Credo che il problema sia da ricercare altrove, non nel codice che ho scritto io.
Comunque, se lo desideri, posso allegare tutto il sorgente, comprese le tabelle.
Ciao.
:ciao:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #9 il: 30 Marzo 2010, 15:07:55 »
Urka come ti scaldi  ;D

Nessuno a detto a nessuno di essere un 'pivello apprendista' (ma poi che che male c'e')

Penso che qui sia nato l'equivoco:
nel tuo primo post, se vai a leggerlo attentamente, dopo che hai descritto cosa hai fatto per spostare-rinominare una tabella, hai scritto questo:


Dopo l'esecuzione delle suddette istruzioni, sembra che tutto sia andato bene, però proseguendo ottengo un errore, attraverso il quale rilevo che:
la tabella rinominata non viene riconosciuta dall'istruzione
Codice: [Seleziona]
IF NOT DB_Connection.Tables.Exist("NomeTabellaOrigine") 
, mentre viene trovata tranquillamente da "Sqliteman", però il passo 4), di ridenominazione, l'ha completamente svuotata del suo contenuto.
Chi mi potrebbe spiegare perchè succede tutto ciò? >:( :'(
Ciao a tutti.



Ecco perche', almeno io, continuo a dirti dove sta l'errore... poi se tu hai sbagliato a scrivere, e' tutta un'altra storia...

Ciao... ;)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #10 il: 30 Marzo 2010, 15:16:11 »
Poi per fare un'altra prova potresti usare il mio codice per testare se funziona anche sul tuo pc, con la tua distro e la tua versione di gambas... almeno ci togliamo ogni dubbio ;)

io uso kubuntu con gambas 2.20.2

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: rinominare tabella SQlite3 da programma
« Risposta #11 il: 31 Marzo 2010, 11:00:52 »
Concordo con Milio su tutti i punti:

1) nessuno ti ha dato del pivello, ti sei scaldato proprio per nulla  ;)
2) ho letto tutta la discussione e nel tuo primo post hai scritto che Gambas non vede la tabella creata ma Sqliteman sì anche se vuota;
3) non è facile capire i problemi quando uno è seduto di fronte ad un computer e l'altro è a 500 km di distanza  ::)
4) googlando ho trovato questo procedimento per cambiare il nome ad una tabella:
Codice: [Seleziona]
-Inserire una nuova colonna nel database (esempio completo).
ATTENZIONE FARE PRIMA UNA COPIA DEL FILE-DATABASE
sqlite prova
#Crea una tabella
sqlite> create table t1(a text, b text);
#Inizia la transazione
sqlite> BEGIN TRANSACTION;
#Crea una tabella temporanea uguale all'altra tabella
sqlite> CREATE TEMPORARY TABLE t1_backup(a,b);
#Fa un copia ed incolla dalla prima tabella alla tabella temporanea
sqlite> INSERT INTO t1_backup SELECT a,b FROM t1;
#Cancella la prima tabella
sqlite> DROP TABLE t1;
#Crea la nuova tabella con la nuova colonna
sqlite> CREATE TABLE t1(a text,b text,c text);
#Fa una copia dalla tabella temporanea alla nuova tabella
sqlite> INSERT INTO t1 (a,b) select * FROM t1_backup;
#Cancella la tabella temporanea
sqlite> DROP TABLE t1_backup;
#Finisce la transazione.
sqlite> COMMIT;
#Controllo nomi colonne
sqlite> .schema

Immagino che un adattamento a Gambas non sia difficile.
Qualcosa tipo:
Codice: [Seleziona]
DB_Connection.Begin
RecTab = DB_Connection.EXEC("CREATE TEMPORARY TABLE NomeTabellaTransito (id INTEGER PRIMARY KEY AUTOINCREMENT, Colonna2 INTEGER, Colonna3 VARCHAR(50) DEFAULT NULL, Colonna4 CHAR(1) DEFAULT NULL, Colonna5 INTEGER );")
RecTab = DB_Connection.EXEC("INSERT INTO NomeTabellaTransito FROM NomeTabellaOrigine ORDER BY Colonna2;")
RecTab = DB_Connection.EXEC("DROP TABLE NomeTabellaOrigine;")
RecTab = DB_Connection.EXEC("CREATE TABLE NomeTabellaOrigine (id INTEGER PRIMARY KEY AUTOINCREMENT, Colonna2 INTEGER, Colonna3 VARCHAR(50) DEFAULT NULL, Colonna4 CHAR(1) DEFAULT NULL, Colonna5 INTEGER );")
RecTab = DB_Connection.EXEC("INSERT INTO NomeTabellaOrigine FROM NomeTabellaTransito;")
RecTab = DB_Connection.EXEC("DROP TABLE NomeTabellaTransito;")
DB_Connection.Commit
DB_Connection.Close
Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #12 il: 31 Marzo 2010, 17:12:38 »
Poi per fare un'altra prova potresti usare il mio codice per testare se funziona anche sul tuo pc, con la tua distro e la tua versione di gambas... almeno ci togliamo ogni dubbio ;)
io uso kubuntu con gambas 2.20.2
Rispondo solo ora perchè ho voluto concludere un test sul programma. Infatti, mentre ragionavo con voi sulla funzione SQL "ALTER TABLE", sono andato avanti.

Anche se a me non piacciono le polemiche, devo dire che, per gli appellativi come "pivello" possono anche essere dichiarati senza nominare il termine esatto: Lo stesso effetto si ottiene, usando frasi che lo facciano capire:
(((se metti  IF conn.Tables.Exist("NomeTabellaOrigine") THEN  gambas esegue le istruzioni se la tabella esiste, invece se  IF NOT conn.Tables.Exist("NomeTabellaOrigine") THEN   esegue le istruzioni se la tabella NON esiste), rafforzata poi da: (Milio ti sta dicendo che il test che esegui tu domanda al DB se NON esiste la tabella. Siccome la tabella esiste, ti restituisce False perché il test non è andato a buon fine (cioè la tabella esiste). Quel "NOT" significa proprio questo: inverti il senso (o risultato) del test. La tabella SQLiteMan la vede proprio perché c'è.)))
Come vedi, soprattutto nella seconda affermazione il concetto è pungente, anche se il termine non è stato citato.
Siccome non credo che che sia costruttivo andare avanti con simili ragionamenti, anche perchè sono convinto che sia io, da una parte, che voi due, dall'altra, rimarremo sempre nelle nostre posizioni, per quanto mi riguarda, la parentesi comportamentale, può considerarsi chiusa.
 :)
Ho voluto provare il tuo codice, anche perchè contiene un'istruzione originale, che non conoscevo (ammetto la mia ignoranza in proposito):
Codice: [Seleziona]
' la seguente sql mi crea la tabella e ci inserisce i dati dentro dalla tabella di origine
  Sql = "CREATE TABLE NomeTabellaTransito AS SELECT * FROM NomeTabellaOrigine ORDER BY cassa;"
 IF DB_Connection.Tables.Exist("NomeTabellaTransito") THEN
    Sql = "SELECT * FROM NomeTabellaTransito;"
    RecTab = DB_Connection.Exec(Sql)
    FOR i = 0 TO RecTab.Max
    NEXT
    PRINT  i  ---->  stampa 142 (cioè il n° dei record teoricamente copiati)
  ENDIF
  ' cancello la tabella di origine
  Sql = "DROP TABLE NomeTabellaOrigine"
  DB_Connection.Exec(Sql)
  ' Rinomino la tabella di transito
  Sql = "ALTER TABLE 'NomeTabellaTransito' RENAME TO 'NomeTabellaOrigine';"
  DB_Connection.Exec(Sql)
  DB_Connection.Commit
  DB_Connection.Close
  WITH
      DB_Connection
      .Type = "sqlite3"
      .Host = VarGlob.$_DbPath
      .Name = VarGlob.$_DbNome
      .OPEN    'Apro il DB
  END WITH
  IF DB_Connection.Tables.Exist("NomeTabellaOrigine") THEN
    Sql = "SELECT * FROM NomeTabellaOrigine;"
    RecTab = DB_Connection.Exec(Sql)
    FOR i = 0 TO RecTab.Max
    NEXT
    PRINT i     ---->  stampa  ancora 142 (sembrerebbe perciò che il lavoro sia andato bene)
  ELSE
    PRINT "La Tabella 'piancont' non esiste"
  ENDIF
Dall'andamento delle interrogazioni sui record di tabella, sia nella fase intermedia, di registrazione sulla 'TabellaTransito',  che nella fase finale, di registrazione sulla 'TabellaOrigine', sembrerebbe che abbia funzionato.
Accedendo però alla Tabella di DB tramite Sqliteman, ahimè, l'ho trovata di nuovo vuota. L'unica cosa che è cambiata dalla mia prova iniziale  è che il test  'IF DB_Connection.Tables.Exist("NomeTabellaOrigine") ' questa volta trova la tabella.
 :-\
Che ne pensi?
Secondo me, non conviene insistere. :)
Ciao.


:ciao:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #13 il: 31 Marzo 2010, 17:56:43 »
Nessun problema, discussione 'animata' chiusa; discussione 'costruttiva' aperta ;)

hai provato a vedere se gambas 'vede' i record, cioe' se al posto di contare i record ci fai un print del contenuto ?

cosi' vediamo se effettivamente sono stati copiati... fammi sapere...

ps. altra cosa che ho visto e' che hai preso pari pari il mio codice
Codice: [Seleziona]
Sql = "CREATE TABLE NomeTabellaTransito AS SELECT * FROM NomeTabellaOrigine ORDER BY cassa;"

io ho messo ORDER BY cassa perche' avevo un campo chiamato cosi'... e' chiamato cosi' anche il tuo campo di riordino?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: rinominare tabella SQlite3 da programma
« Risposta #14 il: 31 Marzo 2010, 17:57:26 »
Citazione
Anche se a me non piacciono le polemiche, devo dire che, per gli appellativi come "pivello" possono anche essere dichiarati senza nominare il termine esatto: Lo stesso effetto si ottiene, usando frasi che lo facciano capire:
(((se metti  IF conn.Tables.Exist("NomeTabellaOrigine") THEN  gambas esegue le istruzioni se la tabella esiste, invece se  IF NOT conn.Tables.Exist("NomeTabellaOrigine") THEN   esegue le istruzioni se la tabella NON esiste), rafforzata poi da: (Milio ti sta dicendo che il test che esegui tu domanda al DB se NON esiste la tabella. Siccome la tabella esiste, ti restituisce False perché il test non è andato a buon fine (cioè la tabella esiste). Quel "NOT" significa proprio questo: inverti il senso (o risultato) del test. La tabella SQLiteMan la vede proprio perché c'è.)))
Come vedi, soprattutto nella seconda affermazione il concetto è pungente, anche se il termine non è stato citato.
io sono sicurissimo che sia leo che milio con quella frase non volesso asserire che tu sei un "pivello", spesso capitano delle sviste anche sul codice semplice e ci sbattiamo la testa per ore ore o giorni , poi quando ci accorgiamo della cacchiata che abbiamo fatto ci diamo del pirla :)
cmq hai fatto bene a mettere in chiaro le cose , mi spiace solo non aver tempo per fare delle prove e capire quale sia il problema.
facci sapere quando risolvi ciao ciao