none
Update com referencia na segunda tabela, agrupar soma da segunda tabela RRS feed

  • Pergunta

  • Boa noite,

    Estou precisando fazer um update com tabela relacionada

    preciso pegar o resultado da consulta abaixo e atualizar outra tabela

    SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA,
    SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP
    INNER JOIN TBL_OB_CADOBRAS OBR ON(OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS)
    GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    ORDER BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA

    Ja tentei diversas formas mas nao tive sucesso.

    Grato pela ajuda.

    Mário Sergio

    domingo, 14 de abril de 2013 22:52

Respostas

  • Davi,

    E um bom caminho.

    ******

    Apenas o Select funcionar, esta me retornando 47 registros

    SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT

    ******

    Bom executei conforme abaixo:

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN

    DECLARE @VALOR DECIMAL(10,2)

    SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT

    EXECUTE PRC_INSERORUPDATE()

    Retornou erro:

    Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 19
    Incorrect syntax near ')'.


    • Editado Maseroli segunda-feira, 15 de abril de 2013 18:48
    • Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:31
    segunda-feira, 15 de abril de 2013 18:45
  • Maseroli,

    Quando a sua procedure, esta faltando um END no final para a mesma ser compilada.

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    DECLARE @VALOR DECIMAL(10,2)
    
    SELECT GT.PAGO FROM 
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP 
      INNER JOIN 
           TBL_OB_CADOBRAS OBR ON 
           (OBR.NROBRA = TMP.OBRA COLLATE Latin1_General_CI_AS )
    GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) As GT
    END

    Alem de que, isso é uma procedure e não uma função, então sua execução não possui um (), então sua execução deve ser:

    EXECUTE PRC_INSERTORUPDATE
    --+ os parametros via @Parametro = 'Valor'


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:21
    segunda-feira, 15 de abril de 2013 18:49
    Moderador

Todas as Respostas

  • Deleted
    domingo, 14 de abril de 2013 23:34
  • José, obrigado pela ajuda!

    E a segunda opçao, preciso atualizar, eu ja inseri os registros importado de um CSV, agora preciso atualizar o valores com uma segunda importaçao do mesmo arquivo.

    Vou fazer testes com seu exemplo e posto o resultado em seguida.

    Obrigado por equanto

    domingo, 14 de abril de 2013 23:55
  • José Bom dia!

    Seu codigo funcionou perfeitamente fico muito agradecido.

      tem alguma maneira de incluir no mesmo codigo, caso exista atualiza o registro se não incluir o registro.

    With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)

    Att,

    Mário Sergio

    segunda-feira, 15 de abril de 2013 13:12
  • Maseroli,

    Qual a versão do teu SQL Server? A partir do SQL 2008 existe a cláusula MERGE, onde você faz justamente essa verificação e inserção / atualização dos teus dados.

    Dê uma olhada nesse link, pode te ajudar: http://technet.microsoft.com/en-us/library/bb510625(v=sql.100).aspx

    []'s

    segunda-feira, 15 de abril de 2013 14:01
  • Somente para complementar esse post , nesse ultimo caso Maseroli creio que a solução seria procedures

    pois nelas você colocaria a lógica da programação ideal escolhendo INSERT OU UPDATE ex :

    CREATE PROCEDURE PRC_INSERTORUPDATE( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) DECLARE @VALOR DECIMAL(10,2) = (SELECT VALORPAGO FROM ATUALIZACOES) IF(@VALOR = 0 OR @VALOR IS NULL) --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure ELSE update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END

    -- Para Chama-la

    EXECUTE PRC_INSERTORUPDATE()

    -- OU

    EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)


    Levando em consideração que Valor Pago só retorna um valor.

    Espero ter ajudado


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 15 de abril de 2013 14:22
  • Davi, bom dia!

    Obrigado pela sua ajuda, porem estou com dificuldades de entender ainda como trabalhar com procedures

    uso SQL 2012 R2

    me retornou um erro

    Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 113
    Incorrect syntax near the keyword 'DECLARE'.
    Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 119
    Incorrect syntax near the keyword 'ELSE'.
    Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 129
    Incorrect syntax near ')'.

    Grato,

    Mário Sergio

    segunda-feira, 15 de abril de 2013 14:44
  • Bom dia , então copiar e colar o código que postei não vai funcionar logo de cara mesmo , tem que haver algumas mudanças e é claro entender como funciona procedures. Façamos o seguinte post seu código com a implementação que você tentou fazer , para podermos ir ajustando conforme a sua necessidade.

    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 15 de abril de 2013 14:58
  • Mude seu código para isso :

    CREATE PROCEDURE PRC_INSERTORUPDATE(
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    
    
    
    DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT)
    
    IF(@VALOR = 0 OR @VALOR IS NULL)
    
    --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure
    
    ELSE
    
    ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
    
    
    END
    -- Para Chama-la 
    EXECUTE PRC_INSERTORUPDATE()
    
    -- OU
    
    EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)

    Espero ter ajudado


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo segunda-feira, 15 de abril de 2013 15:37
    segunda-feira, 15 de abril de 2013 15:06
  • Davi, boa tarde!

    Esta dando erro abaixo

    Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 112
    Incorrect syntax near the keyword 'ELSE'.
    Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 129
    Incorrect syntax near ')'.

    Esta quase dando certo.

    Obrigado

    Mário Sergio

    segunda-feira, 15 de abril de 2013 16:17
  • Vamos mais uma vez tente isso agora :

    CREATE PROCEDURE PRC_INSERTORUPDATE(
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    
    
    
    DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT)
    
    IF(@VALOR = 0 OR @VALOR IS NULL)
    
    --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure
    
    ELSE
     BEGIN
    ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
    
    END
    
    END
    -- Para Chama-la 
    EXECUTE PRC_INSERTORUPDATE()
    
    -- OU
    
    EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)

    Ou seja após o ELSE coloquei BEGIN e END.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 15 de abril de 2013 16:21
  • Davi,

    Ainda não deu, segue resultado abaixo

    Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 115
    Incorrect syntax near the keyword 'ELSE'.
    Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 133
    Incorrect syntax near ')'.

    Att,

    Mário Sergio

    segunda-feira, 15 de abril de 2013 16:54
  • Mas meu amigo você deve colocar alguma coisa no bloco do IF . Como no exemplo seria o INSERT entendeu ?

    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 15 de abril de 2013 16:56
  • Davi, 

    Entendi, desculpas a parte, eu nunca criei uma procedure, nao havia entendido perfeitamente, vou fazer testes e posto o resultado.

    Att,

    Mário Sergio

    segunda-feira, 15 de abril de 2013 16:59
  • Ok Fico no aguardo. Só uma dica não leve meu exemplo ao pé da letra pois o que será inserido de fato ? Os parametros que coloquei são apenas simbolicos de dados que você de fato iria usar exemplo no meu código é como se eu fosse inserir os dados :

    @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL

    Em alguma tabela que esteja esperando isso suponhamos que fosse para as tabelas : tbl_Ob_ImportarFaturamentoTemporario  e TBL_OB_CADOBRAS  seria algum assim :

    CREATE PROCEDURE PRC_INSERTORUPDATE(
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    
    
    
    DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT)
    
    IF(@VALOR = 0 OR @VALOR IS NULL)
    BEGIN
    -- Acrescento o BEGIN e END pois terá mais de uma execução no bloco
    
    INSERT INTO tbl_Od_ImportarFaturamentoTemporario(ValorPago) VALUES (@VALORPAGO)
    
    INSERT INTO TBL_OB_CADOBRAS(codobra,obra,nr_pedido,data) VALUES(@CODOBRA,@OBRA,@NR_PEDIDO,@DATA)
    
    
    
    
    END
    ELSE
     BEGIN
    ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
    
    END
    
    END
    -- Para Chama-la exemplo :
    EXECUTE PRC_INSERTORUPDATE 3,'CASA',10,GETDATE(),1500.50
    

    Espero ter ajudado.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo segunda-feira, 15 de abril de 2013 17:39
    segunda-feira, 15 de abril de 2013 17:33
  • Davi,

    Bom vou contar um pouco da historia do que eu espero acontecer.

    Eu tenho uma tabela chamada "tbl_Ob_ImportarFaturamentoTemporario" que recebe uma importação de um arquivo CSV.

    em seguida preciso atualizar ou incluir na tabela "Ob_Faturamento" porem o relacionamento entre as duas tabelas ( "tbl_Ob_ImportarFaturamentoTemporario" e "Ob_Faturamento" ) e a tabela "TBL_OB_CADOBRAS"

    Na tabela "tbl_Ob_ImportarFaturamentoTemporario" e carregado muitos registro, preciso agrupar

    Se o registro existir atualiza, não existe então insere o registro.

    Fiz algumas alterações no seu codigo mas esta dando um erro que nao consegui corrigir.

    segue o codigo e o erro abaixo.

    CREATE PROCEDURE PRC_INSERTORUPDATE(
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN

    DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT)

    IF(@VALOR = 0 OR @VALOR IS NULL)

    --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure

    INSERT INTO Ob_Faturamento
    (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
    (
    SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
    FROM tbl_Ob_ImportarFaturamentoTemporario GRU
    LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
    )

    ELSE
     BEGIN 
    With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
      GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )

    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)

    END

    END
    -- Para Chama-la 
    EXECUTE PRC_INSERTORUPDATE()

    Erro

    Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 138
    Incorrect syntax near ')'.

    segunda-feira, 15 de abril de 2013 17:49
  • Tente apenas tirar os parenteses desse Select :

    INSERT INTO Ob_Faturamento
    (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
    (
    SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
    FROM tbl_Ob_ImportarFaturamentoTemporario GRU
    LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
    )


    Deixando o Assim :

    INSERT INTO Ob_Faturamento
    (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
    
    
    SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
    FROM tbl_Ob_ImportarFaturamentoTemporario GRU
    LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)

    Detalhe para o seu caso o que o Logan disse sobre MERGE faz todo sentido e é melhor opção ,  caso essa de criar procedures esteja sendo difícil.

    Pode -se até ter o MERGE dentro de uma procedure .


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:00
    segunda-feira, 15 de abril de 2013 17:57
  • Davi,

    E removi os parenteses do select mas ainda nao deu certo.

    Erro:

    Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 45
    Incorrect syntax near ')'.

    Eu preferia resover com seu codigo, pois achei muito interessante e pode me ajudar bastante no futuro.

    Att,

    Mário Sergio

    segunda-feira, 15 de abril de 2013 18:14
  • Coloque BEGIN e END no If também só para ter certeza, como no penultimo exemplo que te passei onde tem 2 inserts lá eu coloquei BEGIN e END 

    tente isso.


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br

    segunda-feira, 15 de abril de 2013 18:19
  • Davi,

    Parece que so falta um pequeno detalhe que nao estamos conseguindo identificar, inclui o BEGIN E END conforme sua orientaçao, porem nao deu muito resultado

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN

    DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT)

    IF
    (@VALOR = 0 OR @VALOR IS NULL)
    BEGIN

    --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure

    INSERT INTO Ob_Faturamento
    (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
    SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
    FROM tbl_Ob_ImportarFaturamentoTemporario GRU
    LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)

    END

    ELSE
     BEGIN 
    With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
      GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
    END

    END

    -- Para Chama-la 

    EXECUTE PRC_INSERORUPDATE()

    Erro:

    Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 49
    Incorrect syntax near ')'.


    segunda-feira, 15 de abril de 2013 18:33
  • Então meu amigo vamos Debugar  a Proc 

    Faça isso :

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    DECLARE @VALOR DECIMAL(10,2)
    
    SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT
    
    
    
    /*
    
    IF
    (@VALOR = 0 OR @VALOR IS NULL)
    BEGIN
    
    --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure
    
    INSERT INTO Ob_Faturamento
    (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
    SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
    FROM tbl_Ob_ImportarFaturamentoTemporario GRU
    LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
    
    END
    
    ELSE
     BEGIN 
    With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO)  as
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
      GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
    )
    update Ob_Faturamento
     set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
     from ATUALIZACOES as ATU inner join Ob_Faturamento as OT 
            on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
    END
    
    */
    
    END

    Veremos o que retorna o seu Select , aguardo retorno.]

    Não esqueça de executar isso :

    EXECUTE PRC_INSERORUPDATE

    ou

    EXECUTE PRC_INSERORUPDATE NULL,NULL,NULL,NULL,NULL


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br




    • Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:45
    segunda-feira, 15 de abril de 2013 18:37
  • Davi,

    E um bom caminho.

    ******

    Apenas o Select funcionar, esta me retornando 47 registros

    SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT

    ******

    Bom executei conforme abaixo:

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN

    DECLARE @VALOR DECIMAL(10,2)

    SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN 
           TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
              GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS  GT

    EXECUTE PRC_INSERORUPDATE()

    Retornou erro:

    Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 19
    Incorrect syntax near ')'.


    • Editado Maseroli segunda-feira, 15 de abril de 2013 18:48
    • Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:31
    segunda-feira, 15 de abril de 2013 18:45
  • Revise seu código deve ter BEGIN e END , não vejo o END 

    Outro detalhe e dica após colocar o END , Só selecione a estrutura da procedure e dê f5 , Depois selecione apenas a chamada  EXECUTE PRC_INSERTORUPDATE 

    e também dê F5. Detalhe não use parenteses na chamada , apenas o EXECUTE PRC_INSERTORUPDATE  , sem nada na frente.

    No Retorno


    Davi Murilo Referência Principal : Jesus que ilumina minha mente.
    Referência Profissonal : http://www.tidm.com.br


    • Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:50
    segunda-feira, 15 de abril de 2013 18:48
  • Maseroli,

    Quando a sua procedure, esta faltando um END no final para a mesma ser compilada.

    CREATE PROCEDURE PRC_INSERTORUPDATE
    (
    @CODOBRA INT = NULL,
    @OBRA VARCHAR(100) = NULL,
    @NR_PEDIDO INT = NULL,
    @DATA DATETIME = NULL,
    @VALORPAGO DECIMAL(10,2) = NULL
    )
    AS
    BEGIN
    
    DECLARE @VALOR DECIMAL(10,2)
    
    SELECT GT.PAGO FROM 
    (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO 
      FROM tbl_Ob_ImportarFaturamentoTemporario TMP 
      INNER JOIN 
           TBL_OB_CADOBRAS OBR ON 
           (OBR.NROBRA = TMP.OBRA COLLATE Latin1_General_CI_AS )
    GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) As GT
    END

    Alem de que, isso é uma procedure e não uma função, então sua execução não possui um (), então sua execução deve ser:

    EXECUTE PRC_INSERTORUPDATE
    --+ os parametros via @Parametro = 'Valor'


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:21
    segunda-feira, 15 de abril de 2013 18:49
    Moderador
  • Fabrizzio/Davi,

    Entendi como usar a procedure, vou fazer os ajustes necessarios e posto o resltado depois.

    obrigado

    Mário Sergio

    segunda-feira, 15 de abril de 2013 19:30
  • Deleted
    terça-feira, 16 de abril de 2013 13:17