Update no Firebird

24/04/2018

0

Olá meus jovens.
Depois de muito bater cabeça eis que aqui estou. Estou habituado a dar updates no Firebird quando há uma comparação de um campo com outro. Porém esse caso é diferente e não consegui encontrar uma lógica para tal.
Vamos lá:
Tenho uma tabela X, com o campo plano, convenio, e codigo_empresa
Somente onde convenio=378, os planos tem preenchido também o codigo_empresa.
Preciso que os valores da codigo_empresa sejam atualizados para o convenio 378 também. Tentei da seguinte forma:
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenios where convenio=378) where convenio=338
Mas sem sucesso. Tentei várias variações e também sem sucesso.
A estrutura da tabela está mais ou menos assim:

Handle | Plano | convenio| codigo_empresa
1 87 29
2 87 338 15
3 90 45
4 505 338 27
5 164 183

Alguém tem alguma dica pra mim conseguir que o valor de codigo_empresas(que está no convenio 338) ser replicado para as outras linhas?
Não posso fazer o campo receber ele mesmo porque ele pode receber valor vazio.
Diego

Diego

Responder

Post mais votado

24/04/2018

boa tarde,

não sei se entendi bem mais acredito que assim vc consegue fazer ele receber ele mesmo mas somente quando for o campo vazio segue :

update cl_convenioplanos
   set codigo_empresa = codigo_empresa
        where convenio = 338
        and codigo_empresa is null


caso nao seja isso volte a postar

Douglas Sousa

Douglas Sousa
Responder

Mais Posts

24/04/2018

Diego

Mas dessa forma ele somente vai setar o codigo_empresa quando o convênio for o 338...
É basicamente o contrário, somente quando não for o 338 que ele deve atualizar o registro codigo_empresa.
Usando essa sua mesma idéia e mudando para NOT IN
update cl_convenioplanos
set codigo_empresa = codigo_empresa
where convenio not in (338)
and codigo_empresa is null

Isso reproduziria o mesmo resultado que is not, e mesmo assim, puxaria um valor vazio para o campo.
Não sei se nesse caso não seria necessário eu trabalhar com uma View, que armazenasse o dado e jogasse ali.

Responder

25/04/2018

Fabricio Kawata

Olá Diego! Se o contexto se trata de um update para uma condição exclusiva e restrita (convenio <> 338 and codigo_empresa is null), é esperado que você já tenha o novo valor a ser atribuído (neste caso, o código da empresa). Neste caso, extraia antes o valor para o "codigo_empresa" (via select) e atribua ele diretamente na instrução de "update". Não vejo outra forma de fazer isso, pois fazendo da primeira forma que você explicou (usando select para retornar o valor a ser usado no update), o valor atribuído ao campo será aleatório, e creio que isso não seja isso o esperado.

Abraço!
Responder

25/04/2018

Diego

Sim... É que no caso, somente o convenio 338 TEM o campo codigo_empresa preenchido, o resto dos convênios, não.
Pois é, tentei extrair os dados do update através de um select, porém como a resposta pro select daria mais do que uma linha, não funciona.
update cl_convenioplanos set codigo_empresa = (select codigo_empresa from cl_convenioplanos where convenio=338)
Esse select geraria multiplas linhas, então acredito que seria necessário um cursor for, mas não sei como implementá-lo no update.

Está mais ou menos assim:
http://oi68.tinypic.com/2447alg.jpg
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar