Consulta por Data banco firebird

Delphi

29/08/2009

Me chamo Flávio e eu estou começando a programanhar em delphi ja estou nessa estrada a dois anos apenas, e tenho esbarrado com algumas dificuldades pelo fato de nao ter curso e tal. Entao estou desenvolvendo um sistema de controle de documentos com banco do dados em firebird. E eu estou tentando fazer uma consulta por data aonde estou esbrarrando com a seguinte dificuldade. quando clico no pesquisar ele nao me retorna nenhum valor no dbgrid.

Estrutura: No meu datamodule tenho 4 componentes

1-TSQLQuery
1-ClienteDataSet
1-DataSetProvider
1-DataSource

TSQLQuery ligado ao meu TSQLConnection
ClientDataSet ligado ao DataSetProvider
DataSetProvider ligado ao TSQLQuery
DataSource Ligado ao ClientDataSet

Na minha aplicação o codigo esta como descrito abaixo.

Função do botao.

begin

dmprincipal.SQLQuery1.Close;
dmprincipal.SQLQuery1.SQL.Clear;
dmprincipal.SQLQuery1.SQL.Add (´select * from TB_SIGEM´);
dmprincipal.SQLQuery1.SQL.Add(´ where MODIFICADO between ´ + ´´´´ + Maskedit1.Text + ´´´´ + ´and´ + ´´´´+ Maskedit2.Text + ´´´´);
dmprincipal.SQLQuery1.Open;
end;

sendo q a minha data nao esta convertida como dd-mm-yyyy se vc puder me dizer como faço para converter ficarei grato.

Desde ja agreço a ajuda.


Fcorrea82

Fcorrea82

Curtidas 0

Respostas

Osocram

Osocram

29/08/2009

vai ter que converter ´yyyy-mm-dd´


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/08/2009

sugiro a você NÃO concatenar datas, a fim de evitar a necessidade de conversão. faça o envio dos valores através de parâmetros.

algo assim:

begin

  with dmprincipal.ClientDataset1 do
  begin
    Close;
    CommandText := 
      ´select * from TB_SIGEM ´+
      ´where MODIFICADO between :dataini and :datafim´;
    Params[0].AsSQLTimeStamp := DateTimeToSQLTimeStamp(StrToDate(Maskedit1.Text));
    Params[1].AsSQLTimeStamp := DateTimeToSQLTimeStamp(StrToDate(Maskedit2.Text));
    Open;
  end;
end;


para poder alterar o commandtext do ClientDataset, modifique a propriedade Options do DatasetProvider de modo a ficar com poAllowCommandText = True.

para utilizar a função DateTimeToSQLTimeStamp inclua a unit SQLTimSt na cláusula uses.


GOSTEI 0
Vitor Rubio

Vitor Rubio

29/08/2009

Só um palpite: além de usar a propriedade commandtext do clientdataset você também pode usar a propriedade sql do sqlquery, ou a propriedade commandtext do sqldataset.

Se você for trabalhar com multi camadas eu aconselho a usar sqldataset e usar a propriedade commandtext dele e não do CDS.

Outra dica interessante, visualmente, é quando você usar filtros por datas, usar o TDateTimePicker. Ele mostra aquele calendariozinho para o usuario escolher a data se ele não quiser digitar, e se ele quiser o DateTimePicker já tem o formato de data correto. Alem disso ele te retorna uma data no formato TDateTime sem a necessidade de conversão.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/08/2009

vitor...

no caso de programação n-camadas eu também recomendo usar sqldataset, mas no caso do commandtext, sugiro exatamente o contrário do que você recomendou.


GOSTEI 0
Vitor Rubio

Vitor Rubio

29/08/2009

Eu acho que tudo depende de ocasião e arquitetura.
Usar o commnadtext do CDS usando n-Tier você força a camada cliente, (de apresentação) a saber montar sql´s dependendo da ocasião e ainda perde alguns recursos do CDS.

Um dos problemas era esse, de quebrar o conceito de ´Regras de negócio apneas no servidor´.

Tinha um outro problema que eu vi no NDDV, mas não consigo me lembrar. Deu branco, não consigo lembrar se tinha a ver com performance, transações.... ou se era o packet records que para de funcionar...

Mas, como eu disse, depende muito do problema. Eu também uso, as vezes.


GOSTEI 0
POSTAR