Ir para conteúdo

Arquivado

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

Luiz Mendes

Cursor - Alterar valores negativos.

Recommended Posts

Prezados,Sei que pode parecer simples para muitos, mas para mim o que preciso é bem complicado. Vejamos se alguém pode me ajudar:Estou com a seguinte situação que envolve apenas um tabela de itens.DATA | NRO NF | SERIE | ITEM| PRODUTO| BASE_ICMS_1| BASE_ICMS_2 | BASE_ICMS_3 | BASE_ICMS_4| VLR_SERVICO|2/2/2006 | 2136 | U | 16| 132756| -14,27 | | | | -14,27|15/2/2006 | 10221 | U | 2| 132756| -42,53 | | | | -42,53|15/2/2006 | 10199 | U | 112| 132756| -4088,68 | | | | -4088,68|27/2/2006 | 34572 | U | 7| 132803| | -0,06 | | | -0,06|- Cada linha refere-se a um item de uma NF diferente (como pode ser observado na coluna NRO NF);- Pode existir um mesmo numero de NF para data diferentes, por isso preciso trabalhar com o numero da NF e a data;- Os valores negativos que aparecem, não deveriam aparecer e são justamente eles que preciso tratar;- Preciso ler a linha do item (por exemplo o primeiro item da tabela acima) NF 2136;- Apagar os valores negativos dos campos (BASE_ICMS_1, BASE_ICMS_2, BASE_ICMS_3, BASE_ICMS_4 e VLR_SERVICO);- E gravar o valor NEGATIVO como POSITIVO (exemplo: antes: -14,27 | depois 14,27) no campo VLR_DESCONTO do primeiro item da NF (coluna ITEM guarda o número do item);- Obs1: se o campo VLR_DESCONTO que irá receber o valor que antes era degativo estiver PREENCHIDO, os valores precisam ser somados (VLR_SERVICO + NOVO VLR VINDO DE OUTRO ITEM);- Obs2: se complicar muito para tratar mais de um item negativo em uma mesma NF, considerar que existe apenas um valor negativo;Bem... seria isso.Se alguém conseguir me ajudar, desde já sou grato!Obs.: Seria interessante copiar a pequena tabela acima para o excel para facilitar a visualização.Luiz MendesCtba-PR.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa,Seguinte, seria bom se possível transformar esses dados em campos para facilitar as operações dml.Utilizar o SQL abaixo para alterar onde for o valor nagativo para null:

UPDATE tabela_itens set campo = replace(campo,'-','');

Qualquer dúvida posta ai novamente!! :mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,você pode fazer esse update que o Montilla falou, porém ao invés do replace, eu sugiro que você use a função ABS, que retorna o valor absoluto de um número, como no exemplo abaixo.SELECT ABS(-8.8) a FROM DUAL; a ---------- 8.8Até,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que entendi é mais complexo um pouco.

 

O ideal seria fazer um programa (bacalhau) para correção da base.

 

Se não dominar pl-sql seria melhor usar outra linguagem.

 

Para fazer este código se requer um programador com alguma experiência, dificil dar uma dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!Obrigado pela ajuda!O problema é que preciso desta informação (os valores negativos) para colocar em um novo campo (sem o sinal negativo). Se eh que entendi corretamente sua colocação.Mas vamos aí! O que precisar você me informa que me viro aqui. To precisando deste procedimento para entregar uma obrigação fiscal que acarreta multa :|Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas,acho que o ideal é primeiro montar um cursor que faça a seleção dos registros que precisam ser alterados. Em cima desse cursor você faz um loop que verifica os valores negativos e soma-os em uma variável, que em seguida será adicionada ao campo VLR_SERVICO. Depois disso você faz um update em todos os registros dessa seleção usando a funçao ABS para retirar o sinal de negativo.É disso que você precisa?Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá,você sabe o básico de criação de uma procedure, certo? Então o SELECT do cursor é mais ou menos assim.SELECT * FROM TABELA WHERE CAMPO1 < 0OR CAMPO2 < 0Nesse SELECT você troca o nome da tabela e adiciona todos os campos na cláusula WHERE que você quer testar para saber se é negativo, acho que no seu caso são BASE_ICMS_1, BASE_ICMS_2, BASE_ICMS_3 e BASE_ICMS_4.Você itera dentro desse cursor usando um FOR, mais ou menos assim: for i in <nome_cursor> loop if i.base_icms_1 < 0 then aux := aux + base_icms_1; end if; ... update VLR_SERVICO = VLR_SERVICO + aux where NRO = i.nro ;end loop;Você repete o if e vai somando os valores que são negativos na variável aux. Depois você atualiza o valor do campo VLR_SERVICO com o valor da variável aux somado a ele mesmo.Em seguida é só fazer o update com o ABS.update tabela set base_icms_1 = abs(base_icms_1) WHERE CAMPO1 < 0OR CAMPO2 < 0Sendo que você altera todos os campos que você deseja e coloca esses mesmos campos na cláusula where.É por aí...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!Acredito ter montado todas as condições do que preciso. Alguém pode me ajudar a montar isso em uma procedure?ESQUECI de colocar o que montei:SELECT * FROM MSAF.X43_ITENS_TELECOMWHERE COD_EMPRESA = 'GV1'AND COD_ESTAB IN ('0011','0012','0013','0055','0061') AND DATA_FISCAL BETWEEN TO_DATE('01022007','DDMMYYYY') AND LAST_DAY(TO_DATE('022007','MMYYYY'))AND VLR_SERVICO < 0FOR CONT IN ALTERA_DESCONTO LOOP IF CONT.VLR_SERVICO < 0 THEN DESCONTO := DESCONTO + VLR_SERVICO; BASE_ICMS_1 := 0; BASE_ICMS_1 := 0; BASE_ICMS_1 := 0; BASE_ICMS_1 := 0; VLR_SERVICO := 0; END IF;UPDATE X43_ITENS_TELECOMSET VLR_DESCONTO = ABS(DESCONTO + VLR_DESCONTO)WHERE NUM_ITEM = 1Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou precisar mudar o UPDATE. UPDATE X43_ITENS_TELECOMSET VLR_DESCONTO = ABS(DESCONTO + VLR_DESCONTO)WHERE NUM_ITEM = 1Se executar como esta abaixo, o valor não vai ficar correto:SET VLR_DESCONTO = ABS(DESCONTO + VLR_DESCONTO)O valor será subtraído ( - desconto + vlr desconto ) antes de tirar o sinal.Obrigado!

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.