$Order ループの開始
$Order ループの 2 つの例 (For を使用するものと While を使用するもの) で、$Order の最初の呼び出しで空文字列を使用しているのは、“最初から開始” という意味です。同様に、ln = "" の場合にループを終了するのは、“最後で停止” という意味です。文を修正してループを使用することにより、生成される添え字を少なくします。例えば、set ln = "B" と設定すると、姓のループは “Jones” を返します (“Agee” はスキップします)。
このループで名前の部分文字列 (“Jone” など) で始まる名前のみを生成する場合は、
-
$Order の最初の呼び出しで、空文字列の代わりにその部分文字列を使用します。
-
部分文字列を姓と比較する条件を使用し、その部分文字列で始まらない名前に達したらループを終了します。これにはいくつか方法があります。内容については次ページで学習します。
ここでは、ループの開始について学習します。変数 substring は、空でない部分文字列を格納すると想定します。部分文字列に基づいて $Order ループが開始されるようにしますが、ln を部分文字列に単純に設定することはできません。この部分文字列が、既にデータベースに存在する姓である可能性もあるためです。このような場合、ループは次の名前から開始されます。これは、初期 $Order が原因で、インデックスに substring と完全に一致する名前が存在しても同様です。
対処法として、$Order を一度逆の順序で使用して、ln を、substring の前にある姓に設定します。それにより、後続の名前からループを開始し、名前を生成できます。
/// examples for ObjectScript Tutorial
Class ObjectScript.Examples
{
/// loop through last names that FOLLOW a substring (including the substring)
ClassMethod FocusedLoopStart()
{
read "Search for: ",substring
// find the last name just BEFORE the substring and then start looping
set ln = $order(^PersonI("Name", substring), -1)
for {
set ln = $order(^PersonI("Name", ln))
quit:(ln = "")
write !, ln
}
}
}
USER>do ##class(ObjectScript.Examples).FocusedLoopStart()
Search for: B
Jones
Swoboda
USER>do ##class(ObjectScript.Examples).FocusedLoopStart()
Search for: J
Jones
Swoboda
USER>do ##class(ObjectScript.Examples).FocusedLoopStart()
Search for: Jones
Jones
Swoboda
USER>do ##class(ObjectScript.Examples).FocusedLoopStart()
Search for: Ju
Swoboda
USER>