none
Inserindo dados de 2 tabelas distintas em uma unica tabela RRS feed

  • Pergunta

  • Boa tarde

    Estou com uma grande dúvida:

    Tenho as seguintes tabelas:

    tabCliente

    idcli  cliente   qtde_produtos
    1        João  5000
    2        José         30000
    3 Maria  100000


    tabProduto

    idprod      produtos            val_mensal ano
    1             0 a 10 mil           12000.00 2019
    2             10 mil a 30 mil    24000.00 2019
    3             30 mil a 100 mil    48000.00 2019

    tabC

    id_tabC   idcli   idprod
    1             1        1
    2             2        2
    3             3        3

    Preciso fazer com que toda vez que um cliente for inserido na tabela Cliente, inclua automaticamente na tabC o ID do cliente e o ID do produto.


    sexta-feira, 11 de outubro de 2019 19:51

Todas as Respostas

  • Preciso fazer com que toda vez que um cliente for inserido na tabela Cliente, inclua automaticamente na tabC o ID do cliente e o ID do produto.

    E como se faz isso, manualmente? Pode explicar o passo a passo e o que é cada coluna das tabelas tabCliente e tabProduto?

     

    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    sexta-feira, 11 de outubro de 2019 20:27
  • Na tabela cliente tenho os dados do clientes e quantos produtos eles têm no estoque.. A tabela produto é o controle que me permite saber, quantos produtos cada cliente tem e qual o valor mensal eles têm de pagar por eles. Exemplo: ClienteX tem 2000 produtos, então pela minha tabela produtos sei que ele tem que pagar 1200 por mês.
    sexta-feira, 11 de outubro de 2019 22:10
  • SS_DBAJr,

    A algum tempo atrás tivemos um post similar ao seus, mas que envolvia três tabelas.

    Pois bem, mas falando do IDProduto, qual deveria ser utilizado para inserir na Tabela TabC? Existe na tabela de Produtos o IDCliente?

    Qual é o seu controle para identificar o Cliente x Produto?

    Dependendo da sua forma de controle ou implementação talvez o uso de um trigger possa ser uma solução simples, mas temos que analisar.

    Veja se este tipo de cenário poderá lhe dar um caminho:

    -- Criando a Tabela A --
    Create Table TabelaA
    (Codigo Int Identity(1,1) Primary Key,
     Produto Char(5),
     Data Date,
     Quantidade Int,
     Status Char(1))
     Go
    
    -- Criando a Tabela B --
     Create Table TabelaB
     (Codigo Int Identity(1,1) Primary Key,
      Ferramenta Char(5),
      Material Char(5))
    Go
    
    -- Criando a Tabela C --
    Create Table TabelaC
    (Codigo Int,
     Produto Char(5),
     Data Date,
     Quantidade Int,
     Ferramenta Char(5),
     Material Char(5))
    Go
    
    -- Inserindo Dados --
    Insert Into TabelaA (Produto, Data, Quantidade, Status)
    Values ('A',GetDate(),10,'P'),
           ('B',GetDate(),20,'N'),
           ('C',GetDate(),30,Null)
    Go
    
    Insert Into TabelaB (Ferramenta, Material)
    Values ('F1','M1'),
           ('F2','M2'),
           ('F3','M3')
    Go
    
    -- Criando a Trigger --
    Create Trigger T_TabelaA_Validar
    On TabelaA
    After Insert, Delete
    As
    Begin
    
    Set NoCount On
    
    Declare @Codigo Int  
    
    -- Encerrando o trigger em caso de não ocorrer manipulação de linhas --
    If (@@RowCount = 0)
    Return
    
    If (Select Status From Inserted) Is Not Null
     Begin
      Set @Codigo = (Select Codigo From Inserted)
    
      Insert Into TabelaC (Codigo, Produto, Data, Quantidade, Ferramenta, Material)
      Select A.Codigo, A.Produto, A.Data, A.Quantidade,
             B.Ferramenta, B.Material
      From TabelaA A Inner Join TabelaB B
                    On A.Codigo = B.Codigo
      Where A.Codigo = @Codigo
      End
    
     If (Select Status From Deleted) Is Not Null
      Begin
       Set @Codigo = (Select Codigo From Deleted)
    
       Delete From TabelaC 
       Where Codigo = @Codigo
      End
    
    End
    
    -- Testando --
    Insert Into TabelaB (Ferramenta, Material)
    Values ('F4','M4')
    Go
    
    Insert Into TabelaA (Produto, Data, Quantidade, Status)
    Values ('D',GetDate(),40,'A')
    Go
    
    -- Validando os dados inseridos na Tabela C --
    Select * From TabelaC
    Go
    

    Ressalto que este é somente um exemplo, um esboço de Código que compartilhei com base em outro post, talvez possa lhe dar uma orientação ou nortear em uma possível solução.

    Verifique, analise e valide de acordo com a sua necessidade.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    sexta-feira, 11 de outubro de 2019 22:24
  • Na tabela cliente tenho os dados do clientes e quantos produtos eles têm no estoque..

    Se um cliente tem 3.000 unidades do produto A e 2.000 unidades do produto B, como fica isso na tabela de cliente? 5.000? Ou existe um único produto?

    Se o cliente tiver 0, ainda assim ele paga?

    Não há como em uma coluna armazenar algo como "0 a 10 mil", a não ser que essa coluna esteja declarada como texto. Mas, se esta coluna estiver declarada como texto, e contendo frase, não há como comparar diretamente com outra coluna que seja número. Assim, a coluna produtos da tabela tabProduto deve ser desmembrada em duas colunas, onde a primeira contém o início da faixa e a segunda contém o final da faixa. Por exemplo:

    -- código #1
    CREATE tabProduto (
    faixa tinyint not null, qtd_inicio int not null, qtd_fim int not null, val_mensal money not null, ano smallint not null );

    INSERT into tabProduto (faixa, qtd_inicio, qtd_fim, val_mensal, ano)
      values (1, 0, 10000, 12000.00, 2019),
             (2, 10000, 30000, 24000.00, 2019),
             (3, 30000, 100000, 48000.00, 2019);


    Considerando-se a tabela tabProduto descrita no código #1, eis como inserir linha na tabela tabC:

    -- código #2
    declare @idcli tinyint;
    set @idcli= ___;

    INSERT into tabC (idcli, idprod) SELECT C.idcli, P.faixa from tabCliente as C cross join tabProduto as P where C.idcli = @idcli and P.qtd_produtos > qtd_inicio and P.qtd_produtos <= qtd_fim;
     

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz sexta-feira, 11 de outubro de 2019 23:27
    sexta-feira, 11 de outubro de 2019 22:48
  • A coluna Produtos é varchar, e teria que comparar ela à quantidade de produtos, que o campo é int. Porque no caso, toda vez que inserisse um Produto, automaticamente a informação iria para tabelaC, informando o ID do cliente, a quantidade de produtos e o valor mensal.

    segunda-feira, 14 de outubro de 2019 11:42
  • A coluna Produtos é varchar, e teria que comparar ela à quantidade de produtos, que o campo é int. Porque no caso, toda vez que inserisse um Produto, automaticamente a informação iria para tabelaC, informando o ID do cliente, a quantidade de produtos e o valor mensal.

    Pois é, mas não há como comparar "0 a 10 mil", "10 mil a 30 mil" ou "30 mil a 100 mil" com 2000, por exemplo. As comparações devem ser feitas tipos de dados semelhantes.

    Se você conhece planilhas (LibreOffice Calc ou Excel), experimente montar o modelo usando uma planilha eletrônica. Quando tiver certeza da forma a implementar, crie o modelo de dados e então implemente em banco de dados.



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    segunda-feira, 14 de outubro de 2019 12:02
  • A coluna Produtos é varchar, e teria que comparar ela à quantidade de produtos, que o campo é int. Porque no caso, toda vez que inserisse um Produto, automaticamente a informação iria para tabelaC, informando o ID do cliente, a quantidade de produtos e o valor mensal.

    SS_DBAJr,

    Neste caso, não temos como realizar uma comparação entre um valor numérico para com um valor texto.

    Você terá que analisar justamente com base em uma estrutura predefinida o que poderá ser aplicado como comparativo, quantidade é uma coisa, valor mensal é outra coisa, mas procure estabelecer um padrão para se usar de tipos de dados, é mais indicado quando nos referimos a quantidades e valores realizar a comparação e identificação entre tipos de dados numéricos.



    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 14 de outubro de 2019 13:12