データモデルを処理するORDAクラス

Deeplからの自動翻訳

前回の ブログでは、ORDAデータモデルクラスの世界について紹介しました。さて、いよいよ手を動かして、もっと勉強しましょう

ORDAの構造(データストアデータクラスエンティティエンティティ選択)がオブジェクトで構成されていることは既にご存知でしょう。しかし、それらは単なるオブジェクトではなく、特定のORDAクラスにリンクされた強型オブジェクトなのです。つまり、データの物理的な実装の複雑さを隠蔽するための関数を書くことができるのです。

したがって、特にデータベースをRESTサーバとして公開する場合は、APIとして公開することがより簡単になります。これは、何年も前に書いたコードや他の人が書いたコードを修正する必要がある場合などの頭痛の種を避けるのにも役立ちます。複雑さを隠すことで、エラーを減らし、開発プロセスをスピードアップすることができます。

HDI: ORDAクラスの使用例

新しいORDAクラスの概要

ORDAクラスはプロジェクトで自動的に利用可能になります。ここにシンプルなデータベース(LearningSystemという名前)があります。 Students テーブルを含む単純なデータベース (LearningSystem という名前) があります。

4Dで以下のクラスが自動的に作成されたことが確認できます。

  • DataStore
  • Students (DataClassクラス)
  • StudentsEntity (Entityクラス)
  • StudentsSelection (EntitySelectionクラス)

要約すると、ローカルデータベースには、以下のものがあります。

  • 1つのデータストア・クラス

そして、各テーブルには

  • データ・クラス・クラス (この例では Students)
  • エンティティ・クラス (この例では StudentsEntity)
  • エンティティ選択クラス(この例ではStudentsSelection)

ORDAオブジェクト(データストアデータクラスエンティティエンティティセレクション)は、対応するデータモデルクラスのインスタンスであり、そのクラスで定義された関数のいずれかを呼び出すことができる。

関数内では、ThisがORDAオブジェクトのインスタンスを指定します。

では、具体的な例を見てみましょう。以下は、使用するデータモデルです。

blank

データストア・クラス

このクラスは、データストアに関連する関数を実装するために使用されます。

以下は、DataStoreクラスの実装です。

データストアの一般的な情報を返すgetDescription() 関数を用意しています。

Class extends DataStoreImplementation
Function getDescription
C_TEXT( ) :="学習システムの対象 "+ ( . . . )+"生徒"$0
$0StringThisStudentsall()length

そして、この関数を呼び出すコードは以下の通りです。

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

コマンドによって返されたデータストアオブジェクトはDataStoreのインスタンスなので dsコマンドによって返されるデータストアオブジェクトはDataStoreクラスのインスタンスなので、これを使用してgetName() 関数を呼び出すことができます。

データクラス

このクラスは、データクラスに関連する関数を実装するために使用されます。

以下は、Schoolsクラスの実装です。ある学校に新しい生徒を作成するための関数registerStudent() を用意しています。

これは、生徒のデータをオブジェクトで受け取り、その生徒の英語レベルが学校の最低必要レベルを満たしているかどうかをチェックします。すべてがOKなら、この関数はStudentsエンティティを作成して保存します。

データモデルの実装について心配する必要はなく、単に オブジェクトを構築して関数を呼び出すだけです。

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

:="The level of English is not high enough"
$0 :=$result
End if

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

End if

そして、この関数を呼び出すコードは次のとおりです。

Formresult:= . . ( . ) //dsSchoolsregisterStudentFormdata
//Form.data is
. {"englishLevel":4,"firstname":"Mary","lastname":"Smith","schoolName":"Math school"}

ds.Schools データクラスオブジェクトはSchoolsクラスのインスタンスなので、これを使用してregisterStudent() 関数を呼び出すことができます。

エンティティクラス

このクラスは、エンティティに関連する関数を実装するために使用されます。

以下は、StudentsEntityクラスの実装です。

getFirstAhead() 関数で、現在の生徒より順位が上の生徒を返しています。

Class extends Entity

Function getFirstAhead
C_OBJECT //Get the $sliceSize Students having a better rank($0;$ahead)
C_LONGINT ($1;$sliceSize)

$sliceSize :=$1

$ahead :=This.getDataClass().query("rank < :1";This.rank).orderBy("rank desc")
$0 :=$ahead.slice(0;$sliceSize)

以下は、この関数を呼び出すコードです。


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

$student エンティティオブジェクトはStudentsEntityクラスのインスタンスなので、これを使ってgetFirstAhead() 関数を呼び出すことができます。

StudentsEntityクラスは、エンティティ・オブジェクトで利用可能なすべてのメンバ・メソッドを含むEntity クラスを継承していることに注意してください(例: , getDataClass()など) が含まれています。したがって、これらのメンバメソッドは、関数内でThisを使用して呼び出すことができます。

エンティティ選択クラス

このクラスは、エンティティ選択に関する関数を実装するために使用されます。

以下は、StudentsSelectionクラスの実装です。

setFinalExam() 関数で、学生のエンティティ選択を更新しています。finalExam 属性には、指定された値が設定されています。

Class extends EntitySelection


Function setFinalExam

C_TEXT
($1;$value)
C_OBJECT
($0;$status;$student)
$value :=$1

For each ($student;This)Until (Not($status.success) )
$studentfinalExam :=$value
$status :=$student.save()
End for each

$0
:=。$status

そして、この関数を呼び出すコードは次のとおりです。

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

ds.Students.all() エンティティ選択オブジェクトはStudentsSelectionクラスのインスタンスなので、これを 使ってsetFinalExam() 関数を呼び出すことができるのです。

残りのサーバーはどうでしょうか?

RESTリクエストでORDAクラスの関数を呼び出す方法については、近日中に別のブログ記事をアップする予定です。ご期待ください。

それまでは、HDIをダウンロードして新しいORDAクラスを発見し始め、詳細についてはドキュメントをチェックしてみてください

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。