Ejemplos de códigos VBScript
Plantillas de Programación VBScript
Código que recorre una colección completa
<action name="runscript"> <script language="VBScript"> Dim coll, filtro ‘Variable con la coleccion que se va a utilizar Set coll =AppData.GetCollection("PresupuestosScript") ‘Guardamos el filtro que tiene la coleccion por defecto filtro=coll.filter ‘Le ponemos un filtro con el atributo filter, ‘que machacaría el filtro que ya tiene la coll en su atributo filter. coll.filter="MAP_SIMBTIPO='PR'" ‘Función para ejecutar el SQL de la coll, y poder recorrer los record que tiene dicha coll coll.StartBrowse ‘Utilizamos un while, preguntando si el registro actual es nulo o no. while not coll.CurrentItem is nothing if coll.CurrentItem("OPTIONS") = 0 then coll.currentItem("OPTIONS")=1 coll.currentItem.Save end if ‘Para pasar al siguiente registro de la coll coll.MoveNext wend ‘Siempre que se hace un StartBrowse, tiene que existir un EndBrowse, que es para cerrar la conexión. coll.EndBrowse ‘Restauramos el filtro original coll.filter=filtro Set coll=nothing </script> </action>
coll.filter, agrega un AND al filtro que tiene aplicado ahora mismo la colección en el atributo filter del XML en el SQL de la colección o bien al filter que se haya definido al llamar al contents, coll.linkfilter sería para cambiar también éste. (OJO! con cambiar el filtro de una colección, hay que acordarse de restablecerlo después…)
Recorrer una colección/content con pocos datos
<action name="runscript"> <script language="VBScript"> Dim colldet,j,i,valor ‘Cogemos la coll contents Detalles del objeto actual This. Set colldet=this.contents("Detalles") j=0 ‘Guardamos en la variable i el número de registros que tiene el content. i=this.contents("Detalles").count ‘Si es cero se pueden dar dos opciones: ‘ - Que no haya ningún registro ‘ - Que aún no se haya cargado el content y por eso no tengamos ningún registro ‘Así que le hacemos un loadall para cargarlos todos (si no están cargados), y si no hubiera ‘registros no pasaría nada al hacer el loadall. ‘El loadall cuidado con su uso, ya que si tiene muchos elementos, nos quedaremos sin memoria. ‘El máximo número de registros de una colección para cargarla con loadall podemos fijarla en 20 ‘claro está, todo depende de lo grande que sea cada registro de dicha colección. if i=0 then this.contents("Detalles").loadall i=this.contents("Detalles").count end if ‘Utilizamos un For para recorrer los registros del contents. For j=0 to i-1 ‘Tomamos el valor del content con el indice de dicho registro. valor=colldet(j)("IDARTICULO") if valor="loquesea" then ‘ Realizar la función deseada end if next ‘Liberamos memoria. Set colldet=nothing </script> </action>
Obtener un objeto (fila) de una colección, teniendo el valor de un campo de dicho objeto
Dim obj ‘Buscamos el cliente en la coll Clientes, con el valor del ID del cliente. Set obj=appdata.getcollection("Clientes")("ID",CStr(This("IDCLIENTE"))) If not obj is nothing Then obj("PROXIMA")=This("PROXIMA") obj("OBSERVACIONES")=This("FICHA") obj.save End If Set obj=nothing
Obtener un objeto (fila) de una colección, utilizando una SQL con más de 1 campo (FINDOBJECT)
AppData.PushValue objLoquesea lanza un objeto en edición.
Set cCierre=AppData.GetCollection("Cierre") Set objCierre=cCierre.FindObject("NUMINCIDENCIA='"+This("NUMINCIDENCIA")+"' AND NUMPROGRESO='"+This("NUMPROGRESO")+"'") If objCierre Is Nothing Then set objCierre=cCierre.CreateObject objCierre("MAP_IDINCIDENCIA")=This("ID") objCierre("NUMINCIDENCIA")=This("NUMINCIDENCIA") objCierre("NUMPROGRESO")=This("NUMPROGRESO") ContarPiezas This("NUMINCIDENCIA"),This("NUMPROGRESO") objCierre("MAP_NUMPIEZAS")=This("MAP_NUMPIEZAS") cCierre.additem objCierre AppData.PushValue objCierre Else Appdata.failwithmessage -11888,"Ya ha ejecutado el cierre con anterioridad." End If
Mensajes (msgBox showToast) Sonidos Notificaciones
Tenemos varias formas de mostrar un mensaje en pantalla.
Comando | Descripción |
---|---|
ui.MsgBox “Ejemplo”, “Mensaje”, 0 | Mensaje “normal” del framework, para desaparecer, tiene que darle el usuario al botón de OK. |
ui.ShowNotification 1, “Título”, “Mensaje” | Notificación en la barra superior de notificaciones, se le especifica un ID (1) para si queremos modificar la notificación más adelante, podemos utilizar el mismo comando con otro mensaje y se modificará el que ya existía. |
ui.DismissNotification “1” | Elimina la Notificación de la barra superior de notificaciones realizado con el “ShowNotification”, hemos de especificar el ID (1) de la notificación para especificar el mensaje que queremos quitar. El parámetro hay que pasarlo como cadena. |
ui.ShowToast “Se ha recibido un nuevo mensaje ” | Mensaje TOAST del sistema operativo, ver la captura de pantalla más abajo. El mensaje desaparece automáticamente tras un par de segundos en pantalla. |
Ejemplo de código:
<mensajes show-wait-dialog="false"> <action name="runscript"> <script language="VBScript"> 'MsgBox0,MsgBox1,MsgBox4,ShowToast,ShowNotification,Sonido Dim vResult Select Case this("MAP_TIPO_MENSAJE") Case "MsgBox0" ui.msgBox "Mensaje Informativo solo con OK","Titulo Ventana",0 Case "MsgBox1" 'Si pulsa ACEPTAR, vResult vale 1 y si pulsa CANCELAR vale 2 vResult =ui.MsgBox ("Pregunta si ACEPTAR ó CANCELAR","Advertencia",1) ui.msgBox "Ha pulsado el botón con valor: "+cstr(vResult),"Titulo Ventana",0 Case "MsgBox4" 'Si pulsa SI, vResult vale 6 y si pulsa NO vale 7 vResult =ui.MsgBox ("Pregunta SI ó NO","Advertencia",4) ui.msgBox "Ha pulsado el botón con valor: "+cstr(vResult),"Titulo Ventana",0 Case "ShowToast" ui.showToast "Mensajito efímero que dura 3 segundos" Case "ShowNotification" ui.ShowNotification 1, "Título", "Esto es una notificación", "Aviso de recepción de datos" Case "Sonido" 'El sonido tiene que estar en la carpeta files del proyecto ui.playSoundAndVibrate "beep-6.wav",true,1 End Select </script> </action> </mensajes>
Nodo para irnos a una colección pasando un parámetro (irColl/abrirColl)
Primero tendríamos un botón para llamar a este nodo:
<prop name="BTOPCION1" type="B" width="260p" height="320p" img="option_gastos.png" method="ExecuteNode(irColl(Socios))" />
El código del nodo quedaría:
'Hemos llamado al nodo irColl pero podríamos haberlo llamado de cualquier otra forma. <irColl show-wait-dialog="false"> <action name="runscript"> <param name="parametro" /> <script language="VBScript"> 'Creamos un objeto nuevo en la colección pasada por parámetro y lo lanzamos en edición. (Si es un objeto existente podríamos buscarlo antes...) set coll=appData.getCollection(parametro) set det = coll.createObject coll.addItem Empty,det appData.pushValue det </script> </action> </irColl>
Nodo para salir de una colección (onback)
Lo llamamos onback porque en Android tenemos un evento que atiende al botón de volver atrás que ejecuta éste nodo, de forma que el botón que pongamos para salir y el botón de volver atrás de Android hagan lo mismo.
Tendríamos un botón salir o volver para ejecutar este nodo.
<prop name="BTSALIR" type="B" img="logout.png" width="128p" height="128p" method="ExecuteNode(onback)" />
Este es el código que ejecuta tanto nuestro botón como el volver atrás de Android.
<onback> <action name="runscript"> <script language="VBScript"> AppData.FailWithMessage -11888,"##EXIT##" </script> </action> </onback>
Nodo para irnos a otra pestaña (showGroup)
En este código también vemos como podemos cambiar una propiedad dinámicamente, en este caso, la imagen de fondo de un frame.
<frame name="cabecera1" width="100%" height="95px" align="left|center" imgbk="##FLD_MAP_FONDOCABECERA##"> ----- </frame> <prop name="MAP_FONDOCABECERA" type="T" visible="0" /> <prop name="MAP_IR_FOTO" type="B" img="./icons/boton_foto.png" method="ExecuteNode (goGroup(2))" width="163px" height="60px" />
<goGroup show-wait-dialog="false"> <action name="runscript"> <param name="grupo" /> <script language="VBScript"> select case cstr(grupo) case "1" this("MAP_FONDOCABECERA")="./icons/cabecera_rojo.jpg" case "2" this("MAP_FONDOCABECERA")="./icons/cabecera_verde.jpg" case "3" this("MAP_FONDOCABECERA")="./icons/cabecera_azul.jpg" end select 'Con este método le decimos que nos muestre otra pestaña ui.ShowGroup cstr(grupo),"##RIGHT##",500,"##RIGHT_OUT##",500 </script> </action> </goGroup>
CASE en SQL para COLORVIEW
Para consulta de algunos que estén oxidados en SQL…
SELECT g.*,CASE WHEN g.APROBADO=0 THEN '#FFFFFF' ELSE '#00FF00' END AS MAP_COLORVIEW FROM ##PREF##Gastos g
MACRO de usuario para filtrar contents
Podemos crear una MACRO de usuario en una colección para sustituir en tiempo real la SQL de una colección, pudiendo llegar a sustituir incluso la SQL de la colección completa.
<coll name="Gastos" sql="SELECT g.*, g.FECHA as MAP_FECHA, tg.NOMBRE as MAP_GASTO, g.IMPORTE as MAP_IMPORTE, g.PROVEEDOR as MAP_PROVEEDOR, tg.NOMBRE as MAP_GASTO2, g.FOTO1 as MAP_FOTO1, g.FOTO2 as MAP_FOTO2, g.FOTO3 as MAP_FOTO3, FROM ##PREF##GASTOS g LEFT JOIN ##PREF##TiposGasto tg ON g.IDTIPOGASTO=tg.ID WHERE ##TIPO## " filter="g.BAJA=0" objname="Gastos" updateobj="Gastos" ... /> <macro name="##TIPO##" value="1=1" default="true" />
Una vez definida la macro en la colección, posteriormente podemos utilizarla para cambiar el valor de dicha macro y por lo tanto cambiar el SQL.
<onchange> <field name="MAP_FTTIPOGASTO"> <action name="runscript"> <script language="VBScript"> collGastos = this.Contents("Gastos") 'Aquí cambiamos el valor de la macro que tenemos definida en la colección Gastos. collGastos.macro("##TIPO##") = "tg.NOMBRE LIKE '%"+cstr(this("MAP_FTTIPOGASTO"))+"%'" this.ExecuteNode "refrescaTotal" </script> </action> </field> </onchange>
Código para Crear/Editar/Borrar un registro de un contents
'Para poder dar de alta un registro en un contents tendríamos que pasarle el ID de la cabecera... function addContents(coll,campoenlace) Set CollCV=appdata.GetCollection(coll) Set ObjCV=CollCV.CreateObject ObjCV(campoenlace) = this("ID") CollCV.AddItem Empty,ObjCV AppData.PushValue ObjCV end function 'A esta función tenemos que pasarle la referencia al contents y el ID que queremos editar. function editContents(coll,idselected) Set CollCV=appdata.GetCollection(coll) Set ObjCV=CollCV.FindObject("ID="+Cstr(idselected)) if not ObjCV is nothing then AppData.PushValue ObjCV end if end function 'Realmente no borramos el registro físicamente, lo que hacemos es cambiar el campo de enlace con la cabecera 'o podemos ponerle un BAJA=1, para darlo de baja lógica. Posteriormente tendríamos un mantenimiento para 'eliminar estos registros del dispositivo (Para que no se replique el borrado físico del registro). function deleteContents(coll,idselected,campoenlace) result = ui.MsgBox("¿Esta seguro de que desea eliminar el registro seleccionado?","¡ALERTA!",4) if result=6 then Set CollCV=appdata.GetCollection(coll) Set ObjCV=CollCV.FindObject("ID="+Cstr(idselected)) if not ObjCV is nothing then ObjCV(campoenlace) = -9999 ObjCV.Save end if ObjCV = nothing CollCV = nothing end if end function
Mostrar error por pantalla
<script language="VBScript"> if this("IDCLIENTE")= 0 then Appdata.FailWithMessage -8100,"¡¡No ha seleccionado un cliente.!!" end if 'SCRIPT PARA REALIZAR LA VALIDACION DE LOS DETALLES, QUE SE MIRA SI EL CAMPO IDTARIFA 'ESTA LLENO O NO. SI DA ERROR, MUESTRA UN MENSAJE DE TIPO -8100, PARA DECIR QUE ES ERROR. Dim i,j Dim colldet Set colldet=this.contents("DetallesCabecera") j=0 i=this.contents("DetallesCabecera").count if i=0 then this.contents("DetallesCabecera").loadall end if i=this.contents("DetallesCabecera").count while i <> 0 valor=colldet(j)("IDTARIFA") if valor=0 then i=0 aux=1 else i=i-1 j=j+1 end if if aux=1 then Appdata.FailWithMessage -8100,"¡¡Hay Detalles sin Tarifa!!" wend </script>
Tipos de errores
<script language="VBScript"> 'ERROR DISPONIBLE EN TODAS LAS PLATAFORMAS 'Muestra un mensaje de error con el texto que le pongamos appdata.failwithmessage -8100,"Mensaje de error" 'ERRORES DISPONIBLES EN PLATAFORMA POCKET PC 'Muestra un mensaje de error con el texto que le pongamos appdata.failwithmessage -7500,"Mensaje de warning" 'Refresca la cabecera cuando se ejecuta con el Selecteditem. YA NO ES NECESARIO. appdata.failwithmessage -666,"Mensaje de información" 'Mensaje de informacion con icono de Información appdata.failwithmessage -11888,"Mensaje que queremos mostrar" 'Mensaje personalizado con posiblidad de bloqueo con botón. appdata.failwithmessage -11822,"Mensaje de información" 'Mensaje propio de CGS appdata.failwithmessage -11811,"Mensaje de información" 'Inicia la replica desde un script Appdata.FailWithMessage -8100,"##STARTREPLICA##" 'Esta macro funciona conjuntamente con CGStart (kiosko de PDA). 'Cierra el frame y le dice al kiosko q reinicie la PDA. 'Si el kiosko no está instalado, simplemente se cierra la aplicación. Appdata.FailWithMessage -8100,"##RESETAPP##" 'Salir de la aplicacion. Appdata.FailWithMessage -8100,"##EXITAPP##" 'Usado para salir de las ventanas de Nomen y Edit. Appdata.FailWithMessage -8100,"##EXIT##" </script>
Validación de datos usando PopValue y PushValue para los errores
Evitar que se pueda guardar un registro con campos con ciertos valores, como vacíos.
Appdata.PopValue es para coger el valor de fallo de la rule, para posteriormente con Appdata.PushValue dárselo.
Se le pasará como un Long, de ahí el Clng.
<insert> <rule name="fail-if-not-valid"> <rule name="runscript" msg="Faltan por rellenar campos obligatorios."> <script language="VBScript"> Dim bFail,x x =AppData.PopValue bFail =0 if This("FECHANAC") <> "" then if This("DNI")<>"" AND bFail=0 then bFail=0 else bFail=1 end if if This("PROVINCIA")<>"" AND bFail=0 then bFail=0 else bFail=1 end if if This("CALLE")<>"" AND bFail=0 then bFail=0 else bFail=1 end if if This("IDPROPIETARIO")<>"" AND bFail=0 then bFail=0 else bFail=1 end if if bfail=0 then This("%FALTANDATOS")=0 else This("%FALTANDATOS")=1 end if Else This("%FALTANDATOS")=1 end if AppData.PushValue (CLng(bFail)) </script> </rule> </rule> </insert>
Botón con Script
CÓDIGO PARA REALIZAR UN BOTÓN.
Está formado por 3 nodos:
Nodo 1 | Prop de tipo “B” (botón) | Es el nodo que define donde sale el mismo, título y a que nodo llama para ejecutar su código. Tiene el atributo method que es el que realiza la llamada al nodo que tiene su código, el nombre “ExecuteNode”, es el nombre del nodo “method”, y tiene que llamarse de la misma forma (mayúsculas-minúsculas). |
Nodo 2 | Nodo method name=“ExecuteNode“ | Es un nodo obligatorio y fijo. (YA NO ES NECESARIO, sólo en frameworks antiguos) |
Nodo 3 | Nodo en el que se pone el código que se va a ejecutar. | El nombre es definido por el usuario, y como único requisito, es el nombre del nodo, tiene que llamarse igual (mayúsculas-minúsculas) que el nodo al que llama el nodo button en su atributo method. |
<prop name="Iniciar" group="3" type="B" method="ExecuteNode (inicializar)" title="Iniciar Ruta" visible="1" toolbar="false" labelwidth="24" onchange="refresh255" lmargin="7"/> <method name="ExecuteNode"> <param name="P1" type="T" value=""/> </method> <inicializar> <action name="runscript"> <script language="VBScript"> Dim vResult vResult =AppData.UserInterface.MsgBox ("Esta acción reiniciará toda la ruta. ¿Está seguro que desea ejecutarla?","Advertencia",1) If vResult =1 Then appdata.executeSQL "UPDATE Gen_Rutas SET VISITADO=0 WHERE IDUSUARIO=" + CStr(This("IDUSUARIO")) vResult =AppData.UserInterface.MsgBox ("Ruta inicializada","Advertencia",0) End If </script> </action> </inicializar>
Colección Avisos
COLECCIÓN DE AVISOS.
<coll name="Avisos" title="el aviso" sql="SELECT d.ID FROM (##PREF##Documentos d LEFT OUTER JOIN ##PREF##TiposDocumento td ON d.IDTIPODOC=td.ID) WHERE td.SIMBOLO='PD' AND d.OP1=1" objname="Documentos" updateobj="Documentos" progid="ASData.CASBasicDataObj" notify="true" notify_counter="false" notify_coll="ParteDiario" alternate-counter="true" notify_title="Entregas Avisos"> <group name="General" id="1"></group> <prop name="ID" group="1" visible="7" type="N" fieldsize="5"></prop> </coll>
Content Imagen
CONTENT EN MODO IMAGEN.
Con este content se mostrarán los datos como una imagen, y el usuario, en ciertas coordenadas de la misma, pondrá poner marcas.
Al realizar un click en dicha marca mostrará los datos relativos a ella, sería como dar a una línea de un content normal.
Hay que tener en cuenta que el ejemplo es para mostrar en una primera imagen un vehículo, y si se le da a un lugar del mismo, que podrá ser una rueda, un cristal o una puerta, saldrán tipos de daños que puede tener dicha parte del vehículo.
DOS CONTENT EN UNA COLL CABECERA. El primero es el content de tipo imagen, que tiene los atributos:
viewmode | PARA INDICAR QUE EL CONTENT SE VEA MODO IMAGEN |
imgbk | SE LE DICE LA IMAGEN QUE SE MUESTRA |
El otro content es el que se pone debajo y que según el lugar donde se marca en el content imagen, saldrán los datos relativos.
<prop name="MAP_KK31-" title="Tarea Verificar. Daños" labelwidth="23" bgcolor="#CC3333" group="3" visible="0" fieldsize="8" size="8" type="TL" labelshadow="false" forecolor="#FFFFFF"/> <prop name="@PLANTILLA1" group="3" visible="1" type="Z" contents="Plantilla1" viewmode="picturemap" imgbk="##FLD_MAP_IMGPLANTILLA1##" bgcolor="#FFFFFF" lines="7" onchange="Refresh" mask="2" height="40%"/> <contents name="Plantilla1" src="Plantilla1" group="3" filter="t1.IDDOCPLANTILLA=##FLD_MAP_IDPLANTILLA1##" macros="##MACRO1##(##FLD_TAREAID##)" mask="2" bgcolor="#FFFFFF"></contents> <button name="AntesVeh" group="3" caption="<< >>" visible="true" labelwidth="12" lmargin="9" onchange="Refresh" method="ExecuteNode (antesveh)" labelfont-bold="true" bgcolor="#FFFFFF" text-bgcolor-disabled="#FFFFFF"/> <prop name="MAP_PLANTILLA" title="Vista:" labelwidth="0" type="T" size="150" locked="true" locking="true" newline="false" lmargin="1" showinline="true" linkedto="MAP_IDPLANTILLA1" linkedfield="DESCRIPCION" fieldsize="14" visible="0" group="3" onchange="Refresh255" labelshadow="false" forecolor="#CC3333" bgcolor="#FFFFFF" text-border-top="false" text-border-bottom="false" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <button name="DespuesVeh" group="3" caption=">>" visible="false" labelwidth="4" newline="false" lmargin="1" onchange="Refresh" method="ExecuteNode (despuesveh)" labelfont-bold="true" bgcolor="#FFFFFF" text-bgcolor-disabled="#FFFFFF"/> <prop name="@PDANOS1" group="3" visible="1" type="Z" contents="Danos1" lines="7" onchange="Refresh" mask="2" height="45%"/> <contents name="Danos1" src="Danos1" group="3" filter="t1.SITUACION=##FLD_MAP_SITUACION##" macros="##MACRO1##(##FLD_TAREAID##)" mask="2"></contents> <!-- COLL QUE ES EL CONTENT DE IMAGEN. TIENE QUE TENER 4 CAMPOS QUE TENDRAN LOS ATRIBUTOS PARA PINTAR LA MARCA EN EL DIBUJO QUE SE MUESTRA xcoord="true": COORDENADA X ycoord="true": COORDENADA Y circle-radius="true": PARA INDICAR EL RADIO DEL CIRCULO DE LA MARCA icon-mark="true": ICONO DE LA MARCA A PONER --> <coll name="Plantilla1" title="Plantilla1" sql="SELECT t1.ID,t1.XCOORD,t1.YCOORD, t1.RADIO,t1.SITUACION,t1.ROWID AS MAP_ROWID, t2.ID AS MAP_IDMPLANTILLA,t2.CONTADOR AS MAP_CONTADOR, CASE WHEN t2.CONTADOR>0 THEN t1.ICONMARK ELSE '' END AS ICONMARK FROM ##PREF##detplantilla t1 LEFT OUTER JOIN ##PREF##marcaplantilla t2 ON t1.ID=t2.IDDETPLANTILLA AND t2.TAREAID=##MACRO1##" objname="detplantilla" updateobj="detplantilla" progid="ASData.CasBasicDataObj" fontsize="8" editmask="2"> <!-- PESTAÑAS --> <group name="Puntos" id="1"></group> <!-- CAMPOS VISIBLES --> <macro name="##MACRO1##" value="0" default="true"/> <!-- --> <prop name="XCOORD" title="X COORD" xcoord="true" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="YCOORD" title="Y COORD" ycoord="true" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="RADIO" title="RADIO" circle-radius="true" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="SITUACION" title="SITUACION" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="ICONMARK" title="" icon-mark="true" labelwidth="6" type="T" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="MAP_IDMPLANTILLA" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="MAP_CONTADOR" labelwidth="6" type="N" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <prop name="MAP_ROWID" labelwidth="6" type="T" size="15" locked="true" locking="true" fieldsize="8" visible="7" group="1" labelshadow="false" forecolor="#CC3333" bgcolor="#CC3333" text-border-top="false" text-border-bottom="true" text-border-left="false" text-border-right="false" labelfont-bold="true" labelbox="false" labelfontsize="10" textfontsize="10" fontsize="10" text-bgcolor-disabled="#FFFFFF"/> <selecteditem onchange="Refresh255"> <action name="runscript"> <script language="VBScript"> 'DATOS DE LA PRIMERA PESTANHA this.ownerCollection.ownerObject("MAP_SITUACION")=This("SITUACION") this.ownerCollection.ownerObject("MAP_IDDETP1")=This("ID") this.ownerCollection.ownerObject("MAP_IDMP1")=This("MAP_IDMPLANTILLA") this.ownerCollection.ownerObject("MAP_CONP1")=This("MAP_CONTADOR") this.ownerCollection.ownerObject("MAP_DETIDP1")=This("MAP_ROWID") //appdata.failwithmessage -666,"" YA NO ES NECESARIO!!! </script> </action> </selecteditem> </coll>
Crear Registro con Script
CREAR UN NUEVO REGISTRO CON UN SCRIPT.
El script se podrá ejecutar en un create, insert, delete, botón… en cualquier lugar.
<action name="histor" type="runscript"> <script language="VBScript"> 'Dimensionamos las variables Dim coll,det 'Cogemos en que coleccion se va a crear el nuevo objeto, con lo que tomara todas las caracteristicas del mismo, ' ejecutandose el create si lo tuviera. Set coll =AppData.GetCollection("ColeccionEnLaQueSeCreaElRegistro") 'Creamos el objeto set det = coll.CreateObject 'Lo añadimos a la coll, lanzando el create del mismo coll.AddItem Empty,det 'Añado los valores a los distintos campos det("CAMPONUMERICO")=5 det("CAMPOTEXTO")="VALOR DEL CAMPO" det("CAMPOFECHA")=now() 'Salvo el objeto det.Save 'Liberamos variables. set coll.clear Set coll=nothing Set det=nothing </script> </action>
Poner valor a una Variable Global
<action name="runscript"> <script language="VBScript"> appdata.CurrentEnterprise.Variables("NoAvisar")=0 </script> </action>
Información Queue Dispositivo
COLECCION QUE MUESTRA LA CANTIDAD DE DATOS QUE QUEDAN POR ENVIAR.
Esta colección se puede complicar todo lo que se quiera, incluso poniendo Join con otras tablas, para decir de que tabla faltan los datos
por enviar desde el dispositivo móvil a la central.
La tabla MASTER_REPLICA_QUEUE, solo se puede utilizar para ver datos, nunca para escribir directamente en la misma, ya que es una
tabla de sistema, con la cual se enviarán los datos desde el dispositivo móvil al servidor central.
<coll name="InformacionQueue" title="la informacion queue" sql="SELECT COUNT(ID) AS MAP_CUENTA FROM master_replica_queue" objname="master_replica_queue" updateobj="master_replica_queue" progid="ASData.CASBasicDataObj" forprint="false" editwidth="75" editheight="76" autorefresh="true"> <group name="General" id="1"/> <prop name="MAP_CUENTA" visible="7" group="1" type="N" fieldsize="20" labelwidth="8" size="30">DATOS PARA ENVIAR</prop> </coll>