none
Transaction - Insert e Update RRS feed

  • Pergunta

  • Caros Colegas

     

    Cenário:

    Criei uma Área de Trabalho para meu usuário que é montada após a criação de uma query e apresenta os dados em várias colunas.

     

    Existe uma tabela principal as demias fazem referencia a ela usando LEFT INNER JOIN, consequentemente quando os dados não existem nas tabelas filhas a coluna fica como NULL, até aqui Blz

     

    Quando o usuário deseja gravar abro uma Transação e dentro da Transação um FOR para percorrer cada linha e cada coluna alterada aqui Blz também.

     

    Problema:

    Para os campos que estão como NULL, faço um INSERT, acontece que se duas colunas da mesma tabela estava como NULL ocorrem dois INSERTS para o mesmo ID.

     

    Isto acontece poque apesar de eu verificar se o registro existe a transação não executou o Commit logo minha verificação retorna False e permite o INSERT ao invés do UPDATE.

     

    Gostaria de ajuda ou dica para tentar fazer a verificação mesmo nas informações que não dofreram um commit.

     

    Obrigado

     

    quinta-feira, 26 de julho de 2007 15:55

Todas as Respostas

  • Cara,

     

    EU não entendi muito bem seu caso. Não entendi a relação ente o Insert e o Update. Poderia ser um pouco mais claro?

     

    Abraço,

     

    Chapolin

    quinta-feira, 26 de julho de 2007 19:21
  • OK, muito obrigado pelo interesse.

     

    Exemplo:

     

    Duas tabelas PRINCIPAL ( PRODUTOS ) e SECUNDÁRIA ( PRODUTOSIMPOSTOS )

     

    Ao criar uma query que preenche uma área de trabalho que se possa manipular os dados, a query usa LEFT OUTER JOIN, todos os dados de PRODUTOS irão aparecer mesmo que em PRODUTOSIMPOSTOS não exista.

     

    Logo um item de PRODUTOS ( MOUSE 2 BOTOES ) que não tenha ICMS de compra e venda preenchido virá para tela assim:

    DESCRICAO                       ICMSCOMPRA          ICMSVENDA

    MOUSE 2 BOTOES             NULL                        NULL

    Ai o usuário em sua tela preenche o ICMSCOMPRA = 18 e ICMSVENDA = 18, minha função que tem uma transação e navega pelas colunas irá fazer DOIS INSERTS, isto porque em minha rotina que irá verificar os dados em PRODUTOSIMPOSTOS não irá encontrar o registro, porque a transação não executou o COMMIT.

     

    Obrigado

    Bene

     

     

     

     

    sexta-feira, 27 de julho de 2007 14:15
  • Benê você pode usar o hint WHIT(READUNCOMMITTED)  para ler os dados da tabela. Usando esta opção o SQL irá ler também os registros que ainda não foram comitados, mas muito cuidado ao usar isso porque os registros lidos podem sofrer um ROLLBACK e dai as informações lidas já não existem mais.

     

    Um exemplo do uso do hint seria assim:

     

     

    select * from tabela with(readuncommitted)

     

    sexta-feira, 3 de agosto de 2007 16:43
  • Benê,

     

    Na verdade o seu problema esta relacionado então com o Commit que não esta sendo realizado!!!

     

    Você possue alguma condição dentro desta função para analisar de acordo com a situação o SQL Server executa o Commit ou não.

    sexta-feira, 3 de agosto de 2007 17:13