Relatorio com duas datas
Boa Tarde!
Estou criando um relatório de funcionários porem preciso adicionar um filtro entre as datas de cadastro, então criei uma tela onde a pessoa informa em dois datepicker a data inicial e final. Porem preciso de ajuda para criar o select, como eu posso o colocar o valores do datepicker dentro do where do select?
Estou usando bd SQL Server.
Estou criando um relatório de funcionários porem preciso adicionar um filtro entre as datas de cadastro, então criei uma tela onde a pessoa informa em dois datepicker a data inicial e final. Porem preciso de ajuda para criar o select, como eu posso o colocar o valores do datepicker dentro do where do select?
Estou usando bd SQL Server.
Deivid Costa
Curtidas 0
Respostas
Marcos Saffran
24/04/2014
Boa tarde,
tente o seguinte:
' where (mensagens.data between ' +
QuotedStr(FormatDateTime('yyyy-mm-dd', dtpInicio.Date)) +
' and ' +
QuotedStr(FormatDateTime('yyyy-mm-dd', dtpTermino.Date))
tente o seguinte:
' where (mensagens.data between ' +
QuotedStr(FormatDateTime('yyyy-mm-dd', dtpInicio.Date)) +
' and ' +
QuotedStr(FormatDateTime('yyyy-mm-dd', dtpTermino.Date))
GOSTEI 0
Marisiana Battistella
24/04/2014
Boa tarde!
Para incluir no select você pode passar as datas através de variáveis (uma para cada data) na query que executa o select que busca os dados para o relatório.
Eu já fiz isso utilizando o Oracle.
Para incluir no select você pode passar as datas através de variáveis (uma para cada data) na query que executa o select que busca os dados para o relatório.
Eu já fiz isso utilizando o Oracle.
GOSTEI 0
Ricardo
24/04/2014
Passa as datas por parâmetro.
Fiquei com preguiça de digitar, então resolvi copiar e colar parte do código de um software meu. Basta você substituir os campos e nomes de componentes pelos seus.
var
Data1,Data2 : string;
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido. A data inicial não pode ser posterior a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
Data1 := DateToStr(DateTimePicker1.Date);
Data2 := DateToStr(DateTimePicker2.Date);
With <Sua Query ou outro componente> do
begin
Close;
SQL.Clear;
SQL.Text := 'SELECT * FROM <sua tabela> WHERE campo da tabela >= :pData1 AND campo da tabela <= :pData2 ';
Parameters.ParamByName('pData1').Value := StrToDate(Data1);
Parameters.ParamByName('pData2').Value := StrToDate(Data2);
Prepared;
Open;
end;
end;
end;
Fiquei com preguiça de digitar, então resolvi copiar e colar parte do código de um software meu. Basta você substituir os campos e nomes de componentes pelos seus.
var
Data1,Data2 : string;
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido. A data inicial não pode ser posterior a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
Data1 := DateToStr(DateTimePicker1.Date);
Data2 := DateToStr(DateTimePicker2.Date);
With <Sua Query ou outro componente> do
begin
Close;
SQL.Clear;
SQL.Text := 'SELECT * FROM <sua tabela> WHERE campo da tabela >= :pData1 AND campo da tabela <= :pData2 ';
Parameters.ParamByName('pData1').Value := StrToDate(Data1);
Parameters.ParamByName('pData2').Value := StrToDate(Data2);
Prepared;
Open;
end;
end;
end;
GOSTEI 0
Deivid Costa
24/04/2014
Pessoal eu fiz dessa maneira:
Não ocorreu nenhum erro porem o relatório não traz nada.
Esse codigo esta no evento preview do relatorio.
var dt_inicial,dt_final : String; begin dt_inicial:= DateToStr(frm_filtro.dateTimePicker1.Date); dt_final:= DateToStr(frm_filtro.dateTimePicker2.Date); frm_relatorio.ADOQuery1.Close; frm_relatorio.ADOQuery1.SQL.Clear; frm_relatorio.ADOQuery1.SQL.Add('SET DATEFORMAT dmy'); frm_relatorio.ADOQuery1.SQL.Add('SELECT * FROM pessoa WHERE DATA_CADASTRO >= :dt_ini AND DATA_CADASTRO <= :dt_fin'); frm_relatorio.ADOQuery1.Parameters.ParamByName('dt_ini').Value := dt_inicial; frm_relatorio.ADOQuery1.Parameters.ParamByName('dt_fin').Value := dt_final; frm_relatorio.ADOQuery1.ExecSQL; end;
Não ocorreu nenhum erro porem o relatório não traz nada.
Esse codigo esta no evento preview do relatorio.
GOSTEI 0
Ricardo
24/04/2014
Que ferramenta você esta usando para criar o relatório?
O código que te passei funciona perfeitamente e estive olhando este seu e também está ok. Porém seria mais viável você carregar o resultado dessa consulta em uma tabela temporária por exemplo, em um dbgrid, em um listview etc.. e a partir desses você envia para o relatório.
O código que te passei funciona perfeitamente e estive olhando este seu e também está ok. Porém seria mais viável você carregar o resultado dessa consulta em uma tabela temporária por exemplo, em um dbgrid, em um listview etc.. e a partir desses você envia para o relatório.
GOSTEI 0
Deivid Costa
24/04/2014
Que ferramenta você esta usando para criar o relatório?
O código que te passei funciona perfeitamente e estive olhando este seu e também está ok. Porém seria mais viável você carregar o resultado dessa consulta em uma tabela temporária por exemplo, em um dbgrid, em um listview etc.. e a partir desses você envia para o relatório.
O código que te passei funciona perfeitamente e estive olhando este seu e também está ok. Porém seria mais viável você carregar o resultado dessa consulta em uma tabela temporária por exemplo, em um dbgrid, em um listview etc.. e a partir desses você envia para o relatório.
Estou usando QuickReport Delphi XE4.
GOSTEI 0
Ricardo
24/04/2014
Tenta fazer como eu falei; carregar o resultado da consulta em algum lugar e depois enviá-los para o relatório. Deste jeito aí que vc está fazendo eu nunca fiz. Na lógica parece dar certo, mas na execução pode não dar.
Dessa forma aí vc eta fazendo o relatório buscar os dados e ele tem é que receber tais informações.
Dessa forma aí vc eta fazendo o relatório buscar os dados e ele tem é que receber tais informações.
GOSTEI 0
Deivid Costa
24/04/2014
Pessoa consegui fazer dessa maneira:
Porem ocorre um problema se eu colocar a mesma data nos 2 DateTimePicker o sistema não retorna nada.
Alguém pode me ajudar?
begin with frm_relatorio.ADOQuery1 do begin Close; SQL.Clear; SQL.Add('SELECT * from pessoa WHERE DATA_CADASTRO between :DataIni and :DataFim ORDER BY DATA_CADASTRO'); Parameters.ParamByName('DataIni').Value := DateTimePicker1.DateTime; Parameters.ParamByName('DataFim').Value :=DateTimePicker2.DateTime; Open; if IsEmpty then begin ShowMessage('Nenhuma informação localizada.'); Exit; end; end; frm_relatorio.QuickRep1.Preview; end;
Porem ocorre um problema se eu colocar a mesma data nos 2 DateTimePicker o sistema não retorna nada.
Alguém pode me ajudar?
GOSTEI 0
Cauê Nishijima
24/04/2014
Zera a propriedade TIME dos dois DateTimePicker e tenta....
GOSTEI 0
Deivid Costa
24/04/2014
Zera a propriedade TIME dos dois DateTimePicker e tenta....
Vou tentar, vlw
GOSTEI 0
Jose Santos
24/04/2014
Você seguindo esse codigo exemplo e colocando certinho com o seu banco vai conceguir
SELECT * FROM nometabela WHERE campocomadata BETWEEN '$dataInicio' AND '$datafim'
GOSTEI 0
Valsistemasdelphi
24/04/2014
Iae pessoal.. Estou com o mesmo problema a meses que tento achar uma forma de visualizar uma datainicial e uma data final em dois TDateTimePicker...eu Uso Ibtable
GOSTEI 0
Valsistemasdelphi
24/04/2014
Iae pessoal.. Estou com o mesmo problema a meses que tento achar uma forma de visualizar um relatório de vendas aqui no sistema que estou desenvolvendo e nada consegui até agora. uma datainicial e uma data final em dois TDateTimePicker...eu Uso Ibtable
GOSTEI 0
Raimundo Pereira
24/04/2014
Brother se puder envie-me cópia do projeto e bd, realizo a rotina e lhe envio de volta.
rcp@outlook.com.br
rcp@outlook.com.br
GOSTEI 0
Deivid Costa
24/04/2014
Opa, galera consegui resolver o problema da seguinte maneira:
Obrigado pela ajuda de todos.
With QryDados do begin Close; SQL.Clear; SQL.Add(SELECT TABELA WHERE DATA Between :pDataIni and :pDataFim); ParamByName('pDataIni').AsDateTime := DateTimePickerIni.DateTime; ParamByName('pDataFim').AsDateTime := DateTimePickerFim.DateTime; Open; end
Obrigado pela ajuda de todos.
GOSTEI 0