none
Percorrer Tabelas para montar uma nova tabela RRS feed

  • Pergunta

  • Olá caros colegas desenvolvedores, a um tempo eu estou montando um sistema
    interno para a empresa em que trabalho e como sou o unico na parte de desenvolvimento
    na unidade do grupo tenho q montar a aplicação e o banco, tenho bons conhecimentos em
    SQL mas nada avançado, e agora estou com um problema e não estou conseguindo resol-
    ver, oque ocorre é o seguinte eu tenho q montar um relatório web dos equipamentos da
    empresa, eu tenho as seguintes tabelas que estão envolvidas neste relatório TABELAS
    tblCarrosPiedade(Prefixo, ValidadorID, Status); tblValidadoresPiedade(ValidadorID, RC,
    Mascara, Wlan, StatusID) e tblStatusValidador(Descricao, StatusID);
    essas são as tabelas envolvidas no processo, com isto eu montei uma procedure para gerar
    um relatório q vai ter q aparecer as informações destas tabelas, só q tem um porém, na tabela
    tblCarrosPiedade o campo ValidadorID pode ser nulo pois existem casos de os validadores
    estarem na reserva ou no concerto eu qro montar um relatório q apareça todos os equipamentos
    por filtro do usuário e uma das coisas no meu modesto conhecimento q axei que eu teria
    de usar seria o INNER JOIN entre as tabelas mas como nem sempre um carro tem um validador
    ou seja nem sempre um validador está associado a um prefixo de  um carro a consulta
    não tras os validadores que estão na reserva ou em manutenção o relatório fica "furado"
    incompleto então eu pensei se tem como eu criar uma tabela temporaria na procedure com todos
    os campos e dae fazer o preenchimento dela só q eu pensei em fazer isso através d um for ou algo
    do tipo gostaria de alguma sugestão de voces um auxilio, basicamente para inserir dados d duas tabelas
    diferentes em uma tabela temporaria sabendo que uma tabela contém dados da outra e então eu só vou
    precisar inserir os dados que da segunda tabela que não estão contidos na primeira tabela pois os mesmos já teram sido inseridos a procedure que montei foi a seguinte:

    USE [dbEdySystem]
    GO
    /****** Object: StoredProcedure [dbo].[FiltrarValidadorBusca]  Script Date: 12/09/2010 09:19:39 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[FiltrarValidadorBusca]
      @Mascara BIGINT,
      @WLAN VARCHAR(50),
      @RC VARCHAR(50),
      @PREFIXO BIGINT,
      @STATUS TINYINT
    AS
    BEGIN
      DECLARE @concat INT = 0
      DECLARE @strConcat NVARCHAR(7)
      DECLARE @cmdSQL NVARCHAR(2000)
      set @cmdSQL = 'SELECT C.Prefixo, 
                  V.ValidadorID, 
                  V.Mascara, 
                  V.Rc, V.Wlan, 
                  tv.DESCRICAO,
                  tv.statusid
                  FROM tblValidadoresPiedade V 
                  INNER JOIN tblCarrosPiedade C 
                  ON C.ValidadorID = V.ValidadorID 
                  INNER JOIN tblStatusValidador tv 
                  ON tv.statusID = V.StatusID'
                  
      IF(@PREFIXO <> 0) BEGIN
          IF(@concat = 0)BEGIN
            SET @strConcat = ' WHERE '
            SET @concat = 1
          END
          ELSE BEGIN
            SET @strConcat = ' AND '
            SET @concat = 1
          END
        set @cmdSQL += @strConcat + ' C.PREFIXO LIKE '''+ CONVERT(nvarchar, @PREFIXO, 111)+'%' + ''''
      END
      ELSE BEGIN
    		SET @strConcat +=''
      END
      IF(@Mascara <> 0) BEGIN
          IF(@concat = 0)BEGIN
            SET @strConcat = ' WHERE '
            SET @concat = 1
          END
          ELSE BEGIN
            SET @strConcat = ' AND '
            SET @concat = 1
          END
          SET @cmdSQL += @strConcat + 'v.mascara LIKE '+ '''' + CONVERT(NVARCHAR, @Mascara,111)+'%' + ''''
        END
        ELSE BEGIN
    			SET @strConcat +=''
        END
        IF(@WLAN <> '') BEGIN
          IF(@concat = 0)BEGIN
            SET @strConcat = ' WHERE '
            SET @concat = 1
          END
          ELSE BEGIN
            SET @strConcat = ' AND '
            SET @concat = 1
          END
          SET @cmdSQL += @strConcat + 'v.WLAN LIKE '+ '''' + CONVERT(NVARCHAR, @WLAN,111)+ '%' + ''''
        END
        ELSE BEGIN
    			SET @strConcat +=''
        END
        IF(@RC <> '') BEGIN
          IF(@concat = 0)BEGIN
            SET @strConcat = ' WHERE '
            SET @concat = 1
          END
          ELSE BEGIN
            SET @strConcat = ' AND '
            SET @concat = 1
          END
          SET @cmdSQL += @strConcat + 'v.Rc LIKE '+ '''' + CONVERT(VARCHAR, @RC,111)+'%' + ''''
        END
    		ELSE BEGIN
    			SET @strConcat+=''
    		END
        IF(@STATUS <> 0) BEGIN
          IF(@concat = 0)BEGIN 
            SET @strConcat = ' WHERE '
            SET @concat = 1
          END
          ELSE BEGIN
            SET @strConcat = ' AND '
            SET @concat = 1
          END
          SET @cmdSQL += @strConcat + 'tv.StatusID LIKE ' + '''' + CONVERT(VARCHAR, @STATUS,111)+'%' + ''''
        END
        ELSE BEGIN
    			SET @strConcat+=''
        END
      
      execute sp_executesql @cmdSQL
    END
    
    

    se alguém tiver alguma idéia de como eu posso resolver essa situação grato desde já

     

     

     


    Att Edney Desenvolvedor C#, WindowsForms, Asp.Net WebForms, Asp.Net MVC
    quinta-feira, 9 de dezembro de 2010 15:40

Respostas

  • Prezado Edney.

     

    Você pode fazer uma consulta simples a estas tabelas. Basta ao invés de usar Inner Join usar Left Outer Join.

    Por exemplo:

    select tblCarrosPiedade.Prefixo, tblCarrosPiedade.ValidadorID, tblCarrosPiedade.Status, tblValidadoresPiedade.RC,
    tblValidadoresPiedade. Mascara, tblValidadoresPiedade.Wlan, tblValidadoresPiedade.StatusID,tblStatusValidador.Descricao

    from tblCarrosPiedade

    left outer join tblValidadoresPiedade on tblValidadoresPiedade.ValidadorID = tblCarrosPiedade.ValidadorID

    left outer join tblStatusValidador on tblStatusValidador.StatusID=tblCarrosPiedade.StatusID

    Essa consulta listará todos os dados das 3 tabelas tendo ou não registro nas duas seguintes.

    []'s

    • Sugerido como Resposta Carlos Magno terça-feira, 14 de dezembro de 2010 14:46
    • Marcado como Resposta Richard Juhasz terça-feira, 2 de outubro de 2012 16:53
    sexta-feira, 10 de dezembro de 2010 16:14

Todas as Respostas

  • Prezado Edney.

     

    Você pode fazer uma consulta simples a estas tabelas. Basta ao invés de usar Inner Join usar Left Outer Join.

    Por exemplo:

    select tblCarrosPiedade.Prefixo, tblCarrosPiedade.ValidadorID, tblCarrosPiedade.Status, tblValidadoresPiedade.RC,
    tblValidadoresPiedade. Mascara, tblValidadoresPiedade.Wlan, tblValidadoresPiedade.StatusID,tblStatusValidador.Descricao

    from tblCarrosPiedade

    left outer join tblValidadoresPiedade on tblValidadoresPiedade.ValidadorID = tblCarrosPiedade.ValidadorID

    left outer join tblStatusValidador on tblStatusValidador.StatusID=tblCarrosPiedade.StatusID

    Essa consulta listará todos os dados das 3 tabelas tendo ou não registro nas duas seguintes.

    []'s

    • Sugerido como Resposta Carlos Magno terça-feira, 14 de dezembro de 2010 14:46
    • Marcado como Resposta Richard Juhasz terça-feira, 2 de outubro de 2012 16:53
    sexta-feira, 10 de dezembro de 2010 16:14
  • Carlos,

    Concordo com você desta forma, ele não precisa ficar fazendo um monte de condições.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    sábado, 11 de dezembro de 2010 21:44
    Moderador