Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Última revisiónAmbos lados, revisión siguiente
wiki:2.-desarrollo-app:2.3.-codigo:c.-eventos:1.-action:start [2018/04/11 13:10] – [RUNSCRIPT] ejetorowiki:2.-desarrollo-app:2.3.-codigo:c.-eventos:1.-action:start [2018/04/12 13:20] – editor externo 127.0.0.1
Línea 1: Línea 1:
 +{{indexmenu_n>1}}
 +====== Nodo ACTION ======
 +\\
 +Nodo donde se expondrán las acciones a realizar en los eventos definidos en nuestra aplicación.
 +\\
 +El nombre de la acción define lo que va a realizar.
 +\\
 +===== SETVAL =====
 +\\
 +Consiste en asignarle un valor a una propiedad del objeto. Se pueden utilizar macros en el atributo value.
 +\\
 +<code xml>
 + <!-- Ponemos la ID de la empresa del usuario que se ha logueado en IDEMPRESA -->
 + <action name="setval" field="IDEMPRESA" value="##ENTID##" />
 +
 + <!-- Se pueden utilizar MACROS, en este caso ##FLD_NOMBRE## que tendría el valor del campo NOMBRE del objeto actual 
 +      OJO porque por ejemplo en un create esta macro NO TENDRIA VALOR -->
 + <action name="setval" field="MAP_CUENTA" value="##FLD_NOMBRE##" />
 +
 + <!-- Ponemos la fecha actual del sistema y la ponemos en el campo FECHA -->
 + <action name="setval" field="FECHA" value="##NOW##" />
 +
 + <!-- Cogemos el ID del usuario del sistema y lo ponemos en IDUSUARIO-->
 + <action name="setval" field="IDUSUARIO" value="##USERID##" />
 +
 +        <!-- Ponemos a 0 el campo EXECUTED y a 1 el campo IDCARGO -->
 + <action name="setval" field="EXECUTED" value="0" />
 + <action name="setval" field="IDCARGO" value="1" />
 +
 +</code>
 +\\
 +^Atributo           ^Descripción ^
 +| **name** | Nombre de la acción a ejecutar  |
 +| **field** | Campo que se va a actualizar |
 +| **value** | Valor que se le va a asignar al campo |
 +
 +===== RUNSCRIPT =====
 +
 +Ejecución de código <nowiki>XOneScript</nowiki> dentro de nuestra aplicación. En este caso, no tiene ningún atributo, pero sí un nodo donde se pondrá el script a ejecutar, como se muestra el ejemplo de más abajo.
 +
 +<code xml>
 +
 + <!-- Cogemos el valor del campo MAP_SERIE y concatenamos con "/" y el campo NUMERO y lo ponemos en NUMCOMPLETO -->
 + <action name="runscript">
 +
 + <!-- Si se desea pasar un parámetro en la llamada al nodo que ejecuta el script, se coloca antes de la etiqueta script -->
 + <param name="opcion" /> 
 +
 + <script language="VBScript">
 + This("NUMCOMPLETO")=This("MAP_SERIE") + "/" + CStr(This("NUMERO"))
 + </script>
 + </action>
 +
 + <!-- Podemos llamar a un fichero de scripts cuando lo necesitemos, la funcion EntrarN estara definida en funciones.vbs -->
 + <action name="runscript">
 + <include file="funciones.vbs" />
 + <script language="VBScript">
 + EntrarN
 + </script>
 + </action>
 +
 + <!-- Esto es en Javascript -->
 + <action name="runscript">
 + <script language="javascript">
 + calculaTotal(self);
 + ui.refresh("MAP_FTTIPOGASTO","@Gastos","MAP_TOTAL");
 + </script>
 + </action>
 +</code>
 +\\
 +===== SETFLDVAL =====
 +
 +Para coger un valor de un campo de la colección padre y ponerlo en un campo de la colección hija. Utilizado en los contents. 
 +
 +<WRAP center round important 60%>
 +Aunque esta acción sigue funcionando, actualmente está en desuso puesto que prácticamente todo se hace por script. La instrucción para asignar/obtener un valor de tu colección "padre" es:\\
 +    1.- En vbscript:   this("NOMBRE")=this.OwnerCollection.ownerobject("MAP_DELPADRE"
 +    2.- En javascript: self.NOMBRE=self.getOwnerCollection().getOwnerObject().MAP_DELPADRE;
 +</WRAP>
 +
 +<code xml>
 +
 + <!-- Cogemos el valor del ID de la colección padre y lo ponemos en el campo IDCLIENTE de la colección Contents -->
 + <action name="setfldval" targetfld="IDCLIENTE" sourcefld="ID"/>
 +
 +</code>
 +\\
 +^Atributo           ^Descripción ^
 +| **name** | Nombre de la acción a ejecutar  |
 +| **targetfld** | Campo que se va a actualizar con el campo del padre |
 +| **sourcefld** | Campo de la colección padre que va a dar valor al campo de esta colección  |
 +===== MAPVAL =====
 +
 +Buscamos un valor en otra colección y nos traemos el valor de algún campo. \\
 +<code xml>
 +
 + <!-- Buscamos en la colección Usuarios el registro cuyo ID sea el el usuario logueado actualmente 
 +      y cogemos el valor del campo IDSERIE para ponerlo en el campo IDSERIE de la colección actual, es decir: 
 +      IDSERIE = "SELECT IDSERIE FROM gen_usuarios WHERE ID=##USERID##". -->
 + <action name="mapval" field="IDSERIE" targetfld="IDSERIE" coll="Usuarios" mapfld="ID" mapvalue="##USERID##" />
 +
 + <!-- Buscamos en la colección TiposUsuario el registro cuyo CODIGO = 4 
 +      y cogemos el valor del campo ID para ponerlo en el campo IDTIPO de la colección actual, es decir: 
 +      IDTIPO = "SELECT ID FROM gen_tiposusuario WHERE CODIGO=4"  -->
 + <action name="mapval" field="IDTIPO" targetfld="ID" coll="TiposUsuario" mapfld="CODIGO" mapvalue="4" />
 +
 + <!-- Buscamos en la colección Usuarios el registro cuyo ID sea el el usuario logueado actualmente 
 +      y cogemos el valor del campo LOGIN para ponerlo en el campo CODTECNICO de la colección actual, es decir: 
 +      CODTECNICO = "SELECT LOGIN FROM gen_usuarios WHERE ID=##USERID##". -->
 +      <action name="mapval" field="CODTECNICO" targetfld="LOGIN" coll="Usuarios" mapfld="ID" mapvalue="##USERID##" />
 +
 +</code>
 +\\
 +^Atributo           ^Descripción ^
 +| **name** | Nombre de la acción a ejecutar  |
 +| **field** | Campo que se va a actualizar |
 +| **targetfld** | Nombre del campo que tiene el valor que va a ser asignado al campo **field** |
 +| **coll** | Colección donde se va a realizar la busqueda del campo que tendrá el valor requerido |
 +| **mapfld** | Campo de la colección que esta definida en el atributo **coll**, que es clave primera de la misma |
 +| **mapvalue** | Valor del campo de la clave primera para rescatar el registro buscado |
 +===== EXECUTESQL =====
 +
 +Para ejecutar una sentencia SQL, Insert, Update o Delete. No tiene sentido ejecutar un Select, porque la acción no devuelve ningún valor.
 +
 +Muy utilizado en las colecciones de cabecera, cuando se está eliminando un registro, eliminar todas sus líneas asociadas.\\
 +\\
 +<code xml>
 +
 + <!-- Se pueden utilizar MACROS -->
 + <action name="executesql" sql="DELETE FROM ##PREF##DetParte WHERE IDPARTE=##ID##" />
 +
 +</code>
 +\\
 +^Atributo           ^Descripción ^
 +| **name** | Nombre de la acción a ejecutar.  |
 +| **sql** | Sentencia SQL que quiere ejecutar. Solo es válido la ejecución de Insert, Update o Delete. |
 +===== LINK =====
 +
 +Para actualizar el campo de enlace de una colección de detalles con la ID de la cabecera. \\
 +\\
 +Utilizado EXCLUSIVAMENTE en el nodo INSERT de una colección de cabecera. Para enlazar las líneas de detalle de la colección CONTENTS cuando se está dando de alta al mismo tiempo la cabecera y los detalles, pues hasta que la cabecera no se graba, las líneas de detalle no saben cual es el ID de su padre.
 +
 +<WRAP center round important 80%>
 +Actualmente, aunque evidentemente sigue funcionando éste método para que automáticamente se actualice el IDENLACE con la cabecera en los detalles (contents, subgrid o como quiera llamarse...) una vez que se grabe la cabecera, este nodo está en desuso y prácticamente todo se controla por script y es el programador el que hace la asociación de datos, cabecera-detalles.\\
 +\\
 +No obstante, el framework internamente sigue intentando buscar un campo de enlace entre los contents y la coleccion "cabecera" donde éstos estén incluidos. Para evitar este comportamiento, en la colección contents, a nivel de COLL, hay que especificar los atributos **check-owner="false"** y **dependent="false"**
 +</WRAP>
 +
 +
 +<code xml>
 +<action name="link" coll="Detalles" field="IDDOCUMENTO" value="##ID##" />
 +</code>
 +\\
 +^Atributo           ^Descripción ^
 +| **name** | Nombre de la acción a ejecutar  |
 +| **coll** | Colección que se busca para actualizar el campo de enlace con esta colección Padre |
 +| **field** | Nombre del campo de la colección con el nombre que está definido en el atributo **coll** y que es el enlace con esta colección Padre |
 +| **value** | Valor que se le asigna al campo enlace entre la colección Padre y la colección hija |
 +
 +
 +
 +
 +====== NODO BEFOREACTION ======
 +
 +Nodo donde se expondrán las acciones a realizar en los eventos definidos en nuestra aplicación, pudiéndose ejecutar todos y cada uno de los tipos de acciones que dispone el **nodo action**.
 +\\
 +Sin embargo, como punto importante a tener en cuenta, es que esta acción solo es válida para el evento 
 +[[wiki:2.-desarrollo-app:2.3.-codigo:c.-eventos:3.-insert:start| Insert ]], y es utilizada para la validación de campos, en caso de que dé error, no se guardará el objeto, y se obliga al usuario a insertar un valor para el campo validado.
 +
 +
 +
 +
 +