Buongiorno a tutti, ho cominciato a lavorare con i database, tentando di migrare un applicazione realizzata in Gambas in Lazarus, riscostruendo il codice da zero.
il mio problema è non riuscire a popolare un database sglite3 prendendo i dati caricati in una StringGrid, Usando l'istruzione For.. To... Do ottengo la scrittura dell'ultimo record.
allego il codice:
procedure TForm1.Button2Click(Sender: TObject);
var
newFile : Boolean;
i : integer;
K : integer;
begin
SQLite3Connection1.Close; //Assicurarsi che la connessione viene chiusa quando iniziamo
SQLite3connection1.DatabaseName:= GetUserDir + Label2.Caption ; // home utente
try
//Dal momento che stiamo facendo questo database per la prima volta,
// verifica del file esistente
newFile := not FileExists(SQLite3Connection1.DatabaseName);
if newFile then
begin
// viene creato database e talelle
try
SQLite3Connection1.Open;
SQLTransaction1.Active := true;
// viene creata la tabella
SQLite3Connection1.ExecuteDirect('CREATE TABLE "pocket"('+
' "idpunto" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
' "Da" VARCHAR(50) NULL,'+
' "A" VARCHAR(50) NULL,'+
' "Lunghezza" REAL DEFAULT NULL,'+
' "Bussola" REAL DAFAULT NULL,'+
' "Inclinazione" REAL DAFAULT NULL);');
ShowMessage('Data base creato');
except;
ShowMessage('Impossibile creare nuovo database');
end;
end;
except;
ShowMessage('Impossibile controllare esistenza database');
end;
sqlquery1.sql.clear;
for i := 0 to StringGrid1.RowsCount - 1 do;
begin
sqlquery1.sql.add(' insert into pocket (Da,A,Lunghezza,Bussola,Inclinazione) values (:Da,:A,:Lunghezza,:Bussola,:Inclinazione)');
k:=i;
sqlquery1.params.ParamByName('Da').AsString:= StringGrid1.Cells[0,k];
sqlquery1.params.ParamByName('A').AsString:= StringGrid1.Cells[1,k];
sqlquery1.params.ParamByName('Lunghezza').AsString:= StringGrid1.Cells[2,k];
sqlquery1.params.ParamByName('Bussola').AsString:= StringGrid1.Cells[3,k];
sqlquery1.params.ParamByName('Inclinazione').AsString:= StringGrid1.Cells[4,k];
end;
sqlquery1.ExecSQL;
SQLTransaction1.Commit;
end;
Grazie per l'aiuto
Si avevo già provato ma il risultato non cambia.
in gambas ad ogni ciclo memorizzo il record con update ma in Lazarus non ho trovato una corrispondenza :
rs_poligonale = $conn.Exec("SELECT * FROM pocket") ' query di selezione
For i = 0 To GridView1.Rows.Count - 1
rs_poligonale = $conn.Create("pocket")
' rs_poligonale!idpunto è autoincrementale non serve indicizzarlo
k = i
rs_poligonale!Da = GridView1[k, 0].Text
rs_poligonale!A = GridView1[k, 1].Text
rs_poligonale!Lunghezza = GridView1[k, 2].Text
rs_poligonale!Bussola = GridView1[k, 3].Text
rs_poligonale!Inclinazione = GridView1[k, 4].Text
rs_poligonale.Update
Next
Bene ho risolto, dopo innumerevoli tentativi ;D ;D
for i := 0 to StringGrid1.RowsCount - 1 do begin;
sqlquery1.sql.text := ' insert into pocket (Da,A,Lunghezza,Bussola,Inclinazione) values (:Da,:A,:Lunghezza,:Bussola,:Inclinazione)';
k:=i;
sqlquery1.params.ParamByName('Da').AsString:= StringGrid1.Cells[0,k];
sqlquery1.params.ParamByName('A').AsString:= StringGrid1.Cells[1,k];
sqlquery1.params.ParamByName('Lunghezza').AsString:= StringGrid1.Cells[2,k];
sqlquery1.params.ParamByName('Bussola').AsString:= StringGrid1.Cells[3,k];
sqlquery1.params.ParamByName('Inclinazione').AsString:= StringGrid1.Cells[4,k];
sqlquery1.ExecSQL;
end;
SQLTransaction1.Commit;
Praticamente l'istruzione "begin" inserita dopo for := ... to...do, vale anche per popolare una semplice listbox, infien al posto di sqlquery1.sql.add( insert.... , sqlquery1.sql.text:= ' insert.
Spero possa essere utile ;) ;)
Ciao.
for i := 0 to StringGrid1.RowsCount - 1 do begin;
Dopo il begin ; -> funziona perchè begin è inizio blocco e ; è fine istruzione, quindi il parser inserisce un nodo "vuoto" (o così mi aspetterei) e in fase di generazione del codice potrebbe diventare una nop oppure essere ignorato.
Metterlo prima (il punto e virgola) significa scrivere un ciclo for con dentro un nop.
Quindi il blocco sucessivo risulta essere eseguito solo 1 volta.
Legolas spero di aver risposto alla tua domanda implicita. :D
Stilgar