Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: antoniog - Marzo 16, 2013, 03:50:20 pm

Titolo: problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 16, 2013, 03:50:20 pm
ho inserito in un datamodule : Zconnection collegandolo ad un database sqlite3, Ztable collegandolo ad una tabella con 73 colonne, e Tdatasource, i collegamenti sono corretti.
Al momento di caricare i campi della tabella (doppio click su Ztable) viene segnalato l'errore :
"Impossibile ottenere la lista campi del dataset
Controlla le impostazioni del dataset
Row buffer width exceeded. Try using fewer or longer columns in SQL query."
qualcuno sà aiutarmi a risolvere l'arcano?
Grazie
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 16, 2013, 09:30:32 pm
azz. Hai sfondato la dimensione della riga di buffer ...
Controlla dentro il file ZDBcCache.
Codice: [Seleziona]
   TZByteArray = array[0..65535] of Byte;
...
   if FColumnsSize > SizeOf(TZByteArray)-1 then
      raise EZSQLException.Create(SRowBufferWidthExceeded);

Da questo controllo direi che dovresti farti 2 conticini .. le righe superano (con i varchar al massimo) i 65535 byte? Se sì, creca di usarne qualcuno meno ;)
Sicuro che ti servano tutti i 73 campi in un unica riga e che tu non possa spezzarla in "parent" e "child"?
Al massimo usi 2 tabelle, in master e slave, dove mappi meno campi per tabella.
Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 16, 2013, 11:51:40 pm
spezzare la tabella mi complichebbe la vita. Ti faccio perdere un pò di tempo. Stò convertendo un programma di contabilità multiaziendale, scritto quasi 20 anni fà in delphi4 (prima rel. 1989 in Foxpro), e ho necessità di riconvertire gli archivi storici, all'occorrenza, da DBF a SQL, con una procedura automatizzata che ho già scritto e funziona, con 2 datamoduli con 27 tabelle ciascuno, in un datamodulo Zconnection e ZTable con protocollo Sqlite-3, nell'altro tabelle Tdbf. Le tabelle Ztable e Dbf hanno gli stessi campi per cui una semplice routine copia i dati da una tabella all'altra, proiettando il programma verso un futuro dove i DBF cesseranno di esistere, già adesso ho incontrato non poche difficoltà ad aprirli e gestirli. La cosa strana, e di logica inspiegabile, è che se al posto di ZTable utilizzo TSqlite3Dataset la tabella con i 73 campi viene gestita così come con TDbf. Quindi o Zeos ha delle grosse limitazioni per cui è meglio non usarlo oppure è necessario, in un qualche modo, configuralo affinchè lavori secondo i bisogni come avveniva con BDE administrator.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 17, 2013, 11:50:02 am
Brevemente ... visto che è un batch quello che stai preparando per la "conversione" degli archivi, lascia stare la parte di "design" e passa a basso livello.
Quello che devi fare sono insert massive, e il passaggio per i componenti grafici, rallenta.
Viagga a livello di IZConnection, IZPreparedStatement.
In questo modo hai le tue "insert" pronte e utilizzabili subito.
Leggi dal vecchio database e inserisci i dati subito. In questo modo non passi per la cache dei vari componenti. A te interessa inserire subito i dati convertendo il db... se non mi sono perso qualche pezzo per strada ...
In ogni caso SQLite ... sei sicuro che sia la strada corretta? Va benissimo per videogiochi e telefonini .. o programmi con piccoli database ... ma un gestionale ... mmm ho qualche dubbio posso essere la scelta vincente ... puoi provare FirebirdSQL embedded .... sicuramente meno "rognoso" per le performance. ;)
Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 17, 2013, 05:02:07 pm
Stilgar, con le opportune differenze, mi è sembrato di capire che tu mi proponi di tornare agli inizi degli anni '80, quando programmavo in basic (il basic di allora) e gestivo archivi in formato testo, dovevo scrivere proprio tutto, chilometri di listati da controllare e verificare, una cosa da 'matti' ; il visuale è un grande passo avanti, irrinunciabile! Di SQL non sò molto, la cosa che mi è sembrato di capire che non cè uno standard, dato che non sò molto evito di dire 'cazzate'.
Proprio perchè vengo da lontano l'impostazione dei miei database consuma poche risorse, in questo gestionale, la conversione degli archivi di un esercizio passato (un anno di contabilità) dura meno di 3 minuti, un tempo più che accettabile. Le tabelle con gli anni hanno aumentato il numero dei campi per essere adeguate alle nuove disposizioni di legge (annuali) e non perdere la compatibilità col passato. Avendo scelto Lazarus (multipiattaforma) per convertire i miei programmi scritti in delphi4 (windows), mi sono subito reso conto di 2 difficoltà, la prima la gestione dei database, atteso che i .DBF non hanno futuro, e i report che sono complessi e dovrò riscrivere completamente, al proposito conosci qualcosa di compatibile con Qreport?  ho pensato di utilizzare SQLite perchè è l'unico che sono riuscito a fare funzionare (SQLite database browser) e, cosa importante, con un piccolo modulo funziona anche in windows ma il problema non è sqlite ma Zeos, anche se non credo che la tabella con 73 campi ecceda i 65535 byte, forse saranno i nomi dei campi, alcuni solo con 2 caratteri, forse perchè nella conversione ho lasciato il tipo 'field' non assegnando alcun altro tipo (text, integer, ecc.), qualcos'altro al suo posto? In ogni caso devo fare delle verifiche e decidere.
Grazie.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 17, 2013, 06:51:43 pm
senza dimenticare quello che ho detto prima è successo una cosa incredibile che mi lascia più insicuro di prima. Ho provato, tramite SQLite database browser, a modificare la tabella che dava l'errore :"Impossibile ottenere la lista campi del dataset Controlla le impostazioni del dataset
Row buffer width exceeded. Try using fewer or longer columns in SQL query.", ho assegnato ai campi numerici 'Field type' = NUMERIC, ai campi TEXT niente (perchè se metti Text viene visualizzato (BLOB), e non da più errore, i dati vengono visualizzati, sembra, correttamente. Il problema rimane perchè questa è una soluzione dovuta ad un pò di esperienza e tanta fortuna.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 17, 2013, 07:53:27 pm
Antonio, io non proponevo per niente un passi negli anni 80 ... ti proponevo un ciclo for ... o meglio un while con annidato un for ... ma tantè.
Lavorare a livello di Insert non centra nulla con la parte visuale. I componenti di Backend possono essere rimossi nel 40% dei casi. Il tuo mi sembrava uno di questi.
Dici che la trasformazione in DBF ti costa 3 minuti. Ok, ma i "giri" che fanno i dati in memoria sono tanti. Se devi fare un impost massivo, forse riesci a risparmiare qualche secondo.
Poi dovrei avere sotto mano i tuoi lisati per poter giudicare se i miei suggerimenti sono effettivamente validi per il tuo problemi.
Persevera e fammi sapere come ne esci.

Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 17, 2013, 08:59:15 pm
non appena avrò ultimato la procedura di conversione ti manderò i sorgenti (2/3 giorni), così potrai fare una valutazione ed eventualmente migliorare il tutto. Ovviamente userò SQLite3, aspetterò tue valutazioni per altro.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 17, 2013, 10:44:07 pm
Antonio .. prova a dare una letta a questo articolo : http://www.lazaruspascal.it/index.php?page=111
Ci sono le basi per lavorare con Zeos senza i componenti di backend.
Mal che vada tieniti le mani libere ;)

Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 18, 2013, 10:17:40 pm
grazie, leggerò e proverò.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 19, 2013, 07:38:28 pm
Stilgar, quello che hai scritto è molto interessante ma al momento mi servono istruzioni più "terra.. terra".
Ho convertito i miei vecchi archivi .DBF in file .CVS pronti per essere importati in un database.
Ho cercato programmi con interfaccia grafica per la gestione dei database e ho trovato solo questi due : Kexi e SQLite database browser.
Gestiti da Lazarus con Zeos, Kexi trasforma i campi stringa in campi memo e SQLite d. b. trasforma i campi numerici in campi stringa. Entrambi non mi consentono di operare.
Tu conosci altre interfaccie grafiche per la gestiorne dei database e delle tabelle?
FlameRobin, PgAdminIII,Tora, emma, sono gestori di database ma io sono un passo prima, devo costruire il database con le tabelle importate tramite .cvs. Da .dbf
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 19, 2013, 09:25:14 pm
http://sqliteadmin.orbmu2k.de/ (http://sqliteadmin.orbmu2k.de/)
Non è mantenuto, o meglio sul forum di Zeos darebbero pure supporto .... se solo il tetesco si degnasse di rilasciare i sorgenti, potremmo aggiustare parecchie cosine del programma.
Ha la funzione import da CSV ... mai notato problemi di conversione anomale.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 19, 2013, 10:31:53 pm
@antoniog:
quante tabelle sono?
se non sono molte puoi ricrearle tu in sql con istruzioni tipo CREATE TABLE, il formato dbf è molto semplice da tradurre.
Poi i csv si importano in un secondo momento a struttura create.


Edit:
questo sembra produrre anche output SQL, spero ci sia anche la struttura e non solo le insert... da provare
http://sourceforge.net/projects/dbf/?source=directory (http://sourceforge.net/projects/dbf/?source=directory)
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 23, 2013, 01:29:43 am
grazie a Stilgar e Nomorelogic dei suggerimenti.
penso di riuscire presto, al momento ho qualche difficoltà come root, la divina provvidenza deve avere cambiato la password.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 25, 2013, 06:22:03 pm
sono ad un punto morto. un pò funziona un pò no.
Voglio cancellare tutti i record di tutte le tabelle di un database sqlite ma mi da errore:
SQL Error: SQL logic error or missing database.
su :
rocedure TConvPrismaF.Button3Click(Sender: TObject);
var
   I : Integer;
  // TTempDBF : TDbf;
  TTempZ : TZTable;
    Perco, Perco1, TempFile, C : string;
begin

      GetDir(0, C);
       perco:= C+'/GENUARDI/2010/esercizio.sdb';
       ConvPrismaF.ProgressBar1.Max := DataSql.ComponentCount;

    with DataSql do  //datamodulo
    begin
          //daidir
      ZConnection1.Connected:=False;
      ZConnection1.Database:= perco ;
      ZConnection1.Connected:=True;
    I:=0;
     while I < ComponentCount do
      begin
        if Components is TZTable then
          begin
            TTempz:= Components as TZTable;
            TTempz.Active:=True;
            if TTempz.recordcount>0 then
              begin
                TTempz.First;
                 while not TTempz.EOF do
                   begin
                     TTempz.Delete;
                     TTempz.Next;
                   end;
                end;
             TTempz.ApplyUpdates;
          end;
        ConvPrismaF.Progressbar2.Position:= ConvPrismaF.Progressbar2.Position + I;
        I:=I+1;
      end;
       informa('Finito Cancella.');
    end;
end;   

ringrazio in anticipo per correzioni.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 25, 2013, 06:44:31 pm
così a occhio potrebbe mancare
ZConnection1.Protocol := ...
prima di effettuare la connessione

se non è questo fai così:
1) vai sulla riga " GetDir(0, C);"
2) premi F5 e metti un breakpoint
3) lancia con F9
4) quando il debugger ti visualizza il punto di esecuzione, vai avanti a forza di F8 finché non individui la riga che da errore (e ci fai sapere ;))
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 25, 2013, 07:41:16 pm
ZConnection1.Protocol := sqlite-3
dopo molti cicli while I< ... Dà errore su
TTempz.Delete;

4 record(s) updated. Only one record should have been updated.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 25, 2013, 08:03:35 pm
cè qualcosa che non funziona nel ciclo while ... Per che aggiunto
try
except
          on E: Exception do  //E:EDatabaseError do
          informa(E.Message);

ed E: ritorna per molte volte il seguente messaggio
0 record(s) updated. Only one record should have been updated
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 25, 2013, 08:29:13 pm
adesso funziona solo che non cancella i record, dove devo mettere .ApplyUpdates,
da qualsiasi parte lo metta mi dà errore.

procedure TConvPrismaF.Button3Click(Sender: TObject);
var
   I : Integer;
  // TTempDBF : TDbf;
  TTempZ : TZTable;
    Perco, Perco1, TempFile, C : string;
begin

      GetDir(0, C);
       perco:= C+'/GENUARDI/2010/esercizio.sdb';
       perco1:= C+'/GENUARDI/2010';
       ConvPrismaF.ProgressBar1.Max := DataSql.ComponentCount;
    with DataSql do
    begin
          //daidir
      ZConnection1.Connected:=False;
      ZConnection1.Database:= perco ;
      ZConnection1.Connected:=True;
    I:=0;
     while I < ComponentCount do
      begin
      try
      begin
         label2.Caption:=  Components.Name;
        if Components is TZTable then
          begin
            TTempz:= Components as TZTable;
            if (TTempz.Name <> 'Esercizi') and
             (TTempz.Name <> 'Aziende')  and
             (TTempz.Name <> 'Archivi')  and
              (TTempz.Name <> 'PartitaCliFor')  and
              (TTempz.Name <> 'ProvPrimaPC')  and
              (TTempz.Name <> 'ProvPrimaCCL')  and
              (TTempz.Name <> 'ProvPrimaCIL')
               then
                 begin

                    ConvPrismaF.ListBox1.Items.Add(perco1+'/'+TTempz.TableName);
                    TTempz.Active:=True;
                    if TTempz.recordcount>0 then
                      begin
                        TTempz.First;
                        while not TTempz.EOF do
                          begin
                            TTempz.Delete;
                            //TTempz.ApplyUpdates;
                            TTempz.Next;
                          end;
                      end;
                end;
                //TTempz.ApplyUpdates;
            if TTempz.Active=True then  TTempz.Active:=False;
          end;
         //TTempz.ApplyUpdates;
        ConvPrismaF.Progressbar2.Position:= ConvPrismaF.Progressbar2.Position + I;
        I:=I+1;
        end;
       except
          on E: Exception do  //E:EDatabaseError do
          informa(E.Message);

         end;
          I:=I+1;
         end;
      end;
       informa('Finito Cancella.');

    //end;
end;                   
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 25, 2013, 09:44:09 pm
Codice: [Seleziona]
Procedura CancellaTabella(Connessione : TZConnection; nomeTabella : String)
var
  statement:IZPrepareStatement;
  numeroRigheEliminate : integer;
begin
try
  statement := Connessione.DbcConnection.PrepareStatement('delete from ?');
  statement.setStringParma(1,nomeTabella);
  numeroRigheEliminate:= statement.ExecuteUpdatePrepared;
except
  on E : Exception do
   informa(E.Message);
end; 
  statement := nil;
End;
Scritto di getto, non testato con il compilatore... vole essere solo una traccia ;)
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 25, 2013, 10:36:50 pm
convprisma.pas(258,31) Error: Identifier not found "IZPrepareStatement"
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 25, 2013, 10:44:13 pm
ZDBCIntfs nella uses ...
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 26, 2013, 09:57:32 am
procedure TConvPrismaF.Button3Click(Sender: TObject);
[...]
                    if TTempz.recordcount>0 then
                      begin
                        TTempz.First;
                        while not TTempz.EOF do
                          begin
                            TTempz.Delete;
                            //TTempz.ApplyUpdates;
                            TTempz.Next;
                          end;
                      end;
                end;             
[...]

ApplyUpdates a parte, questo pezzo di codice è il responsabile del problema dell'eliminazione: ti veniva cancellato 1 record si ed 1 no, nel tuo caso credo tutti i record dispari :)
Quando invochi Delete, il cursore passa automaticamente al record successivo, non serve la Next anzi è un errore richiamarla perché così ne salti uno che non verrà cancellato.

Per cancellare tutto è meglio seguire il consiglio di Stilgar (molto più veloce) però, nel caso dovessi tornare a scrivere qualcosa del genere, devi scrivere il loop in questo modo:
Codice: [Seleziona]
                    if TTempz.recordcount>0 then
                        while TTempz.recordcount>0 do
                            TTempz.Delete;


Edit:
anzi...
la prima riga, quella con l'if non serve neanche, basta:
Codice: [Seleziona]
while TTempz.recordcount>0 do TTempz.Delete;
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 26, 2013, 04:32:26 pm
Nomorelogic, sembra funzionare ed è molto semplice e veloce, in effetti la mia mia procedura concellava solo metà tabella. per quanto riguarda il suggerimento di Stilgar dovrò studiare ancora un pò. già che siamo in tema allego la procedura che dovrebbe copiare i dati dalle tebelle DBF in quelle SQL, ho provato a lanciarla, gira, non fà niente, e consuma tutta la memoria e la RAM. grazie per l'aiuto.

procedure IniziaConverti;
var
  I, f, g : Integer;
  TTempDBF : TDbf;
  TTempZ : TZTable;
  Perco, Perco1, TempFile : string;
  CampoP, Dest, C : string;
begin
  ConvPrismaF.ProgressBar1.Position := 0;
  ConvPrismaF.ProgressBar2.Position := 0;

  //MessageDlg('Inizia Converti', mtInformation, [mbOk], 0);
  GetDir(0, C);
  perco:= C+'/GENUARDI/2010/esercizio.sdb';
  perco1:= C+'/GENUARDI/2010';
    // pulizia archivi in DataSql
  with DataSql do  // modulo dati con Zeos e Ztable
    begin
          //daidir
      ZConnection1.Connected:=False;
      ZConnection1.Database:= perco ;
      ZConnection1.Connected:=True;
    I:=0;
     while I < ComponentCount do
      begin
       try
        if Components is TZTable then
          begin
            TTempz:= Components as TZTable;
             if (TTempz.Name <> 'Esercizi') and
             (TTempz.Name <> 'Aziende')  and
             (TTempz.Name <> 'Archivi')  and
              (TTempz.Name <> 'PartitaCliFor')  and
              (TTempz.Name <> 'ProvPrimaPC')  and
              (TTempz.Name <> 'ProvPrimaCCL')  and
              (TTempz.Name <> 'ProvPrimaCIL')
               then
                 begin
                   TTempz.Active:=True;
                   // inizia trasferimento dati
                   f:=0;
                   with DataDBF do   // modulo dati con tabelle DBF
                     begin
                       while f < DataDBF.ComponentCount do
                        begin
                         if Components[f] is TDbf then
                           begin
                              TTempDBF:= Components[f] as TDbf;
                               if TTempDBF.Name = TTempz.Name then
                                 begin
                                   TTempDbf.Active:=False;
                                   TTempDbf.FilePath:= perco1;
                                   TTempDbf.FilePathFull:= perco1;
                                   TTempDbf.Active:=True;
                                   f:= DataDBF.componentCount;
                                 end;
                              end;
                           f:=f+1;
                         end;
                         TTempDbf.First;
                         while not TTempDbf.EOF do
                           begin
                             TTempz.Append;
                             g:=0;
                             while  (g < TTempDbf.FieldCount)  do
                               begin
                                  CampoP:= TTempDbf.Fields[g].FieldName;
                                  TTempz.FieldValues[CampoP]:=
                                              TTempDbf.FieldValues[CampoP];
                                  end;
                                g:=g+1;
                               end;
                               TTempz.Post;
                               TTempz.ApplyUpdates;
                               //TTempDbf.Next
                           end;
                           //TTempz.ApplyUpdates;
                         end;
                  end;
            //end;
        except
        on E: Exception do
         begin
          MessageDlg(E.Message+#13+'...ERRORE in Converti...'+TTempz.Name, mtInformation, [mbOk], 0);
          //abort;
          exit;
          end;
        end;
        I:=I+1;
    end;
     informa('Conversione finita');
  end;
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 26, 2013, 05:30:44 pm
scusate ho trovato un errore nel ciclo centrale è lo corretto, ha convertito alcune tabelle poi è uscito senza avvisi.

TTempDbf.First;
                         while not TTempDbf.EOF do
                           begin
                             TTempz.Append;
                             g:=0;
                             while  (g < TTempDbf.FieldCount)  do
                               begin
                                  CampoP:= TTempDbf.Fields[g].FieldName;
                                  TTempz.FieldValues[CampoP]:=
                                              TTempDbf.FieldValues[CampoP];
               g:=g+1;  //giusto
                                  end;
                                //g:=g+1; sbagliato
                               end;
                               TTempz.Post;
                               TTempz.ApplyUpdates;
                               //TTempDbf.Next
                           end;
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 26, 2013, 10:54:28 pm
la procedure seguente funziona ma ci mette molto tempo ad elaborare tutto,  c'è qualcosa di più veloce?
ci sono 2 datamoduli, uno contiene tabelle DBF e l'altro Ztable.
Grazie.

with DataDBF do
    begin
       Primanota.Active:=False;
       Primanota.FilePath:= perco1;
       Primanota.FilePathFull:= perco1;
       Primanota.Active:=True;
       Primanota.First;
       while not Primanota..EOF do
         begin
           DataSQL.Primanota.Append;
           g:=0;
           while  (g < Primanota.FieldCount)  do
             begin
               CampoP:= Primanota.Fields[g].FieldName;
               DataSQL.Primanota.FieldValues[CampoP]:= Primanota.FieldValues[CampoP];
               ConvPrismaF.ListBox1.Items.Add(CampoP);
               g:=g+1;
             end;
           Primanota.Next;
         end;
       informa('Elaborazione finita');
    end;           
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 26, 2013, 11:19:38 pm
di solito DisableControls serve a fare queste operazioni più velocemente
prova così:

Codice: [Seleziona]
with DataDBF do
    begin
       Primanota.Active:=False;
       Primanota.FilePath:= perco1;
       Primanota.FilePathFull:= perco1;
       Primanota.Active:=True;

   Primanota.DisableControls;
   DataSQL.Primanota.DisableControls;
   
       Primanota.First;
       
   try
while not Primanota.EOF do
         begin
           DataSQL.Primanota.Append;
           g:=0;
           while  (g < Primanota.FieldCount)  do
             begin
               CampoP:= Primanota.Fields[g].FieldName;
               DataSQL.Primanota.FieldValues[CampoP]:= Primanota.FieldValues[CampoP];
               // ConvPrismaF.ListBox1.Items.Add(CampoP);
               g:=g+1;
             end;
           Primanota.Next;
         end;
   finally
          Primanota.EnableControls;
          DataSQL.Primanota.EnableControls;
       end;    
       informa('Elaborazione finita');
    end;           
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 26, 2013, 11:42:28 pm
grazie, provo.
Il problema e che durante l'elaborazione la form si 'sbianca' tanto che si ha l'impressione che il pc si sia 'piantato', più volte, ho dovuto attivare il monitor di sistema. bisognerebbe inserire 'un qualche cosa' che faccia visualizzare il proseguire dell'elaborazione; ci sono 26 tabelle con una infinità di records e campi.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 27, 2013, 08:46:03 am
Che si "sbianchi" durante questo tipo di operazioni è normale, il processore ha di meglio da fare che disegnare sullo schermo ;)

Per mostrare l'avanzamento dovresti usare (con parsimonia) Application.ProcessMessage che forza l'elaborazione dei messaggi in coda.
Per mostrare l'avanzamente ogni 100 record, ad esempio:

dovresti definire da qualche parte una label (se non ti piace la label puoi fare con la progressbar)

Codice: [Seleziona]
with DataDBF do
    begin
       Label1.Caption := 'Initializing...';
       Primanota.Active:=False;
       Primanota.FilePath:= perco1;
       Primanota.FilePathFull:= perco1;
       Primanota.Active:=True;

       Primanota.DisableControls;
       DataSQL.Primanota.DisableControls;
       
       Primanota.First;
       
       try
         while not Primanota.EOF do
         begin
           DataSQL.Primanota.Append;
           g:=0;
           while  (g < Primanota.FieldCount)  do
             begin
               CampoP:= Primanota.Fields[g].FieldName;
               DataSQL.Primanota.FieldValues[CampoP]:= Primanota.FieldValues[CampoP];
               // ConvPrismaF.ListBox1.Items.Add(CampoP);
               g:=g+1;
             end;
             // refresh gui ogni 100 records
             if (Primanota.RecNo mod 100) = 0 then
                begin
                   Label1.Caption := Format('Processing table %s, record %d/%d done...', ['Primanota', Primanota.RecNo, Primanota.RecordCount]);
                   Application.ProcessMessages;
                end;
           Primanota.Next;
         end;
       finally
          Primanota.EnableControls;
          DataSQL.Primanota.EnableControls;
       end;    
       Label1.Caption := Format('Table %s done.', ['Primanota']);
       informa('Elaborazione finita');
    end;           



Sia Application.ProcessMessages che mod rallenteranno un po' l'esecuzione, ma sparirà l'effetto "non risponde".
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Marzo 27, 2013, 09:29:46 am
Mettere le operazioni lunghe in un thread?
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Marzo 27, 2013, 08:12:41 pm
grazie nomorelogic, funziona e oltre tutto la form non sbianca più.

Stilgar, purtroppo non sò cosa sia un thread. dovrei studiare o trovare degli esempi.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Marzo 28, 2013, 09:55:49 am
grazie nomorelogic, funziona e oltre tutto la form non sbianca più.

Stilgar, purtroppo non sò cosa sia un thread. dovrei studiare o trovare degli esempi.

di nulla

cmq dai un'occhiata ai thread quando hai modo, magari per provare a fare la stessa procedura
con ProcessMessages hai un miglioramento nella gui ma con i thread è un'altra cosa: la gui risponde ancora di più e puoi lanciare anche altre operazioni 
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 05, 2013, 05:39:54 pm
finalmente sono riuscito ad acquisire tabelle DBF in database SQLite non perdendo i dati, non è stato facile, ho acquisito la conoscenza degli strumenti per farlo, se a qualcuno interessa potrei descrivere i risultati della mia esperienza.
Al momento però ho un'altro problema con date e numeri,
per i campi 'data' ho provato ad usare sia un campo TdateTime che Char usando:
 EditMask : !99/99/\2\000;1;_ e DispalyFormat: ddddd
il risultato visualizzato nella form è corretto es.:16/12/2013, ma compilando e lanciando l'appricazione il risultato diventa 16-12-13 e non và bene, cosi come per i numeri REAL che da 1.235.263,45 diventano : 1,235,263.45 trasformati nel formato inglese.
Ho provato ad intervenire sul formato regionale della lingua (Mint 13x64) ma nulla cambia. Avrei bisogno una dritta, grazie.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 06, 2013, 01:11:10 pm
SQLite e' fastidioso con le date.
Se vuoi puoi usare le sue funzioni per la gestione delle date.
http://www.sqlite.org/lang_datefunc.html
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 07, 2013, 06:47:59 pm
non è un problema di gestione ma di visualizzazione, allego la schermata in fase di costruzione (prima) e a runtime (dopo), questo non sò proprio come risolverlo.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Aprile 08, 2013, 08:42:49 am
finalmente sono riuscito ad acquisire tabelle DBF in database SQLite non perdendo i dati, non è stato facile, ho acquisito la conoscenza degli strumenti per farlo, se a qualcuno interessa potrei descrivere i risultati della mia esperienza.

ogni tanto la problematica riemerge e serve sempre a qualcuno
non sarebbe male un articolo sull'argomento
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Aprile 08, 2013, 08:50:58 am
non è un problema di gestione ma di visualizzazione, allego la schermata in fase di costruzione (prima) e a runtime (dopo), questo non sò proprio come risolverlo.

con Sqlite non ci lavoro e non ti saprei dire ma segui questa procedura, così ci togliamo qualche dubbio
http://www.lazaruspascal.it/index.php?topic=535.msg4336#msg4336 (http://www.lazaruspascal.it/index.php?topic=535.msg4336#msg4336)

facci sapere se risolve
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 08, 2013, 07:16:19 pm
seguendo le indicazioni cioè cambiando lingua e ritornando dopo la riaccensione all'italiano qualcosa si è risolto, le date e i numeri sono corretti ma cè un'altro problema mette un ? al posto delle accentate. Come da allegato. cosa altro fare?
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Aprile 09, 2013, 09:50:01 am
potrebbe essere il charset del database, dovresti assicurarti che il charset sia ISO8859 o, meglio, UTF-8
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 09, 2013, 08:23:15 pm
Sqlite usa utf-8.
Prova a giocare con le funzioni SystemtoUtf8 e Utf8Tosystem ... (vado a memoria).
Intercetta il "getText" e "setText" dei campi currency.

Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 11, 2013, 12:38:48 am
certo che i problemi non mancano.
volevo verificare la multipiattaforma del mio programma, in attesa di risolvere alcuni problemi di visualizzazione dei campi sotto linux,
ho provato a trasferirmi sotto windows, sia xp che 7, ed il bello del bello e che non riesco a fare funzionare sqlite o sqlite3 perchè zeos dice che non gli piacciono. Poi non riesco ad installare sotto lazarus fortes report, non si compila per errori e quindi non si installa. L'unica consolazione che il programma con le tabelle DBF funziona mentre sotto mint13x64 le vede in sola lettura. Non sò cosa fare, sono interdetto.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 11, 2013, 12:51:18 am
Sotto win7 a me SqLite non da problemi ... ed è a 64 bit il sistema ... Non saprei.
Dovrei avere il progetto sotto mano e bastonarlo fintanto non compila ;)
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 11, 2013, 08:58:48 pm
per mandarti il progetto devo mettere insieme tutte le form e le unit  dalle varie directory dei mie progetti, lo farò al più presto. il problema sembrerebbe che ZConnection non riconosce le sqlite.dll e sqlite3.dll che ho scaricato dal sito ufficiale :
http://www.sqlite.org/download.html
e mi dà questo errore:
"sql error : library routine called out of sequence"
quindi non posso attivarlo.


Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 12, 2013, 08:27:31 pm
è vero che la maggior parte delle volte il manifestarsi di ERRORI è dovuto alla nostra distrazione. Sono impazzito due giorni, ho scariscato decine di sqlite.dll e sqlite3.dll poi ho scoperto che ZConnection mi segnalava l'errore: 
"sql error : library routine called out of sequence"
perchè non trovava il percorso del Database, infatti sviluppato il programma sotto linux, copiandolo sotto Windows, avrei dovuto cambiare subito il percorso del datatabase, le slash con backslash. Fatto questo funziona.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: nomorelogic - Aprile 13, 2013, 08:17:44 am
questi sono problemi con i quali ci si imbatte inevitabilmente quando si vuol fare qualcosa multipiattaforma
al posto di slash e backslash, usa: PathDelim
;)
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 23, 2013, 07:17:02 pm
PathDelim, grazie, ottimo suggerimento.
non riesco a capire, lancio una routine e mi dà errore, la rilancio senza modificare nulla e funziona, forse cè un bug in zeos 7.0.3?
la routine utilizza due datamoduli contenenti le stesse Ztable stessi nomi, stessi campi ma collegate a directory diverse, l'elaborazione viene fatta sulle tabelle di appoggio e i risultati vengono memorizzati sulle tabelle principali per poi stamparli. Queste routine con delphi4 e DBF funziona perfettamente e velocemente, con lazarus, zeos e sqlite3 e lenta e non senpre funziona.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 23, 2013, 08:15:43 pm
questo è l'errore che mi perseguita:
0 record(s) updated. Only one record should have been updated.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 23, 2013, 10:49:28 pm
Per le tabella di appoggio ... usi tabelle "in memory" o tabelle su disco?
Per il fatto che vengano aggiornati 0 record, non so se questo è un problema o meno ...
il db non ha trovato nulla da aggiornare ....
per queste operazioni batch l'uso dei dataaware non so se è il massimo ... ma poi sta a te decidere, personamente elaboro decine di record senza problemi di performance.
Codice: [Seleziona]
procedure TMainModel.RicreaCodici;

var
  statemnt, updateStatement: string;
  stmt: IZStatement;
  updStmt: IZPreparedStatement;
  rs: IZResultSet;
  numeroRecord: longint;
  node, aNode, root: TDOMElement;
  doc: TXMLDocument;
  indice, indiceIdRef: longint;
  rsMt: IZResultSetMetadata;

  function GetElementById(root: TDOMElement; id: integer): TDOMElement;
  var
    idx: integer;
  begin
    Result := nil;
    if root.GetAttribute('id') = TSystem.valueOf(id) then
      Result := root
    else
    begin
      idx := 0;
      while (idx < root.ChildNodes.Count) and isNull(Result) do
        Result := GetElementById(TDomElement(root.ChildNodes[postInc(idx)]), id);
    end;
  end;

  procedure InsertTree(stmt: IZPreparedStatement; root: TDOMElement);
  var
    idx: integer;
  begin
    for idx := 0 to root.ChildNodes.Count - 1 do
    begin
      try
        with TDOMElement(root.ChildNodes[idx]) do
        begin
          stmt.SetString(1, GetAttribute('id'));
          stmt.SetString(2, root.GetAttribute('id'));
          stmt.SetString(3, GetAttribute('codice'));
          stmt.SetString(4, GetAttribute('descrizione'));
          stmt.ExecutePrepared;
          InsertTree(updStmt, TDOMElement(root.ChildNodes[idx]));
        end;
      except
      end;
    end;
  end;

  function getCodiceElemento(root: TDOMElement): string;
  begin
    Result := root.GetAttribute('id');
    if isAssigned(root.ParentNode) then
      Result := getCodiceElemento(root.ParentNode as TDOMElement) + '.' + Result;
  end;

  procedure RicordificaTree(root: TDOMElement);
  var
    idx: integer;
    idx1, idx2: string;
  begin
    for idx := 1 to root.ChildNodes.Count do
    begin
      try
        idx1 := root.GetAttribute('id');
        if length(idx1) = 1 then
          idx1 := '0' + idx1;
        idx2 := TSystem.valueOf(idx);
        if idx < 10 then
          idx2 := '0' + idx2;

        TDOMElement(root.ChildNodes[idx - 1]).SetAttribute('id',
          TSystem.valueOf(TSystem.parseInt(idx1 + idx2)));

        TDOMElement(root.ChildNodes[idx - 1]).SetAttribute('codice', idx1 + '.' + idx2);

        TDOMElement(root.ChildNodes[idx - 1]).SetAttribute('idRef',
          root.GetAttribute('id'));
        RicordificaTree(TDOMElement(root.ChildNodes[idx - 1]));
      except
      end;
    end;
  end;

begin
  numeroRecord := getConteggioRighe('tabella');
  doc := TXMLDocument.Create;
  root := doc.CreateElement('root');
  root.SetAttribute('id', '0');
  doc.AppendChild(root);

  stmt := connessione.DbcConnection.CreateStatement;

  statemnt := defaultMapper.getItem('getTabellaByIndice');

  updateStatement := defaultMapper.getItem('insertRecord);
  updStmt := connessione.DbcConnection.PrepareStatement(updateStatement);

  try
    try
      rs := stmt.ExecuteQuery(statemnt);
      rsMt := rs.GetMetadata;
      indiceIdRef := -1;
      for indice := 1 to rsMt.GetColumnCount do
      begin
        if rsMt.GetColumnName(indice) = 'idRef' then
          indiceIdRef := indice;
      end;
      indice := 1;
      while rs.Next do
      begin
        node := doc.CreateElement('CAUSALE');
        node.SetAttribute('id', rs.GetStringByName('id'));
        node.SetAttribute('idRef', rs.GetStringByName('idRef'));
        node.SetAttribute('codice', rs.GetStringByName('codice'));
        node.SetAttribute('descrizione', rs.GetStringByName('descrizione'));
        aNode := GetElementById(doc.DocumentElement, rs.GetInt(indiceIdRef));
        if isNull(aNode) then
        begin
          aNode := root;
        end;
        aNode.AppendChild(node);
      end;
    except
      on e: Exception do
      begin
      end;
    end;
  finally
    rs := nil;
    stmt := nil;
  end;
  XMLWrite.WriteXMLFile(doc, 'file.xml');
  doc.Free;

  doc := TXMLDocument.Create;
  XMLRead.ReadXMLFile(doc, 'file.xml');
  try
    RicordificaTree(doc.DocumentElement);
    stmt.Execute('delete from tabella');
    stmt.Execute('update sqlite_sequence set seq=0');
    InsertTree(updStmt, doc.DocumentElement);
    stmt.Execute('update sqlite_sequence set seq=10000');

    XMLWrite.WriteXMLFile(doc, 'file.xml');
  except
  end;
  tabellaAware.Refresh;
  doc.Free;
end;

Questa è una mia routine che legge una tabella. La trasforma in un albero (XML per comodità di lettura su file).
Fa le trasformazioni che mi servono.
Pulisce la tabella, ripristina i contatori delle autokey e reinserisce tutto da zero.
Questo mi serve per evitare buchi logici.
Essendo un albero, quello che elaboro, c'è molta ricorsione tra i nodi.
Poi vedi tu cosa preferisci fare ;)
Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 01:53:52 am
appoggio i dati su tabelle su disco. Il codice che hai postato fa capire le tue conoscenze informatiche. Io non sono ai tuoi livelli. Ho iniziato agli inizi degli anni '80 col basic e poi sempre con linguaggi interpretati. Quello che si impara in gioventù ci segue nella vita. L'informatica non è la mia prima attività anche se miei programmi hanno girato, ai tempi del dos, in alcune pubbliche amministrazioni, con ottimi risultati.  Questo lo dico affinchè tu non denigri troppo il codice che allego. il mondo è cambiato, ora l'interfaccia è indipendente dalla gestione dei dati, due realtà autonome ma il programmatore deve avere coscenza di entrambe. ahime! io non conosco le istruzioni SQL nè l'assembler. il codice che allego serve a stampare il bilancio provvisorio di un'azienda ad una tale date. Come ho già detto i calcoli vengono fatti e scritti su disco su tabelle di appoggio, a calcolo ultimato i risultati vengono scritti su disco nella tabella principale e poi stampati. Ti sarei grato se tu riuscissi a evitarmi a tempi alterni:
0 record(s) updated. Only one record should have been updated.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 24, 2013, 02:00:16 am
Quale procedura da il problema?
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 02:18:00 am
a tempi alterni, non ho capito cosa non piace a zeos. Forse le routine sono troppo vecchie.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 02:22:04 am
ad occhio penso che il problema stia nello not.EOF e nel not.BOF che a secondo dei dati non viene intercettato, mi succedeva anche con delete che ho risolto con le istruzioni SQL.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 02:24:48 am
se ci fosse la possibilità di posizionarsi sulla line che ha causato l'errore al posto di aprire il debug assembler, che non capisco, forse riuscirei a dare una risposta.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Aprile 24, 2013, 09:24:51 am
Visto così errori macroscopici non ci sono.
Se vuoi il log delle attività, controlla tra i componenti di Zeos il Monitor.
Fa tutto in automatico (registrazione presso il driver manager e altre cosine).
Gli devi solo impostare il nome del file dove mettere il testo del logo e dirgli che è attivo all'inizio delle tue routine di calcolo, e lo disattivi alla fine.
Questo per focalizzare l'attenzione del log solo sulla parte in analisi.
.Active := true e .Active:=False nulla di difficile.

Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 10:57:56 pm
grazie, ho attivato il monitor e ho capito molte cose. Non dà più l'errore.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Aprile 24, 2013, 11:17:27 pm
l'errore non è nelle procedure ma nelle istruzioni all'interno del report - fortereport- ora devo cercare dove.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Maggio 02, 2013, 03:25:37 pm
il problema è risolto era un'istruzione all'interno del report. Fortes report è davvero forte! lo tradotto in italiano, a qualcuno può interessare?
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Legolas - Maggio 02, 2013, 03:55:17 pm
Come no? C'è il repository della community che mi sembra il posto ideale per una release della traduzione ;)
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Maggio 02, 2013, 04:43:44 pm
mi spieghi per favore come caricarlo nel repository della community, grazie.
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Maggio 02, 2013, 10:47:54 pm
Dovresti avere un utente sourceforge.
Se non lo hai, puoi mettere nel forum un file compresso ;)
Poi ci pensa Legolas a committare nel repository :D

Stilgar
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: antoniog - Maggio 03, 2013, 07:39:33 pm
file troppo grossi 536,6 kb, e 23,7 mb
Titolo: Re:problemi con sqlite 3 e zeos
Inserito da: Stilgar - Agosto 11, 2013, 02:09:04 pm
Ma hai dovuto mettere mano a tutti i sorgenti?
Al massimo puoi postare i file che hai toccato in modo da ottenere la "localizzazione" con un pacchetto più piccolo.

Stilgar
PS: Scusa il ritardo nella risposta.