Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: antoniog - Febbraio 19, 2019, 11:28:03 am

Titolo: SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE........"[RISOLTO]
Inserito da: antoniog - Febbraio 19, 2019, 11:28:03 am
Linux Mint mate 19x64 - Zeoslib - sqliteBuongiorno,
Voglio copiare alcuni record in base ad una stringa da una tabella in un'altra.Aggiungo un database al database in uso
Codice: [Seleziona]
ZQuery2.Active:=False;
ZQuery2.SQL.Text:= 'ATTACH '+''''+Label149.Caption+''''+' AS '+'''DB2''';
ZQuery2.Active:=True;
Faccio un ciclo while per creare una stringa che mi servirà per il filtro
Codice: [Seleziona]
mTable:='totarticoli';
Ztable2.Active:=False;
Ztable2.TableName:='lotti';
mcosa:='';
Ztable2.Active:=True;
Ztable2.First;
while not Ztable2.Eof do
 begin
   mcosa:= mcosa+Ztable2Num.Text;
   Ztable2.Next;
 end;
A questo punto dovrei dare l'istruzione sql per copiarmi tutti i record dalla seconda tabella nella prima in base al campo riparto di una lettera che deve essere presente nella stringa mcosa.
Codice: [Seleziona]
DMPcopia.ZQuery2.Active:=False;
ZQuery2.SQL.Text:= 'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto='+mcosa+';';
DMPcopia.ZQuery2.Active:=True;   
Dovrei utilizzare un'istruzione tipo pos()>0 . Nel codice inserito non funziona neanche ' WHERE riparto='+mcosa e non capisco perchè, mi da l'errore : SQL Error: SQL logic error: no such column: AB1C.Ho bisogno d'aiuto. Grazie.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 11:32:57 am
  Hai provato ad eseguire la query direttamente in un client sqlite? Perchè alcuni RDBMS usano la sintassi
 
  insert into nome_tabella2 select column1, column2, column3 from nome_tabella1
 
  mentre altri RDBMS usano la sintassi
 
  insert into nome_tabella2 (column1, column2, column3) select column1, column2, column3 from nome_tabella1

  dove le colonne del selecct devono essere elencate nell'esatto ordine in relazione all'insert. Questo è il primo consiglio che mi viene in mente.
  Diversamente conviene sempre allegare un esempio che permetta di riprodurre il problema. Così anche per noi è più facile darti una mano.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 12:03:18 pm
il problema è nella condizione where...
così funziona ma mi copia tutti i record
'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+';';
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 12:09:27 pm
Allora facci avere il contenuto di mcosa e vediamo che cerchi di passargli. Perchè sembra non trovi una delle colonne.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 12:17:03 pm
mcosa è = 'ABC' ma può essere diverso, una stringa composta da caratteri e numeri
riparto è = 'A' o 'B' o qualsiasi lettera o numero di un caratteredevo copiare i record in cui riparto è in mcosa
per esempio tipo questo:
where riparto pos('A', 'ABC')>0 copia
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 12:23:48 pm
Allora è presto detto la tua query è così composta

'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto='+mcosa+';';

e deve diventare

'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto='''+mcosa+''';';

E ovviamente non devi passare il carattere ' nella mcosa altrimenti lo devi raddoppiare.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 12:25:37 pm
Tutto questo perchè il carattere ' è il delimitatore di stringa in lazarus. Quindi per inserire il carattere ' dentro una stringa devi digitarlo 2 volte. Ad esempio se vuoi scrivere il capo e' arrivato dentro la variabile var1 devi scrivere:

var1:='il capo e'' arrivato';
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: guest1752 - Febbraio 19, 2019, 12:31:12 pm
ciao, un altro modo di risolvere il problema è utilizzando i parametri nelle query che fai invece che comporti la query.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 12:39:36 pm
Grazie Xinvimar, così funziona ma io devo copiare se il carattere 'A' del campo 'riparto'  è presente nella stringa 'ABCD'
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 12:53:41 pm
Superc, non ho capito
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 01:38:55 pm
'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto like '%''+mcosa+''%';';
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: guest1752 - Febbraio 19, 2019, 02:17:27 pm
un pezzo di codice di esempio:

Codice: [Seleziona]
function TmainForm.insertRecordIntoDb(tri: TRecimport): Boolean;
var
  qry : TZQuery;
begin
  Result := false;
  try
    try
      qry := TZQuery.Create(nil);
      qry.Connection := conn;
      qry.SQL.Add('insert into import_clienti_fornitori (cod, nome,  paese, indirizzo, cap, loc, prov, telefono, tel_port, fax, partita_iva) '+
                  ' values (:cod, :nome,  :paese, :indirizzo, :cap, :loc, :prov, :telefono, :tel_port, :fax, :partita_iva)');

      qry.ParamByName('cod').AsString:=tri.cod;

      qry.ParamByName('nome').AsString:=tri.nome;
      qry.ParamByName('paese').AsString:=tri.paese;
      qry.ParamByName('indirizzo').AsString:=tri.indirizzo;
      qry.ParamByName('cap').AsString:=tri.cap;
      qry.ParamByName('loc').AsString:=tri.loc;
      qry.ParamByName('prov').AsString:=tri.prov;
      qry.ParamByName('telefono').AsString:=tri.tel;
      qry.ParamByName('tel_port').AsString:=tri.cell;
      qry.ParamByName('fax').AsString:=tri.fax;
      qry.ParamByName('partita_iva').AsString:=tri.pi;

      qry.ExecSQL;
      Result := True;
    except
      on e: exception do
      begin
           ShowMessage('Error...'+e.Message);
      end;
    end;
  finally
    qry.Free;
  end;
end;   
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 04:19:08 pm
'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto like '%''+mcosa+''%';';
Fatal: Syntax error, ";" expected but "ordinal const" found
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 04:30:08 pm
Scusa, prova con

'INSERT INTO '+mtable+' SELECT * FROM DB2.'+mtable+' WHERE riparto like ''%'+mcosa+'%'';';

è per questo che è sempre meglio postare un esempio che riproduce il codice. A quest'ora avremmo già risolto :)
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: antoniog - Febbraio 19, 2019, 05:00:31 pm
Grazie Xinvimar, così funziona.Mi scuso ma non potevo inviare un esempio, questa parte sono solo poche righe di codice ma il progetto a cui lavoro è molto grande e pesante da inviare.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE........."[RISOLTO]
Inserito da: antoniog - Febbraio 19, 2019, 05:04:30 pm
Superc, grazie per le risposte ma io preferisco utilizzare 'DB browser per SQLite' per creare database e tabelle, comodo e facile da usare senza dovere digitare del codice che poi deve essere tutto controllato.
Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: guest1752 - Febbraio 19, 2019, 05:33:41 pm
ciao, no problema, pero credo di essere stato frainteso:
il codice che ti ho postato serve per fare un'esempio di come, al posto di comporre una query facendo l'append anche dei parametri (visti come stringa) , puoi passare questi valori appunto come parametri della query.
Cosi facendo non ti devi preoccupare di inserire i '' dentro una stringa per ottenere l'apice, ma settando la query opportunamente ( ovvio prima devi settare della TZQuery i parametri che accetta e il tipo);
per come la vedo io aumenta la leggibilità.

Titolo: Re:SQLITE "INSERT INTO ......SELECT * FROM DB2..........WHERE............"
Inserito da: xinyiman - Febbraio 19, 2019, 05:53:13 pm
Grazie Xinvimar, così funziona.Mi scuso ma non potevo inviare un esempio, questa parte sono solo poche righe di codice ma il progetto a cui lavoro è molto grande e pesante da inviare.

Figurati, ricorda di classificare il 3d come risolto nel titolo.
Comunque ricapitasse basta estrapolare un esempio piccolino dal progetto grande. A giudicare da quello che volevi bastavano 10 minuti in più. Buon lavoro