Tratar mensagem de erro de banco ao deletar registro.

Forum sobre a ferramenta Oracle JDeveloper, ADF, OAF, etc. (Não é destinado ao aprendeziado da Linguagem Java em geral)
Responder
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

Ola,

Bom Meu nome é Pedro e estou começando a mexer com ADF.
já estudei algumas coisas, já fiz o tutorial o SRDemo da ORacle, fiz tudo certo e já deu pra pegar algumas noções de como trabalhar como ADF.
Tenho uma boa noção com OO.

Bom iniciei minha vida no ADF em um projeto que já estava em andamento pra não dizer terminando, a pessoa encarregada saio da empresa e acabo sobrando pra mim, preciso urgentemente corrigir 2 problemas nesse sistema.
irei colocar um dos probemas aqui e o outro colocarei em outro topico a fim de se fazer uma coisa organizada aqui no forum.

1) Ao Deletar um registro, pode ser que o mesmo possua dependência (FK) que precisam ser verificadas e se ouver apresentar uma mensagem de erro mais amigavel para o usuario, pois o default do ADF é mostrar as mensagem do banco, tentei criar um trigger no banco mas a mensagem apresentada vem com umas coisas desnecessarias o usuario saber.
já procurei na documentação, mas não consegui entender, se alguém puder me ajudar me explicando como que aocntece essa validação e como a mensagem é gerada eu agradeço.

Sds,
Pedro Filipe
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

try {
      //delet
} catch (DMLException e) {
      throw JboExcpetion("msg Erro");
}
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

Oi vitor,
Digamos assim, eu entedi o que você quiz dizer... mas eu já achei em outro lugar falando desse mas eu não consigo usar ele, na linha de fazer o

Selecionar tudo

...
{
throw new JboExcpetion("msg Erro");
}

Ele fica grifado em vermelho, e não tem a opção para importar a classe.
já tentei colocar na mão "import oracle.jbo.JboException;" e tambem não funcionou... a versão do meu Jdev é 10.1.3.3.0...
pra eu usar essa classe eu preciso adicionar algum jar??? qual??

outra pergunta, bom a aplicação que estou mexendo ela foi feita assim...
existe uma classe com o metodo para deletar:

Selecionar tudo

public class Util {
    public Util() {
    }
   public void delete(ActionEvent event) 
    {
        FacesContext fc = FacesContext.getCurrentInstance();
        DCBindingContainer bindings = (DCBindingContainer)fc.getApplication().createValueBinding("#{bindings}").getValue(fc);
        
        bindings.getOperationBinding("Delete").execute();
        bindings.getOperationBinding("Commit").execute();                     
    }
}
Bom sabe sei lá porque fizeram assim, mas eu vou colocar o try/cacth nesse codigo aí... fazendo com que o codigo fique desse jeito.

Selecionar tudo

public class Util {
    public Util() {
    }
   public void delete(ActionEvent event) 
    {
        FacesContext fc = FacesContext.getCurrentInstance();
        DCBindingContainer bindings = (DCBindingContainer)fc.getApplication().createValueBinding("#{bindings}").getValue(fc);
        
        try {
               bindings.getOperationBinding("Delete").execute();
               bindings.getOperationBinding("Commit").execute();     
        } catch (DMLException e) {
              throw new JboExcpetion("msg Erro");
        }                    
    }
}
Eu queria saber se existe um local melhor para se por esse código saca, quero aprender a fazer da forma certa... porque começar já fazendo gambiarra é tenso...

vlw!!!!
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

com relação ao grife vermelho é so problema de digitação... o certo é:

Selecionar tudo

import oracle.jbo.JboException;
-----

tipo assim... para para tudo ... rsrsrsrs

para isso ai que você ta fazendo... não precisava criar este metodo ai no seu Bean
bastava colocar la no actionLitener do seu botão

Selecionar tudo

#{bindings.Delete.execute}
e se a action de Delete estiver no pageDefinition da jsp vai funcionar,
porem não é a melhor forma de fazer isso pois você acaba não tendo muito controle de nada dessa forma q você ta fazendo..

uma outra forma de fazer é o seguinte... MVC.. você tem um método no Bean sim, onde você fará a chamada do método q realmente irá deletar a linha do seu VO, este método chamado deve ficar no AM que contem o seu VO usado no seu JSP..

Selecionar tudo

//exemplo de chamada de método no AM 
//parametro é o nome do metodo
BindingContainer bindings = getBindings();
OperationBinding operationBinding = bindings.getOperationBinding("deleteRow");
se você precisar de ajuda nesa parte tamos ai.. criei novos topicos pois sempre q puder te ajudar assim o farei :D

braço[/code]
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

brother, tipo eu sei que colocando

Selecionar tudo

#{bindings.Delete.execute}

no Actionlistener vai funcionar, mas dae não tem um tratamento de erro legal.
tipo quando eu apago usado o delete no actionlistener e logo depois eu faço um commit, e se houver depencia no banco eu tomo um erro parecido com esse:

Selecionar tudo

JBO-26048: Constraint "SVH_SVR_FK" violated during post operation:"Delete" using SQL Statement "DELETE FROM SERVICE_REQUESTS ServiceRequest WHERE SVR_ID=?".
ORA-02292: integrity constraint (SRDEMO.SVH_SVR_FK) violated - child record found 
saca, imagina um usuario lendo isso.... eu queria mostrar ao usuario uma mensagem mais amigavel do tipo

Selecionar tudo

Esse registro não pode ser excluido pois ele possue uma dependência com xxxx
eu sei que no banco eu posso deixar a FK do tipo em cascade mas aí quando eu apagar o pai ele vai e apaga o filho e não vai aparecer mensagem de erro... mas isso é uma coisa que eu não quero fazer...
na verdade para esse caso em especial ele não deve permitir a remoção quando o registro possuir depencias...

então eu tenho esse problema... e queria poder resolve-lo da melhor forma... eu vou abrir um novo topico para discutir sobre o MVC...
mas por aqui queria discutir mais sobre esse assunto de apagar um registro e fazer o tratamente... como o sistema já ta quase pronto queria fazer de uma forma que ele funciona-se sem eu ter q mexer muito...

outra coisa, algumas siglas q você coloco eu não entendi...tipow AM, o que é isso???
ainda sou muito novo nessa forma de trabalhar... ainda estou tropeçando nas pedras... :oops:
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

AM = application module
VO = view object

você tem um VO na sua jsp ??
esse VO ta dentro de um AM ?

para eu te ajudar com isso você teria q postar seus codigos ai, os trechos que envolvem seu problema
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

bom beleza então...
seguinte eu vou te mandar o codigo do tutorial do srdemo que eu fiz e q ta funcionando, e da tela de list... após concluir o tutorial eu inseri um botao com o metodo de delete na pagina isso já é o suficiente para gerar o mesmo problema que estou tendo na aplicação, e partir dae queria fazer esse tratamento das mensagens de erro:

o meu bean já mandei é só aquilo mesmo (classe Util)

to te mandando o codigo da minha AM:

Selecionar tudo

package oracle.srtutorial.datamodel;

import oracle.jbo.Row;
import oracle.jbo.Session;
import oracle.jbo.server.ApplicationModuleImpl;
import oracle.jbo.server.ViewLinkImpl;


import oracle.jbo.server.ViewObjectImpl;

import oracle.srtutorial.datamodel.common.SRPublicService;
import oracle.srtutorial.datamodel.entities.ServiceRequestImpl;
import oracle.jbo.domain.Number;
// ---------------------------------------------------------------------
// ---    File generated by Oracle ADF Business Components Design Time.
// ---    Custom code may be added to this class.
// ---    Warning: Do not modify method signatures of generated methods.
// ---------------------------------------------------------------------
public class SRPublicServiceImpl extends ApplicationModuleImpl implements SRPublicService {
    /**This is the default constructor (do not remove)
     */
    public SRPublicServiceImpl() {
    }

    /**Sample main for debugging Business Components code using the tester.
     */
    public static void main(String[] args) {
        launchTester("oracle.srtutorial.datamodel", /* package name */
      "SRPublicServiceLocal" /* Configuration Name */);
    }

    /**Container's getter for LoggedInUser
     */
    public ViewObjectImpl getLoggedInUser() {
        return (ViewObjectImpl)findViewObject("LoggedInUser");
    }

    /**Container's getter for ServiceRequests
     */
    public ViewObjectImpl getServiceRequests() {
        return (ViewObjectImpl)findViewObject("ServiceRequests");
    }

    /**Container's getter for RequestCreatedByUser1
     */
    public ViewLinkImpl getRequestCreatedByUser1() {
        return (ViewLinkImpl)findViewLink("RequestCreatedByUser1");
    }

    protected void prepareSession(Session session) {   
        super.prepareSession(session);   
        String currentUser = "sking";  
        // Replace later with getUserPrincipalName()   
        getLoggedInUser().setNamedWhereClauseParam("TheCurrentUser",currentUser); 
        getLoggedInUser().executeQuery(); 
        // Save the current user id in the session user data so entities can  
        // refer to it 
        getDBTransaction().getSession().getUserData().put("CurrentUserId",getLoggedInUser().first().getAttribute("UserId")); 
    }

    /**Container's getter for ServiceRequestMain
     */
    public ViewObjectImpl getServiceRequestMain() {
        return (ViewObjectImpl)findViewObject("ServiceRequestMain");
    }

    /**Container's getter for ServiceHistories
     */
    public ViewObjectImpl getServiceHistories() {
        return (ViewObjectImpl)findViewObject("ServiceHistories");
    }

    /**Container's getter for HistoryLinesForRequest1
     */
    public ViewLinkImpl getHistoryLinesForRequest1() {
        return (ViewLinkImpl)findViewLink("HistoryLinesForRequest1");
    }
    
    public void addNoteToServiceRequest(String noteText) {       
        Row newHistory = getServiceHistories().createRow();       
        getServiceHistories().last();       
        newHistory.setAttribute("Notes",noteText);       
        getDBTransaction().commit(); 
    }

    /**Container's getter for Globals
     */
    public ViewObjectImpl getGlobals() {
        return (ViewObjectImpl)findViewObject("Globals");
    }

    /**Container's getter for ProductsList
     */
    public ViewObjectImpl getProductsList() {
        return (ViewObjectImpl)findViewObject("ProductsList");
    }
    
    public void insureOneBlankRowInGlobals() {  
        getGlobals().clearCache();  
        getGlobals().insertRow(getGlobals().createRow()); 
    }
    
    public void createNewServiceRequestFromGlobals() {     
        ServiceRequestImpl sr = (ServiceRequestImpl)getDBTransaction().createEntityInstance(ServiceRequestImpl.getDefinitionObject(),null);     
        Row globalsRow = getGlobals().first(); 
        sr.setProblemDescription((String)globalsRow.getAttribute("ProblemDescription"));     
        sr.setProdId((Number)globalsRow.getAttribute("ProductId"));     
        getDBTransaction().commit();
    }

    /**Container's getter for StaffList
     */
    public ViewObjectImpl getStaffList() {
        return (ViewObjectImpl)findViewObject("StaffList");
    }

    /**Container's getter for UserList
     */
    public ViewObjectImpl getUserList() {
        return (ViewObjectImpl)findViewObject("UserList");
    }
    
    public void cancelEditsToCurrentServiceRequest() { 
        getServiceRequestMain().getCurrentRow().refresh(Row.REFRESH_WITH_DB_FORGET_CHANGES); 
    }

    /**Container's getter for ServiceHistories1
     */
    public ViewObjectImpl getServiceHistories1() {
        return (ViewObjectImpl)findViewObject("ServiceHistories1");
    }
}
e agora o codigo da minha pagina definition da minha jsp

Selecionar tudo

<?xml version="1.0" encoding="UTF-8" ?>
<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
                version="10.1.3.41.57" id="app_SRListPageDef"
                Package="oracle.srtutorial.userinterface.pageDefs">
  <parameters/>
  <executables>
    <iterator id="ServiceRequestsIterator" RangeSize="10"
              Binds="ServiceRequests" DataControl="SRPublicServiceDataControl"/>
    <variableIterator id="variables">
      <variableUsage DataControl="SRPublicServiceDataControl"
                     Binds="ServiceRequests.variablesMap.TheStatus"
                     Name="ServiceRequests_TheStatus" IsQueriable="false"/>
    </variableIterator>
  </executables>
  <bindings>
    <table id="LoggedInUserServiceRequests"
           IterBinding="ServiceRequestsIterator">
      <AttrNames>
        <Item Value="SvrId"/>
        <Item Value="Status"/>
        <Item Value="RequestDate"/>
        <Item Value="ProblemDescription"/>
        <Item Value="ProdId"/>
        <Item Value="CreatedBy"/>
        <Item Value="AssignedTo"/>
        <Item Value="AssignedDate"/>
      </AttrNames>
    </table>
    <action id="ExecuteWithParams" IterBinding="ServiceRequestsIterator"
            InstanceName="SRPublicServiceDataControl.ServiceRequests"
            DataControl="SRPublicServiceDataControl" RequiresUpdateModel="true"
            Action="95">
      <NamedData NDName="TheStatus" NDType="java.lang.String"
                 NDValue="#{requestScope.Status}"/>
    </action>
    <action id="Delete1" IterBinding="ServiceRequestsIterator"
            InstanceName="SRPublicServiceDataControl.ServiceRequests"
            DataControl="SRPublicServiceDataControl" RequiresUpdateModel="false"
            Action="30"/>
    <action id="Commit" InstanceName="SRPublicServiceDataControl"
            DataControl="SRPublicServiceDataControl" RequiresUpdateModel="true"
            Action="100"/>
    <action id="Rollback" InstanceName="SRPublicServiceDataControl"
            DataControl="SRPublicServiceDataControl" RequiresUpdateModel="false"
            Action="101"/>
  </bindings>
</pageDefinition>
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

1- crie o método no seu AM

Selecionar tudo

    public void deleteServiceRequests () {
            try {
                getServiceRequests().removeCurrentRow();
            } catch (DMLException e) {
                throw new JboException("erro");
            }            
    }
2- na aba "System Navigator" ou "Application Navigator" localize seu AM e dando dois cliques nele e va para "Client Interface"

3- localiza seu método na coluna da esquerda e atraves das setas localizadas no meio coloque o seu método na coluna da direita, tornando esse método acessivel.

4- com o seu pageDefinition aberto, va para a aba de "Structure" ( va no menu View e selecione esta aba), e clique com o botão direito em cima de "bindings", e depois "Insert inside bindings", e depois clique em "methodAction"

5- localize seu AM na coluna da esquerda e depois de seleciona-lo, procure seu método na combo da direita, e clique em OK

6- crie o método no seu Bean

Selecionar tudo

public String deleteServiceRequests () {
	BindingContainer bindings = getBindings();
	OperationBinding operationBinding = bindings.getOperationBinding("deleteServiceRequests");

	operationBinding.execute();
}
7- no seu botão la na jsp

Selecionar tudo

action="#{util.deleteServiceRequests}"
Onde 'util' é o nome da classe Util que você mapeia la no faces-config.xml[/code]
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

ok...
conseguir fazer o que você me passo... mas ainda não chegamos aonde estou querendo chegar... ainda ta faltnando alguma coisa , porque tipo no metodo deleteServiceRequests dentro da minha AM, mesmo quando eu removo um registro que não deveria devido a dependecia ele não gero a mensagem de erro...

aí pra testar eu coloquei o throw de fora do try exatamente pra ver como ficaria a mensagem de erro... e ficou assim...

Selecionar tudo

1- JBO-29000: Unexpected exception caught: oracle.jbo.JboException, msg=erro
2- erro
e o registro não foi removido, os botoes de commit continuaram desabilitados... exatamente como deveria acontecer... então dentro do try eu tenho q fazer a validação manualmente??? como ficaria isso???

e teria como remover a mensagem 1 das mensagens apresentada??? só mostrando a minha mensagem customizada???

o interessante seria fazer uma coisa generica no AM, e depois criar uma classe (uma pra cada entidade) com as mensagens de erros depois ... saca... dae dependendo do erro gerado no banco ele pega uma mensagem... nem tenho ideia de como fazer isso... mas vamos devagar .. depois agente vê isso...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

então...

DMLException é lançada quando você tenta deletar via sql e o registro tem dependentes e vai violar alguma constraint

as vezes com o removeCurrentRow() e lançada outra

no seu catch troque DMLException por Exception e da um e.printStackTrace()
System.out.print(e.getMessage())

pra você poder ver qual exception é lançada quando você tanta remover usando o ADF BC, dai então poder tratar de forma adequada


uma pergunta.... você trabalha em vitoria ?? que projeto e esse ?? STJ ??
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

rapaz,
o metodo não ta gerando nenhuma exception... porque eu troquei como você falo... e não aconteceu nada, olhei no console do jdev e nenhuma mensagem apareceu...

Sim, trabalho em vitório - ES... é um projeto interno aqui na empresa... não sei o que é STJ... (Supremo Tribunal de Justiça??? bom não sei.. mas c for, não trabalho la não...)
porque a pergunta???
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

eu alterei o metodo de deleção ... pois só assim q ele gero a exception...
mas aí eu não queria q o commit fosse feito agora... queria q só depois q o usuario aperta-se o botao salvar q tem na tela...

o codigo fico assim:

Selecionar tudo

    
public void deleteServiceRequests () {
                try {
                    getServiceRequests().removeCurrentRow();
                    getTransaction().commit();
                } catch (Exception  e) {
                    throw new JboException("erro");
                } 
        }
porque sera q o removeCurentRow não gerou exception quando estava sozinha??? sera q esse comando não enviado ao banco???
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

cara..
foi falha minha... :oops:
so vai dar o delete quando fizer o commit
mas e ai a Exception lançada foi a DML ???

sinceramente não sei porque você está recebendo 2 msg de erro na tela...
outra maneira de dar a msg do jeito que você quer e fazer isso no Bean.. dai você não precisa de try catch la no AM

Selecionar tudo

public String deleteServiceRequests () { 
   BindingContainer bindings = getBindings(); 
   OperationBinding operationBinding = bindings.getOperationBinding("deleteServiceRequests"); 

   operationBinding.execute(); 

   if (operationBinding.getErrors() != null &&
       operationBinding.getErrors().size() > 0) {

       FacesContext ctx = getFacesContext();
       FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro inesperado", null);
       ctx.addMessage(null, fm);
   }
}

Sim.. Tribunal de Justiça.. tenho amigos lá.. ta rolando um projeto da oracle em ADF la... tendeu
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

rapaz,

a exception gerada é a DMLException mesmo...
mas seguinte desse codigo que você passo.. eu coloquei na mesma bean que ta la no faces-config.xml certo... mas o metodo

Selecionar tudo

FacesContext ctx = getFacesContext();
não é reconhecido... daonde vem esse cara???
no meu bean existe esses imports:

Selecionar tudo

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import oracle.adf.model.AttributeBinding;

import oracle.adf.model.binding.DCBindingContainer;

import oracle.binding.BindingContainer;
import oracle.binding.OperationBinding;
o que será q ta faltando??? não é dada nenhuma opção para adicionar nada novo... tem a opção de criar o metodo... mas o que eu coloco dentro dele???


rapaz, tem um cara que ta fazendo curso de AS aqui na empresa e ele é do TJ... Ronney, conhece???
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

troca por esse...
FacesContext.getCurrentInstance()

esse eu não conheço... muitos amigos pasaram por la porem atualmente so tem o Fabio Paiva
Pedro_fvieira
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Sex, 08 Ago 2008 10:17 am
Localização: Vitoria - ES
Existem 11 tipos de pessoas no mundo: As que entendem binário, as que acham que entendem e as que não entendem.

é, depois q eu olhei melhor tb achei isso aí...
mas seguinte... ainda não to conseguindo fazer o que eu quero....
do jeito que ta funciona assim... mas eu acho q isso q você me passo já é a base para o que eu quero...
vou continuar aqui tentando.. qualquer coisa eu posto aqui o que eu conseguir... e duvidas que eu for encontrado...
e vlw pela ajuda até agora...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

boa sorte!
:D
OldJack
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Dom, 28 Set 2008 6:22 pm
Localização: Vitória
BC4J SUCKS!!!!

de que empresa você é Pedro??
Responder
  • Informação
  • Quem está online

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