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:
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!