ORDA-Klassen zur Handhabung Ihres Datenmodells

In einem früheren Blogbeitrag haben wir Sie in die Welt der ORDA-Datenmodellklassen eingeführt. Jetzt ist es an der Zeit, sich die Hände schmutzig zu machen und mehr zu lernen!

Sie wissen bereits, dass die Struktur von ORDA(Datenspeicher, Datenklasse, Entität, Entitätsauswahl) aus Objekten besteht. Aber es sind nicht einfach nur Objekte, sondern stark typisierte Objekte, die mit bestimmten ORDA-Klassen verknüpft sind. Das bedeutet, dass Sie Funktionen schreiben können, um die Komplexität der physischen Implementierung Ihrer Daten zu verbergen.

Daher ist es viel einfacher, Ihre Datenbank als API bereitzustellen, insbesondere wenn Sie Ihre Datenbank als REST-Server bereitstellen. Dies hilft Ihnen auch, Kopfschmerzen zu vermeiden, z. B. wenn Sie einen Teil des Codes ändern müssen, den Sie vor Jahren geschrieben haben oder der von jemand anderem geschrieben wurde. Das Ausblenden von Komplexität reduziert Fehler und beschleunigt Ihren Entwicklungsprozess!

HDI: Beispiele für die Verwendung von ORDA-Klassen

Übersicht der neuen ORDA-Klassen

ORDA-Klassen sind automatisch mit Projekten verfügbar, lassen Sie uns ein Beispiel sehen. Hier ist eine einfache Datenbank (namens LearningSystem), die eine Students Tabelle.

Wir können feststellen, dass 4D automatisch die folgenden Klassen erstellt hat:

  • DataStore
  • Students (DataClass-Klasse)
  • StudentsEntity (Entitätsklasse)
  • StudentsSelection (EntitySelection-Klasse)

Zusammenfassend lässt sich sagen, dass es in einer lokalen Datenbank Folgendes gibt:

  • Eine einzelne Datenspeicherklasse

Und jede Tabelle hat:

  • Eine Datenklassenklasse (in diesem Beispiel: Students)
  • Eine Entitätsklasse (in diesem Beispiel: StudentsEntity)
  • Eine Entitätsauswahlklasse (in diesem Beispiel: StudentsSelection)

Jedes ORDA-Objekt(Datenspeicher, Datenklasse, Entität, Entitätsauswahl) ist eine Instanz der entsprechenden Datenmodellklasse und kann jede der in der Klasse definierten Funktionen aufrufen.

Innerhalb einer Funktion bezeichnet This die Instanz des ORDA-Objekts.

Schauen wir uns ein konkretes Beispiel an. Hier ist das Datenmodell, das wir verwenden werden:

blank

die Klasse datastore

Diese Klasse wird verwendet, um Funktionen im Zusammenhang mit dem Datenspeicher zu implementieren.

Im Folgenden sehen Sie die Implementierung der Klasse DataStore.

Wir haben eine getDescription() Funktion, die allgemeine Informationen über den Datenspeicher zurückgibt.

Class extends DataStoreImplementation
Function getDescription
C_TEXT( ) :="Lernsystem für "+ ( . . . )+" Schüler"$0
$0StringThisStudentsall()length

Und hier ist der Code, der die Funktion aufruft:

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

Da das Datenspeicherobjekt, das vom ds Befehl zurückgegebene DataStore-Objekt eine Instanz der DataStore-Klasse ist, können wir es für den Aufruf der Funktion getName() verwenden.

die Klasse dataclass

Diese Klasse wird verwendet, um Funktionen zu implementieren, die mit der Datenklasse zusammenhängen.

Im Folgenden sehen Sie die Implementierung der Klasse Schools. Wir haben eine registerStudent() Funktion, um einen neuen Schüler in einer Schule anzulegen.

Sie empfängt die Daten eines Schülers in einem Objekt und prüft, ob das Englischniveau des Schülers dem von der Schule geforderten Mindestniveau entspricht. Wenn alles in Ordnung ist, erstellt und speichert die Funktion die Entität Schüler.

Sie brauchensich nicht um die Implementierung des Datenmodells zu kümmern, sondern erstelleneinfach Ihr Objekt und rufen die Funktion auf.

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("Erfolg";True)

If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="Das Englischniveau ist nicht hoch genug"
$0 :=$result
End if

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

$0 :=$student

End if

Und hier ist der Code, der die Funktion aufruft:

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

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

Da das Objekt ds.Schools dataclass eine Instanz der Klasse Schools ist, können wir es zum Aufruf der Funktion registerStudent() verwenden.

die Entitätsklasse

Diese Klasse wird verwendet, um Funktionen zu implementieren, die sich auf eine Entität beziehen.

Im Folgenden sehen Sie die Implementierung der Klasse StudentsEntity.

Wir haben eine Funktion getFirstAhead(), die die Schüler zurückgibt, die einen besseren Rang als der aktuelle Schüler haben.

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)

Hier ist der Code, der die Funktion aufruft:


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

Da das Entitätsobjekt $student eine Instanz der Klasse StudentsEntity ist, können wir es für den Aufruf der Funktion getFirstAhead() verwenden.

Beachten Sie, dass die Klasse StudentsEntity die Klasse Entity erweitert, die alle für ein Entitätsobjekt verfügbaren Methoden enthält(z. B. , getDataClass(), usw.). Daher können diese Methoden mit This in der Funktion aufgerufen werden.

die Entitätsauswahlklasse

Diese Klasse wird verwendet, um Funktionen im Zusammenhang mit einer Entitätsauswahl zu implementieren.

Im Folgenden ist die Implementierung der Klasse StudentsSelection dargestellt.

Wir haben eine setFinalExam() Funktion, die eine Entitätsauswahl von Studenten aktualisiert. Das Attribut finalExam wird auf den angegebenen Wert gesetzt.

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

Und hier ist der Code, der die Funktion aufruft:

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

Da das Objekt ds.Students.all() eine Instanz der Klasse StudentsSelection ist, können wir es zum Aufrufen der Funktion setFinalExam() verwenden.

Was ist mit dem restlichen Server?

In einem weiteren Blog-Beitrag wird demnächst erklärt, wie man Funktionen von ORDA-Klassen in REST-Anfragen aufruft. Bleiben Sie dran!

In der Zwischenzeit können Sie den HDI herunterladen, um die neuen ORDA-Klassen kennenzulernen, und die Dokumentation für weitere Details lesen!

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert ist seit 2017 als Product Owner im 4D Produktteam tätig. Als Product Owner ist sie für das Schreiben der User Stories und deren Umsetzung in funktionale Spezifikationen zuständig. Ihre Aufgabe ist es auch, sicherzustellen, dass die Implementierung der Funktionen den Anforderungen des Kunden entspricht. Marie-Sophie ist Absolventin der ESIGELEC Ingenieurschule und begann ihre Karriere als Ingenieurin bei IBM im Jahr 1995. Sie nahm an verschiedenen Projekten teil (Wartungs- oder Build-Projekte) und arbeitete als Cobol-Entwicklerin. Dann arbeitete sie als UML-Designerin und Java-Entwicklerin. In letzter Zeit bestand ihre Hauptaufgabe darin, funktionale Anforderungen zu analysieren und zu schreiben sowie Geschäfts- und Entwicklungsteams zu koordinieren.