- Este tópico contém 24 respostas, 3 vozes e foi atualizado pela última vez 11 anos, 1 mês atrás por rman.
-
AutorPosts
-
2 de outubro de 2013 às 7:35 pm #105937PAULO HENRIQUEParticipante
Olá,
Sou iniciante em Oracle estou encontrando dificuldades em realizar um rotina em meu trabalho.
Segue minha duvida,
Tenho 3 tabelasTab1
codigo_item, posicao_fiscal, pis,cofinstab2
codigo_item, pis, cofins,nota_fiscaltab3
nota_fiscal, data_documentoPergunta, através do código NCM(tab1) preciso de determinadas notas fiscais(tab2) em uma data selecionada(tab3). após o resultado preciso alterar as colunas pis e cofins da tab2,com um determinado valor.
Fiz o select, porém não estou conseguindo fazer o UPDATE, alguém poderia me ajudar?
Segue o código do select
select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
where posicao_fiscal = 40169990
and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
and to_date(’02/08/2013′,’dd/mm/yyyy’)
and C.revenda = 1
and A.item_estoque = B.Item_Estoque
and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
and C.Tipo_Transacao = ‘P01’
order by C.Numero_Nota_Fiscal2 de outubro de 2013 às 8:14 pm #105938Andrei RubinoParticipante@cardoso_ph
Não entendi muito bem sua dúvida…
Qual sua dúvida em relação ao update ?
Quer fazer o update de uma forma automatizada, ou quer rodar o update na mão ?2 de outubro de 2013 às 9:59 pm #105939PAULO HENRIQUEParticipanteOlá Andrei,
minha dúvida seria em fazer o update na Tab1 tendo em vista que o estou buscando dados também na Tab2 e Tab3 para ter exatamente o que alterar na tab1.
Não precisa ser de forma automatizada, por que tenho alguns critérios diferentes para serem alterados de acordo com a pesquisa.2 de outubro de 2013 às 10:56 pm #105940rmanParticipante@cardoso_ph
É perfeitamente possível atualizar um campo baseado em valores de outras tabelas, segue um exemplo:
3 de outubro de 2013 às 5:32 pm #105942PAULO HENRIQUEParticipante@RMAN
Obrigado pela ajuda tb.Verifiquei o post , porém o exemplo é com uma tabela e não com 3.
Cheguei até tentar fazer um update mais sem sucesso.
Problema é que para eu chegar na informação que eu quero eu preciso pegar dados de 3 tabelas, aí sim alterar o valor em uma delas.Segue minha tentativa de update
[b]update pec_item_estoque A
set A.base_pis = 0
where A.posicao_fiscal = [/b]
(select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
where posicao_fiscal = 40169990
and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
and to_date(’02/08/2013′,’dd/mm/yyyy’)
and C.revenda = 1
and A.item_estoque = B.Item_Estoque
and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
and C.Tipo_Transacao = ‘P01’)** Mensagem de retorno 00913 – too many values
Como disse sou iniciante, se puderem me ajudar com exemplo pratico eu agradeço.
conto com o apoio de vocês.
3 de outubro de 2013 às 5:45 pm #105943Andrei RubinoParticipante@cardoso_ph
Esse erro(‘00913 – too many values’) ocorre pois no seu select você está retornando mais de um valor, que são esses (A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida) então ele diz que existem muitos valores.
Para corrigir você deve deixar apenas a coluna a qual corresponde o valor da clausula.Que no seu caso é where A.posicao_fiscal = ?
Exemplo:
update pec_item_estoque A
set A.base_pis = 0
where A.posicao_fiscal =
(select A.Item_Estoque from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
where posicao_fiscal = 40169990
and C.dta_entrada_saida between to_date(’01/08/2013′,’dd/mm/yyyy’)
and to_date(’02/08/2013′,’dd/mm/yyyy’)
and C.revenda = 1
and A.item_estoque = B.Item_Estoque
and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
and C.Tipo_Transacao = ‘P01’)3 de outubro de 2013 às 6:42 pm #105944PAULO HENRIQUEParticipante@Andrei Rubino
Obrigado pela ajuda,
Antes de executar o update fiz o select somente para um dia para teste, e ele me retornou 6 itens..
Coloquei o codigo com update ele executou sem erros, porém fica executando eternamente, necessário dar um break .
O que pode estar acontecendo ?
3 de outubro de 2013 às 8:35 pm #105945Andrei RubinoParticipante@cardoso_ph
Se o seu select te retornou 6 registros provavelmente ele não executou com sucesso o update.
A pergunta é você quer dar update na tabela para cada registro destes 6 registros retornados no select ?
Se sim, utilize o operador IN em vez de = na clausula where.
Ficando assim where A.posicao_fiscal in (select ……).Se não, se era para retornar apenas uma linha, sua query está com problemas.
3 de outubro de 2013 às 9:34 pm #105946PAULO HENRIQUEParticipanteEntendi Andrei,
Executo o select acima antes do update ai tenho esse retorno abaixo.
Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
1 53513 102032 1,00 0,00 0,00 12/08/2013
2 64034 102118 3,00 100,00 100,00 12/08/2013
3 31025 1744962 2,00 0,00 0,00 12/08/2013
4 31025 1744962 2,00 0,00 0,00 12/08/2013
5 65056 1745438 1,00 0,00 0,00 12/08/2013
6 65056 1745438 1,00 0,00 0,00 12/08/2013Baseado nesse retorno quero executar o update que altere o valor base_pis de 100 para 0.
executei o update com operador IN ele executa bem rápido porém não está alterando o valor de 100 para 0.
Qual seria o erro ?
Obrigado mais uma vez.
3 de outubro de 2013 às 9:37 pm #105947PAULO HENRIQUEParticipante.
3 de outubro de 2013 às 11:35 pm #105948Andrei RubinoParticipante@CARDOSO_PH
Qual desses valores deve ser igual a sua clausula where A.posicao_fiscal = ?
Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
1 53513 102032 1,00 0,00 0,00 12/08/2013
2 64034 102118 3,00 100,00 100,00 12/08/2013
3 31025 1744962 2,00 0,00 0,00 12/08/2013
4 31025 1744962 2,00 0,00 0,00 12/08/2013
5 65056 1745438 1,00 0,00 0,00 12/08/2013
6 65056 1745438 1,00 0,00 0,00 12/08/2013A.posical_fiscal = Num_nota ?
Acredito que você está executando o select errado ainda.
Posta aqui o código que você está executando.3 de outubro de 2013 às 11:42 pm #105949PAULO HENRIQUEParticipanteCodigo para consulta
select A.Item_Estoque, C.Numero_Nota_Fiscal, B.Quantidade, A.Base_Pis, A.Base_Cofins, C.Dta_Entrada_Saida from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
where posicao_fiscal = 40169990
and C.dta_entrada_saida between to_date(’12/08/2013′,’dd/mm/yyyy’)
and to_date(’12/08/2013′,’dd/mm/yyyy’)
and C.revenda = 1
and A.item_estoque = B.Item_Estoque
and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
and C.Tipo_Transacao = ‘P01’
order by C.Numero_Nota_FiscalRetorna os valores abaixo:
Item_estoque Num_nota QTD Base_Pis Base_Con DTA_Entrada
1 53513 102032 1,00 0,00 0,00 12/08/2013
2 64034 102118 3,00 100,00 100,00 12/08/2013
3 31025 1744962 2,00 0,00 0,00 12/08/2013
4 31025 1744962 2,00 0,00 0,00 12/08/2013
5 65056 1745438 1,00 0,00 0,00 12/08/2013
6 65056 1745438 1,00 0,00 0,00 12/08/2013Codigo do com update:
update pec_item_estoque A
set A.base_pis = ‘0,00’
where A.posicao_fiscal in
(select A.Item_Estoque from pec_item_estoque A, fat_movimento_item B, fat_movimento_capa C
where posicao_fiscal = 40169990
and C.dta_entrada_saida between to_date(’12/08/2013′,’dd/mm/yyyy’)
and to_date(’12/08/2013′,’dd/mm/yyyy’)
and C.revenda = 1
and A.item_estoque = B.Item_Estoque
and B.Numero_Nota_Fiscal = C.NUMERO_NOTA_FISCAL
and C.Tipo_Transacao = ‘P01’)4 de outubro de 2013 às 8:02 pm #105950rmanParticipante@cardoso_ph
Acho que entendi o que você precisa, seria atualizar a tabela PEC_ITEM_ESTOQUE utilizando critérios que estão em outras tabelas.
Tente assim, faça o UPDATE, verifique depois se a atualização fez o que deveria, se estiver ok, dê COMMIT, caso contrário dê ROLLBACK;
UPDATE PEC_ITEM_ESTOQUE A
SET A.BASE_PIS = '0,00'
WHERE A.POSICAO_FISCAL = 40169990
AND EXISTS (
SELECT 1
FROM FAT_MOVIMENTO_ITEM B
INNER JOIN FAT_MOVIMENTO_CAPA C ON C.NUMERO_NOTA_FISCAL = B.NUMERO_NOTA_FISCAL
WHERE A.ITEM_ESTOQUE = B.ITEM_ESTOQUE
AND C.DTA_ENTRADA_SAIDA BETWEEN TO_DATE('12/08/2013', 'DD/MM/YYYY') AND TO_DATE('12/08/2013', 'DD/MM/YYYY')
AND C.REVENDA = 1
AND C.TIPO_TRANSACAO = 'P01'
)
4 de outubro de 2013 às 9:47 pm #105951PAULO HENRIQUEParticipante@rman
Exatamente isso.
então no meu exemplo acima, esse comando que me enviou deveria alterar somente 1 registro correto ?
Porém ele me dá que são 4 registros.
Agora fazer uma pergunta , como vejo o resultado(esses 4 registros)antes de efetuar o commit?
Porque eu podendo visualizar o que será alterado eu posso verificar aonde ele estaria pegando os outros 3 registros.
4 de outubro de 2013 às 10:57 pm #105952rmanParticipante@cardoso_ph
Para verificar é simples:
SELECT *
FROM PEC_ITEM_ESTOQUE A
WHERE A.POSICAO_FISCAL = 40169990
AND EXISTS (
SELECT 1
FROM FAT_MOVIMENTO_ITEM B
INNER JOIN FAT_MOVIMENTO_CAPA C ON C.NUMERO_NOTA_FISCAL = B.NUMERO_NOTA_FISCAL
WHERE A.ITEM_ESTOQUE = B.ITEM_ESTOQUE
AND C.DTA_ENTRADA_SAIDA BETWEEN TO_DATE('12/08/2013', 'DD/MM/YYYY') AND TO_DATE('12/08/2013', 'DD/MM/YYYY')
AND C.REVENDA = 1
AND C.TIPO_TRANSACAO = 'P01'
)
Se era para atualizar apenas 1 registro, então está faltando alguma condição. Bom, não vou conseguir te dizer se era pra atualizar 1 ou 4 registro, pois isso envolve a regra do negócio.
-
AutorPosts
- Você deve fazer login para responder a este tópico.