none
Insert com Select com duas ou mais tabelas e um valor fixo para uma coluna RRS feed

  • Pergunta

  • Olá, pessoal.

    Preciso de uma ajuda.

    Tenho uma tabela chamada EXCEÇÃO onde tenho varias colunas.

    exemplo:

    me_cd, pd_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf

    preciso inserir nessa tabela dados referente a mais duas tabelas (PROD e NAT)

    Só que da PROD só preciso de uma coluna (mas são várias linhas).

    E da NAT pego todas as outras COLUNAS, só NÃO a "TRIB_CD" que tem que ser um valor FIXO.

    como consigo fazer um INSERT na EXECEÇÃO com um select da PROD e NAT e informando que o campo TRIB_CD receberá o valor "x"??

    segunda-feira, 24 de março de 2014 14:36

Respostas

Todas as Respostas

  • Deleted
    segunda-feira, 24 de março de 2014 14:40
  • Olá.

    A coluna em comum é a PD_CD.

    Da PROD a pd_cd é a "PK" , e da NAT é a me_cd com a pd_cd

    segunda-feira, 24 de março de 2014 14:47
  • Deleted
    segunda-feira, 24 de março de 2014 14:53
  • Da PROD pegaremos a PD_CD porque quero inserir todos os PD_CD que não esta na EXCEÇÃO
    segunda-feira, 24 de março de 2014 15:02
  • Deleted
    segunda-feira, 24 de março de 2014 15:23
  • Amigo, acho que me expressei errado.

    é assim:

    A tabela Produtos NÃO tem relação com a tabela NATUREZA. Sò a tabela EXCEÇÃO terá relação quando inserido os produtos que devem ficar como "exceção".

    Funciona assim.

    Tenho a tabela produtos onde os mesmos estão cadastrados, nessa tabela só o que me interessa é a Coluna PD_CD.

    A tabela NAT é as configurações das vendas para os produtos, as vendas são SEM TRIBUTAÇÃO onde o codigo do TRIB_CD é  "60", ai é quando entra a EXCEÇÃO.

    Nesta tabela (EXCEÇÃO) insiro o PD_CD  da PROD e o ME_CD da NAT, só que o TRIB_CD tem que ficar com o VALOR "00".

    Ou seja, a tabela EXCEÇÃO é composta da tabela PROD só com a Coluna PD_CD, mais as demais COLUNAS a tabela NAT só diferenciando a TRIB_CD que deve ser igual a "00".

    NAT.me_cd PROD.pd_cd trib_cd NAT.me_aliqicmsdentrouf NAT.me_aliqicmsforauf
    CO02 11500 00 18 12

    segunda-feira, 24 de março de 2014 19:11
  • Deleted
    segunda-feira, 24 de março de 2014 20:03
  • Boa noite, José.

    Me desculpe a demora pela resposta.

    Então, da tabela :

    PROD o PD_CD é a PK

    E sua tabela é formada por estas duas abaixo e mais um monte

    pd_cd pd_icmsst
    11500         S

    NAT o ME_CD é a PK e na

    EXCEÇÃO o PD_CD + ME_CD são as PK's

    As coluna que compõe a NAT são estas 4 abaixo e mais 138 colunas

    me_cd trib_cd cfo_forndentrouf me_ds
    CO02 60 5.102 COMPRA - DE
    CO03 60 5.102 COMPRA P/ ESTOQUE (OUTROS) 




    E as colunas que compoem a EXCEÇÃO são estas abaixo e mais umas 100

    me_cd pd_cd trib_cd me_aliqicmsdentrouf
    CO02  11500         00 18
    CO03  11500         00 18
    CO04  11500         00 18

    A regra que define para que um PD_CD vá para a EXCEÇÃO é que uma coluna na PROD chamada PD_ICMSST, onde o valor é "S" ou "N". Estando como "N" ai este produto é classificado como EXCEÇÃO.

    Então na EXCEÇÃO o pd_cd é INSERIDO para cada ME_CD que seu TRIB_CD é 60.



    terça-feira, 25 de março de 2014 22:05
  • Deleted
    terça-feira, 25 de março de 2014 23:22
  • Bom dia, José.

    Respondendo a sua duvida, o valor do campo na Coluna pd_icmsst deve estar sim como "N", ou seja, o produto não é ICMS-ST. Sendo assim ele é uma EXCEÇÃO.

    Eu executei seu codigo acima e deu um erro, a mensagem foi a seguinte:

    Não é possível inserir uma linha de chave duplicada no objeto 'dbo.tab_mep' com índice exclusivo 'pktab_mep'. O valor da chave duplicada é (1125/5T       , CO02).

    Só que este produto nao esta na EXCEÇÃO.

    e o OUTPUT também deu um erro:

    Msg 102, Level 15, State 1, Line 22
    Sintaxe incorreta próxima a 'output'.

    CODIGO 3

                      

    with
    PROD_NAT as 
    (
    SELECT P.pd_cd, N.me_cd, N.trib_cd, N.me_aliqicmsdentrouf, N.me_redicmsdentrouf, N.me_aliqicmsforauf, N.me_redicmsforauf, N.me_baseretidodentrouf, N.me_baseretidoforauf, N.me_destacareddentrouf, N.me_destacaredforauf, N.cfo_forndentrouf, N.cfo_fornforauf, N.cfo_escrdentrouf, N.cfo_escrforauf, N.cfo_ncontforndentrouf, N.cfo_ncontfornforauf, N.cfo_ncontescrdentrouf, N.cfo_ncontescrforauf, N.me_obscomp, N.me_redicmsdifdentrouf, N.me_redicmsdifforauf, N.trib_cdpis, N.trib_cdcofins, N.incide_pis, N.incide_cofins, N.cod_cred, N.nat_bc_cred, N.trib_cdipi

      from (SELECT pd_cd from ger_pd p where NOT EXISTS (SELECT pd_cd FROM tab_mep WHERE TAB_MEP.pd_cd=P.pd_cd) AND pd_icmsst='N') as P

      cross join

           (SELECT * from tab_mep where me_cd in ('CO02','VE01','DC01','DV01','TE01','TS01') ) as N
    )
    MERGE
      into tab_mep as E  
      using PROD_NAT as PN  
      on PN.me_cd = E.me_cd and PN.pd_cd = E.pd_cd  
      when not matched by target then

    INSERT (me_cd, pd_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, incide_pis, incide_cofins, cod_cred, nat_bc_cred, trib_cdipi)

             values (me_cd, pd_cd, '00', me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, incide_pis, incide_cofins, cod_cred, nat_bc_cred, trib_cdipi);

      output $action, inserted.me_cd, inserted.pd_cd;
    go

    Obs. ger_pd é a tabela PROD

    tab_me é a tabela NAT

    tab_mep é a tabela EXCEÇÃO

    quarta-feira, 26 de março de 2014 13:05
  • Deleted
    • Marcado como Resposta Everton.moreira sexta-feira, 28 de março de 2014 11:30
    quarta-feira, 26 de março de 2014 22:06
  • Bom dia, José.

    Respondendo a sua pergunta sobre o ANSI_PADDING, verifiquei e vi que esta como OFF.

    E muito obrigado, testei o script acima e funcionou perfeitamente.

    sexta-feira, 28 de março de 2014 11:30
  • Deleted
    sexta-feira, 28 de março de 2014 21:35
  • BOA TARDE.

    RETIRANDO A FUNÇÃO RTRIM () DEU ERRO INFORMANDO QUE A TABELA NÃO ACEITA CHAVE DUPLICADA, OU SEJA, O PD_CD + ME_CD.

    JÁ A CLAUSULA OUTPUT NÃO FUNCIONOU.

    ;with
    PROD_NAT as (
    SELECT P.pd_cd, N.*
      from (SELECT rtrim(pd_cd) as pd_cd from ger_pd where pd_icmsst='N') as P
           cross join
           (SELECT * from tab_me where me_cd in ('CO02','VE01','DC01','DV01','TE01','TS01') ) as N
    )
    MERGE
      into tab_mep as E  
      using PROD_NAT as PN  
      on E.pd_cd = PN.pd_cd and E.me_cd = PN.me_cd
      when not matched by target then
         INSERT (pd_cd, me_cd, trib_cd, me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, cod_cred, nat_bc_cred, trib_cdipi)
             values (PN.pd_cd, PN.me_cd, '00', me_aliqicmsdentrouf, me_redicmsdentrouf, me_aliqicmsforauf, me_redicmsforauf, me_baseretidodentrouf, me_baseretidoforauf, me_destacareddentrouf, me_destacaredforauf, cfo_forndentrouf, cfo_fornforauf, cfo_escrdentrouf, cfo_escrforauf, cfo_ncontforndentrouf, cfo_ncontfornforauf, cfo_ncontescrdentrouf, cfo_ncontescrforauf, me_obscomp, me_redicmsdifdentrouf, me_redicmsdifforauf, trib_cdpis, trib_cdcofins, cod_cred, nat_bc_cred, trib_cdipi);
      --output $action, inserted.pd_cd, inserted.me_cd;

    terça-feira, 1 de abril de 2014 18:01
  • Deleted
    terça-feira, 1 de abril de 2014 20:58
  • Bom dia.

    segue abaixo.

    quarta-feira, 2 de abril de 2014 11:39