Usuário com melhor resposta
Contagem Registros excel

Pergunta
-
Galera bom dia,
preciso de uma ajuda tenho que alimentar uma planilha no excel para informar quantos lançamentos contabeis foram feitos para cada empresa, estou pensando em montar uma matriz e uma planilha com o resultado final, porém, estou tendo dificuldades nos comandos, vou explicar abaixo:
Meu sistema possui a tabela EMPRESA onde fica o CODIGO, IDEMPRESA e NOME EMPRESA, e meus lançamentos contabeis ficam na tabela MV????? onde ?????=Codigo da empresa, todo mês entram empresas novas.
Eu precisaria então de um resultado final uma VIEW ou select para levar ao excel contendo CODIGO EMPRESA, NOME EMPRESA DA TABELA "EMPRESA" e DATA DOS LANÇAMENTOS DA TABELA "MV????" A soma eu posso fazer no proprio excel, pois irei colocar uma formula quando o cliente colocar o codigo da empresa e o periodo ele automaticamente vai informar quantos lançamentos possuem.
Se alguem tiver uma dica.
Respostas
-
Felipe,
Neste caso, o mais indicado seria utilizar uma procedure que realiza a leitura do código de cada empresa cadastrada em seu banco, e através da view do Adilson realiza a pesquisa de dados.
Vale ressaltar que o uso do Order By em views não é permitido em alguns cenários.
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]
- Marcado como Resposta Robson William Silva quarta-feira, 28 de setembro de 2016 19:16
Todas as Respostas
-
Filipe,
Na sua opinião o que precisa estar definido na view? Quais colunas?
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]
-
Se eu conseguir só o CODIGO EMPRESA "Tabela EMPRESA" e DATA "Tabela MV????" o resto eu resolvo via formula excel, porque la eu mando somar quantos lançamentos tem em um determinado periodo que o usuario digitar.
Lembrando que a tabela MV eu posso ter infinitas
MV00001 MV00002 MV00003 e ai por diante, qualquer empresa nova que entre o comando precisa pegar. -
Felipe.Segue abaixo o exemplo da consulta que une as duas tabelas Empresas e MV através do campo IDEMPRESA. Depois conta a quantidade de registros agrupado por DataLançamento.
CREATE VIEW AS Vw_EmpresaContabil as (Se for criar a View)
SELECT
tabE.IDEMPRESA ,
tabE.NOME_EMPRESA ,
tabMV.DATA_LANCAMENTO,
tabMV. count(LANCAMENTOS) AS LancamentosContabeis
FROM tabelaEmpresa as tabE INNER JOIN MV as tabMV on tabE.IDEMPRESA = tabMV.IDEMPRESA
GROUP BY tabE.IDEMPRESA , tabE.NOME_EMPRESA , tabMV.DATA_LANCAMENTO
ORDER BY tabMV.DATA_LANCAMENTO ASC
Espero que ajude.
Abraços
Adilson Paranhos de Jesus
- Editado Adilson Paranhos quarta-feira, 28 de setembro de 2016 17:28
-
Meu amigo boa tarde,
o seu pensamento foi correto, mas, como eu disse eu posso ter N empresas, esse seu comando eu teria que rodar um para cada empresa, eu precisava de algo mais global, esse que me mandou serviria se fosse uma unica empresa.
Supondo que eu tenha as empresas
00001
00002
00003
até
00500
eu teria que rodar o comando várias vezes, então eu precisava que em uma unica query ele me trouxesse todos os lançamentos de todas as empresas.
-
-
Felipe,
Neste caso, o mais indicado seria utilizar uma procedure que realiza a leitura do código de cada empresa cadastrada em seu banco, e através da view do Adilson realiza a pesquisa de dados.
Vale ressaltar que o uso do Order By em views não é permitido em alguns cenários.
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]
- Marcado como Resposta Robson William Silva quarta-feira, 28 de setembro de 2016 19:16
-
Felipe. Segue o código de uma função que retorna uma tabela:
CREATE FUNCTION fn_ContaEmpresas (@IDEMPRESA int, @DtInicial date , @DtFinal date)
RETURNS TABLE
AS
RETURN (
SELECT
tabE.IDEMPRESA ,
tabE.NOME_EMPRESA ,
tabMV.DATA_LANCAMENTO,
tabMV. count(LANCAMENTOS) AS LancamentosContabeis
FROM tabelaEmpresa as tabE INNER JOIN MV as tabMV on tabE.IDEMPRESA = tabMV.IDEMPRESA
WHERE tabE.IDEMPRESA = @IDEMPRESA AND tabMV.DATA_LANCAMENTO between @DtInicial and @DtFinal
GROUP BY tabE.IDEMPRESA , tabE.NOME_EMPRESA , tabMV.DATA_LANCAMENTO
)
;
Para recuperar o resultado da função. Dentro dos parênteses digite o ID_EMPRESA, data inicial e data final .
SELECT IDEMPRESA, NOME_EMPRESA , convert(nvarchar(20), DATA_LANCAMENTO, 103) as DT_LANCAMENTO, LancamentosContabeis FROM fn_ContaEmpresas (00500, '2016-01-01' , '2016-02-01')
Abraços
Adilson Paranhos de Jesus
- Editado Adilson Paranhos quarta-feira, 28 de setembro de 2016 19:25
- Sugerido como Resposta Adilson Paranhos quarta-feira, 28 de setembro de 2016 19:28
- Não Sugerido como Resposta Adilson Paranhos sexta-feira, 30 de setembro de 2016 18:15
-
-
Filipe,
Então neste caso ou você cria um view para cada tabela MV envolvida neste processo, ou então cria um Stored Procedure e executa esta procedure passando como parâmetro o nome da tabela que deseja utilizar na consulta.
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]
-
Caro Felipe. Como sugerido pelo professor Pedro Antonio. Segue abaixo o exemplo de uma Store Procedure , programada em SQL Dinâmica(consulta criada em tempo de execução), nela temos como parâmetros : Nome da Tabela, Data Inicial e Data final .
No parâmetro @tabela terá como entrada o nome tabela da empresa, exemplo ‘MV0001’ . E nos parâmetros @DtInicial e @Dtfinal, o período de tempo.
create procedure Sp_ContaEmpresas
@tabela nvarchar(50)
,@DtInicial date
,@Dtfinal date
as
declare @query nvarchar(max)
set @Query =
'SELECT
tabE.IDEMPRESA ,
tabE.NOME_EMPRESA ,
tabMV.DATA_LANCAMENTO,
tabMV. count(LANCAMENTOS) AS LancamentosContabeis
FROM tabelaEmpresa as tabE INNER JOIN '+ @tabela + ' as tabMV on tabE.IDEMPRESA = tabMV.IDEMPRESA
WHERE tabE.IDEMPRESA = @IDEMPRESA AND tabMV.DATA_LANCAMENTO between @DtInicial and @DtFinal
GROUP BY tabE.IDEMPRESA , tabE.NOME_EMPRESA , tabMV.DATA_LANCAMENTO'
exec sp_executesql @query, N' @tabela nvarchar(50), @DtInicial date, @Dtfinal date',@tabela,@DtInicial,@Dtfinal
;
Para ver o resultado da Store Procedure, execute :
exec bancoDados.dbo.Sp_ContaEmpresas @tabela='MV00001', @DtInicial = '2016-08-01', @Dtfinal = '2016-10-01'
Abraços
Adilson Paranhos
- Sugerido como Resposta Adilson Paranhos sexta-feira, 30 de setembro de 2016 18:15
- Editado Adilson Paranhos sexta-feira, 30 de setembro de 2016 18:41
-
Caro Felipe. Como sugerido pelo professor Pedro Antonio. Segue abaixo o exemplo de uma Store Procedure , programada em SQL Dinâmica(consulta criada em tempo de execução), nela temos como parâmetros : Nome da Tabela, Data Inicial e Data final .
No parâmetro @tabela terá como entrada o nome tabela da empresa, exemplo ‘MV0001’ . E nos parâmetros @DtInicial e @Dtfinal, o período de tempo.
create procedure Sp_ContaEmpresas
@tabela nvarchar(50)
,@DtInicial date
,@Dtfinal date
as
declare @query nvarchar(max)
set @Query =
'SELECT
tabE.IDEMPRESA ,
tabE.NOME_EMPRESA ,
tabMV.DATA_LANCAMENTO,
tabMV. count(LANCAMENTOS) AS LancamentosContabeis
FROM tabelaEmpresa as tabE INNER JOIN '+ @tabela + ' as tabMV on tabE.IDEMPRESA = tabMV.IDEMPRESA
WHERE tabE.IDEMPRESA = @IDEMPRESA AND tabMV.DATA_LANCAMENTO between @DtInicial and @DtFinal
GROUP BY tabE.IDEMPRESA , tabE.NOME_EMPRESA , tabMV.DATA_LANCAMENTO'
exec sp_executesql @query, N' @tabela nvarchar(50), @DtInicial date, @Dtfinal date',@tabela,@DtInicial,@Dtfinal
;
Para ver o resultado da Store Procedure, execute :
exec bancoDados.dbo.Sp_ContaEmpresas @tabela='MV00001', @DtInicial = '2016-08-01', @Dtfinal = '2016-10-01'
Abraços
Adilson Paranhos
Adilson,
Obrigado pela sugestão.
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]
-
Obrigado a todos pelas respostas, essa procedure daria 100% se eu tivesse uma chave primaria que ligasse a tabela empresa a tabela de movimento, mas, não existe.
O banco de dados é assim:
TABELA EMPRESA - DBO.EMPRESA
CODIGO EMPRESA, NOME EMPRESA,CNPJ
00100, EMPRESA TESTE, 00000000000000
TABELA MOVIMENTO DBO.MV00100
IDLOTE, DATA LANÇAMENTO, VALOR LANÇAMENTO, IDCONTAXXASDF, 13/03/1990, 150,00, 50
Não existe algo que faça JOIN de uma tabela com a outra.
O sistema ele roda esse comando pra contar os lançamentosSELECT dtlancamento,idlote,idlotelancamento FROM DBO.MV00001WHERE (dtlancamento >= '01/01/2014') AND dtlancamento <= '31/01/2014'GROUP BY dtlancamento,idlote,idlotelancamentoORDER BY dtlancamento,idlote,idlotelancamento
Depois roda um COUNT e apresenta no sistema.
Mas via query como vou fazer pra puxar esses dados da empresa, sendo que não tem nada pra fazer JOIN? -
Filipe,
Não precisa necessariamente existir uma chave primária, podemos pensar no uso de um relacionamento artificial.
Por acaso não existe nenhum atributo que possa ser utilizado como mecanismo para relacionamento?
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]
-
-
Filipe,
Certo, mesmo assim você não conseguirá fazer o Join da forma desejada!!!
Talvez você terá que pensar em fazer este tipo de procedimento por partes, lendo os dados de cada tabela realizando o armazenamento em outra, desta forma, você terá todo o conjunto de dados dentro de uma única tabela e poderá fazer as devidas análises e gerar os devidos relatórios com base nestes dados agrupados.
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]
-