O controle de número de registros está sobrando. Excluir a variável v_n_registros, o if com ela e o incremento dela não mudará em nada o resultado. Como eu disse na minha primeira resposta, bastava tirar um next_record para que tudo funcionasse. Esse é o primeiro código que tu postou, agora sem a linha que estragava o resultado: declare v_n_tipo number := 0; v_n_count number := 0; begin go_block('medicamento_protocolo'); first_record; v_n_tipo := :medicamento_protocolo.class_id_tipo_dose; loop if v_n_tipo != :medicamento_protocolo.class_id_tipo_dose then v_n_count := v_n_count + 1; end if; exit when :system.last_record = 'TRUE'; next_record; end loop; if v_n_count > 0 then msg('Não é permitido Tipos de Dose diferentes no mesmo regime!'); raise form_trigger_failure; end if; end; Se quiser dar um simplificada e poupar tempo e processamento, principalmente em blocos com muitos registros, dá pra usar algo assim (repare no exit): declare v_n_tipo number; begin go_block('medicamento_protocolo'); first_record; v_n_tipo := :medicamento_protocolo.class_id_tipo_dose; loop if v_n_tipo != :medicamento_protocolo.class_id_tipo_dose then v_n_tipo := null; exit; end if; exit when :system.last_record = 'TRUE'; next_record; end loop; if v_n_tipo is null then msg('Não é permitido Tipos de Dose diferentes no mesmo regime!'); raise form_trigger_failure; end if; end; E finalmente, se não se importar com boas práticas isso simplifica as coisas (sem causar problema algum): declare v_n_tipo number; begin go_block('medicamento_protocolo'); first_record; v_n_tipo := :medicamento_protocolo.class_id_tipo_dose; loop if v_n_tipo != :medicamento_protocolo.class_id_tipo_dose then msg('Não é permitido Tipos de Dose diferentes no mesmo regime!'); raise form_trigger_failure; end if; exit when :system.last_record = 'TRUE'; next_record; end loop; end; De brinde, os dois últimos exemplos ainda deixam o foco no registro com problema. Uma sugestão: troque aquele “Não é permitido Tipos de Dose diferentes...” por algo como “Não são permitidos Tipos...”. Os ouvidos agradecem :-) Étore Schiavini <mailto:et...@snpti.com.br> et...@snpti.com.br From: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] On Behalf Of Tiago de Assis Pimenta Sent: quinta-feira, 14 de julho de 2011 14:44 To: oracle_br@yahoogrupos.com.br Subject: Re: [oracle_br] Re: [Forms] Quantidade total de registros no bloco Como sou novo em Forms, achei o loop o jeito mais fácil de se resolver esse problema, provavelmente, em termos de performace, ele vá ser mais custoso do que um controle via váriavel como o Chiappa disse, mas como já faz alguns dias que estou com isso para resolver, preferi fazer assim:
/* Verificando se os tipos de dose são diferentes */ declare v_n_tipo number := 0; v_n_count number := 0; v_n_registros number := 1; begin go_block('medicamento_protocolo'); first_record; v_n_tipo := :medicamento_protocolo.class_id_tipo_dose; loop if v_n_registros > 1 then if v_n_tipo != :medicamento_protocolo.class_id_tipo_dose then v_n_count := v_n_count + 1; exit; end if; end if; exit when :system.last_record = 'TRUE'; next_record; v_n_registros := v_n_registros + 1; end loop; if v_n_count > 0 then msg('Não é permitido Tipos de Dose diferentes no mesmo regime!'); raise form_trigger_failure; end if; end; Dentro desse loop, alguem mudaria algo ? Visto que desse jeito está funcionando certim agora =D [ ]s ________________________________ De: Étore Schiavini <et...@snpti.com.br <mailto:etore%40snpti.com.br> > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> Enviadas: Quinta-feira, 14 de Julho de 2011 11:23 Assunto: RE: [oracle_br] Re: [Forms] Quantidade total de registros no bloco Chiappa Vou discordar de ti desta vez, acho que um loop no recordset é uma solução melhor neste caso (na verdade “menos ruim”). Parto do princípio que o usuário não precisa ser avisado no momento da inclusão/alteração do registro, mas sim no commit. Usar uma variável externa para controle implica em colocar código em mais pontos, não só no when-validate-record. No caso de existir apenas um registro no bloco e ele for excluído ou limpo a variável de controle também deve ser limpa. O tipo pode ser alterado via plsql em algum outro ponto do forms e nem sempre estas alterações disparam o when-validate-record. Enfim, acho complicado cobrir todas as possibilidades de forma simples. Mas, se o Tiago partir para a solução de usar uma variável externa para controle sugiro um parameter e não uma global. Aboli o uso de globals há muito tempo porque, como o próprio nome diz, o contexto delas é toda a aplicação e não somente o forms em questão (o ID delas é o próprio nome da global). Só pra ficar num exemplo simples, se este mesmo forms for aberto duas ou mais vezes concomitantemente uma única global servirá a todas as instâncias do forms, bagunçando o controle. Abraços Étore Schiavini <mailto:et...@snpti.com.br <mailto:etore%40snpti.com.br> > et...@snpti.com.br <mailto:etore%40snpti.com.br> 51 8116.4858 From: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> [mailto:oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> ] On Behalf Of José Laurindo Sent: quinta-feira, 14 de julho de 2011 09:26 To: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> Subject: [oracle_br] Re: [Forms] Quantidade total de registros no bloco Colega, com certeza : 1. no caso de Inserção, claro que se os registros são NOVOS, ainda não existem no database, então SIM, é Óbvio que não tem como obter isso via consulta no banco, os registros Não Estão lá ainda ... 2. como eu tinha dito, eu Acho que o mais eficiente seria vc validar já na hora que a informação entra, ie, tipo : vc tem uma variável Global, que inicialmente é nula, e tem na trigger when-validate-record um código tipo : :global.tipo := :nomedobloco.nomedocampotipo e aí, antes de aceitar a informação (trigger When-validate-Item do item Tipo no tal bloco-filho) : IF :global.tipo is not null -- Já disparou anteriormente validate-record, já tenho um Tipo entrado, não posso aceitar Outro! THEN if :nomedobloco.TIPO <> :global.tipo then raise form_trigger_failure('Já tem tipo entrado, Não pode digitar Outro!); end if; END IF; 3. Já pra UPDATEs, aí sim, a informação anterior Já Existe no database, aí sim vc pode fazer um SELECT no banco pra ver se mudou... obs : nem preciso dizer, o que escrevi acima é PSEUDO-CÓDIGO, é só um EXEMPLO : NÃO use ipsis literis o que eu escrevi, E pense bem na lógica, adeque às suas necessidades... []s Chiappa --- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> <mailto:oracle_br%40yahoogrupos.com.br> , Tiago de Assis Pimenta <tiagopimenta@...> escreveu > > - Milton Bastos - > > Eu coloquei [Forms] no subjects realmente para ficar claro que era sobre > Forms Builder que eu estava falando, mas agradeço da mesma forma ao amigo > Duilio pela ajuda. > > - Duilio Bruniera Junior - > > Sem problemas cara, muito obrigado pela ajuda. > > - Chiappa - > > É isso mesmo que eu preciso, para ser mais expecificio, eu tenho um bloco > master e um bloco filho, esse bloco filho é o bloco que eu preciso validar os > registros. Nesse bloco eu tenho uma coluna chamada "Tipo" e ela só pode ser > de um tipo. Então me pediram para fazer a verificação antes de inserir e > antes de atualizar, mas como no pre-insert e no pre-update não posso usar a > bult-in go_block e se não me engano a next_record também eu não posso usar, > resolvi fazer a validação no on-commit. Se você achar uma maneira mais > eficiente para tal, eu agradeceria se me avisasse. > > - Étore Schiavini - > > O que eu quiz dizer é o seguinte, se eu estiver inserindo novos registros, > não posso fazer a verificação que eu comentei com o Chiappa ali em cima > usando um select entende ? Pois eu ainda não tenho esses registros na tabela, > por isso * EU ACHO * que para fazer essa verificação, só fazendo um loop no > bloco antes mesmo dele gravar os registros na tabela. > > O commit lá no final é porque eu estou fazendo a verificação no on-commit. > > Galera, me desculpe se não fui claro de inicio. > > [ ]s > > > ________________________________ > De: Étore Schiavini <etore@...> > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> > Enviadas: Quarta-feira, 13 de Julho de 2011 18:11 > Assunto: RE: [oracle_br] [Forms] Quantidade total de registros no bloco > > > > Tiago > > Só agora que outros alertaram que eu vi que era um bloco de Forms :-) > > Até agora não entendi o que tu quis dizer com "antes mesmo que esses > registros estejam fisicamente no banco" mas vou desconsiderar essa sentença > e responder a partir do resto da proposição. > > “Só que do jeito que está, dá pau se for um registro só.†> > Sim, porque aquele next_record antes do loop tá sobrando, ele impede o teste > de um registro único. > Suma com ele e tudo deve funcionar. > > Estranhei aquele commit antes da última atribuição mas deve fazer sentido no > contetxo do teu forms. > > Abraço > > Étore Schiavini > <mailto:etore@...> etore@... > 51 8116.4858 > > From: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> [mailto:oracle_br@yahoogrupos.com.br > <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> ] On > Behalf Of Tiago de Assis Pimenta > Sent: quarta-feira, 13 de julho de 2011 14:57 > To: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> > Subject: Re: [oracle_br] [Forms] Quantidade total de registros no bloco > > > Eu acho que não, pois acho que vai ser alguma bult-in do forms. Para ajudar > a compreender a minha dúvida, vou por o código abaixo: > > /* Verificando se os tipos de dose são diferentes */ > declare > v_n_tipo number := 0; > v_n_count number := 0; > begin > go_block('medicamento_protocolo'); > first_record; > v_n_tipo := :medicamento_protocolo.class_id_tipo_dose; > next_record; > loop > if v_n_tipo != :medicamento_protocolo.class_id_tipo_dose then > v_n_count := v_n_count + 1; > end if; > exit when :system.last_record = 'TRUE'; > next_record; > end loop; > if v_n_count > 0 then > msg('Não é permitido Tipos de Dose diferentes no mesmo regime!'); > raise form_trigger_failure; > else > commit; > :medicamento_protocolo.tipo_dose := > pck_util.fnc_get_descricao_class(:medicamento_protocolo.class_id_tipo_dose); > end if; > end; > > Só que do jeito que está, dá pau se for um registro só. > > [ ]s > > ________________________________ > De: Duilio Bruniera Junior <bruniera@... <mailto:bruniera%40gmail.com> > > > Para: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> > <mailto:oracle_br%40yahoogrupos.com.br> > Enviadas: Quarta-feira, 13 de Julho de 2011 13:49 > Assunto: Re: [oracle_br] [Forms] Quantidade total de registros no bloco > > oh bgrother é isso que voce quer por um acaso? > > SELECT S.blocks FROM DBA_SEGMENTS S WHERE S.owner='<OWNER>' AND > S.segment_name='<NOME DA TABELA>'; > > Em 13 de julho de 2011 12:41, Tiago de Assis Pimenta <tiagopimenta@... > <mailto:tiagopimenta%40ymail.com> > > escreveu: > > > ** > > > > > > Senhores, boa tarde. > > > > Gostaria de saber como faço para pegar a quantidade toda de registros em > um > > bloco antes mesmo que esses registros estejam fisicamente no banco. Pois > > estou rodando um loop para verificar se tem tipos de registros diferente > em > > uma determinada coluna, mas se tiver só um registro no bloco, não há > > necessidade deu fazer tal procedimento. > > > > Já tentei com o query_hits mas o mesmo traz 0 mesmo eu setando a > > propriedade do bloco "Consultar todos os registros" como SIM. > > > > Abraços > > > > Tiago Pimenta > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > ------------------------------------ > > ---------------------------------------------------------- > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira > responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > ---------------------------------------------------------- > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure > » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: > http://www.oraclebr.com.br/ > ---------------------------------------------------------- Links do Yahoo! > Grupos > > [As partes desta mensagem que não continham texto foram removidas] > > [As partes desta mensagem que não continham texto foram removidas] > > > > > [As partes desta mensagem que não continham texto foram removidas] > [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas] [As partes desta mensagem que não continham texto foram removidas]