Update em Loop
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
Bom Dia Pessoal
Eu de novo.
Já postei aqui sobre o LOOP em uma tela que possui dois bloco auxiliares.
Bom. Preciso fazer um update.
Tenho um botão chamado, alterar resultados. E faz um execute_query.
QUando peço pra salvar dar erro de chave duplicada.
Então preciso fazer um update nesses dois blocos auxiliares. Pra salvar um bloco data base.
alguém sabe me dizer como e o onde poderia fazer o update.
Eu de novo.
Já postei aqui sobre o LOOP em uma tela que possui dois bloco auxiliares.
Bom. Preciso fazer um update.
Tenho um botão chamado, alterar resultados. E faz um execute_query.
QUando peço pra salvar dar erro de chave duplicada.
Então preciso fazer um update nesses dois blocos auxiliares. Pra salvar um bloco data base.
alguém sabe me dizer como e o onde poderia fazer o update.
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
To com outro problema,
Já ta fazendo as alterações. Porem quando mando salvar. Diz que não tem nada pra salvar. COmo faço pra mudar isso.
Ai vai o codigo
POr favor, alguém por ai
Já ta fazendo as alterações. Porem quando mando salvar. Diz que não tem nada pra salvar. COmo faço pra mudar isso.
Ai vai o codigo
POr favor, alguém por ai
declare
nr_rep number;
BEGIN
if :parameter.acao = 'A' then-- Alterar
select distinct pra.nr_repeticao into nr_rep
from pra pra,
resultado_exame re,
requisicao_exame r,
crm c,
resultados_gerais rg,
anticorpos_pra a,
pessoa_fisica pf,
pessoa_juridica pj,
lista_exame le
where rg.nr_amostra = :parameter.numero_amostra
and rg.nr_amostra = re.nr_amostra
and le.nr_requisicao = r.nr_requisicao
and re.nr_amostra = le.nr_amostra
and re.nr_controle = le.nr_controle
and re.cd_servico = le.cd_servico
and re.nr_repeticao = le.nr_repeticao_atual
and rg.cd_servico = re.cd_servico
and rg.nr_controle = re.nr_controle
and rg.nr_repeticao = re.nr_repeticao
and re.nr_amostra = pra.nr_amostra
and re.cd_servico = pra.cd_servico
and re.nr_controle = pra.nr_controle
and re.nr_repeticao = pra.nr_repeticao
and pra.cd_anticorpo = a.cd_anticorpo
and c.cd_crm(+) = r.cd_crm
and a.cd_classe = 1
and pf.cd_pessoafisica = re.cd_pessoafisica
and pj.id_pessoajuridica = r.cd_pessoajuridica
and pra.dt_realizacao = rg.dt_realizacao
and pra.dt_atualizacao = rg.dt_atualizacao
and pra.cd_usuario = rg.cd_usuario;
IF :cd_anticorpo1 is not null and :vl_anticorpo1 is not null AND
:cd_anticorpo2 is not null and :vl_anticorpo2 is not null then
if :nr_repeticao = nr_rep then
DELETE FROM PRA
WHERE NR_AMOSTRA = :NR_AMOSTRA
AND NR_REPETICAO = :NR_REPETICAO;
end if;
end if;
END IF;
validar_obrigatorios;
if :cd_anticorpo1 is not null then
--Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
go_block('anticorpo1');
first_record;
loop
IF :SYSTEM.RECORD_STATUS in ('NEW','INSERT') THEN
if :cd_anticorpo1 is not null and :vl_anticorpo1 is not null then
begin
insert into PRA(nr_amostra,nr_controle,nr_repeticao,cd_servico,cd_anticorpo,dt_realizacao,dt_atualizacao,cd_usuario,vl_anticorpo)
values(:resultados_gerais.nr_amostra,:resultados_gerais.nr_controle,:resultados_gerais.nr_repeticao,:resultados_gerais.cd_servico,
:cd_anticorpo1,:resultados_gerais.dt_realizacao,:resultados_gerais.dt_atualizacao,:global.cd_pessoafisica, :vl_anticorpo1);
exception
when others then
controle_de_msg('ERR',sqlerrm);
end;
end if;
forms_ddl('commit');
next_record;
END IF;
exit when :cd_anticorpo1 is null;
end loop;
end if;
if :cd_anticorpo2 is not null then
--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
go_block('anticorpo2');
first_record;
LOOP
IF :SYSTEM.RECORD_STATUS in ('NEW','INSERT') THEN
if :cd_anticorpo2 is not null and :vl_anticorpo2 is not null then
begin
insert into PRA(nr_amostra,nr_controle,nr_repeticao,cd_servico,cd_anticorpo,dt_realizacao,dt_atualizacao,cd_usuario,vl_anticorpo)
values(:resultados_gerais.nr_amostra,:resultados_gerais.nr_controle,:resultados_gerais.nr_repeticao,:resultados_gerais.cd_servico,
:cd_anticorpo2,:resultados_gerais.dt_realizacao,:resultados_gerais.dt_atualizacao,:global.cd_pessoafisica, :vl_anticorpo2);
exception
when others then
controle_de_msg('ERR',sqlerrm);
end;
end if;
forms_ddl('commit');
next_record;
END IF;
Exit when :cd_anticorpo2 is null;
end loop;
end if;
COMMIT_FORM;
end;
-
- Rank: DBA Sênior
- Mensagens: 389
- Registrado em: Ter, 27 Jul 2010 1:34 pm
- Localização: Sapiranga - RS
- Contato:
Quem falou que programar era fácil??
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Já que pede com tanto afinco vou lhe apontar alguns erros e algumas melhorias propostas.
1 - Evite ao máximo o usu de Into. Motivo? você não est tratando nenhum tipo de exception, se estourar um erro você sofrerá para descobrir a solução.
2 - Observe que antes de efetuar o primeiro loop você não se posiciona em local alguém. Ou seja, imagine se você estiver entrado em uma linha em branco, o que ocorreria? Os dois loops não executariam.
3 - Durante sua você comentou que seu bloco era "auxiliar", tomei por verdade que estes blocos eram não base table, desta forma os comandos Você esta efetuando diversos forms_ddl('commit');COMMIT ou COMMIT_FORM; nunca terão nenhuma integração para salvar. Talvez por isso sua mensagem.
4 - Sua aplicação salva alguma coisa?
Se eu fosse criar uma rotina para o mesmo funcionamento faria assim:
Não revisei a ortografia, mas a lógica em si faria algo assim...
1 - Evite ao máximo o usu de Into. Motivo? você não est tratando nenhum tipo de exception, se estourar um erro você sofrerá para descobrir a solução.
2 - Observe que antes de efetuar o primeiro loop você não se posiciona em local alguém. Ou seja, imagine se você estiver entrado em uma linha em branco, o que ocorreria? Os dois loops não executariam.
3 - Durante sua você comentou que seu bloco era "auxiliar", tomei por verdade que estes blocos eram não base table, desta forma os comandos Você esta efetuando diversos forms_ddl('commit');COMMIT ou COMMIT_FORM; nunca terão nenhuma integração para salvar. Talvez por isso sua mensagem.
4 - Sua aplicação salva alguma coisa?
Se eu fosse criar uma rotina para o mesmo funcionamento faria assim:
Declare
nr_rep Number;
v_top_rec Number;
v_cur_rec Number;
v_cur_block Varchar2(100) := :System.current_block;
Begin
If :parameter.acao = 'A' Then
-- Alterar
Select Distinct pra.nr_repeticao
Into nr_rep
From pra pra,
resultado_exame re,
requisicao_exame r,
crm c,
resultados_gerais rg,
anticorpos_pra a,
pessoa_fisica pf,
pessoa_juridica pj,
lista_exame le
Where rg.nr_amostra = :parameter.numero_amostra
And rg.nr_amostra = re.nr_amostra
And le.nr_requisicao = r.nr_requisicao
And re.nr_amostra = le.nr_amostra
And re.nr_controle = le.nr_controle
And re.cd_servico = le.cd_servico
And re.nr_repeticao = le.nr_repeticao_atual
And rg.cd_servico = re.cd_servico
And rg.nr_controle = re.nr_controle
And rg.nr_repeticao = re.nr_repeticao
And re.nr_amostra = pra.nr_amostra
And re.cd_servico = pra.cd_servico
And re.nr_controle = pra.nr_controle
And re.nr_repeticao = pra.nr_repeticao
And pra.cd_anticorpo = a.cd_anticorpo
And c.cd_crm(+) = r.cd_crm
And a.cd_classe = 1
And pf.cd_pessoafisica = re.cd_pessoafisica
And pj.id_pessoajuridica = r.cd_pessoajuridica
And pra.dt_realizacao = rg.dt_realizacao
And pra.dt_atualizacao = rg.dt_atualizacao
And pra.cd_usuario = rg.cd_usuario;
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null
And :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
If :nr_repeticao = nr_rep Then
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
End If;
End If;
End If;
validar_obrigatorios;
go_block('anticorpo1');
v_top_rec := get_block_property('anticorpo1', top_record);
v_cur_rec := get_block_property('anticorpo1', current_record);
first_record;
If :cd_anticorpo1 Is Not Null Then
--Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null Then
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo1,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo1);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
End If;
forms_ddl('commit');
next_record;
End If;
Exit When :system.last_record = 'TRUE';
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block('anticorpo2');
v_top_rec := get_block_property('anticorpo2', top_record);
v_cur_rec := get_block_property('anticorpo2', current_record);
first_record;
If :cd_anticorpo2 Is Not Null Then
--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo2,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo2);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
End If;
forms_ddl('commit');
next_record;
End If;
Exit When :system.last_record = 'TRUE';
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block(v_cur_block);
:system.messsage_level := 25;
Commit;
:system.messsage_level := 0;
message('Todos os registros foram salvos!');
Exception
When Others then
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.')
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge)
End;
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
SIM ELE SALVA NO BANCO. POREM, OCORRE EXATAMENTE O QUE você COMENTOU.
QUANDO ESTA EM BRANCO, OU SALVA E VOLTA EM BRANCO
ELE DA MENSAGEM DE ERRO, ORA-0001.
vOU TESTAR AQUI, E LOGO TE AVISO.
ESSA TELA ESTA ME DEIXANDO DE CABELO BRANCO. RS
QUANDO ESTA EM BRANCO, OU SALVA E VOLTA EM BRANCO
ELE DA MENSAGEM DE ERRO, ORA-0001.
vOU TESTAR AQUI, E LOGO TE AVISO.
ESSA TELA ESTA ME DEIXANDO DE CABELO BRANCO. RS
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
OI GFKAUER, BOM DEU CERTO
POREM QUANDO COLOCO O
ELE NÃO SALVA A ULTIMA LINHA DE CADA BLOCO
SE EU COLOCO
ELE DA ERRO, DIZENDO QUE PRECISA DELETAR OUTRO REGISTRO.
MAIS UMA VEZ, TE AGRADEÇO
POREM QUANDO COLOCO O
Exit When :system.last_record = 'TRUE'
SE EU COLOCO
Exit When :cd_anticorpo2 is null
MAIS UMA VEZ, TE AGRADEÇO
-
- Rank: DBA Sênior
- Mensagens: 389
- Registrado em: Ter, 27 Jul 2010 1:34 pm
- Localização: Sapiranga - RS
- Contato:
Quem falou que programar era fácil??
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Mude:
para:
forms_ddl('commit');
next_record;
End If;
Exit When :system.last_record = 'TRUE';
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
Gfkauer, tudo bom?
Deu outro problema. vê se você pode me ajudar
consigo deletar naquele seu codigo. QUando for igual a A, pra alterar
Mais quando eu desejo somente incluir. for Igual a I. Ele salva, porem da mensagem de duplicação, quando eu alterar e pedir pra salvar denovo.
EU deveria fazer outro delete. mais onde, como?
Sabe me dizer?
Deu outro problema. vê se você pode me ajudar
consigo deletar naquele seu codigo. QUando for igual a A, pra alterar
Mais quando eu desejo somente incluir. for Igual a I. Ele salva, porem da mensagem de duplicação, quando eu alterar e pedir pra salvar denovo.
EU deveria fazer outro delete. mais onde, como?
Sabe me dizer?
-
- Rank: DBA Sênior
- Mensagens: 389
- Registrado em: Ter, 27 Jul 2010 1:34 pm
- Localização: Sapiranga - RS
- Contato:
Quem falou que programar era fácil??
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Poderia especificar o que é cada nome destes, se uma primary, uma unique ou uma foreign...
-
- Rank: DBA Sênior
- Mensagens: 389
- Registrado em: Ter, 27 Jul 2010 1:34 pm
- Localização: Sapiranga - RS
- Contato:
Quem falou que programar era fácil??
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Reescrevi a minha sugestão antiga...
tente algo assim:
e por favor poste os resultados.
tente algo assim:
Declare
nr_rep Number;
v_top_rec Number;
v_cur_rec Number;
v_cur_block Varchar2(100) := :System.current_block;
v_nro_rec Number;
Begin
If :parameter.acao = 'A' Then
-- Alterar
Select Distinct pra.nr_repeticao
Into nr_rep
From pra pra,
resultado_exame re,
requisicao_exame r,
crm c,
resultados_gerais rg,
anticorpos_pra a,
pessoa_fisica pf,
pessoa_juridica pj,
lista_exame le
Where rg.nr_amostra = :parameter.numero_amostra
And rg.nr_amostra = re.nr_amostra
And le.nr_requisicao = r.nr_requisicao
And re.nr_amostra = le.nr_amostra
And re.nr_controle = le.nr_controle
And re.cd_servico = le.cd_servico
And re.nr_repeticao = le.nr_repeticao_atual
And rg.cd_servico = re.cd_servico
And rg.nr_controle = re.nr_controle
And rg.nr_repeticao = re.nr_repeticao
And re.nr_amostra = pra.nr_amostra
And re.cd_servico = pra.cd_servico
And re.nr_controle = pra.nr_controle
And re.nr_repeticao = pra.nr_repeticao
And pra.cd_anticorpo = a.cd_anticorpo
And c.cd_crm(+) = r.cd_crm
And a.cd_classe = 1
And pf.cd_pessoafisica = re.cd_pessoafisica
And pj.id_pessoajuridica = r.cd_pessoajuridica
And pra.dt_realizacao = rg.dt_realizacao
And pra.dt_atualizacao = rg.dt_atualizacao
And pra.cd_usuario = rg.cd_usuario;
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null
And :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
If :nr_repeticao = nr_rep Then
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
End If;
End If;
End If;
validar_obrigatorios;
go_block('anticorpo1');
v_top_rec := get_block_property('anticorpo1', top_record);
v_cur_rec := get_block_property('anticorpo1', current_record);
first_record;
If :cd_anticorpo1 Is Not Null Then
--Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null Then
Select count(1)
Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo1;
If v_nro_rec = 0 Then
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo1,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo1);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
End If;
v_nro_rec := 0;
End If;
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block('anticorpo2');
v_top_rec := get_block_property('anticorpo2', top_record);
v_cur_rec := get_block_property('anticorpo2', current_record);
first_record;
If :cd_anticorpo2 Is Not Null Then
--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
Select count(1)
Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo1;
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo2,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo2);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
End If;
v_nro_rec := 0;
End If;
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block(v_cur_block);
:system.messsage_level := 25;
Commit;
:system.messsage_level := 0;
message('Todos os registros foram salvos!');
Exception
When Others then
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.')
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge)
End;
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
Dae, conseguir fazer. Deu certo. Fiz um delete nesse if que você fez. Porém ele deletar algumas linhas. Não sei dizer o porque. Se eu modifico ele deleta alguma linhas
Declare
nr_rep Number;
v_top_rec Number;
v_cur_rec Number;
v_cur_block Varchar2(100) := :System.current_block;
v_nro_rec Number;
Begin
If :parameter.acao = 'A' Then
-- Alterar
Select Distinct pra.nr_repeticao
Into nr_rep
From pra pra,
resultado_exame re,
requisicao_exame r,
crm c,
resultados_gerais rg,
anticorpos_pra a,
pessoa_fisica pf,
pessoa_juridica pj,
lista_exame le
Where rg.nr_amostra = :parameter.numero_amostra
And rg.nr_amostra = re.nr_amostra
And le.nr_requisicao = r.nr_requisicao
And re.nr_amostra = le.nr_amostra
And re.nr_controle = le.nr_controle
And re.cd_servico = le.cd_servico
And re.nr_repeticao = le.nr_repeticao_atual
And rg.cd_servico = re.cd_servico
And rg.nr_controle = re.nr_controle
And rg.nr_repeticao = re.nr_repeticao
And re.nr_amostra = pra.nr_amostra
And re.cd_servico = pra.cd_servico
And re.nr_controle = pra.nr_controle
And re.nr_repeticao = pra.nr_repeticao
And pra.cd_anticorpo = a.cd_anticorpo
And c.cd_crm(+) = r.cd_crm
And pf.cd_pessoafisica = re.cd_pessoafisica
And pj.id_pessoajuridica = r.cd_pessoajuridica
And pra.dt_realizacao = rg.dt_realizacao
And pra.dt_atualizacao = rg.dt_atualizacao
And pra.cd_usuario = rg.cd_usuario;
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null
And :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
If :nr_repeticao = nr_rep Then
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
End If;
End If;
End If;
validar_obrigatorios;
go_block('anticorpo1');
v_top_rec := get_block_property('anticorpo1', top_record);
v_cur_rec := get_block_property('anticorpo1', current_record);
first_record;
If :cd_anticorpo1 Is Not Null Then
--Loop para salvar campos cd_anticorpo1 e vl_anticorpo1 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo1 Is Not Null
And :vl_anticorpo1 Is Not Null Then
Select count(1)
Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo1;
If v_nro_rec = 0 Then
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo1,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo1);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
--End If;
else
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
end if;
v_nro_rec := 0;
End If;
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block('anticorpo2');
v_top_rec := get_block_property('anticorpo2', top_record);
v_cur_rec := get_block_property('anticorpo2', current_record);
first_record;
If :cd_anticorpo2 Is Not Null Then
--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo2 Is Not Null
And :vl_anticorpo2 Is Not Null Then
Select count(1)
Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo2;
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo2,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo2);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
else
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
End If;
v_nro_rec := 0;
End If;
forms_ddl('commit');
-- End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block(v_cur_block);
:system.message_level := 25;
Commit;
:system.message_level := 0;
message('Operação Realizada com Sucesso!');
Exception
When Others then
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.');
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge) ;
End;
-
- Rank: DBA Sênior
- Mensagens: 389
- Registrado em: Ter, 27 Jul 2010 1:34 pm
- Localização: Sapiranga - RS
- Contato:
Quem falou que programar era fácil??
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
Quanto mais dificil for a implementação mais valorizado seu trabalho será!
Acessem: www.gfkauer.com.br
cuma???Porém ele deletar algumas linhas. Não sei dizer o porque. Se eu modifico ele deleta alguma linhas
Não entendi o que você quis dizer com esta frase acima...
O seu delete não é pela pk da tabela, desta forma você poderá excluir dados indevidos... revisa isso e reavalia este delete...
Qualquer coisa questiona quem analisou se ele realmente quer que exclua os registro que seriam duplicados...
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
OIiii
Consegui fazer. Mais o site estava fora....
Então Lá vai.
Brigada pela ajuda.
Consegui fazer. Mais o site estava fora....
Então Lá vai.
Declare
nr_rep Number;
REP NUMBER;
v_top_rec Number;
v_cur_rec Number;
v_cur_block Varchar2(100) := :System.current_block;
v_nro_rec Number;
Begin
-- fAZ DELETE NO CASO DE ALTERAR RESULTADO
If :parameter.acao = 'A' Then
Select Distinct pra.nr_repeticao
Into nr_rep
From pra pra,
resultado_exame re,
requisicao_exame r,
crm c,
resultados_gerais rg,
anticorpos_pra a,
pessoa_fisica pf,
pessoa_juridica pj,
lista_exame le
Where rg.nr_amostra = :parameter.numero_amostra
And rg.nr_amostra = re.nr_amostra
And le.nr_requisicao = r.nr_requisicao
And re.nr_amostra = le.nr_amostra
And re.nr_controle = le.nr_controle
And re.cd_servico = le.cd_servico
And re.nr_repeticao = le.nr_repeticao_atual
And rg.cd_servico = re.cd_servico
And rg.nr_controle = re.nr_controle
And rg.nr_repeticao = re.nr_repeticao
And re.nr_amostra = pra.nr_amostra
And re.cd_servico = pra.cd_servico
And re.nr_controle = pra.nr_controle
And re.nr_repeticao = pra.nr_repeticao
And pra.cd_anticorpo = a.cd_anticorpo
And c.cd_crm(+) = r.cd_crm
And pf.cd_pessoafisica = re.cd_pessoafisica
And pj.id_pessoajuridica = r.cd_pessoajuridica
And pra.dt_realizacao = rg.dt_realizacao
And pra.dt_atualizacao = rg.dt_atualizacao
And pra.cd_usuario = rg.cd_usuario;
If :cd_anticorpo1 Is Not Null And :vl_anticorpo1 Is Not Null
And :cd_anticorpo2 Is Not Null And :vl_anticorpo2 Is Not Null Then
If :nr_repeticao = nr_rep Then
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
End If;
End If;
End If;
-- FINALIZA ALTERAÇÃO
--ENTRA NO BLOCO ANTICORPO1
go_block('anticorpo1');
v_top_rec := get_block_property('anticorpo1', top_record);
v_cur_rec := get_block_property('anticorpo1', current_record);
first_record;
If :cd_anticorpo1 Is Not Null Then
--Faz pesquisa no banco para verificar se já possui alterações. Se possuir, deletar e salvar no loop
Select count(1) Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo1;
if v_nro_rec > 0 then
Delete From pra
Where nr_amostra = :nr_amostra
And nr_repeticao = :nr_repeticao;
end if;
--Inicia o Loop, para inserir dados anticorpo1
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo1 Is Not Null And :vl_anticorpo1 Is Not Null Then
Begin
--Faz insert no bloco pra
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo1,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo1);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
End If;
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
--FINALIZA ANTICORPO1
--INICIAR BLOCO ANTICORPO2
go_block('anticorpo2');
v_top_rec := get_block_property('anticorpo2', top_record);
v_cur_rec := get_block_property('anticorpo2', current_record);
first_record;
If :cd_anticorpo2 Is Not Null Then
--Loop para salvar campos cd_anticorpo2 e vl_anticorpo2 no bloco PRA
Loop
If :system.record_status In ('NEW', 'INSERT') Then
If :cd_anticorpo2 Is Not Null And :vl_anticorpo2 Is Not Null Then
Select count(1) Into v_nro_rec
From pra p
Where p.nr_amostra = :resultados_gerais.nr_amostra
And p.nr_controle = :resultados_gerais.nr_controle
And p.nr_repeticao = :resultados_gerais.nr_repeticao
And p.cd_servico = :resultados_gerais.cd_servico
And p.cd_anticorpo = :cd_anticorpo2;
Begin
Insert Into pra
(nr_amostra,
nr_controle,
nr_repeticao,
cd_servico,
cd_anticorpo,
dt_realizacao,
dt_atualizacao,
cd_usuario,
vl_anticorpo)
Values
(:resultados_gerais.nr_amostra,
:resultados_gerais.nr_controle,
:resultados_gerais.nr_repeticao,
:resultados_gerais.cd_servico,
:cd_anticorpo2,
:resultados_gerais.dt_realizacao,
:resultados_gerais.dt_atualizacao,
:global.cd_pessoafisica,
:vl_anticorpo2);
Exception
When Others Then
controle_de_msg('ERR', Sqlerrm);
End;
end if;
-- v_nro_rec := 0;
forms_ddl('commit');
End If;
Exit When :system.last_record = 'TRUE';
next_record;
End Loop;
End If;
go_record(v_top_rec);
go_record(v_cur_rec);
go_block(v_cur_block);
:system.message_level := 25;
Commit;
:system.message_level := 0;
message('Operação Realizada com sucesso!');
Exception
When Others then
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.') ;
message('Você não tratou os erros TOO_MANY_ROWS nem NO_DATA_FOUND.', no_acknowledge) ;
End;
Brigada pela ajuda.
-
- Rank: DBA Pleno
- Mensagens: 297
- Registrado em: Ter, 21 Dez 2010 8:45 am
- Localização: Florianopolis
Priscila Fernandes
tO COM OUTRO PROBLEMA EM UM WHEN BUTTON pRESS
dEPOIS QUE SALVO O VALOR IGUAL A ZERO
DEPOIS QUANDO VOU ALTERAR QUERO MUDAR ESSE VALOR PRA 5 POR EXEMPLO
pRECISO APERTAR UMA BOTÃO PRA INSERIR OS VALORES
ENTÃO OS CAMPOS FICAM TODOS ATIVADOS
POREM DA O MESMO ERRO DE NAVEGAÇÃO
dEPOIS QUE SALVO O VALOR IGUAL A ZERO
DEPOIS QUANDO VOU ALTERAR QUERO MUDAR ESSE VALOR PRA 5 POR EXEMPLO
pRECISO APERTAR UMA BOTÃO PRA INSERIR OS VALORES
ENTÃO OS CAMPOS FICAM TODOS ATIVADOS
POREM DA O MESMO ERRO DE NAVEGAÇÃO
declare
cursor c1 is select cd_anticorpo from anticorpos_pra where cd_classe = 1 order by cd_anticorpo;
r1 c1%rowtype;
begin
open c1;
go_block('ANTICORPO1');
first_record;
loop
fetch c1 into r1;
exit when c1%notfound;
if r1.cd_anticorpo is not null then
:cd_anticorpo1 := r1.cd_anticorpo;
next_record;
end if;
end loop;
first_record;
close c1;
exception
when no_data_found then
controle_de_msg('ERR','Não existem anticorpos cadastrados!');
end;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes