Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

$Order ループの開始

$Order ループの 2 つの例 (For を使用するものと While を使用するもの) で、$Order の最初の呼び出しで空文字列を使用しているのは、“最初から開始” という意味です。同様に、ln = "" の場合にループを終了するのは、“最後で停止” という意味です。文を修正してループを使用することにより、生成される添え字を少なくします。例えば、set ln = "B" と設定すると、姓のループは “Jones” を返します (“Agee” はスキップします)。

このループで名前の部分文字列 (“Jone” など) で始まる名前のみを生成する場合は、

  • $Order の最初の呼び出しで、空文字列の代わりにその部分文字列を使用します。

  • 部分文字列を姓と比較する条件を使用し、その部分文字列で始まらない名前に達したらループを終了します。これにはいくつか方法があります。内容については次ページで学習します。

ここでは、ループの開始について学習します。変数 substring は、空でない部分文字列を格納すると想定します。部分文字列に基づいて $Order ループが開始されるようにしますが、ln を部分文字列に単純に設定することはできません。この部分文字列が、既にデータベースに存在する姓である可能性もあるためです。このような場合、ループは次の名前から開始されます。これは、初期 $Order が原因で、インデックスに substring と完全に一致する名前が存在しても同様です。

対処法として、$Order を一度逆の順序で使用して、ln を、substring の前にある姓に設定します。それにより、後続の名前からループを開始し、名前を生成できます。

VS Code - ObjectScript


/// 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>
FeedbackOpens in a new tab