Retornar a Idade

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Salve mestres!
Bom, estou com uma dúvida, já procurei por tudo mas nada q me ajudasse mesmo, então volto a recorrer à vocês.. mestres!
Tenho dentro do meu bloco co_clientes um item denominado dt_nasc_cli. Então criei ao lado deste item um display item chamado dsp_idade e q me retornará a idade do meu cliente apartir da data colocada no item anterior. E é aí q está o problema. Como faço para retornar para este display a idade do meu cliente?
Provavelmente eu esteja errado, mas tentei fazer algo como: dentro de um Post_change do display eu coloquei a query

Selecionar tudo

:dsp_idade := to_char((sysdate - :dt_nasc_cli)/365);
e é claro q sem nenhum sucesso.
Bom, se alguém pudesse me dar uma luz aê fico muito grato.
Vlw!
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Selecionar tudo

SELECT  trunc(to_char(sysdate - p.dt_nascimento)/365.25) as Idade
Tenta algo assim
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Passei por uma situação semelhante, desta forma você terá anos, meses e dias, ai você aproveita o q te interessa. Segue o link.

http://glufke.net/oracle/viewtopic.php?t=2668&highlight
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Obrigado pela ajuda recebida.
Bom, criei esta seguinte query dentro de um post query:

Selecionar tudo

 if :co_clientes.dt_nasc_cli is not null then
        select trunc(to_char(sysdate - :co_clienets.dt_nasc_cli)/365.25) "anos"
        into :co_clientes.dsp_idade from co_clienets;
        end if; 
O problema q encontro é como popular este display idade no forms?
Se alguém conseguir me ajudar agradeço.
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

você está dando um select de um campo do bloco na tabela.
Tente desta forma:

Selecionar tudo

if :co_clientes.dt_nasc_cli is not null then 
:co_clientes.dsp_idade := trunc(to_char(sysdate -:co_clients.dt_nasc_cli)/365.25);
end if;
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Grande Erico Balboa.
Executei a query aqui e ela rodou certinho, só q ainda não cosigui popular o display idade. Vou continuar tentando aqui mas agradeço muito a ajuda.
Vlw!
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Bom, testei aqui e funcionou direitinho. Populando a idade.

você está colocando na trigger POST_QUERY de bloco correta?
Não existe um procedimento limpando o campo?
Dá algum erro ou simplesmente não mostra?

Qualquer coisa dá um grito ai
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Grande Érico Balboa.
Pois é, eu tb estou intrigado com este problema. Simplesmente não me retorna nada no display idade.
Qnt ao bloco não tem erro, estou no correto.
Bom, vou tentar achar se tem algum item das propriedades do display q possa estar me travando aqui.
De qualquer forma agradeço e muito a ajuda.
Vlw!
gfkauer
Rank: DBA Sênior
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

Bom vejamos, faça as seguintes alterações e reporte o resultado:
Campo Data Nascimento: Crie uma trigger When-Validate-Item com o seguinte texto:

Selecionar tudo

Begin
  :bloco.display := trunc((Sysdate - :bloco.dt_nasc) / 365.25);
End;
A nível de Bloco: Crie uma trigger Post-Query com o sequinte texto:

Selecionar tudo

Begin
  :bloco.display := trunc((Sysdate - :bloco.dt_nasc) / 365.25);
End;
Retire todos os outros códigos onde tentas calcular a idade.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Uma forma é fazer assim:

Hoje é dia 24/02... digamos que o aniversário dele é amanhã:

Selecionar tudo

SQL> select trunc((months_between(sysdate, to_date('25/02/2000', 'dd/mm/yyyy')))/12) IDADE 
  2  from dual
  3  /

     IDADE
----------
        10

SQL> 

Caso o aniversário dele seja HOJE, mudou a idade :-)

Selecionar tudo

SQL> select trunc((months_between(sysdate, to_date('24/02/2000', 'dd/mm/yyyy')))/12) IDADE
  2  from dual
  3  /

     IDADE
----------
        11

SQL> 
NO SEU CASO:

Selecionar tudo

:bloco.idade := select trunc((months_between(sysdate,  :bloco.dt_nascimento ))/12)

:-o
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Observe que a solução proposta acima aqui no tópico não funciona perfeitamente:

Digamos que o nascimento dele seja dia 01-MAR-2000.
E digamos que HOJE seja dia 01-MAR-2011.

Neste caso, ele tem 11 anos!

veja:
Na forma que eu enviei, funcinona perfeitamente:

Selecionar tudo

SQL> select trunc( ( months_between( to_date('01/03/2011', 'dd/mm/yyyy')  --hoje  
  2                                , to_date('01/03/2000', 'dd/mm/yyyy')  --nascimento
  3                                ))/12) IDADE 
  4  from dual
  5  /

     IDADE
----------
        11   -----> CORRETO !

SQL> 
Na forma proposta não funcionou perfeitamente:

Selecionar tudo

SQL> select trunc(to_char( ( to_date('01/03/2011', 'dd/mm/yyyy')   --hoje
  2                        - to_date('01/03/2000', 'dd/mm/yyyy')   --nascimento
  3                        )/365.25) ) IDADE
  4  from dual
  5  /

     IDADE
----------
        10   --->>> ERRADO ! Deveria retornar 11

SQL> 

Portanto sugiro que seja usado essa forma:

Selecionar tudo

:bloco.idade := select trunc((months_between(sysdate,  :bloco.dt_nascimento ))/12)
:-o
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 98
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Fala dr_gori,

Desta forma não funciona, ou faz

Selecionar tudo

:bloco.idade := trunc((months_between(sysdate,  :bloco.dt_nascimento ))/12);
ou

Selecionar tudo

select trunc((months_between(sysdate,  :bloco.dt_nascimento ))/12) 
   into :bloco.idade 
  from dual;
O bloco recebendo um select direto não rola. :)
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Isso, copiei errado !

:-D
ROBSON ROCHA
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 21
Registrado em: Qua, 10 Mar 2010 10:20 am
Localização: IGREJINHA

Salve grandes mestres!
Olha, agradeço a ajuda de cada um d vocês. Agora sim funfou o esquema! Garanto-lhes q cada dica dada, para mim foi muito proveitosa.
Vlw pessoal!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes