Consulta por Data banco firebird
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.
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
Curtidas 0
Respostas
Osocram
29/08/2009
vai ter que converter ´yyyy-mm-dd´
GOSTEI 0
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:
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.
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
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.
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
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.
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
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.
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