Classes ORDA pour gérer votre modèle de données

Traduit automatiquement de Deepl

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 :

blank

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 !

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.