Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paulolimarb

Update

Recommended Posts

Olá Pessoal

Estou atualizando a tabela "ESTOQUECOPIA" com os dados da tabela "ESTOQUEGERAL" até ai tudo bem. Porem a tabela "Estoque Geral" ao final do dia sempre terá mais linhas do que a "EstoqueCopia"

Então como eu faço para alem de "atualizar" as linhas existentes entre "ESTOQUECOPIA" e ESTOQUEGERAL adicionar as linhas a mais que estão dentro de "ESTOQUEGERAL" na tabela "ESTOQUECOPIA".

Código que utilizo parta atualizar as linha existentes.

UPDATE ESTOQUECOPIA SET ESTOQUECOPIA.REFE_COM_BARRA = EstoqueGeral.REFE_COM_BARRA FROM ESTOQUECOPIA INNER JOIN EstoqueGeral ON ESTOQUECOPIA.REFE_COM_BARRA = EstoqueGeral.REFE_COM_BARRA;

O banco é SQL SERVER

Grande Abraço.

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for a mesma estrutura, pode utilizar o EXCEPT para verificar os registros e com isso fazer o INSERT

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for a mesma estrutura, pode utilizar o EXCEPT para verificar os registros e com isso fazer o INSERT

Olá A.jr

 

Como implemento isso? Sou muito leigo em SQL.

 

Abs,

Paulo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Paulo.

 

1- Você pode fazer um insert com select, de maneira simples ficaria algo como(assumindo o refe_com_barra como identificador unico):

 

insert into estoquecopia select * from estoquegeral where refe_com_barra not in (select refe_com_barra from estoquecopia)

 

2- como faz a atualização no final do dia, a maneira mais simples é truncar a tabela e inserir os dados da tabela geral:

 

truncate table estoquecopia

insert into estoquecopia select * from estoquegeral

 

caso a estoque copia tenha um campo identity, ou seja, auto incremental, deverá utilizar o comando "set identity_insert estoquecopia on" e definir os campos que receberão os dados logo após a tabela "insert into estoquecopia (campo1,campo2...campo10) select * from estoquegeral"

 

3- Criar uma trigger para fazer isso automaticamente pra vc.. é claro que, deve ser analisado se implicará na performance.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Paulo.

 

1- Você pode fazer um insert com select, de maneira simples ficaria algo como(assumindo o refe_com_barra como identificador unico):

 

insert into estoquecopia select * from estoquegeral where refe_com_barra not in (select refe_com_barra from estoquecopia)

 

2- como faz a atualização no final do dia, a maneira mais simples é truncar a tabela e inserir os dados da tabela geral:

 

truncate table estoquecopia

insert into estoquecopia select * from estoquegeral

 

caso a estoque copia tenha um campo identity, ou seja, auto incremental, deverá utilizar o comando "set identity_insert estoquecopia on" e definir os campos que receberão os dados logo após a tabela "insert into estoquecopia (campo1,campo2...campo10) select * from estoquegeral"

 

3- Criar uma trigger para fazer isso automaticamente pra você.. é claro que, deve ser analisado se implicará na performance.

 

Oi Diemerson

 

A sua 1ª dica funcionou perfeitamente....

 

Um outro detalhe que eu não expliquei, eu vou atualizar a tabela "estoquecopia" de 1 em 1 horas... Pois pego os dados movimentados no estoque geral. E nesse caso eu não teria como truncar a tabela no final do dia.

 

Mais como eu faço pra implementar esse insert que vc deu a dica com um Update da tabela?

 

 

Cara muito obrigado mesmo.

 

Grande Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Paulo

 

Utilizando uma trigger, você teria essa atualização em tempo real, cada evento na tabela de estoquegeral seria replicado para a estoquecopia, porém existe o custo de CPU e IO pra fazer essas atualizações e pode deixar a aplicação mais lenta. para rodar a cada hora, você deve criar um job que executa esse comando.

 

Criar o job é um processo simples

1- no Sql server agent, clique com o botão direito sobre o diretório Jobs e selecione a opção new job

2- dê um nome para o seu job e altere o owner para 'SA' se deixar seu usuário, caso ele seja desativado o job parará de funcionar. depois selecione a opção steps no menu esquerdo.

3- Selecione a opção new step, de um nome para o passo que será executado ex: (atualiza estoquecopia) no parametro type, deixe a opção Transact-sql script (T-SQL), selecione a base de dadosno qual seu script sera executado na opção "Database" e cole seu script de update, seguido do script de insert no campo command, na quia advanced, você pode configurar o retorno do job em caso de sucesso ou falha e gerar um arquivo de log. clique em ok e selecione a opção Schedule.

4- dê um nome para seu schedule e configure o melhor horário pra execução(a cada uma hora, todos os dias, de segunda a ---ta e etc).

5- nas quia notification você pode adicionar uma notificação por e-mail caso o job falhe (pra isso é preciso criar um operador, e configurar o databasemail) o 5 só é necessário caso você queira ser notificado, você pode criar o job sem notificação.

 

 

Criar uma trigger também é simples e ficaria +/- assim:

create trigger trg_atualiza_estoquecopia on estoquegeral

for insert, delete, update

as

begin

delete estoquecopia where refe_com_barra in (select refe_com_barra from deleted)

insert into estoquecopia select * from inserted

end

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Diemerson

 

Muito obrigado por sua ajuda... A opção de trigger iria consumir os recursos deixando a performance ruim.

 

Para isso eu construi uma aplicação de serviço que fica executando os inserts e update de 1 em 1 hora e sem consumir muitos recursos e isso está levando em média 10 segundos.

 

Muito obrigado por sua ajuda, a dica do insert foi crucial.

 

Grande Abraço

Paulo Lima

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.