V předchozím příspěvku na blogu jsme vás seznámili se světem tříd datového modelu ORDA. Nyní je čas zašpinit si ruce a naučit se více!
Již víte, že struktura ORDA(datové úložiště, datová třída, entita, výběr entit) se skládá z objektů. Ale nejsou to jen objekty, jsou to silně typované objekty propojené s konkrétními třídami ORDA. To znamená, že můžete psát funkce, které skryjí složitost fyzické implementace dat.
Proto je mnohem snazší vystavit databázi jako rozhraní API, zejména pokud vystavíte databázi jako server REST. To vám také pomůže vyhnout se bolestem hlavy, například když potřebujete upravit kus kódu, který jste napsali před lety nebo který napsal někdo jiný. Skrytí složitosti snižuje počet chyb a urychluje proces vývoje!
HDI: Příklady použití tříd ORDA
Přehled nových tříd ORDA
Třídy ORDA jsou automaticky k dispozici s projekty, podívejme se na příklad. Zde je jednoduchá databáze (pojmenovaná LearningSystem), která obsahuje např. Students tabulku.
Můžeme si ověřit, že 4D automaticky vytvořilo následující třídy:
- DataStore
- Students (třída DataClass)
- StudentsEntity (třída Entity)
- StudentsSelection (třída EntitySelection)
Shrneme-li to, v místní databázi se nachází:
- Jedna třída datového úložiště
A každá tabulka má:
- třídu datové třídy (v tomto příkladu: Students).
- třídu entit (v tomto příkladu: StudentsEntity)
- třídu pro výběr entit (v tomto příkladu: StudentsSelection)
Každý objekt ORDA(datové úložiště, datová třída, entita, výběr entity) je instancí příslušné třídy datového modelu a může volat libovolnou funkci definovanou v této třídě.
V rámci funkce This označuje instanci objektu ORDA.
Podívejme se na konkrétní příklad. Zde je datový model, který budeme používat:
třída datového úložiště
Tato třída slouží k implementaci funkcí souvisejících s datovým úložištěm.
Následuje implementace třídy DataStore.
Máme funkci getDescription(), která vrací obecné informace o datovém skladu.
Class extends DataStoreImplementation
Function getDescription
C_TEXT( ) :="Výukový systém zahrnující "+ ( . . . )+" studenty".$0
$0StringThisStudentsall()length
A zde je kód, který funkci volá:
C_TEXT($dbName)
$dbName :=ds.getDescription() // $dbName is "Learning system covering 200 students"
Protože objekt datového skladu vrácený pomocí ds příkazem, je instancí třídy DataStore, můžeme jej použít k volání funkce getName().
třída dataclass
Tato třída slouží k implementaci funkcí souvisejících s datovou třídou.
Následuje implementace třídy Školy. Máme funkci registerStudent() pro vytvoření nového žáka ve škole.
Přijme údaje o studentovi v objektu a zkontroluje, zda úroveň angličtiny studenta splňuje minimální požadovanou úroveň školy. Pokud je vše v pořádku, funkce vytvoří a uloží entitu Students.
Není třeba se starat o implementaci datového modelu,stačí vytvořit objekt a zavolat funkci.
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("úspěch";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="Úroveň angličtiny není dostatečně vysoká"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
A zde je kód, který funkci volá:
Form.result:=ds.Schools.registerStudent(Form.data)
//Form.data is
// {"englishLevel":4,"firstname":"Mary","lastname":"Smith","schoolName":"Math school"}
Protože objekt ds.Schools datové třídy je instancí třídy Školy, můžeme jej použít k volání funkce registerStudent().
třída entit
Tato třída slouží k implementaci funkcí souvisejících s entitou.
Následuje implementace třídy StudentsEntity.
Máme funkci getFirstAhead() vracející studenty, kteří mají lepší hodnocení než aktuální student.
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).
Zde je kód, který funkci volá:
)
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
Protože objekt entity $student je instancí třídy StudentsEntity, můžeme jej použít k volání funkce getFirstAhead().
Všimněte si, že třída StudentsEntity rozšiřuje třídu Entity, která obsahuje všechny členské metody dostupné pro objekt entity(např, getDataClass(), atd.). Proto lze tyto členské metody volat pomocí funkce This.
třídy pro výběr entit
Tato třída slouží k implementaci funkcí souvisejících s výběrem entity.
Následuje implementace třídy StudentsSelection.
Máme funkci setFinalExam() aktualizující výběr entit studentů. Atribut finalExam je nastaven na danou hodnotu.
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
A zde je kód, který funkci volá:
C_OBJECT($result)
)
$result :=ds.Students.all().setFinalExam("Předáno"
// All the students have their finalExam attribute set to "Passed"
Protože objekt ds.Students.all() entity selection je instancí třídy StudentsSelection, můžeme jej použít k volání funkce setFinalExam().
A co zbytek serveru?
Brzy vyjde další příspěvek na blogu, kde bude vysvětleno, jak volat funkce tříd ORDA v požadavcích REST. Zůstaňte naladěni!
Mezitím si stáhněte HDI, abyste mohli začít objevovat nové třídy ORDA, a podívejte se do dokumentace, kde najdete další podrobnosti!