前回の ブログでは、ORDAデータモデルクラスの世界について紹介しました。さて、いよいよ手を動かして、もっと勉強しましょう
ORDAの構造(データストア、データクラス、エンティティ、エンティティ選択)がオブジェクトで構成されていることは既にご存知でしょう。しかし、それらは単なるオブジェクトではなく、特定のORDAクラスにリンクされた強型オブジェクトなのです。つまり、データの物理的な実装の複雑さを隠蔽するための関数を書くことができるのです。
したがって、特にデータベースをRESTサーバとして公開する場合は、APIとして公開することがより簡単になります。これは、何年も前に書いたコードや他の人が書いたコードを修正する必要がある場合などの頭痛の種を避けるのにも役立ちます。複雑さを隠すことで、エラーを減らし、開発プロセスをスピードアップすることができます。
新しいORDAクラスの概要
ORDAクラスはプロジェクトで自動的に利用可能になります。ここにシンプルなデータベース(LearningSystemという名前)があります。 Students テーブルを含む単純なデータベース (LearningSystem という名前) があります。
4Dで以下のクラスが自動的に作成されたことが確認できます。
- DataStore
- Students (DataClassクラス)
- StudentsEntity (Entityクラス)
- StudentsSelection (EntitySelectionクラス)
要約すると、ローカルデータベースには、以下のものがあります。
- 1つのデータストア・クラス
そして、各テーブルには
- データ・クラス・クラス (この例では Students)
- エンティティ・クラス (この例では StudentsEntity)
- エンティティ選択クラス(この例ではStudentsSelection)
ORDAオブジェクト(データストア、データクラス、エンティティ、エンティティセレクション)は、対応するデータモデルクラスのインスタンスであり、そのクラスで定義された関数のいずれかを呼び出すことができる。
関数内では、ThisがORDAオブジェクトのインスタンスを指定します。
では、具体的な例を見てみましょう。以下は、使用するデータモデルです。
データストア・クラス
このクラスは、データストアに関連する関数を実装するために使用されます。
以下は、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クラスを発見し始め、詳細についてはドキュメントをチェックしてみてください