Třídy ORDA pro zpracování datového modelu

Automaticky přeloženo z Deepl

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:

blank

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!

Avatar
• Product Owner • Marie-Sophie Landrieu-Yvert se připojila k programovému týmu 4D jako Product Owner v roce 2017. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Její úlohou je také zajistit, aby implementovaná funkce odpovídala potřebám zákazníka. Marie-Sophie vystudovala inženýrskou školu ESIGELEC a svou kariéru zahájila jako inženýrka v IBM v roce 1995. Podílela se na různých projektech (projekty údržby nebo výstavby) a pracovala jako vývojářka Cobol. Poté pracovala jako UML designer a Java developer. V poslední době byly jejími hlavními rolí analyzovat a psát funkčních požadavky a koordinovat obchodní a vývojové týmy.