none
Contagem Registros excel RRS feed

  • 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.

    quarta-feira, 28 de setembro de 2016 12:39

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]

    quarta-feira, 28 de setembro de 2016 18:54

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]

    quarta-feira, 28 de setembro de 2016 14:24
  • 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.

    quarta-feira, 28 de setembro de 2016 16:02
  • 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




    quarta-feira, 28 de setembro de 2016 17:27
  • 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.

    quarta-feira, 28 de setembro de 2016 18:05
  • Caro Felipe.

    Antes de eu montar o novo código...

    O usuário digitaria  o  ID_EMPRESA (que ele desejar)  e a consulta retornaria o resultado do post anterior?  Você precisa de uma "View" com entrada com o valor( ID_EMPRESA) de forma dinâmica?

    quarta-feira, 28 de setembro de 2016 18:51
  • 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]

    quarta-feira, 28 de setembro de 2016 18:54
  • 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



    quarta-feira, 28 de setembro de 2016 19:10
  • Meu amigo quase deu certo, na linha onde faz o JOIN você faz a tabela MV, só que MV puro não existe só existe exemplo MV00001, MV00002 e assim por diante ai começa dar erro nessa parte 
    quinta-feira, 29 de setembro de 2016 14:02
  • 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]

    quinta-feira, 29 de setembro de 2016 15:39
  • 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 




    quinta-feira, 29 de setembro de 2016 19:26
  • 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]

    sábado, 1 de outubro de 2016 23:57
  • 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, IDCONTA

    XXASDF, 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çamentos

    SELECT dtlancamento,idlote,idlotelancamento FROM DBO.MV00001
    WHERE (dtlancamento >= '01/01/2014') AND dtlancamento <= '31/01/2014'
    GROUP BY dtlancamento,idlote,idlotelancamento

    ORDER 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?

    quinta-feira, 13 de outubro de 2016 17:38
  • 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]

    quinta-feira, 13 de outubro de 2016 18:01
  • Sim concordo, como passei acima o que é relacional é o codigo da tabela com o codigo da empresa.

    na tabela EMPRESA tenho o codigo 00100, logo minha tabela de movimento é MV00100. Só isso que é relacional.

    quinta-feira, 13 de outubro de 2016 18:11
  • 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]

    quinta-feira, 13 de outubro de 2016 18:22
  • Entendi amigo, fiz assim e consegui chegar ao resultado fim. 

    Obrigado a todos que ajudaram.

    quinta-feira, 27 de outubro de 2016 15:48