Inquiridor
Gerar relatorio criando um periodo de data atraves do parametro

Pergunta
-
Boa tarde pessoal estou com um impasse para criar um novo relatório, busco informação em uma tabela de pedidos quais os pedidos que estão em aberto a partir da data atual buscando automaticamente 60 dias que configurei nas propriedades do parâmetro e com isso está me trazendo as informações, porém o encarregado não quer que eu mostre somente as datas que tem pedido em aberto no banco ele precisa que eu mostre todos os dias mesmo não tendo pedido em aberto mas não sei como fazer na hora da geração para que o reporting gere as linhas com as datas que não tenho informação no banco.
Alguém poderia me dar uma ajuda?
Todas as Respostas
-
Você pode utilizar a CTE abaixo e realizar um Left Join com a sua tabela de pedidos.
DECLARE @DTINI DATE = '20160801' DECLARE @DTFIM DATE = '20160830'; WITH CTE (DATA,CONT) AS ( SELECT CONVERT(CHAR,@DTINI,112) AS DATA, 1 AS CONT UNION ALL SELECT CONVERT(CHAR,DATEADD(DD,CONT,@DTINI),112) AS DATA, CONT+1 AS CONT FROM CTE WHERE DATA < @DTFIM ) SELECT CTE.DATA, PED.* FROM CTE LEFT JOIN PEDIDOS PED ON PED.DATA = CTE.DATA
No caso você precisará tratar as funções de agregação necessárias de acordo com a estrutura da sua tabela de pedidos, mas a ideia geral é essa.
Caso tenha algum problema em montar a query final posta a estrutura dessa tabela de pedidos que poderemos te ajudar de forma mais eficiente.
abraço!
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
-
Boa tarde Kanaãm
Minha Query de consulta as tabelas está da seguinte forma:
SELECT pv0131.status_pv0131, pv0130.dt_fatur_pv0130, pv0131.num_ped_pv0131, pv0131.cod_prod_pv0131, pv0131.qtde_prod_pv0131, pv0131.qt_estoque_pv0131, pr5030.descr_abrev_pr5030,
sa5030.desc_sa5030, pr5033.est_ini_pr5033, pr5033.est_fis_pr5033, pr5033.campo3_pr5033, pr5033.pto_req_pr5033, pr5033.tempo_repos_pr5033
FROM pv0131 INNER JOIN
pv0130 ON pv0131.num_ped_pv0131 = pv0130.num_ped_pv0130 INNER JOIN
pr5030 ON pv0131.cod_prod_pv0131 = pr5030.cod_prd_pr5030 INNER JOIN
sa5030 ON pr5030.sales_group_pr5030 = sa5030.cod_sa5030 INNER JOIN
pr5033 ON pv0131.cod_prod_pv0131 = pr5033.cod_prd_pr5033
WHERE (pv0130.dt_fatur_pv0130 >= @Data_Incial) AND (pv0130.dt_fatur_pv0130 <= @Data_Final) AND (pv0131.status_pv0131 = '0')Aonde as tabelas PV0130 e PV0131 estão relacionadas aos pedidos, as tabelas PR5030 e SA5030 são do cadastro dos produtos e a PR5033 são os dados de estoque dos produtos.
Os parâmetros estão da seguinte forma para ficar automatizado:
@Data_Inicial "=Today()"
@Data_Final "=DateAdd("d",60,today())"
-
Acho que seria algo mais ou menos assim:
WITH CTE (DATA,CONT) AS ( SELECT CONVERT(CHAR,@Data_Incial,112) AS DATA, 1 AS CONT UNION ALL SELECT CONVERT(CHAR,DATEADD(DD,CONT,@Data_Incial),112) AS DATA, CONT+1 AS CONT FROM CTE WHERE DATA < @Data_Final ) SELECT ISNULL(pv0131.status_pv0131,'') status_pv0131, ISNULL(pv0130.dt_fatur_pv0130,'') dt_fatur_pv0130, ISNULL(pv0131.num_ped_pv0131,'') num_ped_pv0131, ISNULL(pv0131.cod_prod_pv0131,'') cod_prod_pv0131, ISNULL(pv0131.qtde_prod_pv0131,'') qtde_prod_pv0131, ISNULL(pv0131.qt_estoque_pv0131,'') qt_estoque_pv0131, ISNULL(pr5030.descr_abrev_pr5030,'') descr_abrev_pr5030, ISNULL(sa5030.desc_sa5030,'') desc_sa5030, ISNULL(pr5033.est_ini_pr5033,'') est_ini_pr5033, ISNULL(pr5033.est_fis_pr5033,'') est_fis_pr5033, ISNULL(pr5033.campo3_pr5033,'') campo3_pr5033, ISNULL(pr5033.pto_req_pr5033,'') pto_req_pr5033, ISNULL(pr5033.tempo_repos_pr5033,'') tempo_repos_pr5033 FROM CTE LEFT JOIN pv0130 ON pv0130.dt_fatur_pv0130 = CTE.DATA AND pv0131.status_pv0131 = '0' INNER JOIN pv0131 ON pv0131.num_ped_pv0131 = pv0130.num_ped_pv0130 INNER JOIN pr5030 ON pv0131.cod_prod_pv0131 = pr5030.cod_prd_pr5030 INNER JOIN sa5030 ON pr5030.sales_group_pr5030 = sa5030.cod_sa5030 INNER JOIN pr5033 ON pv0131.cod_prod_pv0131 = pr5033.cod_prd_pr5033 WHERE DATA BETWEEN @Data_Incial AND @Data_Final
Verifique se funciona.
Talvez tenha que realizar alguma tratativa de conversão nas datas do CTE.
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 24 de agosto de 2016 13:17
-
Kanaãm eu realmente não conhecia o funcionamento de CTE estou até pegando algum conteúdo na internet para estudar e entender melhor como funciona. Tentei utilizar essa que você montou porém está dando erro com um dos campos
SQL Execution Error
Executed SQL statement: WITH CTE(DATA, CONT) AS (SELECT CONVERT(CHAR, @Data_Incial, 112) AS DATA, 1 AS CONT UNION ALL SELECT CONVERT(CHAR, DATEADD(DD, CONT, @Data_Incial), 112) AS DATA, CONT + 1 AS CONT FROM CTE AS CTE_2 WHERE (DATA < @Data_Final)) SELECT ISNULL(pv0131.st...
Error Source: .Net SqlClient Data Provider
Error Message: O identificador de várias partes "pv0131.status_pv0131" não pôde ser associado.
-
Fabio,
Você testou a CTE que o Kanaãm montou no Management Studio ou na sua aplicação?
Qual é a versão do SQL Server que você esta utilzando?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Fabio,
Certo, com qual componente?
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-