Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: Picavbg - 11 Agosto 2009, 10:29:02

Titolo: [RISOLTO] Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 11 Agosto 2009, 10:29:02
Da quando ho sbattuto la faccia nel concetto delle tabelle indicizzate in sqlite3, mi sono impantanato nelle sabbie mobili e vi sono immerso fino al collo. Per non dilungarmi troppo non sto a spiegare la scelta pensata per mantenere le tabelle del mio DB sempre ordinate nell'ambito della primary key. Uno dei passi immaginati comprende la cancellazione, la nuova creazione della tabella originaria(Tabella_orig) e la riscrittura della stessa coi dati riordinati e salvati prima della cancellazione in una tabella di Backup (Tabella_bkp). Ora dovrei semplicemente leggere tutte le righe della "Tabella_bkp" e trascriverle pari pari nella "Tabella_orig"; per ottenere ciò, ho scritto il seguente codice:
Codice: [Seleziona]
 WITH 
      DB_Connection
      .Name = DBname
      .OPEN    'Riapro il DB
  END WITH
 
  sql = "CREATE TABLE 'Tabella_orig'  ("                  
  sql = sql & " 'NumVoce'  INTEGER PRIMARY KEY,"                        
  sql = sql & " 'NomeVoce' VARCHAR(50) DEFAULT NULL,"  
  sql = sql & " 'Campox1' CHAR(1) DEFAULT NULL,"    
  sql = sql & " 'Campox2' INTEGER DEFAULT NULL"    
  sql = sql & " );"                                        
  sqltable = DB_Connection.Exec(sql)
  DB_Connection.CLOSE               'chiude il DB

  DB_Connection.Begin
  NomeRec_via = DB_Connection.edit("Tabella_bkp")  
  NomeRec = DB_Connection.edit("Tabella_orig")  
  FOR EACH NomeRec_via
      NomeRec = NomeRec_via
      NomeRec.Update
  NEXT

  DB_Connection.Commit
  DB_Connection.CLOSE

Però, non capisco il perché, l'istruzione  
Citazione
NomeRec.Update

fornisce l'errore
Citazione
Cannot modify record: SQL error or missing database


Ho sbagliato qualcosa? Dove?
Spero che anche a ferragosto qualcuno mi possa aiutare.  :ciao:  :ciao:
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 11 Agosto 2009, 11:56:03
Ciao, io solitamente uso la sintassi sql pura senza utilizzare le funzioni update dei result. cmq credo che il problema sia alla riga:
Codice: [Seleziona]
NomeRec = NomeRec_via 

credo tu debba specificare colonna per colonna i vari valoti. ad esempio:
Codice: [Seleziona]
NomeRec!nome_primo_campo = NomeRec_via!nome_primo_campo
NomeRec!secondo_nome_campo = NomeRec_via!nome_secondo_campo

forse in questa maniera il commit andrebbe messo dentro il ciclo FOR.
Oppure prova con la sintassi sql pura:
Codice: [Seleziona]
FOR EACH NomeRec_via
     DB_Connection.Exec("INSERT INTO NomeRec VALUES(" & NomeRec_via!nome_primo_campo & ", " & NomeRec_via!secondo_primo_campo & ")")  
NEXT


Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 11 Agosto 2009, 22:47:05
Citazione

Berserker79 ha scritto:
Ciao, io solitamente uso la sintassi sql pura senza utilizzare le funzioni update dei result. cmq credo che il problema sia alla riga:
Codice: [Seleziona]
NomeRec = NomeRec_via 

credo tu debba specificare colonna per colonna i vari valoti. ad esempio:
Codice: [Seleziona]
NomeRec!nome_primo_campo = NomeRec_via!nome_primo_campo
NomeRec!secondo_nome_campo = NomeRec_via!nome_secondo_campo

forse in questa maniera il commit andrebbe messo dentro il ciclo FOR.
Oppure prova con la sintassi sql pura:
Codice: [Seleziona]
FOR EACH NomeRec_via
     DB_Connection.Exec("INSERT INTO NomeRec VALUES(" & NomeRec_via!nome_primo_campo & ", " & NomeRec_via!secondo_primo_campo & ")")  
NEXT

Ciao.

Si, sicuramente così funziona, ma, salvo che la logica di Sqlite3 voglia sorprendermi ulteriormente, essendo "NomeRec_via" una stringa contenente tutto il record letto da "Tabella_bkp", credo che possa pari pari essere trasferito nella stringa "NomeRec", corrispondente al record da registrare in "Tabella_orig". Se così non é vuol dire che la mia logica é sbagliata, ma vuol dire anche che
Citazione
Sqlite3 é veramente modesto.

Mi dispiace solamente che in maniera standalone Gambas non sia in grado di agganciarsi ad altre strutture di "veri" DB. Purtroppo sono costretto ad utilizzare SQLite3 che sta portando via un bel pò del mio tempo senza che sia ancora riuscito a vedere funzionare la parte gestione archivi del mio progetto. Spero solamente di riuscirvi in questa vita.
Grazie comunque. Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 12 Agosto 2009, 13:31:24
Secondo me stai sottovalutando sqlite. io lo uso sia per programmi scritti con gambas che sotto windows con VB NET, utilizzando il linguaggio sql. Poi se pensi che firefox lo utilizza, non credo proprio che sia un db poco performante. Io personalmente non ho ancora utilizzato altri db, quindi non sò dirti come ci si trovi ad utilizzarli. Secondo me dovresti insistere con sqlite, vedrai che ti darà soddisfazioni. Lascio la parola ai mastri gamberi, credo possano darti delle dritte!!! Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 13 Agosto 2009, 10:25:41
Sai benissiomo che viviamo nella piena relatività, da quella familiare a quella sociale. Esite sempre un diverso modo di vedere le cose; se per te il bicchiere può essere mezzo pieno, per me é invece mezzo vuoto. Tornando ad SQLite3, tutto dipende dall'uso che ne devi fare, per costruire una rubrichetta telefonica, dove quello che conta é il nominativo da chiamare ed il suo numero di telefono, SQLite va benissimo, ma se cominci a considerare che il type dichiarato delle colonne componenti le tabelle di DB viene trasformato automaticanmente in formato stringa, l'impossibilità di tenere il contenuto di ciascuna tabella sempre ordinato rispetto alla primary key (sto citando le mie esperienze), SQLite comincia a manifestare i suoi limiti. Se fosse possibile, utilizzerei un altro motore di DB, ma purtroppo, visto che gli altri DB sono strutturati per lavorare in ambienti di tipo client-server, mentre io devo applicarlo ad un ambiente mono-pc, mio malgrado, dovrò utilizzare SQLite.

Come vedi, poi, i "mastri" non partecipano a questa discussione; e lo capisco, perché essi conoscono già il mio pensiero su SQLite e sanno benissimo che le soluzioni da me cercate in SQLite non esistono!
:ciao:  :ciao:
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 13 Agosto 2009, 23:40:47
Nella spereanza di andare avanti col programma  ho modificasto l'istruzione
Citazione
NomeRec = NomeRec_via
con le seguenti:
Codice: [Seleziona]
NomeRec!NumVoce= NomeRec_via!NumVoce
NomeRec!NomeVoce= NomeRec_via!NomeVoce

Ebbene, mi viene restituito sempre l'errore  di "result is not availabe all'esecuzione della prima delle due istruzioni.
Pensando che potesse dare fastidio un trasferimento diretto fra gli elementi di Tabella ho inaseriro campi di transito intermedi:
Codice: [Seleziona]
DIM i_Numero AS Integer
DIM $_Nome AS String
i_Numero = NomeRec_via!NumVoce
$_Nome = NomeRec_via!NomeVoce
NomeRec!NumVoce = i_Numero
NomeRec!NomeVoce = $_Nome

Il risultato non é però cambiato. :cry:
Non so più che fare!!!  :fuso:

Ciao a tutti.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 14 Agosto 2009, 13:09:36
Ciao, se puoi posta il progetto e vediamo se posso darti una mano. In alternativa posta la parte di codice dall'inizio dalla dichiarazione della connessione fino alla parte che ti dà l'errore.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: leo72 - 14 Agosto 2009, 22:39:43
Secondo me non va perché stai usando la stessa connessione per 2 transazioni sullo stesso DB.

Prova aprendo 2 connessioni... tipo:

Codice: [Seleziona]

Dim Connessione As New Connection
Dim ConnessioneVia As New Connection
Dim Risultato As Result
Dim RisultatoVia As Result


Quando devo ricopiare dati tra due tabelle faccio in genere così, e non ho problemi.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 15 Agosto 2009, 09:51:36
@ leo72
Se non ho capito male, applicando il tuo esempio al mio programma,  ho proceduto così:
Codice: [Seleziona]

PUBLIC DB_Connection AS Connection
PUBLIC DB_Conn2 AS Connection

PUBLIC SUB Form_Open()
  DIM DB_Connection AS NEW Connection
  DIM DB_Conn2 AS NEW Connection
  DIM DBname AS String
  DIM DB_path AS String
  DBname = "ContabFam.db"
  DB_path = Application.path & "/ContabFam_DB"  
  WITH DB_Connection
    .Type = "sqlite3"
    .Host = DB_path
    .Login = ""
    .Password = ""
    .Name = DBname
    .OPEN  
 END WITH
 WITH DB_Conn2
    .Type = "sqlite3"
    .Host = DB_path
    .Login = ""
    .Password = ""
    .Name = DBname
    .OPEN  
  END WITH
 
  DB_Conn2.Begin
  NomeRec_via = DB_Conn2.edit("piancont_via")  
  DB_Connection.Begin
  NomeRec = DB_Connection.edit("PianCont")  
  FOR EACH NomeRec_via
      [i]NomeRec!NumVoce = NomeRec_via!NumVoce[/i]
      NomeRec!NomeVoce = NomeRec_via!NomeVoce
     
      NomeRec.Update
  NEXT
  DB_Connection.Commit  'vorrei provare a farlo una volta sola, alla fine,
                        'per vedere se viene mantenuto ai record lo stesso
                        'ordine dell'input, o se SQLite3 tiene conto
                        'dell'ordine impostato con la Primary Key
  DB_Connection.CLOSE


Ebbene, in prova ricevo sempre il messaggio
Citazione
Result is not available

nell'esecuzione della prima riga di codice di trasferimento valori, cioé:
          NomeRec!NumVoce = NomeRec_via!NumVoce

Purtroppo continua a non funzionare !!! :evil:  :cry:

Ciao a tutti.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 15 Agosto 2009, 10:18:24
Ciao, credo di aver capito dove sta l'errore.
Codice: [Seleziona]
NomeRec = DB_Connection.edit("PianCont")

sostituiscila con questa riga:
Codice: [Seleziona]
NomeRec = DB_Connection.Create("PianCont")


Il metodo edit non và bene per la tabella originale, dato che di fatto non contiene dati e quindi usa il create.
Poi non capisco perchè usi il metodo edit per leggere i dati della tabella backup.
Vai con un semplice .Exec("SELECT ecc..")
Cmq ti posto il codice che ho provato io e che mi ha funzionato:
Codice: [Seleziona]
PUBLIC SUB Button4_Click()
   DIM tab_originale AS Result
   DIM tab_backup AS Result
   tab_backup = myConnection.Exec("SELECT * FROM tlog")
   tab_originale = myConnection.Create("tlog2")
   FOR EACH tab_backup
     tab_originale!a = tab_backup!id
     tab_originale!b = tab_backup!line
     tab_originale!c = tab_backup!testata
     tab_originale!d = tab_backup!data
     tab_originale!e = tab_backup!importo
     tab_originale.Update()
   NEXT
   myConnection.Commit()
   myConnection.Close()
   Message("fine")
END

Se ho capito bene quello che vuoi ottenere, in questa maniera dovresti essere apposto. Cmq io ho usato una sola connessione.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 17 Agosto 2009, 18:54:39
Citazione

Berserker79 ha scritto:
Ciao, credo di aver capito dove sta l'errore.
Codice: [Seleziona]
NomeRec = DB_Connection.edit("PianCont")

sostituiscila con questa riga:
Codice: [Seleziona]
NomeRec = DB_Connection.Create("PianCont")



Grazie. Non avevo mai usato il parametro ".create" nell'assegnazione della variabile Result. Effettivamente, con quella modifica e facendo riferimento ad un'unica connessione (DB_Connection) non ho più ricevuto errori. Non ho ottenuto però quello che volevo, perché in fase di scrittura i valori da me assegnati alla colonna definita come PrikmaryKey sono stati sostituiti da un progressivo di tipo ID. Perciò, alla fine della ricostruzione della tabella, mi sono ritrovato con valori assolutamente non significatovi nel colonna "NumVoce", definita nel Create della tabella come chiave primaria.
La conclusione é che apparentemenmte sono andato avanti, ma sono sempre più immerso nel pantano.
Lo vedi che SQLite é modesto!
Ho l'impressione, salvo diverso suggerimento da maestro, che l'unica soluzione palleativa sia quella di attribuire alle mie tabelle una colonna ID, oppure, definire tutte le tabelle senza chiave primaria. Qual'é la scelta più tranquillamente percorribile e, perciò, meno traumatica?  :-(  :-(  :-(
Ciao a tutti.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 18 Agosto 2009, 00:49:10
Ti posso solo consigliare di usare la sintassi sql pura anzichè affidarsi a gambas tramite il result.update.
Ho fatto una prova, utilizzando la sintassi sql i valori della tabella di backup vengono riportati perfettamente nella tabella originale, mentre utilizzando il metodo update, il campo impostato come primary key mi veniva rimpiazzato con un indice progressivo che partiva da 1.
Prova in questa maniera e vedi se risolve il tuo problema.
Ciao, aspetto tue notizie.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 20 Agosto 2009, 19:21:45
Citazione

Berserker79 ha scritto:
Ti posso solo consigliare di usare la sintassi sql pura anzichè affidarsi a gambas tramite il result.update.
Ho fatto una prova, utilizzando la sintassi sql i valori della tabella di backup vengono riportati perfettamente nella tabella originale, mentre utilizzando il metodo update, il campo impostato come primary key mi veniva rimpiazzato con un indice progressivo che partiva da 1.
Prova in questa maniera e vedi se risolve il tuo problema.
Ciao, aspetto tue notizie.


Provare con istruzioni SQL: ... bel problema! Ho imitato la sintassi utilizzata per il "Create" della tabella, seguendo anche lo schema riportato nella guida grafica del sito "/www.sqlite.org", però non ne vuol sapere: ricevo sempre il messaggio
 
Citazione
Query failed: SQL error or missing database
.
Riporto le istruzioni utizzate a partire dalla ctreazione della tabella da ripopolare:
Codice: [Seleziona]
DIM sql AS String 'serve per eseguire i comandi sul DB
  DIM sqltable AS Result
  DIM NomeRec AS Result
  DIM NomeRec_via AS Result
   
  DBname = "ContabFam.db"
  DB_path = Application.path & "/ContabFam_DB"
   WITH DB_Connection
    .Type = "sqlite3"
    .Host = DB_path
    .Login = ""
    .Password = ""
  END WITH
  'DB_Connection.Open    'Tento l'apertura del DB, se presente
    IF DB_Connection.Databases.Exist(DBname) THEN   'verifica l'esistenza del DB
        DB_Connection.CLOSE               'chiude il DB
  WITH
      DB_Connection
      .Name = DBname
      .OPEN    'Riapro il DB
  END WITH
 
  sql = "CREATE TABLE 'PianCont'  ("
  sql = sql & " 'NumVoce'  INTEGER PRIMARY KEY,"
  sql = sql & " 'NomeVoce' VARCHAR(50) DEFAULT NULL,"
  sql = sql & " 'ContrPartSiNo' CHAR(1) DEFAULT NULL,"
  sql = sql & " 'DtPrimoUso' INTEGER DEFAULT NULL"
  sql = sql & " );"                                        
  sqltable = DB_Connection.Exec(sql)
  DB_Connection.Begin
  NomeRec_via = DB_Connection.Edit("piancont_via")  
  NomeRec = DB_Connection.Create("PianCont")  
  FOR EACH NomeRec_via
      sql = "INSERT INTO 'PianCont' ('NumVoce', 'NomeVoce', 'ContrPartSiNo', 'DtPrimoUso')"
      sql = sql & " VALUES(NomeRec_via!NumVoce, NomeRec_via!NomeVoce, NomeRec_via!ContrPartSiNo, NomeRec_via!DtPrimoUso) ;"
[u]      NomeRec = DB_Connection.EXEC(sql)     [/u]     qui si determina l'errore
  NEXT
  DB_Connection.Commit()
  DB_Connection.CLOSE()

Ho guardato anche la miniguida di fsurfing, ma al riguardo riporta solo istruzioni non SQL. Ho provato in tanti modi, ad eliminare gli apici relativi al nome di tabella, poi solo quelli relativi alle colonne interne alla tabella, poi tutti gli apici, ma il risultato non é cambiato. Uffà !!! :noia:
 Non capiosco perché non vada, eppure non va. :ciao:

p.s.: ho verificato che la tabella esista ed ho constatato che é stata creata benissimo.
Ciao ancora.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 22 Agosto 2009, 09:59:55
tuo codice:
Codice: [Seleziona]
sqltable = DB_Connection.Exec(sql)
DB_Connection.Begin
NomeRec_via = DB_Connection.Edit("piancont_via")
NomeRec = DB_Connection.Create("PianCont")
FOR EACH NomeRec_via
   sql = "INSERT INTO 'PianCont' ('NumVoce', 'NomeVoce', 'ContrPartSiNo', 'DtPrimoUso')"
   sql = sql & " VALUES(NomeRec_via!NumVoce, NomeRec_via!NomeVoce, NomeRec_via!ContrPartSiNo, NomeRec_via!DtPrimoUso) ;"
   NomeRec = DB_Connection.EXEC(sql)    
    qui si determina lerrore
NEXT
DB_Connection.Commit()
DB_Connection.CLOSE()


Modifica il codice in questo modo:
----------------------------------
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_via")
NomeRec = DB_Connection.Create("PianCont") ' questa istruzione credo si posa omettere
FOR EACH NomeRec_via
     DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce &
     ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")
NEXT
DB_Connection.Commit()
DB_Connection.CLOSE()
----------------------------------
Come vedi per popolare il result NomeRec_via uso il metodo .Exec che mi sembra più azzeccato del .Edit, dato che devi fare una ricerca dei record.
Poi la tua istruzione sql era errata nella parte dei VALUES, nel modo in cui l'avevi scritta tu i record da inserire non erano i valori del result NomeRec_via ma il testo NomeRec_via!NumVoce, NomeRec_via!NomeVoce ecc.
Poi ho tolto la parte relativa a l'ordine dei campi, basta semplicemente inserire i VALUES nell'ordine in cui sono stati creati i campi.
Come vedi per scrivere una istruzione lunga puoi andare tranquillamente a capo dopo & senza bisono di utilizzare come hai fatto tu:
Codice: [Seleziona]
sql = "CREATE TABLE 'PianCont'  ("
sql = sql & " 'NumVoce'  INTEGER PRIMARY KEY,"

Infine, per inserire i dati nella tabella PianCont vado direttamente con il metodo .Exec della connection, senza far riferimento al result NomeRec.
Non ho provato il codice ma dovrebbe esere ok. Fammi sapere se và bene, ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 23 Agosto 2009, 10:24:40
Citazione

Berserker79 ha scritto:
Modifica il codice in questo modo:
----------------------------------
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_via")
NomeRec = DB_Connection.Create("PianCont") ' questa istruzione credo si posa omettere
FOR EACH NomeRec_via
     DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce &
     ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")
NEXT
DB_Connection.Commit()
DB_Connection.CLOSE()
----------------------------------

Nn é importante come si scrivonno le istruzioni, ma il risultato che si ottiene, poi un metodo vale l'altro. Io scrivo le istruizioni così come te le ho riportate, allo scopo di renderle più leggibili a me stesso.
omunque ho modificato il codice così come mi hai suggerito e la conclusione non é cambiata. la riga
Citazione
DB_Connection.EXEC("INSERT INTO ..........

continua a dare il solito errore "Query failed: SQL error or missing database"

Per maggiore chiarezza riporto qui di seguito il codice così come l'ho eseguito:
Codice: [Seleziona]
WITH 
      DB_Connection
      .Name = DBname
      .OPEN    'Riapro il DB
  END WITH
 
  sql = "CREATE TABLE 'PianCont'  ("
  sql = sql & " 'NumVoce'  INTEGER PRIMARY KEY,"                        
  sql = sql & " 'NomeVoce' VARCHAR(50) DEFAULT NULL,"      
  sql = sql & " 'ContrPartSiNo' CHAR(1) DEFAULT NULL,"    
  sql = sql & " 'DtPrimoUso' INTEGER DEFAULT NULL"        
  sql = sql & " );"                                        
  sqltable = DB_Connection.Exec(sql)

  DB_Connection.Begin
  NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_via")
  NomeRec = DB_Connection.Create("PianCont")  '''lasciando o togliendo questa riga non cambia alcunché
  FOR EACH NomeRec_via
  DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")
  NEXT
  DB_Connection.Commit()
  DB_Connection.CLOSE()

:oops:  Mi trovo veramente imbarazzato per l'impegno al quale involontariamente sto sottoponendo  la tua cortesissima disponibilità. Vedo che hai padronanza nell'uso delle istruzioni in SQL. Io conosco il linguaggio SQL da tantissimo tempo, ma non l'ho mai adoperato, quindi non é esperienza pratica.
Per Es.: non capisco come mai nelle istruzioni del "create table" la stringa la cui modalità ho copiato da una guida, termini con un crt. ";" e la successiva sqltable = DB_Connection.Exec(sql) funzuioni perfettamente, mentre nella riga SQL ".EXEC" che mi hai proposto non occorra il crt ";".
Intanto, oggi é una domenica del periodo di ferragosto ancora calda; quindi se puoi goditi un fresco marino o montanaro. Io, da questo punto di vista, sono ultra fortunato: abito in collina e posso scendere in mare in soli 8'.
Poi, se ti va di sopportarmi ancora, riprenderemo questo duro cammino verso la soluzione del ".EXEC".
 :-)  :-)  :ciao:  :ciao:
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 24 Agosto 2009, 19:49:40
ciao, mi potresti postare il tuo file db, con la tabella di backup già contenente i dati da passare alla tabella originale.
riguardando la query non ho visto errori, quindi il problema potrebbe essere il tipo di dati passati al db.
Attendo ansiosamente il file per provare l'INSERT.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 24 Agosto 2009, 22:48:23
Citazione

Berserker79 ha scritto:
ciao, mi potresti postare il tuo file db, con la tabella di backup già contenente i dati da passare alla tabella originale.
riguardando la query non ho visto errori, quindi il problema potrebbe essere il tipo di dati passati al db.
Attendo ansiosamente il file per provare l'INSERT.
Ciao.

Ciao, spero di farcela. Non so come posso mandarti il file DB; provo ad allegarlo al presente post. Se riesci ad aprirlo, il DB si chiama ContFam_DB; le tabelle oggetto dell'attività di lettura ed insert sono rispettivamente: "piancont_via" e "PianCont"; la prima é quella di back-up contenente i dati da copiare sulla seconda ("PianCont"). Quest'ultima come puoi vedere nel codice di "CREATE TABLE" del mio precedente post é stata creata col nome contenente lettere maiuscole e minuscole, anche se nell'elenco delle tabelle del file DB lo trovi scritto tutto in minuscolo. Ho lasciato la tabella PianCont in modo che non hai bisogno di crearla. Tieni ancora presente che tutto il mio ambiente Gambas (programmi  e file DB) gira sotto Fedora 9.0.Spero tanto che riesca a provare felicemente l'INSERT.
A presto, ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 25 Agosto 2009, 21:59:08
Ciao, allegato al post non ho trovato niente, se il file non è troppo grande mandamelo sulla mia email, la trovi cliccando sul mio nickname.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 26 Agosto 2009, 22:43:33
Citazione

Berserker79 ha scritto:
Ciao, allegato al post non ho trovato niente, se il file non è troppo grande mandamelo sulla mia email, la trovi cliccando sul mio nickname.
Ciao.

Scusa, ma non mi sono accorto che non potevo allegare il file nel suo formato originale. Ho provveduito a zippare il file che questa volta dovrei riuscire a farti avpervenire. Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 27 Agosto 2009, 05:53:25
Ciao, ho trovato l'errore che impediva l'insert.
Solo che mi sono accorto che quando il campo NomeRec_via!DtPrimoUso della tabella di backup è 0(nell'ultimo riga della tabella), in realtà mi viene letto come un numero negativo e in fase di insert mi viene sostituito con questo numero negativo.
Non riesco a capire come mai.
Il campo in questione che tipo di utilità ha???
Forse lo si può impostare diversamente per non imbattere in questo errore.
La cosa strana è che ho provato ad inserire nella tabella di backup un nuovo record, passando al campo DtPrimoUso il valore 0, e il record da me inserito viene letto in maniera corretta e inserito come 0 anche nella tabella originale.
La tabella di backup come la popoli, tramite result.update?
Ciao, credo che ormai siamo alla risoluzione, basta chiarire questo punto ed è fatta, resto in attesa di una tua risposta per rivedere eventualmente il codice dell'inert e poi lo posto.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 27 Agosto 2009, 23:18:41
Citazione

Berserker79 ha scritto:
Ciao, ho trovato l'errore che impediva l'insert.
Solo che mi sono accorto che quando il campo NomeRec_via!DtPrimoUso della tabella di backup è 0(nell'ultimo riga della tabella), in realtà mi viene letto come un numero negativo e in fase di insert mi viene sostituito con questo numero negativo.
Non riesco a capire come mai.
Il campo in questione che tipo di utilità ha???
Forse lo si può impostare diversamente per non imbattere in questo errore.
La cosa strana è che ho provato ad inserire nella tabella di backup un nuovo record, passando al campo DtPrimoUso il valore 0, e il record da me inserito viene letto in maniera corretta e inserito come 0 anche nella tabella originale.
La tabella di backup come la popoli, tramite result.update?
Ciao, credo che ormai siamo alla risoluzione, basta chiarire questo punto ed è fatta, resto in attesa di una tua risposta per rivedere eventualmente il codice dell'inert e poi lo posto.


È strano quello che mi dici, perché, mettendo sotto controllo il programma, la colonna "campo NomeRec_via!DtPrimoUso" mi viene mostrata col contenuto "NULL" che é esattamente quello che ho caricato manualmente con "Sqliteman", cioé "Knoda" in tutti i record inseriti. Io non so come hai fatto per leggere il valore esatto di codesta colonna, né conosco la rappresentazione esadecimale di "NULL". La colonna incriminata dovrà contenere la data in cui viene usata per la prima volta in assoluto la voce contabile della stessa riga. Nella mia idea iniziale dovrebbe impedirmi la cancellazione del record qualora detto campo si trovi valorizzato con una data significativa. Ho provato a vivere la tua eseprienza positiva, modificando l'istruzione:
Citazione
DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")

con l'istruzione:
 
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce & "','" & NomeRec_via!NomeVoce & "','" & NomeRec_via!ContrPartSiNo & ")")


dove ho tolto la valorizzazione della colonna "DtPrimoUso". E il programma continua a non funzionare.
Lo stesso accade se cerco di forzare il valore zero in quella colonna:
Citazione
DB_Connection.EXEC("INSERT INTO 'PianCont' VALUES(" & NomeRec_via!NumVoce & "','" & NomeRec_via!NomeVoce & "','" & NomeRec_via!ContrPartSiNo & "','" & "0" & ")")


Scusa la domanda: ma tu hai provato il codice  così come l'ho scritto io? :-?  :-?
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 28 Agosto 2009, 00:54:50
ciao, modifica il codice in questo modo:
Codice: [Seleziona]
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_Via")
FOR EACH NomeRec_via
     IF NomeRec_via!DtPrimoUso = "" THEN
        DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', null)")    

     ELSE
        DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")
     ENDIF
NEXT


Come puoi vedere ho fatto sparire quei connection.begin,commit ecc.. che non servono.
Prima dell'istruzione insert, verifico il valore del campo DtPrimoUso per eseguire l'itruzione giusta.
Il valore del campo DtPrimoUso in che formato lo passi alla tabella di backup? Perchè se non è nel formato che lui si aspetta (integer) non vorrei che faccia qualche strana conversione e poi non ti ritrovi più i valori corretti.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 28 Agosto 2009, 23:20:00
Citazione

Berserker79 ha scritto:
ciao, modifica il codice in questo modo:
Codice: [Seleziona]
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_Via")
FOR EACH NomeRec_via
     IF NomeRec_via!DtPrimoUso = "" THEN
        DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', null)")    

     ELSE
        DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', " & NomeRec_via!DtPrimoUso & ")")
     ENDIF
NEXT


Come puoi vedere ho fatto sparire quei connection.begin,commit ecc.. che non servono.
Prima dell'istruzione insert, verifico il valore del campo DtPrimoUso per eseguire l'itruzione giusta.
Il valore del campo DtPrimoUso in che formato lo passi alla tabella di backup? Perchè se non è nel formato che lui si aspetta (integer) non vorrei che faccia qualche strana conversione e poi non ti ritrovi più i valori corretti.
Ciao.


Allo stato attuale esemplificherei l'esecuzione, togliendo l'if che mi hai proposto, perché la colonna "DtPrimoUso" contiene sempre e solamente null. Sicuramente sarà da aggiungere in secondo momento. Per ora l'importante é riuscire a fare funzionere sta benedetta o maledetta istruzione SQL; infatti ho riportato nel programma il gruppo di struzioni così come l'hai scritta tu (senza la if)
Codice: [Seleziona]
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_Via")
FOR EACH NomeRec_via
        DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', null)")
NEXT

ma becco sempre l'errore fatale " Query failed: SQL error or missing database"
 :-(  :-?  :fuso:  :cry:

Non capisco perché la prova a te funziona ed a me no. Sono lì lì per abbandonare tutto. Mi dispiace per il tempo che ti sto portando via e ti chiedo scusa.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 29 Agosto 2009, 07:33:33
Che dire, ho ricopiato il codice da te postato senza l'IF e a me funziona.
Prova ad eseguire questo codice al posto del ciclo FOR EACH:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(99999999, 'WWW','SSS', null)")

vedi se và a buon fine, e poi riprova con l'istruzione FOR EACH e quando ti dà l'errore vedi se riesci a postare la stringa sql che compone il programma da far eseguire alla connessione.
Cmq il mio codice è scritto con l'ultima versione la 2.15.2 su Ububtu 9.04, ti posto questo piccolo programma che non fà altro che copiare i dati dalla tabella backup a quella originale e ripulire la tabella originale. Il db utilizzato è quello che mi hai mandato tu, provalo e vedi se ti funziona.
Fammi sapere, ciao.
P.S.: non ti preoccupare del tempo che sto spendendo per aiutarti, lo faccio con piacere.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 30 Agosto 2009, 23:25:55
Citazione

Berserker79 ha scritto:
Che dire, ho ricopiato il codice da te postato senza l'IF e a me funziona.
Prova ad eseguire questo codice al posto del ciclo FOR EACH:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(99999999, 'WWW','SSS', null)")

vedi se và a buon fine, e poi riprova con l'istruzione FOR EACH e quando ti dà l'errore vedi se riesci a postare la stringa sql che compone il programma da far eseguire alla connessione.
Cmq il mio codice è scritto con l'ultima versione la 2.15.2 su Ububtu 9.04, ti posto questo piccolo programma che non fà altro che copiare i dati dalla tabella backup a quella originale e ripulire la tabella originale. Il db utilizzato è quello che mi hai mandato tu, provalo e vedi se ti funziona.
Fammi sapere, ciao.
P.S.: non ti preoccupare del tempo che sto spendendo per aiutarti, lo faccio con piacere.


Grazie anche per il programmino che mi hai gentilmente mandato. Andiamo con ordine:
1) il codice di prova fuori da ciclo "For each" funziona perfettamente;
2) ho riprovato il ciclo "For each" con diversi cambiamenti l'uno successivo all'altro, all'interno della riga
Citazione
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', null)")
e continua a non funzionare;
3) Non posso postarti la stringa che mi hai richiesto perché non so come ottenerla (ammetto la mia ignoranza);
4) Ho eseguito una prova soltanto dela programmino che mi hai fatto pervenire, ma c'é qualche problema di path. Secondo me non conviene insistere in codesta nuova prova, salvo ad abbandonare per il momento la precedente.
5) Non so se il problema che incontro possa essere legato al fatto che adopero Gambas 2.9.0. Probabilmente può darci una mano qualche super esperto.

Infine ho scoperto, durante le ricerche fatte per uscire dal labirinto in cui sono finito, la seguente modalità di Select:
Codice: [Seleziona]
NomeRec_via = DB_Connection.Exec("SELECT * FROM piancont_Via ORDER BY NumVoce")
e l'ho provata; sonoriuscito così, molto semplicemente, ad ottenere una sequenza ordinata per "NumVoce" delle righe della tabella incriminata e probabilmente posso mandare alle ortiche tutte le modifiche certosine apportate al programma per mantenere le tabelle sempre ordinate. Penso piuttosto ad una utility che di tanto in tanto le riordini in base alla chiave primaria. Ciò significa che debbo in ogni caso uscire dal labirinto. Ma dov'é il filo della famosa Arianna? ... :-)
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 31 Agosto 2009, 08:24:30
Ciao, per vedere la stringa che viene creata dal codice, basta che lo esegui e quando ti dà l'errore, senza chiudere il programma, seleziona con il mouse tutta la stringa sql partendo dalle virgole e finendo alle virgolette, ti si apre un baloon che ti dice il valora assunto in quel momento dalla variabile.
Se mi dici che l'inserimento singolo che hai provato funziona, significa che c'è un valore errato che viene passato alla stringa sql.
Oppure se vuoi, puoi passarmi l'intero progetto, e vedo cosa succede, eseguendolo.
magari c'è qualcosa a monte che crea problemi.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 03 Settembre 2009, 23:17:16
Citazione

Berserker79 ha scritto:
Ciao, per vedere la stringa che viene creata dal codice, basta che lo esegui e quando ti dà l'errore, senza chiudere il programma, seleziona con il mouse tutta la stringa sql partendo dalle virgole e finendo alle virgolette, ti si apre un baloon che ti dice il valora assunto in quel momento dalla variabile.
Se mi dici che l'inserimento singolo che hai provato funziona, significa che c'è un valore errato che viene passato alla stringa sql.
Oppure se vuoi, puoi passarmi l'intero progetto, e vedo cosa succede, eseguendolo.
magari c'è qualcosa a monte che crea problemi.
Ciao.


Grazie per l'indicazione; non lo sapevo. la stringa che viene passata é:
Citazione
"INSERT INTO PianCont VALUES(10000000, ATTIVO, n, )"

La stringa a me sembra corretta, perciò ho pensato di realizzare un programmino che fa la stessa operazione di copia tabella a scelta dell'operatore, in modo da concentrare l'indagine al solo codice che nel, mio progetto da problemi e verificare così se, fuori dal contesto progettuale di origine, la funzione di duplica tabella funziona. A fine prova, ahimé il problema persiste inesorabile. Allego perciò, come da tuo invito detto programmino.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 04 Settembre 2009, 23:36:23
Ciao, guardando la stringa vedo due errori.
Il primo è che manca il quarto valore da passare al campo DtPrimoUso.
Il secondo è che i valori stringa vanno passati inseriti fra gli apici.
La stringa corretta dovrebbe essere la seguente:
"INSERT INTO PianCont VALUES(10000000, 'ATTIVO', 'n', null)"

Ho provato il programmino che mi hai allegato, ho apportato delle modifiche alla parte di codice inerente l'insert e a me funziona.
P.S.: ho modificato il percorso del db facendolo puntare nella mia home, ricordati di rimettere il tuo percorso prima di provarlo.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 05 Settembre 2009, 17:00:00
Citazione

Berserker79 ha scritto:
Ciao, guardando la stringa vedo due errori.
Il primo è che manca il quarto valore da passare al campo DtPrimoUso.
Il secondo è che i valori stringa vanno passati inseriti fra gli apici.
La stringa corretta dovrebbe essere la seguente:
"INSERT INTO PianCont VALUES(10000000, 'ATTIVO', 'n', null)"

Ho provato il programmino che mi hai allegato, ho apportato delle modifiche alla parte di codice inerente l'insert e a me funziona.
P.S.: ho modificato il percorso del db facendolo puntare nella mia home, ricordati di rimettere il tuo percorso prima di provarlo.
Ciao.

 :eh:
Ciao. Non ho capito dove starebbe l'errore commesso da me. La stringa che ti ho evidenziato nel mio precedente post é quella che viene formata in automatico dall'istruzione SQL seguente:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", " & NomeRec_via!NomeVoce & ", " & NomeRec_via!ContrPartSiNo & ", " & NULL & ")")
; quindi, credo  che, se errore ho commesso, é sicuramente di sintassi internamente all'istruzione.
Tuttavia ho guardatato il file che hai allegato al tuo post ed ho notato che mi hai rispedito il mio programmino, vale a dire, senza le tue correzioni, quindi non ho potuto verificare alcunché.

 :ciao:
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 05 Settembre 2009, 20:20:22
Questa è la riga di codice da te postata:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", " & NomeRec_via!NomeVoce & ", " & NomeRec_via!ContrPartSiNo & ", " & NULL & ")")

Cambiala con questa:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', NULL)")

Ho allegato il tuo programma con le correzioni.
Non ho cambiato niente, solo la sintassi dell'istruzione INSERT che era incorretta
Cmq basta solo cambiare la sintassi con quella che ti ho postato.
Ciao.
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Picavbg - 05 Settembre 2009, 22:23:06
Citazione

Berserker79 ha scritto:
Questa è la riga di codice da te postata:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", " & NomeRec_via!NomeVoce & ", " & NomeRec_via!ContrPartSiNo & ", " & NULL & ")")

Cambiala con questa:
Codice: [Seleziona]
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", '" & NomeRec_via!NomeVoce & "', '" & NomeRec_via!ContrPartSiNo & "', NULL)")

Ho allegato il tuo programma con le correzioni.
Non ho cambiato niente, solo la sintassi dell'istruzione INSERT che era incorretta
Cmq basta solo cambiare la sintassi con quella che ti ho postato.
Ciao.


Si, lo so; ce ne ho messo di tempo, ma alla fine ho capito. Con l'ultima correzione sintattica dettagliata ho capito perché in NomeRec_via!NumVoce mancano gli apici, mentre in tutti gli altri sono presenti. Ho atttribuito tale diverso utilizzo al fatto che il NomeRec_via!NumVoce é definito in trabella come campo numerico, mentre gli altri sono campi stringa. Per me codesto criterio era inesatto e toglievo sempre gli apici racchiudenti i campi stringa, per cui l'istruzione SQL andava in errore.
Ebbene, dopo la correzione che mi hai sottolineato ho riprovato e...  :evviva:  :evviva: ha funziunato tutto, compreso l'esatta disposizione ordinata dei record, basata sulla chiave primaria. A proposito la colonna definita in tabella come primary key, l'ho ritrovata valorizzata bene, coi valori che avevo  attribuito in fase di registrazione manuale.

Citazione
Non capisco perché l'istruzione
Codice: [Seleziona]
NomeRec!NumVoce = NomeRec_via!NumVoce
debba alterare il contenuto del campo registrando al posto del valore originario una sequenza di "Id" non desiderata

E' come se la conversione automatica in istruzione SQL, curata da Gambas, non funzioni.

Citazione

-------------------------------------------------------------------------
                   Che ne pensano i moderatori?
-------------------------------------------------------------------------

 Comunque, tornando alla mia cattiva conoscenza dei comandi SQL, ti ringrazio tantissimo per il validissimo e volenteroso aiuto che mi hai regalato e se non hai altro da aggiungere, possiamo ritenere conclusa la discussione.
Grazie ancora!!!
 :-D  :-D  :ciao:
Titolo: Re: Sqlite3: scrittura nuova tabella coi dati di una tabella dibackup
Inserito da: Berserker79 - 06 Settembre 2009, 12:00:23
Evvai!!!
Sicuramente con il metodo result.update risulta più facile manipolare i dati nel db, in quanto è gambas che si occupa della comunicazione col db. Ma per avere un controllo completo credo che utilizzare l'sql puro sia l'unica strada.
Adesso, spero che la tua opinione su sqlite sia un pò cambiata.
Se hai bisogno di aiuto chiedi pure. Ciao.