4D v16

Llamar tablas y métodos 4D

Inicio

 
4D v16
Llamar tablas y métodos 4D

Llamar tablas y métodos 4D    


 

El modo de acceso a las tablas 4D a las que se hace referencia en Wakanda depende de cómo está integrado el catalogo externo, el cual se definió en Wakanda durante su conexión a la aplicación remota (ver Integrar al modelo activo o utilizar un modelo dedicado):

  • fusionado con el modelo activo (opción predeterminada): en este caso, las tablas remotas se usan exactamente igual a las clases locales a través del objeto ds.
  • utilizando un modelo específico: en este caso, las tablas remotas son propiedades del objeto de modelo exclusivo.

Cuando se fusiona al modelo activo, las tablas 4D referenciadas en la aplicación Wakanda se pueden utilizar directamente en el código JavaScript del lado del servidor (SSJS) como propiedades del objeto ds, al igual que las datastore clases locales.

Nota: el objeto DS contiene el datastore actual de la aplicación Wakanda.

Por ejemplo, para realizar una consulta en los registros de la tabla 4D [Employees], puede escribir:

var emp = ds.Employees.query("age > :1",30);
        //recuperar una colección de registros de la tabla Employees
        //donde la edad es mayor a 30 en la variable emp

Del lado del cliente, también puede aprovechar los mecanismos automáticos de las datasources basadas en las clases de datos y asociadas a los widgets. Por ejemplo, si asocia la datasource ’employees’ a un widget de tipo ’Grid’, puede ver la lista de empleados de forma automática:


Cuando la tabla está asociada a una datasource, también puede acceder a sus datos a través de esta datasource. Por ejemplo, para ordenar la colección de registros de la datasource "employees", puede escribir:

sources.employees.orderBy("age");
    //ordenar la colección de empleados por edad

Para obtener más información sobre cómo trabajar con las clases datastore, consulte la documentación de Wakanda.

Las tablas 4D referenciadas se utilizan en el código JavaScript del lado del servidor como propiedades del catálogo donde se ubicaron cuando se creó el enlace. El nombre de este catálogo es el que pasó en el parámetros de conexión Remote datastore name (diálogo de conexión de Wakanda Studio) o en nomLocal (métodos JavaScript).

Por ejemplo, si ha creado un enlace llamado "my4Dstore" y desea realizar una consulta entre los registros de la tabla [Employees], puede escribir:

var emp2 = my4Dstore.Employees.query("age > :1", 30);
     // Buscar en los registros de la tabla Employees 
     // En el enlace "my4Dstore" 

Nota de implementación: del lado del cliente, utilizando un modelo dedicado en la versión actual de 4D Mobile no permite el acceso a las clases remotas en el momento.

Los métodos 4D referenciados en la aplicación Wakanda se pueden utilizar directamente en el código JavaScript como propiedades de los objetos clase de datos, colección de entidades o entidad en función de su alcance definido del lado 4D (ver el párrafo Tabla padres y alcance de los métodos proyecto). Aquí está la correspondencia entre los objetos Wakanda y el alcance de los métodos proyecto:

Alcance 4DObjeto Wakanda
tablaclase de datos
selección actualcolección de entidades
registro actualentidad

Nota: los métodos 4D también se pueden llamar del lado del cliente por las fuentes de datos (ver más adelante), en este caso todos los métodos están disponibles, y la fuente de datos los aplica automáticamente a la colección actual o la entidad actual dependiendo del contexto.

Por ejemplo, si realiza un a búsqueda con el método query (ver sección anterior), Wakanda devuelve una colección de entidades. Puede ejecutar cualquier método de proyecto 4D cuyo alcance declarado sea "selección actual".

Los métodos 4D pueden ser llamados por código JavaScript de tres formas:

  • En el código JavaScript ejecutado en el servidor (SSJS), utilizando el SSJS Datastore API. En este caso, los métodos de 4D se llaman como las propiedades de los objetos clase de datos, colección de entidades o entidad, tal como se describió anteriormente.
    Ejemplos:

    var vTot = ds.Emp.raiseSalary(param))
        //raiseSalary es una propiedad de datastore class
        //el catálogo está fusionado al modelo activo
    var vTot2 = my4DStore.Company.first().capital(param))
        //capital es una propiedad de entidad ya que first() devuelve una entidad
        //utilización del modelo dedicado my4DStore

  • Desde el código JavaScript ejecutado en el cliente (es decir, el navegador) utilizando el Wakanda Ajax Framework (WAF). Hay dos posibilidades:
    Nota de implementación: en la versión actual de Wakanda Enterprise, el acceso cliente a los métodos de la base 4D está disponible únicamente cuando la base remota se conecta y fusiona con el modelo activo.
    • utilizar el WAF Datasource API: este API de alto nivel ofrece muchas funciones automáticas para la gestión de datos. Con esta API, los métodos 4D se llaman como las propiedades de las fuentes de
      datos asociadas a la clase de datos
      , la entidad colección actual, o la entidad actual en función del contexto. Puede manejar valores de retorno de los métodos o los posibles errores utilizando la sintaxis asincrónica (requerido para el código ejecutado en el cliente). Ejemplo:

      sources.employee.raiseSalary(param,
          {onSuccess: function(event)
          { ... //código a ejecutar cuando el método ha terminado}
      }))

      No es obligatorio utilizar una función de retrollamada (callback) porque los objetos tipo datasource tienen funciones automáticas que admiten, por ejemplo, la actualización de los datos que aparecen en
      la colección actual después de una búsqueda
    • utilizar el WAF Dataprovider API: este API cliente de bajo nivel le permite manipular directamente los objetos. Al igual que con el API SSJS Datastore, los métodos 4D se llaman como propiedades de
      clase de datos
      , colección de entidades o entidad. Sin embargo, debe gestionar los valores de retorno de los métodos o cualquier error utilizando la sintaxis asincrónica (necesaria para código ejecutado en el cliente). Ejemplo:
      ds.Employee.raiseSalary(param, // a sintaxis se parece a una llamada SSJS
          {onSuccess: function(event)    // pero es el código del lado del cliente por lo que debe gestionar el método de retrollamada de la llamada asincrónica
          { ... //código a ejecutar cuando el método 4D termina}
      }))

    La elección del lugar (servidor o cliente) y del API depende de las necesidades de la aplicación y se describe en la documentación de Wakanda.

Al igual que con los métodos estándar, usted puede pasar parámetros durante la llamada, que se reciben en el orden en los parámetros $1,$2, etc. Del mismo modo, el método puede devolver un resultado en la variable $0.

Ejemplo: Quiere darle un aumento del 5% a los empleados cuyo salario es menor que 1500.

  • Del lado 4D, el método IncreaseSalary  se expuso vía 4D Mobile y su alcance es la "Selección actual".
    Su código es el siguiente:
     C_REAL($1)
     READ WRITE([Empleados])
     FIRST RECORD([Empleados])
     While(Not(End selection([Empleados])))
        [Employees]salary:=[Empleados]salary*$1
        SAVE RECORD([Empleados])
        NEXT RECORD([Empleados])
     End while
     UNLOAD RECORD([Empleados])
  • Del lado de Wakanda, ejecute el siguiente código en el servidor:
    var emp = ds.Employees.query("salary < :1",1500); 
            // emp contiene la colección de empleados cuyo salario es <1500
        emp.IncreaseSalary(1.05);
            /ejecuta el método IncreaseSalary en la colección
            //También se podría escribir:
            //"ds.Employees.query("salary < :1",1500).IncreaseSalary(1.05);

También puede devolver una selección 4D directamente como una colección Wakanda utilizando el comando MOBILE Return selection. Por ejemplo:

  //método proyecto FindCountries
  //FindCountries( string ) -> object
 
 C_TEXT($1)
 C_OBJECT($0)
 QUERY([Countries];[Countries]ShortName=$1+"@")
 $0:=MOBILE Return selection([Countries])

Al llamar a un método 4D por medio del enlace de Wakanda:

  • Si el método se aplica a una selección (colección de entidades), ésta se convierte en la selección actual y 4D se ubica en el primer registro de esta selección sin cargar o activar las relaciones. Si la selección está vacía, el comando Selected record number devuelve 0 en lugar de 1.
  • Si el método se aplica a un registro (entidad), éste se convierte en el registro actual. La selección actual se reduce solo a este registro y el comando Selected record number devuelve 1.  
    Nota: por razones de optimización y para evitar bloqueos innecesarios, el registro se carga en modo de sólo lectura. Sin embargo, la tabla está en modo lectura-escritura, por lo que simplemente puede llamar al comando LOAD RECORD para forzar la carga del registro en modo lectura-escritura siempre que sea necesario.   
  • Si el método se aplica a una tabla (clase de datos), ni la selección actual ni el registro actual se ven afectados.

Tenga en cuenta que después de ejecutar un método vía 4D Mobile, el contexto 4D se reinicializa:

  • las selecciones se reducen a 0,
  • los registros se desapilan y descargan,
  • las selecciones locales y los conjuntos para el proceso se destruyen,
  • las transacciones abiertas durante la ejecución del método se cancelan,
  • la configuración de las relaciones automáticas por campos, los destinos de búsqueda o consultas en el servidor se restablecen,
  • se cancelan los trabajos de impresión,
  • las ventanas se cierran,
  • toda conexión SQL, PHP o HTTP se cierra.

Debe asegurarse de que el alcance del método 4D corresponde al tipo de objeto Wakanda que lo está llamando, de lo contrario el error "TypeError: 'undefined' is not a function" es devuelto por Wakanda.

Por ejemplo, dado el método 4D "getcursel" que contiene el siguiente código:

 $0:=Records in selection([Table_1])

Dado el método run del lado Wakanda

var tt = ds.Table_1.query("Field_2 = 'a*'").getcursel();

El método query() devuelve una colección. Si el alcance del método getcursel fue definido como "Registro actual", Wakanda devuelve el siguiente error:
TypeError: 'undefined' is not a function (evaluating 'ds.Table_1.query("Field_2 = 'a*'").getcursel()')".

 
 

 
PROPIEDADES 

Producto: 4D
Tema: Llamar tablas y métodos 4D

 
HISTORIA 

 
ARTICLE USAGE

4D Mobile ( 4D v16)