Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
refrescar pantalla
17-04-2019, 11:01 AM
Mensaje: #1
refrescar pantalla
Buenos días.

siguiendo con el mismo tema de ayer, el boton eliminar quedo fino, pero claro ahora quiero que la pantalla se refresque y quite de la vista la fila eliminada. estoy haciendo esto:
  • pantalla que contiene la tabla
    Código XOne:
    <group name="Grupo1" id="1">
            <
    frame name="Todo1" height="90%" width="100%" align="left|top">
              <
    frame name="frmTitleOrdenes" align="top|center" bgcolor="#10327D" lmargin="0" width="100%" height="1%" framebox="true">
                <
    prop name="MAP_TXT_TITLE_ORDENES" class="ppal_subtitulo" type="T" title=" " />
              </
    frame>
              <
    frame name="frmOrdenes" align="top|left" bgcolor="#FFFFFF" width="90%" height="10%" framebox="false" lmargin="5%">
                  <
    prop name="TLCAMPO1" class="titColContent" type="TL" title="ID" width="20%" height="60p" newline="true" tmargin="10p" align="left|center" lpadding="3p" />
                  <
    prop name="TLCAMPO2" class="titColContent" type="TL" title="DESCRIPCIÓN" newline="false" width="50%" height="60p" tmargin="10p" align="left|center" lpadding="3p"/>
                  <
    prop name="TLCAMPO3" class="titColContent" type="TL" title="FECHA ALTA" newline="false" width="20%" height="60p" tmargin="10p" align="left|center" lpadding="3p"/>
              </
    frame>
              <
    prop name="RepostajeContent" type="Z" contents="RepostajeContent" 
                
    tmargin="2p" height="80%" lmargin="5%" mask="0" width="90%" border="true" text-border="true" border-width="5" 
                
    postonchange="ExecuteNode(before-edit)" edit-inrow="true" />
              <
    contents name="RepostajeContent" src="RepostajeContent" filter="TIPO='REPOSTAJE'" sort="FECHAALTA" />
            </
    frame>
          </
    group
  • fila
    Código XOne:
    <group name="Content" id="99">
            
            <
    prop name="IDCU" class="celdaContent" type="N" lmargin="0p" width="20%" text-align="center|left" lpadding="10p"/>
            <
    prop name="DESCRIPCION" class="celdaContent" type="T" newline="false" width="50%" text-align="center|left" lpadding="10p"/>
            <
    prop name="FECHAALTA" class="celdaContent" type="DT" newline="false" width="20%" text-align="center|left" lpadding="10p"/>

            <
    prop name="BTN_ELIMINAR" class="celdaContento" type="B" width="45p" height="55p" text-align="center|left" lmargin="40p"
                
    img="trash_buttom.png" imgsel="trash_buttom.png"
                
    method="executenode(deleteRepostajeRow)" newline="false"/>
                
        </
    group
  • metodo llamado para eliminar una fila
    Código XOne:
    <deleteRepostajeRow refresh="true">
            <
    action name="runscript">
              <
    script language="javascript">
                
                
                var 
    coll=appData.getCollection("MenuCuestionarioRepostaje");
                
    coll.clear();
                var 
    obj=coll.findObject("IMEI='"self.IMEI"' AND IDCU="self.IDCU);
                
                if (
    obj){
                    
    ui.msgBox("message","title",0);
                    
                    
    obj.deleteObject();
                    
    //faltaria refrescar la vista para perder de vista el parte.
                    
    ui.getView(self.getOwnerCollection().getOwnerObject()).refreshAll("Todo1");
                }
        
              
    </script>
            </action>
        </deleteRepostajeRow> 
  • nodo before edit de la vista de la tabla que se ejecuta en el postonchange
    Código XOne:
    <before-edit show-wait-dialog="false" refresh="true">
            <
    action name="runscript">
              <
    script language="javascript">

                    
    self.getContents("RepostajeContent").unlock();
                    
    self.getContents("RepostajeContent").clear();
                    
                    if (
    self.MAP_FILTRO=="1")
                    {
                        
    //##XONE_TRANSLATE_NEXT_LINE##
                        
    self.MAP_TXT_TITLE="REPOSTAJES REGISTRADOS";
                        
    self.getContents("RepostajeContent").setFilter("EXTERNO=1 AND TIPO='REPOSTAJE' AND (FINALIZADO=1 OR FINALIZADO=999)");
                    }
                    else
                    {
                        
    //##XONE_TRANSLATE_NEXT_LINE##
                        
    self.MAP_TXT_TITLE="REPOSTAJES PENDIENTES";
                        
    self.getContents("RepostajeContent").setFilter("EXTERNO=1 AND TIPO='REPOSTAJE' AND (FINALIZADO=0 OR FINALIZADO IS NULL)");
                    }
                    
                    
    self.getContents("RepostajeContent").loadAll();
                    
    self.getContents("RepostajeContent").lock();
                    
                    
    ui.getView(self).refreshAll("Todo1");
                    
                
    </script>
            </action>
          </before-edit> 



no consigo que me refresque la vista de ninguna de esas dos formas, he tratado también de refrescar por "porps"...
Encuentra todos sus mensajes
Cita este mensaje en tu respuesta
17-04-2019, 11:18 AM
Mensaje: #2
RE: refrescar pantalla
Hola,

Después de eliminar la fila y antes de refrescar el control, debes volver a lanzar la SQL para que se quite. Par ello debes hacer un loadall:

self.getOwnerCollection().getOwnerObject().getContents("RepostajeContent").unlock();
self.getOwnerCollection().getOwnerObject().getContents("RepostajeContent").loadAll();
self.getOwnerCollection().getOwnerObject().getContents("RepostajeContent").lock();

También deberías tener en cuenta que debes borrar todas las respuestas asociadas al repostaje (gen_cuestionarioRespuestas y gen_cuestionarioRespuestasContent)

Saludos
Encuentra todos sus mensajes
Cita este mensaje en tu respuesta
17-04-2019, 11:41 AM (Este mensaje fue modificado por última vez en: 17-04-2019 11:42 AM por Juan Carlos.)
Mensaje: #3
RE: refrescar pantalla
Hola, cuando invocas deleteObject() directamente sobre el DataObject a eliminar, sólo estás eliminando la fila de la base de datos, pero el DataObject cargado en memoria sigue estando presente en la DataCollection del content. Una alternativa, es coger la DataCollection, e invocar deleteItem(clave). Esto elimina tanto la fila como también quita el objeto de la collección content. Con esto te ahorras hacer un nuevo loadAll y solo hace falta refrescar la pantalla.

self.getOwnerCollection().getOwnerObject().getContents("RepostajeContent").deleteItem(self.ID);

Si tienes un framework reciente, puedes hacer lo siguiente también con getParent(), que es un atajo para getOwnerCollection().getOwnerObject():

self.getParent().getContents("RepostajeContent").deleteItem(self.ID);

Como nota al margen, sabed que existe tambien self.getParent().getContents("RepostajeContent").removeItem(self.ID), que sirve sólo para quitarlo de la colección y dejar intacta la fila de la base de datos.

Juan Carlos Rabanal Villalobos.
Computer Global Software - CGSoft
Encuentra todos sus mensajes
Cita este mensaje en tu respuesta
17-04-2019, 11:45 AM
Mensaje: #4
RE: refrescar pantalla
po menos mal que me lo has dicho yo pensaba que ya estaba borrando toda esa información, ¿como tendría que hacerlo? ¿accedo al todas las respuestas con el IMEI y el id del cuestionario?
Encuentra todos sus mensajes
Cita este mensaje en tu respuesta
17-04-2019, 12:25 PM
Mensaje: #5
RE: refrescar pantalla
(17-04-2019 11:45 AM)juanantonio.rodriguez escribió:  po menos mal que me lo has dicho yo pensaba que ya estaba borrando toda esa información, ¿como tendría que hacerlo? ¿accedo al todas las respuestas con el IMEI y el id del cuestionario?

Hola,
Recuerda que la información de los cuestionarios no se almacena enlazada en cascada con al registro cabecera, sino es un almacenamiento de un REGISTRO por cada campo.

Como bien has dicho, debes borrarlos buscando por IMEI e IDCU.
Puedes hacerlo recorriendo la colección y haciendo DeleteObject.
O bien asi:
appData.executeSQL("DELETE FROM gen_cuestionarioRespuestas where IMEI='"+self.IMEI +"' AND IDCU="+ self.IDCU);
appData.executeSQL("DELETE FROM gen_cuestionarioRespuestasContent where IMEI='"+self.IMEI +"' AND IDCU="+ self.IDCU);


Esto borrará la información tanto del terminal como del server.

Aunque, no se si conoces que todos los "DELETE" que realices en un terminal tienen que ser enviado a todos los terminales ya que al estar borrada la información las reglas de selectividad no pueden analizar a quien pertenece y debe enviarse a todos los dispositivos.
Por tanto, desde XOne recomendamos hacer borrados lógicos, simplemente para que la información deje de mostrarse en los terminales y posteriormente con mantenimientos (tanto en terminal como a nivel server) eliminar la información de manera controlada.
Dicho esto, lo que yo haría seria lo siguiente:
1- En lugar de borrar el cuestionario, updatear los IMEI de ese cuestionario a vacío (en cuestionarios, respuestas y respuestascontent)
2- Filtrar el content para que no muestre los cuestionarios con IMEI vacío. Con esto ya consigues que el cuestionario no sea visible.
3- En un momento controlado y puntual, borrar de manera local la los IMEI vacío de ese cuestionario, sus respuestas y respuestascontent. Para realizar este borrado se suele hacer en el nodo ONLOGON (entrada app) u ONLOGOFF (salida app). Se realiza con una coll "Formaintenance" que puedes ver aquí: http://www.xoneisp.com/xonewiki/doku.php...ll:start&s[]=%2Aexecutesqlstring%2A#executesqlstring

4- Mantenimiento a nivel de server que borre los cuestionarios con IMEI vacío, sus respuestas y respuestascontent; para mantener limpia la base de datos.


Cualquier duda me dices.
Saludos
Encuentra todos sus mensajes
Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)

Contáctanos | XOne | Volver arriba | Volver al contenido | Archivo (Modo simple) | Sindicación RSS