Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: nicola.nicoletti - Febbraio 04, 2013, 01:15:58 pm

Titolo: [Risolto ]Problema con locate del tsqlquery
Inserito da: nicola.nicoletti - Febbraio 04, 2013, 01:15:58 pm
Ciao Ragazzi
Io uso lazarus 1.04 , fpc 2.6 su piattaforma intel con windows xp.
Ho fatto una applicazione che copia in memoria una tabella sqlite e cerca di dati utilizzando la locate su tsqlquery.
Purtroppo la mia applicazione trova la riga sbagliate nel db, quelle che iniziano per la stringa anche se non uso la opzione loPartialKey

ho allegato il db sqlite .
Invece una unit di test come esempio è

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, sqlite3conn, sqldb, db, FileUtil, Forms, Controls,
  Graphics, Dialogs, DBGrids, StdCtrls, DbCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Datasource1: TDatasource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    SQLite3Connection1: TSQLite3Connection;
    SQLQuery1: TSQLQuery;
    SQLTransaction1: TSQLTransaction;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin

  SQLQuery1.Locate('cod_age','FA0160',[]);

 ShowMessage(IntToStr(SQLQuery1.RecNo));

end;

end.


L'applicazione di prova ritorna 21 ma la corretta è 823

Qualcuno può darmi una mano
grazie


Titolo: Re:Problema con locate del tsqlquery
Inserito da: nicola.nicoletti - Febbraio 04, 2013, 02:07:40 pm
ho sherato tutta la applicazione via drop box

https://dl.dropbox.com/u/64726031/test%20sqlite.zip

se vi può essere utile
Titolo: Re:Problema con locate del tsqlquery
Inserito da: nomorelogic - Febbraio 04, 2013, 03:18:34 pm
ciao nicola
volevo chiederti di fare una prova:
il metodo Locate è in realtà una funzione quindi dovresti scrivere:
Codice: [Seleziona]
if  SQLQuery1.Locate('cod_age','FA0160',[]) then
   ShowMessage(IntToStr(SQLQuery1.RecNo))
else
   ShowMessage('not found!');

credo infatti che più che di chiave parziale si tratti di chiave non trovata.
Facci sapere.

Poi un altro consiglio ;)
Locate in realtà non esegue solo una ricerca ma: sposta il cursore del dataset, valorizza tutti i campi persistenti e ricalcola quelli calcolati.
Nei dataset con pochi record e pochi campi calcolati non si percepisce (in termini di tempo) alcun ritardo ma se ci sono molti record e/o molti campi calcolati il programma ne potrebbe risentire pesantemente.
Se non si necessita dello spostamento del cursore e di tutto quello che ne consegue il consiglio è quello di usare Lookup che: dopo aver cercato la chiave, ritorna esclusivamente i campi di cui hai bisogno senza spostare il cursore.
Titolo: Re:Problema con locate del tsqlquery
Inserito da: xinyiman - Febbraio 04, 2013, 03:21:39 pm
ciao nicola
volevo chiederti di fare una prova:
il metodo Locate è in realtà una funzione quindi dovresti scrivere:
Codice: [Seleziona]
if  SQLQuery1.Locate('cod_age','FA0160',[]) then
   ShowMessage(IntToStr(SQLQuery1.RecNo))
else
   ShowMessage('not found!');

credo infatti che più che di chiave parziale si tratti di chiave non trovata.
Facci sapere.

Poi un altro consiglio ;)
Locate in realtà non esegue solo una ricerca ma: sposta il cursore del dataset, valorizza tutti i campi persistenti e ricalcola quelli calcolati.
Nei dataset con pochi record e pochi campi calcolati non si percepisce (in termini di tempo) alcun ritardo ma se ci sono molti record e/o molti campi calcolati il programma ne potrebbe risentire pesantemente.
Se non si necessita dello spostamento del cursore e di tutto quello che ne consegue il consiglio è quello di usare Lookup che: dopo aver cercato la chiave, ritorna esclusivamente i campi di cui hai bisogno senza spostare il cursore.

Nomore mi hai anticipato di alcuni minuti.
Titolo: Re:Problema con locate del tsqlquery
Inserito da: nomorelogic - Febbraio 04, 2013, 03:24:37 pm
Nomore mi hai anticipato di alcuni minuti.

oggi sono già a 4 caffè.... :D
Titolo: Re:Problema con locate del tsqlquery
Inserito da: xinyiman - Febbraio 04, 2013, 03:27:08 pm
Nomore mi hai anticipato di alcuni minuti.

oggi sono già a 4 caffè.... :D
Hahahahaha
Titolo: Re:Problema con locate del tsqlquery
Inserito da: Stilgar - Febbraio 04, 2013, 04:12:46 pm
Cribbio ... ma voi dove siete?
I post segnano le 5 ... e io ho l'orologio alle 4 ... cavolo ... ritorno al futuro O.o
Titolo: Re:Problema con locate del tsqlquery
Inserito da: xinyiman - Febbraio 04, 2013, 04:15:16 pm
Cribbio ... ma voi dove siete?
I post segnano le 5 ... e io ho l'orologio alle 4 ... cavolo ... ritorno al futuro O.o

a me segna le 3 nei miei vecchi post
Titolo: Re:Problema con locate del tsqlquery
Inserito da: nomorelogic - Febbraio 04, 2013, 04:19:07 pm
Cribbio ... ma voi dove siete?
I post segnano le 5 ... e io ho l'orologio alle 4 ... cavolo ... ritorno al futuro O.o

a me segna le 3 nei miei vecchi post

pure a me: 3 pm
Titolo: Re:Problema con locate del tsqlquery
Inserito da: Stilgar - Febbraio 04, 2013, 04:53:53 pm
 nomorelogic

    Global Moderator
    Hero Member
    *****
 Re:Problema con locate del tsqlquery
« Risposta #8 il: Oggi alle 06:19:07 pm »

Fò copia e incolla..
Titolo: Re:Problema con locate del tsqlquery
Inserito da: nomorelogic - Febbraio 04, 2013, 04:57:56 pm
nomorelogic

    Global Moderator
    Hero Member
    *****
    Post: 635

Re:Problema con locate del tsqlquery
« Risposta #8 il: Oggi alle 04:19:07 pm »


questo è il mio copia/incolla


Edit:
ma che sei in vpn con Cipro? :D
Titolo: [Solved] Re:Problema con locate del tsqlquery
Inserito da: nicola.nicoletti - Febbraio 04, 2013, 04:59:15 pm
E' stato risolto
Il problema sta nel fatto che quando ho dichiarato nel sqlite il cod_age , su cui faccio la ricerca , come una char(5) poi quando ho caricato il db era un char(6) ,  sqlite lite (managgia a lui )  me lo ha fatto caricare.
Quindi cambiando la lunghezza di uno ora funziona.
Titolo: Re:[Solved] Re:Problema con locate del tsqlquery
Inserito da: nomorelogic - Febbraio 04, 2013, 05:02:52 pm
Il problema sta nel fatto che quando ho dichiarato nel sqlite il cod_age , su cui faccio la ricerca , come una char(5) poi quando ho caricato il db era un char(6) ,  sqlite lite (managgia a lui )  me lo ha fatto caricare.

i char quando posso li evito...
ogni volta che ci ho a che fare c'è sempre un problema di trim che mi fa perdere tempo :)
vai di varchar ;)