Tema cerrado 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Solucionado Content con datos en memoria
11-11-2015, 09:59 AM
Mensaje: #1
Content con datos en memoria
Buenos días,

Estoy intentando en un proyecto realizar un content que mantenga los datos solo en memoria, pero no lo consigo.

Necesitaría que el content guarde los datos en memoria, para luego poder optar por modificar los mismos o no en la BBDD indicándolo por código.

Me estoy encontrando con las siguientes dificultades:
1. No sé si me está guardando en memoria algo en el content, pues al añadir un ítem no me aparece en el mismo.
2. Los datos que tengo en la base de datos y deben aparecer en el content, no sé cómo he de cargarlos y tampoco se muestran.

Esta es la colección que contiene el content “Materiales_Ordenes”:

Código XOne:
<coll name="OTUsuario" title="OTUsuario" editmask="0" notab="false" objname="OT" updateobj="OT" progid="ASData.CASBasicDataObj" show-toolbar="false"
sql="SELECT t1.ID, t1.TIPO, t1.NUMERO, t1.NUMERO AS MAP_NUMERO1, t1.NUMERO AS MAP_NUMERO2, t1.CLIENTEID, strftime('%d-%m-%Y', t1.FECHAOT)  AS MAP_FECHA,
strftime('%d-%m-%Y', t1.FECHAOT)  AS MAP_FECHA2 ,   t1.DESCRIPCION AS MAP_DESCRIPCION, t1.OBSERVACIONES, t1.ESTADOID, t1.MOTIVOID, t1.INCIDENCIA,   
t1.FOTO, t1.FIRMA, t1.BORRADO, t3.CODIGOCLIENTE AS MAP_CODIGOCLIENTE,    t3.DOMICILIO AS MAP_DOMICILIO_INST, t3.DOMICILIO AS MAP_DOMICILIO_INST2,   
t3.RAZONSOCIAL AS MAP_RAZON_INST,  t3.RAZONSOCIAL AS MAP_RAZON_INST2, t3.MUNICIPIO AS MAP_MUNICIPIO_INST, t3.TELEFONO AS MAP_TELEFONO,   
t3.REPRESENTANTE AS MAP_REPRESENTANTE_INST, t4.CODIGOESTADO AS MAP_CODIGOESTADO,   t4.DESCRIPCION AS MAP_ESTADO, t4.DESCRIPCION AS MAP_ESTADO_DESC, 
t5.DESCRIPCION  AS MAP_MOTIVO_DESC 
FROM ##PREF##OT t1  
inner join ##PREF##ASIGNACIONOT t2 on t2.OTID = t1.ID  
inner join ##PREF##CLIENTE t3 on t1.CLIENTEID=t3.ID    
inner join ##PREF##ESTADOS t4 on t1.ESTADOID=t4.ID   
left outer join ##PREF##MOTIVOS t5 on t1.MOTIVOID=t5.ID   
left outer join ##PREF##JORNADA t11 on t11.USUARIOID=##USERID## and t11.FIN is null"  
filter="t2.USUARIOID=##USERID##" sort="" check-owner="false" dependent="false" >
<
group name="MAT" id="4" tab-width="25%" disablevisible="MAP_GRUPO4=0">
       <
prop name="MAP_GRUPO4" type="N" visible="0" />
        

<!-- 
## Combo selecionar cantidad ## -->
 
<prop name="MAP_IDNUMERO" type="N" visible="0" mapcol-values="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30​,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50" />
 <
prop name="MAP_CANTIDAD" type="N" visible="1" class="combolupa" showinline="true" title="Cantidad" labelwidth="7" linkedto="MAP_IDNUMERO" linkedfield="DATA" disableedit="MAP_CODIGOESTADO=3" />

      <!-- 
## Frames Content Materiales ## -->
      
<frame name="materiales2" class="frame_datos" height="44%" align="left|top" framebox="true">
        <
prop name="MAP_IDMATERIALORDEN_SEL" type="N" visible="0" />
        <
prop name="MAP_MATERIALES_ORDENES" visible="1" type="Z" contents="Materiales_Ordenes" locked="true" onchange="Refresh" forceonchange="true" mask="8" />
        <
contents name="Materiales_Ordenes" src="OTMaterial" />
      </
frame>
  </
group

Esta es la colección del content:

Código XOne:
<coll name="OTMaterial" cell-height="40p" title="OTMaterial" show-toolbar="false" keepdata="true" check-owner="true" dependent="true"
sql="" objname="OTMaterial" updateobj="OTMaterial" progid="ASData.CASBasicDataObj" filter="" sort="">
  <
group name="General" id="1">
    <
prop name="ID" type="N" visible="0" />
    <
prop name="OTID" type="N" visible="0" />
    <
prop name="MATERIALID" type="N" visible="0" fieldsize="4" locked="true" mapcol="Material" mapfld="ID" />
    <
prop name="MAP_DESCRIPMATERIAL" visible="7" type="T" class="propcontents" width="80%" labelwidth="0" linkedto="MATERIALID" linkedfield="NOMBRECOMPLETO" />     
    <
prop name="CANTIDAD" visible="7" type="N" class="propcontents" width="20%" labelwidth="0" newline="false" />
    <
prop name="BORRADO" type="N" visible="0" />
  </
group>
 <
selecteditem show-wait-dialog="false" refresh="false">
    <
action name="runscript">
      <
script language="VBScript">  
           if 
not this.ownercollection.ownerobject is nothing then
             this
.ownercollection.ownerobject("MAP_IDMATERIALORDEN_SEL")=this("ID")                    
             
ui.RefreshContentSelectedRow "MAP_MATERIALES_ORDENES"    
           
end if
       
</script>
    </action>
 </selecteditem>   
</coll> 

Y este es el código que utilizo para introducir los items en el content:

Código XOne:
Function AddMaterial_OT
    
if this("MAP_MATERIALID")=or this("MAP_CANTIDAD")=0 then
        msg
="Debe seleccionar un material y una cantidad"
        
LB_msg msg              
    
else
    
'Vamos a crear un nuevo registro de Materiales_Ordenes
        set Coll=this.contents("Materiales_Ordenes")
        set Item=Coll.CreateObject
        Coll.AddItem(Item)
        Item("MATERIALID")=this("MAP_MATERIALID")
        Item("CANTIDAD")=this("MAP_CANTIDAD")
        Item("OTID")=this("ID")
        ui.RefreshContentSelectedRow "MAP_MATERIALES_ORDENES"
        this("MAP_MATERIALID")=0
        this("MAP_CANTIDAD")=0
    end if
end function 

Gracias,
Saludos,
Daniel Ojeda
Encuentra todos sus mensajes
11-11-2015, 10:44 AM
Mensaje: #2
RE: Content con datos en memoria
Hola, envia la aplicación a desarrollador@xone.es para que podamos revisarlo. Indicanos el usuario y pass y los pasos a seguir para llegar a ese punto que indicas.
Encuentra todos sus mensajes
11-11-2015, 05:31 PM (Este mensaje fue modificado por última vez en: 11-11-2015 05:32 PM por Ruben.)
Mensaje: #3
RE: Content con datos en memoria
Hola, te indico lo que hemos visto en el proyecto que nos has enviado y lo que seria oportuno que lo modificaras, para que mejore la aplicación en velocidad y te funcione el tema de los datos en memoria:

Para que tu puedas controlar un content en memoria y no se revise la base de datos, tienes que hacer esto con el frame:
*Poner a la coll que es content, a nivel de coll, el atributo loadall="true"
*Luego, ese content ya tienes que controlarlo tu, para ello, por script lo tienes que bloquear, para que el frame no busque ya datos en base de datos, para ello, pondrías esto, que por ejmeplo para tu ejemplo yo lo he puesto en el before-edit de la coll OTUsuario:
+Para cargarlo en memoria, por si tiene datos en bd, pues cargarlo la primera vez: this.Contents("Materiales_Ordenes").loadall
+Para bloquearlo y de esa forma ya no ira más a la base de datos: this.Contents("Materiales_Ordenes").lock
Si más adelante necesitas rescatar valores de base de datos, pones esto: this.Contents("Materiales_Ordenes").unlock

Ahora para los refrescos:

*Para los campos map, que tienen un linkedto: en el campo que tiene el mapcol y el mapfld, le pones esto: onchange="refresh(campos_a_refrescar)", para tu caso seria:
Código:
<prop name="MAP_MATERIALID" type="N" visible="0" mapcol="Material" mapfld="ID" onchange="refresh(MAP_MATERIAL,MAP_CANTIDAD)" />
<prop name="MAP_IDNUMERO" type="N" visible="0" onchange="refresh(MAP_CANTIDAD)" mapcol-values="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30​,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50" />


Luego, en la función de añadir datos al content, para refrescar solo lo que se modifica, haces esto:
*Quita el ui.RefreshContentSelectedRow
*Pon esto: ui.Refresh "MAP_MATERIALES_ORDENES","MAP_MATERIAL","MAP_CANTIDAD"

Pero muy importante, en el nodo que llamas a dicha funcion, que se llama addmat, lo pones asi: <addmat refresh="false">


Con eso, los datos se cargan en memoria y solo se refrescan los campos que realmente cambia. De la forma que lo tenias, se refrescaba todo y si tienes un móvil con poca memoria, el proceso se relantiza bastante, por ello te aconsejo que utilices lo que te he comentado, para darle mayor velocidad a tu aplicación.
Encuentra todos sus mensajes
12-11-2015, 03:42 PM
Mensaje: #4
RE: Content con datos en memoria
Hola,

Gracias. Ya está solucionado lo anterior.

Ahora lo que no consigo es que al marcar como borrado un ítem del content se deje de mostrar el ítem en el content que tiene los datos en memoria.

Lo que hago es marcar como borrado el ítem contenido en el content modificando el valor de su campo BORRADO=1.

Necesitaríamos que este ítem desaparezca de la lista de ítems del content en pantalla, pero sin modificar la BBDD. El cambio de valor del campo sí que se realiza, pero el ítem continúa visualizándose en el content.

El content tiene un filtro t1.BORRADO=0 para que no se muestren los ítems marcados a 1.

Código XOne:
<contents name="Materiales_Ordenes" src="OTMaterial" filter="t1.BORRADO=0"

¿Cómo actualizo el content en este caso?

Gracias,
Saludos,
Daniel Ojeda
Encuentra todos sus mensajes
12-11-2015, 05:41 PM
Mensaje: #5
RE: Content con datos en memoria
Hola, lo que tienes que hacer es eliminar el registro de memoria. Para ello, utiliza o DeleteItem o removeItem, que lo tienes definido en el wiki.
Encuentra todos sus mensajes
13-11-2015, 01:49 PM
Mensaje: #6
RE: Content con datos en memoria
Hola,
Muchas gracias, ya esta solucionado.
Saludos,
Daniel
Encuentra todos sus mensajes
Tema cerrado 


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