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:
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 NomeRec.Update
fornisce l'errore Cannot modify record: SQL error or missing database
Ho sbagliato qualcosa? Dove?
Spero che anche a ferragosto qualcuno mi possa aiutare. :ciao: :ciao:
Ciao, io solitamente uso la sintassi sql pura senza utilizzare le funzioni update dei result. cmq credo che il problema sia alla riga:
credo tu debba specificare colonna per colonna i vari valoti. ad esempio:
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:
FOR EACH NomeRec_via
DB_Connection.Exec("INSERT INTO NomeRec VALUES(" & NomeRec_via!nome_primo_campo & ", " & NomeRec_via!secondo_primo_campo & ")")
NEXT
Ciao.
Nella spereanza di andare avanti col programma ho modificasto l'istruzione
NomeRec = NomeRec_via
con le seguenti:
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:
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.
Secondo me non va perché stai usando la stessa connessione per 2 transazioni sullo stesso DB.
Prova aprendo 2 connessioni... tipo:
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.
@ leo72
Se non ho capito male, applicando il tuo esempio al mio programma, ho proceduto così:
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
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.
Ciao, credo di aver capito dove sta l'errore.
NomeRec = DB_Connection.edit("PianCont")
sostituiscila con questa riga:
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:
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.
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
Query failed: SQL error or missing database
.
Riporto le istruzioni utizzate a partire dalla ctreazione della tabella da ripopolare:
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.
tuo codice:
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:
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.
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
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:
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:
ciao, modifica il codice in questo modo:
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.
Berserker79 ha scritto:
ciao, modifica il codice in questo modo:
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)
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.
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:
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.
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:
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
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:
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.
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:
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:
Questa è la riga di codice da te postata:
DB_Connection.EXEC("INSERT INTO PianCont VALUES(" & NomeRec_via!NumVoce & ", " & NomeRec_via!NomeVoce & ", " & NomeRec_via!ContrPartSiNo & ", " & NULL & ")")
Cambiala con questa:
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.