Pesquisa em campos timestamp no firebir , e no delphi
como eu faço essa proc funcionar corretamete, do jeito que ela esta ai nao me retorna nada ,se eu tirar a clausula where ela retorna o problema esta no between ?
CREATE or ALTER PROCEDURE PRC_CONSULTA_CAIXA_PERIDO(
DataI timestamp ,DataF timestamp ) RETURNS
(
TIPO_LANCAMENTO VARCHAR (50) ,VL_LANCAMENTO NUMERIC (9,2),NR_MATRICULA INTEGER,USUARIO varchar (50),
VL_DESPEZA NUMERIC (18,2),VL_RECEITA numeric (18,2),VL_SALDO NUMERIC (18,2),fL_RECEITA smallint
)
AS
BEGIN for SELECT
B.DS_TIPO_LANCAMENTO,
A.VL_LANCAMENTO,
M.NR_MATRICULA,
D.nm_login ,
CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END as VL_DESPEZA,
CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END AS VL_RECEITA ,
CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END -CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END AS VL_SALDO,
B.fl_receita
FROM TB_MOVIMENTACAO_CAIXA A
INNER JOIN TB_TIPO_LANCAMENTO B ON (A.ID_TIPO_LANCAMENTO=B.ID_TIPO_LANCAMENTO)
INNER JOIN TB_ABERTURA_CAIXA C ON (A.ID_ABERTURA_CAIXA=C.ID_ABERTURA_CAIXA )
INNER JOIN TB_USUARIO D ON (A.id_usuario = D.ID_USUARIO)
inner join tb_motoqueiro m on (m.id_motoqueiro =a.id_motoqueiro)
WHERE (a.dt_lancamento between :datai and :dataf)
order by A.id_movimentacao_caixa desc
INTO
:TIPO_LANCAMENTO ,:VL_LANCAMENTO ,:NR_MATRICULA ,:USUARIO , :VL_DESPEZA ,:VL_RECEITA ,:VL_SALDO ,:fl_receita
DO
begin
suspend ;
end
END outra coisa e la no delphi como eu vou fazer a pesquisa
with ds.DataSet do
begin
close;
tclientdataset(ds.DataSet).Params[0].AsDate := dtpI.Date;
tclientdataset(ds.DataSet).Params[1].AsDate := dtpF.Date + 1;
// tclientdataset(ds.DataSet).Params[0].AsDate:= StrToDate('11/03/2010') ;
// tclientdataset(ds.DataSet).Params[1].AsDate := StrToDate('11/03/2010')+1 ;
Open;
lblTotal.Caption := IntToStr(ds.DataSet.RecordCount);
DBGrid1.SetFocus; end;
DataI timestamp ,DataF timestamp ) RETURNS
(
TIPO_LANCAMENTO VARCHAR (50) ,VL_LANCAMENTO NUMERIC (9,2),NR_MATRICULA INTEGER,USUARIO varchar (50),
VL_DESPEZA NUMERIC (18,2),VL_RECEITA numeric (18,2),VL_SALDO NUMERIC (18,2),fL_RECEITA smallint
)
AS
BEGIN for SELECT
B.DS_TIPO_LANCAMENTO,
A.VL_LANCAMENTO,
M.NR_MATRICULA,
D.nm_login ,
CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END as VL_DESPEZA,
CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END AS VL_RECEITA ,
CASE B.Fl_Receita WHEN 1 THEN A.VL_LANCAMENTO ELSE 0 END -CASE B.Fl_Receita WHEN 1 THEN 0 ELSE A.VL_LANCAMENTO END AS VL_SALDO,
B.fl_receita
FROM TB_MOVIMENTACAO_CAIXA A
INNER JOIN TB_TIPO_LANCAMENTO B ON (A.ID_TIPO_LANCAMENTO=B.ID_TIPO_LANCAMENTO)
INNER JOIN TB_ABERTURA_CAIXA C ON (A.ID_ABERTURA_CAIXA=C.ID_ABERTURA_CAIXA )
INNER JOIN TB_USUARIO D ON (A.id_usuario = D.ID_USUARIO)
inner join tb_motoqueiro m on (m.id_motoqueiro =a.id_motoqueiro)
WHERE (a.dt_lancamento between :datai and :dataf)
order by A.id_movimentacao_caixa desc
INTO
:TIPO_LANCAMENTO ,:VL_LANCAMENTO ,:NR_MATRICULA ,:USUARIO , :VL_DESPEZA ,:VL_RECEITA ,:VL_SALDO ,:fl_receita
DO
begin
suspend ;
end
END outra coisa e la no delphi como eu vou fazer a pesquisa
with ds.DataSet do
begin
close;
tclientdataset(ds.DataSet).Params[0].AsDate := dtpI.Date;
tclientdataset(ds.DataSet).Params[1].AsDate := dtpF.Date + 1;
// tclientdataset(ds.DataSet).Params[0].AsDate:= StrToDate('11/03/2010') ;
// tclientdataset(ds.DataSet).Params[1].AsDate := StrToDate('11/03/2010')+1 ;
Open;
lblTotal.Caption := IntToStr(ds.DataSet.RecordCount);
DBGrid1.SetFocus; end;
Carlos Faria
Curtidas 0
Respostas
Rodrigo Mourão
11/03/2010
Olá Carlos,
Bem a principio seu select esta correto so nao ha necessidade se colocar os parenteses mas nao tem nada haver. O Problema pode esta na hora de passar os parametros para o firebird.
AS inves de passar como .asDate Passa como .AsString e teste.
Att,
Bem a principio seu select esta correto so nao ha necessidade se colocar os parenteses mas nao tem nada haver. O Problema pode esta na hora de passar os parametros para o firebird.
AS inves de passar como .asDate Passa como .AsString e teste.
Att,
GOSTEI 0
Carlos Faria
11/03/2010
So fazendo uma retificacao aqui , essa proc ta funcionando o problema esta nao clausula where , onde eu nao sei muito trabalhar com o firebir
Eu preciso fazer um filtro entre exemplo 05/03/20
tem que ser entre (05/03/2010 00:00:00 ) e (05/03/2010 23:59:59)
la no sqlserver eu fazia simplesmente o seguinto
Proc_x
(@dataI smalldatetime , @dataf smalldatetime )
as
select table ......
where campo beween (@datai) and (@dataf)
so isso aqui ja me bastava ..
no delphii eu adiconava dois componentes tdatetime pricture e ficaria assim
cds.close ;
cds.params[0].asstring := formatdatetime('yyyy-mm-dd 00:00:00',dtpI.date) ;
cds.params[1].asstring := formatdatetime('yyyy-mm-dd 23:59:59',dtpf.date) ;
cds.open
pronto 100% perfeito e funcional , porem no firebird parece que isso muda e nao se faz assim
fico no aguardo
GOSTEI 0
Rodrigo Mourão
11/03/2010
Entao, como eu falei abaixo: Tente passar como string, da mesma forma. A data no FireBird e igual no SqlServer yyyy-mm-dd
Att,
Att,
GOSTEI 0
Carlos Faria
11/03/2010
Rapaz agente respondeu simultaneamente rs
bom eu ja tentei parece que nao funciona ,eu fiz exatamente como fazia no sql , declarei os parametros do tipo string o problema e qual o formato no firebird
como ficaria o
Cdsparamas[0].asstring := formatdatetime (---------------,datetimepicture.date) ;
talves esteja aqui o problema
GOSTEI 0
Carlos Faria
11/03/2010
funcionou perfeitamento agora
so nao entendi pq la no firebird direto ele nao me da o retorno
select * from PRC_CONSULTA_CAIXA_PERIDO (:datai,:dataf)
executei esse select acima e nao me trouxe nada no firebird ,pq ?
essa mesma proc no delphi ja trouxe os resultados !
GOSTEI 0
Rodrigo Mourão
11/03/2010
Bem pode ser problema em como esta passando a data no IBexpert. Passe como 2010-03-01 por exemplo. MAs no Delphi esta correto ???
Att,
Att,
GOSTEI 0
Carlos Faria
11/03/2010
Ok no chamado , grande Rodrigo !
GOSTEI 0