オブジェクトの接続
これで、新しい TicketItem オブジェクトを Show オブジェクトと TicketOrder に接続することができます(TicketItem を定義したとき、これらの参照を保持するために同じ名前 —Show および TicketOrder— を持つプロパティを作成しました)。
これらの接続を行うには、どのようにすればいいでしょうか。これらの接続を作成するには、オブジェクトをメモリに運んだ %New や %OpenID メソッドで返される oref と同様に、プロパティを設定するだけです。
たった今生成した TicketItem オブジェクトに対する oref は既に既に持っていますが、Show オブジェクトに対する oref は持っていません。持っているものは、AddShow メソッドのパラメータとして渡された Show オブジェクトに対するオブジェクト ID です。この %OpenId メソッドのオブジェクト ID を使用して Show オブジェクトをオープンし、その oref を shw 変数に割り当てます。
// Connect to a Show object
Set shw = ##class(Cinema.Show).%OpenId(ShowID)
Set itm.Show = shw
// Connect to the Order object
Set itm.TicketOrder = ord
後は、shw 変数と ord 変数で保持されている oref の値を、itm.Show プロパティと itm.TicketOrder プロパティに割り当てるだけです。
Utils.AddShow
ClassMethod AddShow(ShowID As %String)
{
// Get an order object
If $data(%session.Data("Order")) {
Set ord = ##class(Cinema.TicketOrder).%OpenId(%session.Data("Order"))
}
Else {
Set ord=##class(Cinema.TicketOrder).%New()
// ...
}
// Create a new TicketItem object
Set itm = ##class(Cinema.TicketItem).%New()
// Connect to a Show object
Set shw = ##class(Cinema.Show).%OpenId(ShowID)
Set itm.Show = shw
// Connect to the Order object
Set itm.TicketOrder = ord
// ...
// Save incomplete order and remember its Id in %session.
Do ord.%Save()
Set %session.Data("Order") = ord.%Id()
}