Colega, seguinte : a) como já deve ter ficado Claro, o mecanismo do Forms é : quando vc faz uma Modificação num item base-table, o Forms *** NÃO *** gera nem envia imediatamente o DML correspondente pro database, ok ? Então ** NÃO TEM COMO ** vc "juntar" numa só Transação os DMLs feitos no banco (por uma trigger do Forms, por uma procedure do Banco, etc) com os Futuros DMLs que serão gerados e disparados pelo Forms em relação aos base-itens alterados quando o procedimento de forms_commit for executado - é Óbvio que eles vão estar numa OUTRA transação, yes ?? O que eu RECOMENDARIA nesse sentido é centralizar no database, ** NÂO ** alterando os itens base-table e sim AO INVÉS DISSO adicionar DMLs correspondentes no código PL/SQL , aí sim tudo estará na mesma transação, que AÍ SIM se sofrer um rollback tudo é desfeito, esse é o conceito mesmo de Transação.... Claro, para que o usuário final veja na tela as alterações, no final de todo o processamento vc inclui um código para refresh dos dados, refazendo a query - afaik como esses procedimentos são Restritos, pode ser que vc precise lançar mão de truques como usar um TIMER, mas isso é normal na programação Forms client/server... b) "Quanto a setar valores para itens de um bloco base-table, beleza, ele não participa da transação, mas no caso de um rollback, ele deveria descartar as alterações, não ?!?"
O parágrafo acima já esclareceu, mas a resposta é NÃO : como eu disse, quando há um rollback (ou um COMMIT!!) no banco, é a Transação que está em execução NO BANCO que vai ser encerrada ou desfeita, okdoc ??? Tá claro ?? SE vc quiser "limpar" o status dos campos base-table alterados (como eu disse acima não recomendo isso, Recomendo que as alterações sejam feitas NO DATABASE, mas enfim) aí vc teria que usar uma built-in de limpeza, como CLEAR-qquercoisa... E mais, no sentido contrário, no help mesmo do Forms para CLEAR_FORM nós temos bem clara a observação : "If you use a PL/SQL ROLLBACK statement in an anonymous block or a user-defined subprogram, Form Builder interprets that statement as a CLEAR_FORM built-in subprogram with no parameters. " => OU SEJA, o rollback num PL/SQL ** seu ** , dentro do Forms, VAI SER SILENCIOSAMENTE TRANSFORMADO EM CLEAR_FORM, ** não ** indo para o database e portanto ** não ** encerrando a transação porventura aberta NO DATABASE, yes ?? c) sim - veja o link que te passei na msg anterior, no processamento rotineiro do Forms sim, qquer erro de database ORA-xxx (até mesmo um erro ORA-20xxx levantado por um raise_application_error NO DATABASE) é detectado como erro, E quem trata erros é a trigger ON-ERROR, sim... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Tiago de Assis Pimenta <tiagopimenta@...> escreveu > > Bom dia pessal, > > - Eduardo - > > Vou aprofundar um pouco mais... tenho um botão que chama a procedure > "PRC_CONC_ANALISE", logo no inicio dessa proc, tem um commit, depois tem > algumas validações, uma parte que seta valores a determinados campos de um > bloco baseado em tabela, outras proc's de validações e ai vem a parte parte > que preciso commitar as alterações, essa parte basicamente chama uma proc de > validação, commita, chama uma proc de impressão, da um go_item no botão de > pesquisa e faz a pesquisa novamente com os valores atualizados. Abaixo está a > parte que comentei agora: > > begin > prc_libera; > prc_commit; > call_hc_print; > go_item('BL_control.btn_pesquisa'); > execute_trigger('WHEN-BUTTON-PRESSED'); > exception > when others then > clear_form(full_rollback); > execute_trigger('WHEN-NEW-FORM-INSTANCE'); > raise form_trigger_failure; > end; > > Um teste que eu fiz, foi, antes do prc_libera ali, coloquei um raise > form_trigger_failure, ai ele entra no exception. Mas simulando um erro a > nível de banco (Trigger na tabela), não entra n exception, nem erro a nível > de aplicação. > > - Chiappa - > > Sim sim, é em uma trigger da tabela, não descrevi que o > raise_application_error estava em uma trigger, pois poderiam confundir com > uma trigger do forms... Mas você entendeu corretamente, está numa trigger de > uma tabela que faço uma atualização na aplicação. > > Tenho a proc chamada "PRC_CONC_ANALISE" e nela, as outras proc's que fazem > validações e algumas dessas proc's de validações, tinha lá o commit > encerrando a transação, ou seja, o processo era mais ou menos assim... Clico > no botão, no when-button-pressed, chamo a "PRC_CONC_ANALISE"... nela seto um > campo de determinado bloco, o status como "CONCLUIDO", commito, depois faço > outras validações, seto um campo de outro bloco como "CONCLUIDO", mas em > algum momento aqui (Não é sempre que acontece), ele dá um erro e não comita. > Dai ficamos com o registro pai como Concluido e o filho como Aberto, ou seja, > a integridade dos dados aqui foi pro espaço. > > Quanto a setar valores para itens de um bloco base-table, beleza, ele não > participa da transação, mas no caso de um rollback, ele deveria descartar as > alterações, não ?!? Vamos imaginas duas situações, eu seto valores para um > item do bloco base-table, ai faço umas validações e seto valor para um item > de outro bloco base-table, ai aqui dá um erro e não é possível setar os > valores desse segundo bloco, como estou dentro de um begin/exception/end, e > no exception tem um clear_form(full_rollback), ele deveria descartar a > alteração do primeiro bloco, correto ? Segunda cituação, idem a anterior, só > que em vez do erro fim da aplicação, vem do banco, teria que entrar no > exception também e dar rollback, correto ? > > Quanto a terceira parte, então na teoria, um erro no banco, seria > interpretado pela aplicação e eu conseguiria dar um rollback, certo ? > > [ ]s > > > ________________________________ > De: J. Laurindo Chiappa <jlchiappa@...> > Para: oracle_br@yahoogrupos.com.br > Enviadas: Quinta-feira, 22 de Novembro de 2012 17:08 > Assunto: [oracle_br] Re: [Forms] "Controle de Transação" > > > > Bom, vamos por partes : primeiro absolutamente *** não existe ** isso de > "raise_application_error em uma tabela", isso é Impossível, não faz > sentido... RAISE_APPLICATION_ERROR é built-in ** PL/SQL **, então vc o coloca > numa ROTINA PL/SQL, e nunca numa "tabela", okdoc ? Até pode ser que haja uma > TRIGGER DE TABELA com o built-in, mas clarificando, é NA TRIGGER (que é uma > rotina PL/SQL) que ele fica, yes ?? > > Segundo : no RDBMS Oracle, uma TRANSAÇÃO ocorre automaticamente com o > primeiro DML e fica ativa até receber um COMMIT ou um ROLLBACK - todos os > DMLs que forem executados pela sessão após o início da transação vão ser > PARTE dessa mesma e única Transação aberta, certo ? Isso posto, vc não > explicita mas pelo que entendi em um (ou mais de um) trigger do Forms vc > chama procedures PL/SQL, e havia COMMITs encerrando a transação (talvez em > cada proc, fazendo na prática cada proc ter a sua própria transação separada, > já que o primeiro DMLs da próxima proc abriria nova transação) E hoje o que > vc quer é alterar o Form para que tudo ocorra na mesma transação, né ? => Se > for mesmo isso, o procedimento é esse mesmo que vc fez, ie : retirar tudo que > for COMMIT e ROLLBACK das procs (evitando que a transação aberta pelo > primeiro DML da primeira proc seja fechada), sim.... Idealmente, se for > possível vc ter um controle Centralizado (ie, uma > proc EXEC_ROTINA a partir de onde vc chama uma por uma as outras procs > todas) beleza, vc colocaria o COMMIT (ou ROLLBACK talvez, em caso de erro) > nessa proc "central" que chama todas as outras, mas se não der aí sim, é ter > o fecho da única transação aberta pelo primeiro DML da primeira proc sendo > feito na ** última ** proc a ser executada - não entendi por que vc deixou > COMMIT na primeira proc, se o que eu falei acima é o seu objetivo.... Será > que essa primeira proc vai ser a sua "controladora" , tudo vai ser chamado > por ela ? Se sim ok, vc está certo, se não, não faz sentido... > > Um ponto adicional : vc Sabe que quando vc altera valores em itens de um > bloco base-table (imagino que é isso que vc quer dizer com "ele seta valores > para o bloco baseado em tabela") o Forms *** não ** envia o INSERT ou UPDATE > correspondente pro banco nesse instante, PORTANTO não abre transação ainda, > certo ??? Apenas quando o usuário do Forms pressionar key-commit (ou clickar > no botão de save, enfim) aí SIM é que o Forms vai gerar e enviar pro banco os > INSERTs e UPDATEs necessários , yes ?? Então vc está Absolutamente Enganado > se acha que as alterações feitas pelo seu PL/SQL em itens de blocos > base-table tá participando de uma eventual Transação aberta por DMLs enviados > pro banco por outras procs ou triggers , yep ??????? > > Terceiro, sobre tratamento de erros : o ponto CRUCIAL a se colocar aqui > (sendo Forms client/server, o que vc não diz mas IMAGINO ser o caso) é que se > o PL/SQL em execução reside no Forms (ie, ele é uma procedure ou function ou > trigger criada DENTRO DO FORMS) ela está sendo executada pelo interpretador > PL/SQL DO FORMS, enquanto que uma rotina (seja proc, function,package ou > trigger) criada no banco executa no interpretador PL/SQL DO DATABASE, yep ?? > Então um RAISE_APPLICATION_ERROR sinalizado pelo interpretador PL/SQL do > forms não vai ser "enxergado" pelo do database... Já o contrário (ie, um > RAISE_APPLICATION_ERROR disparado por uma rotina PL/SQL residente no > database), apesar de não ser reconhecida pelo interpretador PL/SQL do Forms > (que não faz idéia do que o interpretador PL/SQL do banco fez ou não), ela é > SIM reconhecida pelo Forms, que vai disparar a trigger de erro > correspondente, então vc pode capturar isso customizando a trigger > genérica de erros do Forms, vide > http://talk2gerd.blogspot.com.br/2006/12/best-practices-on-error-and-on-message.html > > > []s > > Chiappa > > > --- Em oracle_br@yahoogrupos.com.br, Tiago de Assis Pimenta <tiagopimenta@> > escreveu > > > > Pessoal, boa tarde. > > > > Estou com uma tela aqui (forms) que preciso "controlar a transação" nele. O > > forms tem bastante regras nas quais fica inviável a reconstrução dele. Em > > um determinado processo nesse forms, é chamado outros processos (Proc's) > > que fazem insert em banco, setam valores para blocos baseados em tabelas, > > enfim, tem várias outras transações ocorrendo. Já olhei cada transação > > procurando um commit e todos que achei eu desabilitei, deixando só no final > > do primeiro processo, um commit e um exception caso de erro, o problema é > > justamente o exception que não está "funcionando". > > > > Por exemplo, no momento que ele seta valores para o bloco baseado em > > tabela, estava dando um erro que era porque o bloco estava setado como > > insert/update/delete como false, ou seja, deu um erro, mas em vez de > > acontecer o rollback dos outros processo, ele continuou como se não fosse > > um erro. > > > > Outro erro que o exception do forms não "pegou", foi um > > raise_application_error que coloquei na tabela direto no banco, parece que > > para o forms, o raise no banco não é um exception. > > > > Então a minha primeira dúvida é a seguinte: Um raise direto na tabela no > > banco realmente não é visto pelo forms como um erro ?? > > > > A segunda dúvida é um pouco mais complicada, mas queria saber quais as > > possibilidades, do erro no bloco baseado em tabela no forms, não ter sido > > "pego" como um erro e não ter entrado no exception when others then !!! > > > > Att. > > > > Tiago Pimenta > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > [As partes desta mensagem que não continham texto foram removidas] >