Quando o relatório é executado, o mecanismo de execução vai gerar duas sentenças sql’s dinamicamente baseadas nas configurações das bandas e controles. Nesse caso serão geradas duas sentenças sql. Primeira sentença: Relacionada a banda pai; SELECT PFUNC.CODCOLIGADA, PFUNC.CHAPA, PFUNC.SALARIO, ABATFUN.DATA FROM PFUNC LEFT OUTER JOIN ABATFUN (NOLOCK) ON (PFUNC.CODCOLIGADA = ABATFUN.CODCOLIGADA AND PFUNC.CHAPA = ABATFUN.CHAPA) WHERE PFUNC.CODCOLIGADA = 1 AND ABATFUN.DATA < :DATAATUAL Aviso |
---|
| Nada muda em relação à query que será executada depois da melhoria. |
Segunda sentença: Relacionada a banda filha; SELECT PFDEPEND.CODCOLIGADA, PFDEPENDE.NOME FROM PFDEPEND INNER JOIN PFUNC (NOLOCK) ON (PFUNC.CODCOLIGADA = PFDEPEND.CODCOLIGADA AND PFUNC.CHAPA = PFDEPEND.CHAPA) LEFT OUTER JOIN ABATFUN (NOLOCK) ON (PFUNC.CODCOLIGADA = ABATFUN.CODCOLIGADA AND PFUNC.CHAPA = ABATFUN.CHAPA) WHERE PFUNC.CODCOLIGADA = 1 AND ABATFUN.DATA < :DATAATUAL
Neste cenário, a primeira sql, ao ser executada, retornará dados repetidos para o funcionário, visto que, existirá várias batidas para um único funcionário. Isso gera o que chamamos de "produto cartesiano". A query de dependentes retornará os dependentes ligados ao funcionário que possua batidas < que "DATAATUAL", gerando também, produto cartesiano para os dependentes.Sendo assim, ao gerar o relatório, na banda de dependentes, aparecerá vários dependentes repetidos de acordo com as batidas de um determinado funcionário.
|