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
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.