Dans un précédent billet de blog, nous vous avons présenté le monde des classes de modèles de données ORDA. Il est maintenant temps de mettre la main à la pâte et d’en apprendre davantage !
Vous savez déjà que la structure d’ORDA(datastore, dataclass, entité, sélection d’entité) est composée d’objets. Mais ce ne sont pas de simples objets, ce sont des objets fortement typés liés à des classes ORDA spécifiques. Cela signifie que vous pouvez écrire des fonctions pour masquer la complexité de l’implémentation physique de vos données.
Il est donc beaucoup plus facile d’exposer votre base de données en tant qu’API, surtout si vous exposez votre base de données en tant que serveur REST. Cela vous permet également d’éviter les maux de tête, par exemple lorsque vous devez modifier un morceau de code que vous avez écrit il y a des années ou qui a été écrit par quelqu’un d’autre. Cacher la complexité réduit les erreurs et accélère votre processus de développement !
HDI : Exemples d’utilisation des classes ORDA
Aperçu des nouvelles classes ORDA
Les classes ORDA sont automatiquement disponibles avec les projets, voyons un exemple. Voici une base de données simple (nommée LearningSystem) contenant une table Students table.
Nous pouvons vérifier que 4D a automatiquement créé les classes suivantes :
- DataStore
- Students (classe DataClass)
- StudentsEntity (classe Entity)
- StudentsSelection (Classe EntitySelection)
Pour résumer, dans une base de données locale il y a :
- Une seule classe de datastore
Et chaque table a :
- Une classe de classe de données (dans cet exemple : Students)
- Une classe d’entité (dans cet exemple : StudentsEntity)
- Une classe de sélection d’entité (dans cet exemple : StudentsSelection)
Tout objet ORDA(datastore, dataclass, entité, sélection d’entité) est une instance de la classe de modèle de données correspondante et peut appeler n’importe quelle fonction définie dans la classe.
Dans une fonction, This désigne l’instance de l’objet ORDA.
Prenons un exemple concret. Voici le modèle de données que nous allons utiliser :
la classe datastore
Cette classe est utilisée pour implémenter les fonctions liées au datastore.
Voici l’implémentation de la classe DataStore.
Nous avons une fonction getDescription() qui renvoie des informations générales sur le datastore.
Class extends DataStoreImplementation
.
Function getDescription
C_TEXT( ) := "Système d'apprentissage couvrant "+ ( . . . )+" les étudiants"$0
$0StringThisStudentsall()length
Et voici le code qui appelle la fonction :
C_TEXT($dbName)
$dbName :=ds.getDescription() // $dbName is "Learning system covering 200 students"
Parce que l’objet datastore retourné par la commande ds est une instance de la classe DataStore, nous pouvons l’utiliser pour appeler la fonction getName().
la classe dataclass
Cette classe est utilisée pour implémenter les fonctions liées à la classe de données.
Voici l’implémentation de la classe Schools. Nous avons une fonction registerStudent() pour créer un nouvel élève dans une école.
Elle reçoit les données d’un élève dans un objet et vérifie si le niveau d’anglais de l’élève correspond au niveau minimum requis par l’école. Si tout est correct, la fonction crée et enregistre l’entité Students.
Iln’y a pas besoin de se préoccuper de l’implémentation du modèle de données,il suffit de construire votre objet et d’appeler la fonction.
Class extends DataClass
Function registerStudent
C_OBJECT($1;$data;$student;$school;$result;$0)
$data :=$1
$school :=ds.Schools.query("name = :1" ;$data.schoolName).first()
$result:=New object("success" ;True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:= "Le niveau d'anglais n'est pas assez élevé"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
Et voici le code qui appelle la fonction :
Form.result:=ds.Schools.registerStudent(Form.data)
//Form.data is
// {"englishLevel":4,"firstname":"Mary","lastname":"Smith","schoolName":"Math school"}
Comme l’objet de classe de données ds.Schools est une instance de la classe Schools, nous pouvons l’utiliser pour appeler la fonction registerStudent().
la classe entité
Cette classe est utilisée pour implémenter des fonctions liées à une entité.
Voici l’implémentation de la classe StudentsEntity.
Nous avons une fonction getFirstAhead() qui retourne les étudiants qui ont un meilleur classement que l’étudiant actuel.
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)
Voici le code qui appelle la fonction :
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
L’objet entité $student étant une instance de la classe StudentsEntity, nous pouvons l’utiliser pour appeler la fonction getFirstAhead().
Notez que la classe StudentsEntity étend la classe Entity qui contient toutes les méthodes membres disponibles sur un objet entité(par exemple, getDataClass(), etc.). Ces méthodes membres peuvent donc être appelées avec This dans la fonction.
la classe de sélection d’entités
Cette classe est utilisée pour implémenter les fonctions liées à la sélection d’une entité.
Voici l’implémentation de la classe StudentsSelection.
Nous avons une fonction setFinalExam() qui met à jour une sélection d’entités d’étudiants. L’attribut finalExam est défini à la valeur donnée.
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
Et voici le code qui appelle la fonction :
C_OBJECT($result)
)
$result :=ds.Students.all().setFinalExam("Passed"
// All the students have their finalExam attribute set to "Passed"
Comme l’objet de sélection d’entité ds.Students.all() est une instance de la classe StudentsSelection, nous pouvons l’utiliser pour appeler la fonction setFinalExam().
Qu’en est-il du reste du serveur ?
Un autre article de blog sera bientôt publié pour expliquer comment appeler les fonctions des classes ORDA dans les requêtes REST. Restez à l’écoute !
En attendant, téléchargez le HDI pour commencer à découvrir les nouvelles classes ORDA et consultez la documentation pour plus de détails !