Ayuda con el siguiente modelo...

JOSE ELIAS
2013-05-28
2013-06-23
  • JOSE ELIAS

    JOSE ELIAS - 2013-05-28

    Modelo:
    Visita Na1 Paciente 1aN Alerta

    Desde la entidad visita, cuando selecciono un paciente quiero que desde la action OnChange, se muestren en una venta nueva un listado con la alertas del paciente seleccionado. Poder verlas y editarlas.

    Lo he intentado como lo explica la WIKI Llamar a otro módulo, se lanza la action pero no presenta el listado, alguna idea de cómo hacerlo?????

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-05-28

    así Tengo el action Onchange

    public class OnChangePacienteLanzarAlertas extends OnChangePropertyBaseAction
    implements IChangeModuleAction,
    IModuleContextAction {

    private ModuleContext context;

    public void execute() throws Exception {

    if(getNewValue() == null) return;
    
    // recuperar paciente
    Integer numeroPaciente = getView().getValueInt("paciente.oid");
    
    //comprobar si hay alertas registradas para el paciente
    Long numeroAlertas = (Long) XPersistence.getManager()                                                           .createQuery("Select count(*) from Alerta c where c.paciente.oid =" + numeroPaciente)       .getSingleResult();
    
    System.out.println("numeroPaciente: " + numeroPaciente.toString());
    System.out.println("numeroAlertas: " + numeroAlertas.toString());       
    //si tiene alertas, lanzar listado para paciente y módulo
     if(numeroAlertas > 0){
    
        System.out.println("Levantar tab: " + getNextModule() );    
    Tab tabAlertas = (Tab) context.get("XavioPRM", getNextModule(), "xava_tab");       
    tabAlertas.setBaseCondition("${paciente.oid} = " + numeroPaciente );
    
      }//end if
    

    }//end execute

    //sirve para indicar cual será el módulo al que cambiaremos después de ejecutar la acción, 
    public String getNextModule() {                                            // 7
        return "Alerta";                //definido en aplication.xml
    }
    
    // y hasReinitNextModule() (9) para indicar si queremos que se reinicie el módulo al cambiar a él.
    public boolean hasReinitNextModule() {                                     // 9
        return true;
    }
    
    //IModuleContextAction (2) que hace que esta acción reciba un objeto de tipo ModuleContext
    public void setContext(ModuleContext context) {                            // 8
        this.context = context;
    }
    

    }//end class

     
  • Javier Paniza

    Javier Paniza - 2013-05-31

    Hola José,

    se lanza la action pero no presenta el listado,

    ¿Y qué es lo que hace? ¿alguna excepción?

    Para tu caso también probar usar una vista personaliza para la referencia con @AsEmbedded. Me explico:

    class Visita {
    
        @ReferenceView("SoloAlertas")
        @AsEmbedded
        Paciente paciente
    
    }
    

    A lo mejor no es exactamente lo que habías imaginado, pero lo puedes conseguir de forma declarativa.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-05-31

    Lo que persigo es que desde visita al referenciar un paciente, salte automáticamente la lista de alertas que tiene registradas este mismo paciente.
    Para esto había pensado usar el evento OnChange sobre paciente.

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-03

    Una solución mas general sería extender la action ReferenceSearch.choose para el módulo Paciente y de esta forma, cada vez que un paciente es escogido se lanzarían las alertas, pero no sé como hacerlo, ¿Alguna ayuda?

    Estoy definiendo el módulo Paciente y controlador extendiendo de ReferenceSearch , pero nada, no me funciona.

     
  • Javier Paniza

    Javier Paniza - 2013-06-04

    Hola José,

    ¿Has probado la solución que te propuse? A lo mejor combinando eso con ocultar y mostrar la vista de pacientes tienes algo que te sirve.
    También puedes usar una colección calculada alertas en Visita y ocultarla o no según convenga.

    Si quieres que aparezca en un diálogo échale un vistazo a la acción ReferenceSearchAction de OpenXava.

    Cuando algo te funcione tienes que poner tu código y la excepción que se produce, porque si simplemente dices "lo he intentado y no me funciona" nos estás dando pocas pistas.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-07

    Hola Javier, estoy intentando sacar los registros de "alertas" de "paciente" en un diálogo, una vez se escoge el "paciente" en el módulo "visita"

    Para esto, lo que he hecho es lo que indicas en varios entradas de otros usuarios

    Desde la accion OnChange he implementado IChangeModuleAction y en getNextModule() he puesto un módulo descrito en aplicacion.xml indicando un controlador con una accion al-iniciar que presentaría en el diálogo el listado de alertas. Por alguna razón el el módulo el llamado pero no se lanza.

    Te dejo la acción OnChange, los ficheros aplicación.xml y controladores.xml y la acción al-iniciar a ver si me puedes echar una mano.

    /*************/

    public class OnChangePacienteLanzarAlertas_v4 extends
    OnChangePropertyBaseAction implements IChangeModuleAction {

    public void execute() throws Exception {
        // TODO Auto-generated method stub
    
    }
    
    //para indicar cual será el módulo al que cambiaremos después de ejecutar la acción 
    public String getNextModule() {
        // TODO Auto-generated method stub
        System.out.println("OnChangePacienteLanzarAlertas_v4.getNextModule: " + "AlertasDePaciente");
        return "AlertasDePaciente";
    }
    
    //para indicar si queremos que se reinicie el módulo al cambiar a él    
    public boolean hasReinitNextModule() {
        // TODO Auto-generated method stub
        return true;
    }
    

    }//enclass

    /*************/

    <aplicacion nombre="XavioPRM">

    <modulo-defecto>          
        <controlador nombre="Typical"/>     
    </modulo-defecto>
    
    <modulo nombre="Recepcion" descripcion="Recepcion: Diario de citas">
        <modelo nombre="Recepcion"/>
        <controlador nombre="Recepcion"/>
    </modulo>
    
    <modulo nombre="AlertasDePaciente">
        <modelo nombre="AlertasDePaciente"/>
        <controlador nombre="AlertasDePaciente"/>
    </modulo>
    

    </aplicacion>

    /*************/

    <controladores>

    <controlador nombre="AlertasDePaciente">
    
        <accion nombre="sacarDialogo" al-iniciar="true" oculto="true"
                    clase="org.openxava.xavioprm.actions.SacarDialogoAlertasDePaciente"/>
    
        <accion nombre="añadirAlerta" modo="detail"
                    clase="org.openxava.xavioprm.actions.AñadirAlertaDePaciente"
                    imagen="images/create_new.gif"/>
    
    </controlador>
    

    </controladores>

    /*************/

    public class SacarDialogoAlertasDePaciente extends ViewBaseAction {

    public void execute() throws Exception {
        // TODO Auto-generated method stub
    
        System.out.println("SacarDialogoAlertasDePaciente.execute: " );
        showDialog();
            getView().setTitleId("alertas");
            getView().setModelName("AlertasDePaciente");
            setControllers("Dialog");       //acción cancel por defecto
    
    }//endexecute
    

    }//endclass

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-09

    No salta ninguna traza de error, simplemente no responde la acción OnChange al cambio de módulo.
    Alguien sabría decirme si desde la acción OnChange se puede cambiar de módulo?

     
    Last edit: JOSE ELIAS 2013-06-10
  • Javier Paniza

    Javier Paniza - 2013-06-11

    Hola José,

    no debería haber problema para cambiar de módulo desde un onchange.
    ¿Se ejecuta el método execute() de la acción on change? Pon un print para saberlo.
    ¿Se llega a ejecutar SacarDialogoAlertasDePaciente? Ahí ya tienes un print

    De todos formas, según lo tienes, cuando te funcione, cambiaría al módulo sacando la lista (que ocuparía toda la página) sin diálogo, y después sacaría un diálogo de detalle, y creo que esto no es lo que buscas.

    Para sacar una lista en un diálogo no tienes que cambiar de módulo, mira como lo hace OpenXava en ReferenceSearchAction y hazlo tu igual.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-11

    Muchas gracias Javier

    He lanzado en el OnChange la misma acción ReferenceSearchAction.
    Estoy haciendo los cambios sobre la accion, a ver si me puedes orientar con los cambios que hay que hacer para sacar la lista del módulo "Alertas"
    
    El primero de los "casques" lo tengo en la llamada a super.execute() de ReferenceBaseAction, exactamente en la línea
    

    int idx = propertyName.lastIndexOf(".");

    Salta la excepcion java.lang.NullPointerException
    De la función createMemberName()

    Antes de llamar a super.execute() he puesto setKeyProperty("paciente.oid");

    Pero me salta un diálogo de la entidad pacientes sin registros...
    Seguiré buscando...

    No sé si me puedes decir que es lo que está pasando y cóm puedo resolverlo

     
    Last edit: JOSE ELIAS 2013-06-12
  • Javier Paniza

    Javier Paniza - 2013-06-13

    Hola José,

    ReferenceSearchAction es una acción genérica donde se inyecta el nombre de una propiedad de la referencia que se usa la acción para obtener el nombre del modelo.
    Pero tu acción no es genérica, tu ya sabes el nombre del modelo. Te puedes ahorra todo ese código genérico complicado. Borralo y usa el nombre del modelo directamente.


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-16

    Hola Javier

    Me puedes orientar con los cambios qué tengo que hacer?, No doy con ello. He hecho varios cambios pero siempre sale un diálogo con la misma búsqueda que lanza el OnChange.

     
  • Javier Paniza

    Javier Paniza - 2013-06-18

    Hola José,

    ¿qué has conseguido hasta ahora? ¿te sale un diálogo con la lista?
    ¿cuál es tu código actual? ¿qué es exactamente lo que te falta?


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-18

    Hola Javier
    La acción con OnChange se lanza ok.
    Me salta un diálogo pero siempre de "Paciente" y no de "Alerta". Te adjunto la acción Onchage tal cual la tengo ahora mismo.

    He comentado toda la clase excepto lo que he ido entendiendo que necesitaba.

    /**************/
    public class OnChangePacienteLanzarAlertas_v5 extends ReferenceBaseAction
    implements IOnChangePropertyAction, INavigationAction {

    @Inject
    private Tab tab;
    private String tabName = "";
    private String nombreModelo = "Alerta";
    private String nextController = "Alerta";
    private int pacienteOid; //pacienteOid que lanza la acción

    public void execute() throws Exception {

    System.out.println("OnChangePacienteLanzarAlertas_v5.getNextModule: " + getNextController());
    
    //super.execute();
    Tab tab = new Tab();                        
    tab.setRequest(getTab().getRequest());      
    setTab(tab);
    
    //View subview = getViewInfo().getView();                       
    //MetaModel metaRootModel = getViewInfo().getParent().getMetaModel();       
    //getTab().setModelName(subview.getBaseModelName());
    getTab().setModelName("Alerta");
    
    //MetaReference ref = getMetaReference(metaRootModel, getViewInfo().getMemberName());   //.getMemberName() devuelve un string
    //MetaReference ref = getMetaReference(metaRootModel,"Alerta");
    tab.setTabName(tabName);
    
    //ModelMapping rootMapping = null;
    //try {
    //  rootMapping = metaRootModel.getMapping();
    //}
    //catch (XavaException ex) {            
        // In case of an aggregate without mapping
    //}
    // because maybe a collection of references
    //if (rootMapping != null && metaRootModel.containsMetaReference(ref.getName()) && rootMapping.isReferenceOverlappingWithSomeProperty(ref.getName())) {
    
        StringBuffer condition = new StringBuffer();            
        //Iterator itOverlappingProperties = rootMapping.getOverlappingPropertiesOfReference(ref.getName()).iterator();         
        //while (itOverlappingProperties.hasNext()) {
            //String referenceProperty = (String) itOverlappingProperties.next();
            //String overlaped = rootMapping.getOverlappingPropertyForReference(ref.getName(), referenceProperty);
            condition.append("${");
            condition.append("paciente.oid");
            condition.append("} = ");
            //boolean numeric = ref.getMetaModelReferenced().getMetaProperty(referenceProperty).isNumber(); 
            //if (!numeric) condition.append("'"); 
            //condition.append(getView().getValue(overlaped));
            condition.append(pacienteOid);
            //if (!numeric) condition.append("'");              
            //if (itOverlappingProperties.hasNext()) {
            //  condition.append(" AND ");                       
            //} 
        //}
    
        System.out.println("getTab().setBaseCondition: " + condition.toString());   
            getTab().setBaseCondition(condition.toString());
    //}
    //else {
    //  getTab().setBaseCondition(null);
    //}
    //MetaView metaView = ref.getMetaModel().getMetaView(subview.getParent().getViewName());
    //MetaView metaView = ref.getMetaModel().getMetaView("Alerta");
    //if (metaView != null) {
    //  MetaReferenceView metaReferenceView  = metaView.getMetaReferenceViewFor(ref.getName());
    //  if (metaReferenceView != null) {
            //String searchListCondition = metaReferenceView.getSearchListCondition();
            //if (searchListCondition != null) {
            //  getTab().setBaseCondition(searchListCondition);
            //}
        //}
    //}
    
    showDialog();
    //getView().setTitleId("choose_reference_prompt", "Alertas de Paciente");
    

    }

    private MetaReference getMetaReference(MetaModel metaRootModel, String referenceName) throws XavaException {
    try {
    return metaRootModel.getMetaReference(referenceName);
    }
    catch (ElementNotFoundException ex) {
    return metaRootModel.getMetaCollection(referenceName).getMetaReference();
    }
    }

    public String[] getNextControllers() throws Exception {
    // TODO Auto-generated method stub
    return new String[]{ getNextController() };
    }

    private String getNextController() {
    // TODO Auto-generated method stub
    return nextController;
    }

    public void setNextController(String nextController) {
    this.nextController = nextController;
    }

    public String getCustomView() throws Exception {
    // TODO Auto-generated method stub
    return "xava/referenceSearch.jsp?rowAction="+ getNextController() + ".choose";
    }

    public void setChangedProperty(String propertyName) {
    // TODO Auto-generated method stub

    }

    public void setNewValue(Object value) {
    // TODO Auto-generated method stub
    this.pacienteOid = Integer.valueOf(value.toString());
    }

    public Tab getTab() {
    return tab;
    }

    public void setTab(Tab tab) {
    this.tab = tab;
    }

    public String getTabName() {
    return tabName;
    }

    public void setTabName(String tabName) {
    this.tabName = tabName;
    }

    }//endclass

     
  • Javier Paniza

    Javier Paniza - 2013-06-20

    Hola José,

    el código lo veo bien, debería funcionar.

    ¿Qué versión de OpenXava estás usando?

    Prueba definir la acción con un botón (definiendo en controladores.xml y con @Action en la referencia o propiedad donde quieras que aparezca el botón), ¿te funciona en ese caso?


    Ayuda a otros en este foro como yo te ayudo a ti.
    ¿Necesitas más ayuda? Usa el soporte profesional de OpenXava

     
  • JOSE ELIAS

    JOSE ELIAS - 2013-06-23

    Gracias Javier

    Estoy usando 4.7.1, voy a probar a hacer lo que me indicas y te cuento.

    He creado un botón y una accion que presenta un módulo transient con el listado de alertas y esto funciona.

    He creado una @Action en la referencia y un botón con con el mismo código que no me funcionaba pero salta una excepcion "nullpointerexception" en showDialog().

    No se que más puedo hacer...

     
    Last edit: JOSE ELIAS 2013-06-23

Log in to post a comment.

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:





No, thanks