22 julho 2008

[REPORT BUILDER] Como usar um mesmo filtro duas vezes?

Se você está utilizando o Report Builder você quer utilizar um período num filtro, e seus registros devem estar dentro desse período, mas deve trazer registros anteriores a esse período também em alguns casos, o que fazer? O problema que eu tive foi num Extrato Bancário. Eu precisava trazer todos os débitos e créditos dentro de um período, mas precisava trazer também os débitos/créditos que ainda não foram conciliados até esse período. A solução que eu encontrei foi:

1- Criar um evento no OnCreate do relatório chamando uma procedure para preencher uma tabela ja com os filtros necessários

var
INICIO,FIM,VSQL, FILTRO2:string;
begin
PERIODO := Report.AutoSearchCriteriaByName('NOMEDODATASET', 'CAMPO_PERÍODO').SearchExpression;
FILTRO2 := Report.AutoSearchCriteriaByName('NOMEDODATASET', 'CAMPO_FILTRO2').SearchExpression;
DATA_FIM := StrToDate(Copy(PERIODO, 12, 10));
INICIO := Copy(PERIODO, 1, 10);
FIM := Copy(PERIODO, 12, 10);
CamposREL := TStringList.Create;
CamposREL.add('CAMPO');
VSQL:= ('DECLARE @DATAINI DATETIME ,@DATAFIM DATETIME, @OUTRO_FILTRO INT SET @DATAINI = CONVERT(DATETIME,'''+INICIO+''',103)SET @DATAFIM = CONVERT(DATETIME,'''+FIM+''',103)SET @OUTRO_FILTRO = CONVERT(INT,'+FILTRO2+',1) execute XXX_PROCEDURE_FILTRO_SP @DATAINI,@DATAFIM, @OUTRO_FILTRO select 1 as CAMPO');
execsql(Report, VSQL, CamposREL, false);
end;


2- Criar a tabela a ser preenchida com todos os campos necessários para sua projeção

3- Criar a procedure para preencher a tabela. Abaixo tem um exemplo de uma procedure simples que deleta a tabela, e preenche com o novo filtro.

CREATE PROCEDURE dbo.XXX_PROCEDURE_FILTRO_SP
( @DATA_INICIO DATETIME, @DATA_FIM DATETIME, @FILTRO2 INT )
AS BEGIN
DELETE FROM XXX_TABELA
INSERT INTO XXX_TABELA
(CAMPO1,CAMPO2,CAMPO3,CAMPOX,DATA_EMISSAO,DATA_PAGAMENTO)
SELECT
CAMPO1,
CAMPO2,
CAMPO3,
CAMPOX,
DATA_EMISSAO,
DATA_PAGAMENTO
FROM
XXX_TABELA
WHERE
((DATA_EMISSAO BETWEEN @DATA_INICIO AND @DATA_FIM) OR
((DATA_PAGAMENTO > @DATA_FIM or DATA_PAGAMENTO is null) AND
(DATA_EMISSAO < @DATA_INICIO))) AND (CAMPOX = @FILTRO2
END)

4- Fazer o relatório com essa tabela ja filtrada como dataset principal

1 comentários:

Anônimo disse...

Ótimo poster, Eu queria saber como faço para criar estes filtros dentro do próprio relatório via código Pascal que é a linguagem do Report Builder.
Email: adao_lucas_2020@hotmail.com