Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: nicholas77 - Febbraio 20, 2017, 08:57:47 am

Titolo: Uso errato di Append
Inserito da: nicholas77 - Febbraio 20, 2017, 08:57:47 am
Salve,
   Utilizzo la libreria Zeos per accedere al database Sqlite.
   Scrivendo il seguente codice :

          with datamodule1.ZQuery1 do
              begin
                open;
                append;
                fieldbyname('cognome').asstring:=edit1.text;
                post;
                close;
            end;
 
dopo aver eseguito l'istruzione 'post'  si genera il seguente errore :

                "Sql error : constraint failed: routine called out of sequence"
                "raise EZSQLExcption.CreateWithCode(ErrorCode,Format(SSQLError1,[error]));"

Ho cercarto e provato diverse soluzioni, ma non riesco a risolvere l'errore.
Ho utilizzato,sempre, questa modalità d'inserimento del nuovo record in Delphi, mai avuto problemi.

Qualcuno potrebbe aiutarmi.

Grazie.
Titolo: Re:Uso errato di Append
Inserito da: Avogadro - Febbraio 20, 2017, 02:57:17 pm
Due domande:

Perché "append" e non "insert" ?

Cosa sono "open" e "close" ? Attivano e disattivano una zquery?


Anche io uso zeoslib e sqlite  e non riscontro problemi, almeno finora -uso le table, sono piu' semplici da gestire- :

...
      ztable4.Insert;
      ztable4data1.AsString:=FormatDateTime('YYYY-MM-DD',incmonth(date,i));
      ztable4.post;
...


Facci sapere

ciao


Titolo: Re:Uso errato di Append
Inserito da: nicholas77 - Febbraio 20, 2017, 08:49:00 pm
 
  nella zquery, scrivo :
           SELECT * FROM nometabella


  Poi con "open", apro la query; poi aggiungo il record poi lo riempo ed infine faccio "post".
  Ho provato ad utilizzare "insert" mi da l'errore di sopra.
  invece usando "edit" riesco a modificare il record senza problemi.
  Proverò, con ztable.
  Vi faccio sapere.
Titolo: Re:Uso errato di Append
Inserito da: Avogadro - Febbraio 20, 2017, 09:21:27 pm
Non è che puoi postare  qualche riga di codice in piu' ?

Io faccio così:

metto la connessione,
collego zquery e data source
attivo la conenssione
metto zquery.active:=true (dall' ispettore degli oggetti)

collego il dbnavigator al data source e lo uso per le varie operazioni (post, edit, prior etc)

oppure con un menu pop up prevedo un comando "save"

...  if zquery1.State in [dsinsert,dsedit] then
     zquery1.post;   
...

le query e le table hanno comportamenti simili, ma le query sono piu' flessibili se si vuole usare l'sql

magari verifica che tutto quadri: che il driver per sqlite sia quello giusto - 32 o 64 bit - , che  tutto sia connesso e collegato corretamente (zquery, zconnesion, datasoruce, etc ) , che i campi ci siano nella zquery etc etc

Magari prova ad usare un  software per sqlite (es. https://sqlitestudio.pl/index.rvt )  e vedi se la query di inserimento funziona per davvero su sqlite (caso mai c'è un errore di sintassi o qualcosa del genere - vedi il caso di chiamare un campo "data" che è una parola riservata di sql)  .

Avevo iniziato ad usare il driver per odbc per collegarmi a un data base in access; usavo le query di lazarus e testavo il codice sql prima su access e poi lo implementavo. Il programmino per la gestione di un reagentario che avevo fatto diversi anni fa gira  ancora benissimo; l' unica rottura è che windows cambia sempre le carte in tavola e ho trovato problemi di configurazione dell'obdc  se l' hardware è 64 bit, ragion per cui sono passato ad sqlite,  che non devi configurare niente ( o quasi) , metti il software, dati compresi,  su una pennina e lo fa girare dove vuoi  .

Facci sapere

Ciao
Titolo: Re:Uso errato di Append
Inserito da: Avogadro - Febbraio 20, 2017, 09:55:19 pm
Giusto per scambaire 4 chiacchere.

Allora, l' uso delle query aumenta la flessibilità perché è possibile usare l'sql, un esempio:

...
if prod_isinsert then begin
   SQLQuery4.SQL.Clear;
   SQLQuery4.SQL.add('insert into PROD (Prog, DEN, IND, CAP, Comune, Prov, PAR_IVA, COD_FIS, FAX, TEL, REF)');
   SQLQuery4.SQL.add('values ('+inttostr(max_prog_prod+1)+','
                               +chr(39)+SQLQuery1DEN.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1IND.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1CAP.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1Comune.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1Prov.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1PAR_IVA.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1COD_FIS.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1FAX.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1TEL.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1REF.Asstring+chr(39)+')'

                     );
    {form2.Memo1.Lines.Clear;
    form2.Memo1.Lines.add('insert into PROD (Prog, DEN, IND, CAP, Comune, Prov, PAR_IVA, COD_FIS, FAX, TEL, REF)');
    form2.Memo1.Lines.add('values ('+inttostr(max_prog_prod+1)+','
                               +chr(39)+SQLQuery1DEN.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1IND.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1CAP.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1Comune.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1Prov.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1PAR_IVA.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1COD_FIS.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1FAX.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1TEL.Asstring+chr(39)+','
                               +chr(39)+SQLQuery1REF.Asstring+chr(39)+')'

                     );  }
   {form2.ShowModal;}
   SQLQuery4.UsePrimaryKeyAsKey:=false;
   SQLQuery4.ExecSQL;
   sqltransaction1.Commit;

...


Ci sono poi tante varianti che lazarus consente (in pratica puo impostare le query sql di insert, delete etc come proprietà  dell' oggetto query ma non solo) .

Il punto è vedere se il gioco vale la candela: se l'applicazione è sofisticat e lo richiede, bene, ben venga il poter gestire l'sql direttamente; se l'applicazione non è complessa il classico approccio "borland database engine " va piu' che bene (mi pare che zeoslib questo voglia fare alla fine - l'essere l'engine di una banca dati  non importa se sqllite o firebird o altro ancora - ; al limite puo' andare bene anche l'approccio piu' classico "dbf"  anche se deprecato  (se la mole di dati non è eccesiva - ho provato a scorrere 10 mila record, è lento - )  la sua semplicità d'uso ripaga tutto .

Saluti.




Titolo: Re:Uso errato di Append
Inserito da: Stilgar - Febbraio 21, 2017, 12:51:01 am
Con zeos si possono definire delle "prepared statement".
Passare i parametri. Eseguire.
Lo faresti senza usare i componenti grafici.
Devi partire dalla connessione .
Tempo fa scrissi un articolo su come interrogare direttamente i database senza passare per i componenti grafici.

EDIT

http://www.lazaruspascal.it/index.php?page=111 (http://www.lazaruspascal.it/index.php?page=111)
Titolo: Re:Uso errato di Append
Inserito da: Avogadro - Febbraio 21, 2017, 04:27:59 am
Un approccio interessante.

Il problema che risontrato con  zeoslib è la documentazione;  quando h'ho installato ho usato una guida trovata da qualche parte sul web che diceva come usarlo con firebird.

C'è una una pagina web dedicata a zeoslib ma non vi ho trovato granché dentro.

Quindi dei link a dei manuali , a degli esempi etc sono i benvenuti.

Saluti






Titolo: Re:Uso errato di Append
Inserito da: Stilgar - Febbraio 21, 2017, 11:08:44 am
Devi cercare la documentazione  per jdbc.
Hanno fatto il porting dell'intelaiatura java per i database. 😉
Titolo: Re:Uso errato di Append
Inserito da: Diego1981 - Febbraio 22, 2017, 03:09:39 pm
Ciao nicholas
per quel poco che uso zeos ho sempre fatto cosi

ZQuery1.Active:=False;
ZQuery1.SQL.Text:='SELECT * FROM tabella';
ZQuery1.Active:=True;

a questo punto

Zquery1.Inert;
ZQuery1.FieldByName('nomecolonna').Asinteger(a seconda del tipo di colonna):= valore da inserire
ZQuery.post;

e se hai posto a True la proprietà CacheUpdate
zquery1.applyupadate;

Attento che se però la tua query coinvolge piu tabelle allora la vita si complica

ciao