Clases ORDA para manejar su modelo de datos

Traducido automáticamente de Deepl

En una entrada anterior del blog, te presentamos el mundo de las clases del modelo de datos ORDA. Ahora es el momento de ensuciarse las manos y aprender más.

Ya sabes que la estructura de ORDA(datastore, dataclass, entity, entity selection) está formada por objetos. Pero no son sólo objetos, son objetos fuertemente tipados vinculados a clases específicas de ORDA. Esto significa que puedes escribir funciones para ocultar la complejidad de la implementación física de tus datos.

Por lo tanto, es mucho más fácil exponer tu base de datos como una API, especialmente si expones tu base de datos como un servidor REST. Esto también te ayuda a evitar dolores de cabeza, como cuando necesitas modificar un trozo de código que escribiste hace años o que fue escrito por otra persona. Ocultar la complejidad reduce los errores y acelera el proceso de desarrollo.

HDI: Ejemplos de uso de clases ORDA

Visión general de las nuevas clases ORDA

Las clases ORDA están disponibles automáticamente con los Proyectos, veamos un ejemplo. Aquí tenemos una simple base de datos (llamada LearningSystem) que contiene una Students tabla.

Podemos comprobar que 4D ha creado automáticamente las siguientes clases:

  • DataStore
  • Students (clase DataClass)
  • StudentsEntity (clase Entity)
  • StudentsSelection (clase EntitySelection)

En resumen, en una base de datos local hay

  • Una única clase datastore

Y cada tabla tiene

  • Una clase dataclass (en este ejemplo: Estudiantes)
  • Una clase de entidad (en este ejemplo: StudentsEntity)
  • Una clase de selección de entidad (en este ejemplo: StudentsSelection)

Cualquier objeto ORDA(datastore, dataclass, entity, entity selection) es una instancia de la clase del modelo de datos correspondiente y puede llamar a cualquiera de las funciones definidas en la clase.

Dentro de una función, This designa la instancia del objeto ORDA.

Veamos un ejemplo concreto. Este es el modelo de datos que utilizaremos

blank

la clase datastore

Esta clase se utiliza para implementar funciones relacionadas con el datastore.

La siguiente es la implementación de la clase DataStore.

Tenemos una función getDescription() que devuelve información general sobre el datastore.

Class extends DataStoreImplementation
Function getDescription
C_TEXT( ) :="Sistema de aprendizaje que cubre "+ ( . . . )+" estudiantes"$0
$0StringThisStudentsall()length

Y aquí está el código que llama a la función:

C_TEXT($dbName)
$dbName :=ds.getDescription() // $dbName is "Learning system covering 200 students"

Como el objeto datastore devuelto por el comando ds es una instancia de la clase DataStore, podemos usarla para llamar a la función getName().

la clase dataclass

Esta clase se utiliza para implementar funciones relacionadas con la clase de datos.

La siguiente es la implementación de la clase Escuelas. Tenemos una función registerStudent() para crear un nuevo alumno en una escuela.

Recibe los datos de un alumno en un objeto y comprueba si el nivel de inglés del alumno cumple con el nivel mínimo requerido por la escuela. Si todo está bien, la función crea y guarda la entidad Estudiantes.

No hay que preocuparse por la implementación del modelo de datos,simplemente se construye el objeto y se llama a la función.

Class extends DataClass

Function registerStudent

C_OBJECT($1;$data;$student;$school;$result;$0)

$data :=$1

$school :=ds.Schools.query("nombre = :1";$data.schoolName).first()
$result:=New object("éxito";True)

If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="El nivel de inglés no es suficientemente alto"
$0 :=$result
End if

If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .school:=$school

$result :=$student.save()

$0 :=$student

End if

Y aquí está el código que llama a la función:

Form.result:=ds.Schools.registerStudent(Form.data)
//Form.data is

//
{"englishLevel":4,"firstname":"Mary","lastname":"Smith","schoolName":"Math school"}

Como el objeto ds.Schools es una instancia de la clase Escuelas, podemos utilizarlo para llamar a la función registerStudent().

la clase entidad

Esta clase se utiliza para implementar funciones relacionadas con una entidad.

A continuación se muestra la implementación de la clase StudentsEntity.

Tenemos una función getFirstAhead() que devuelve los estudiantes que tienen una mejor clasificación que el estudiante actual.

Class extends Entity

Function getFirstAhead
C_OBJECT($0;$ahead)
C_LONGINT ($1;$sliceSize)

$sliceSize :=$1

//Get the $sliceSize Students having a better rank
$ahead :=This.getDataClass().query("rank < :1";This.rank).orderBy("rank desc")
$0 :=$ahead.slice(0;$sliceSize)

Este es el código que llama a la función:


C_OBJECT
($student;$ahead)

$student :=ds.Students.query("lastname= :1"; "Smith").first()

$ahead :=$student.getFirstAhead(3)
//$ahead is an entity selection (Students) containing the three Students ahead the student Smith

Como el objeto de entidad $student es una instancia de la clase StudentsEntity, podemos utilizarlo para llamar a la función getFirstAhead().

Observe que la clase StudentsEntity extiende la clase Entity que contiene todos los métodos miembros disponibles en un objeto entidad (porejemplo, getDataClass()etc.). Por lo tanto esos métodos miembros pueden ser llamados con This en la función.

la clase de selección de entidades

Esta clase se utiliza para implementar funciones relacionadas con la selección de una entidad.

A continuación se muestra la implementación de la clase StudentsSelection.

Tenemos una función setFinalExam() que actualiza una selección de entidades de estudiantes. El atributo finalExam se establece con el valor dado.

Class extends EntitySelection


Function setFinalExam

C_TEXT
($1;$value)
C_OBJECT
($0;$status;$student)
$value :=$1

For each ($student;This) Until (Not($status.success))
$student.finalExam:=$value
$status :=$student.save()
End for each

$0
:=$status

Y aquí está el código que llama a la función:

C_OBJECT($result)
$result :=ds.Students.all().setFinalExam("Pasado"
)
// All the students have their finalExam attribute set to "Passed"

Como el objeto de selección de entidades ds.Students.all() es una instancia de la clase StudentsSelection, podemos utilizarlo para llamar a la función setFinalExam().

¿Qué pasa con el resto del servidor?

Pronto habrá otra entrada en el blog para explicar cómo llamar a las funciones de las clases ORDA en las peticiones REST. Permanece atento.

Mientras tanto, descarga el HDI para empezar a descubrir las nuevas clases ORDA y consulta la documentación para más detalles.

Avatar
• Propietario de producto - Marie-Sophie Landrieu-Yvert ingresó al equipo de 4D Product como Propietario de producto en 2017. Como tal, está a cargo de escribir las historias de los usuarios y luego traducirlas en especificaciones funcionales. Su papel es también asegurarse de que la implementación de la funcionalidad entregada cumpla con las necesidades del cliente. Marie-Sophie se graduó en la Escuela de Ingeniería de ESIGELEC y comenzó su carrera como ingeniera en IBM en 1995. Participó en varios proyectos (de mantenimiento y creación) y trabajó como desarrolladora de Cobol. Luego trabajó como diseñadora de UML y desarrolladora de Java. Sus principales funciones fueron analizar y redactar requisitos funcionales, coordinar los equipos de negocio y de desarrollo.