^%GCHANGE グローバルを探して変更

^%GCHANGEユーティリティは、指定されたグローバル内の条件を満たすものを探し出し、一覧表示したり、一括変更したり、複雑な操作を行ったりするユーティリティです。

探して表示 (Find)

次のようなグローバルがあるとき
User>ZWrite ^A
^A(1)="A"
^A(2)="BB"
^A(3)="日本語のデータ"
^A(4)="データBase"
^A(5)=$LB(1,"Book")
Bを含むグローバルを探してみます。Findモードで動作させます。
User>Do ^%GCHANGE

Output on
Device:
Right margin: 80 =>

Global ^A     //対象グローバルを指定
(F) Find, (C) Change every, or (X) Execute code: F=> F //Findモード
Find every: B //Bを含むグローバルを探す
^A(2)=BB
^A(4)=データBase
^A(5)= Book
このようにデータ部にBを含むものが一度に表示されます。
検索対象となるのはデータ部のみで、キー部は対象になりません。

また、この例では$LB内のBookも見つけていますが、$Listとして解釈しているのではなく単純に文字列が含まれるかどうか( [ 演算子か何かで )見ているようです。このため$List内は見つけられないことがあるので注意が必要です。例えばこの^Aの例では1で探しても^A(5)は見つかりません。


日本語でも検索できることを確認してみます。
Global ^A
(F) Find, (C) Change every, or (X) Execute code: F=> F
Find every: データ
^A(3)=日本語のデータ
^A(4)=データBase
期待通り動作しました。

一括変更 (Change)

一括変更を使ってBをCに変えてみます。Changeモードで動作させます。
User>D ^%GCHANGE

Output on
Device:
Right margin: 80 =>

Global ^A  //対象グローバルを指定
(F) Find, (C) Change every, or (X) Execute code: F=> C  //Changeモード
Change every: B to: C  //BをCに変更する
^A(2)=CC                //変換した結果が表示されます
^A(4)=データCase
^A(5)= Cook

日本語でも置換してみます。
Global ^A
(F) Find, (C) Change every, or (X) Execute code: F=> C
Change every: データ to: データー
^A(3)=日本語のデーター
^A(4)=データーCase
問題ないですね。

複雑な操作 (eXecute)

任意のコマンドを実行できるXを使ってみます。
User>D ^%GCHANGE

Output on
Device:
Right margin: 80 =>

Global ^A  //対象グローバルを指定
(F) Find, (C) Change every, or (X) Execute code: F=> X  //eXecuteモード
GREF is the full global reference. GVAL is its value.
Do NOT change GREF or %EX!

Find every data node with: C  //Cを含むグローバルに対して
And execute code: Write "GREF:",GREF,!,"GVAL:",GVAL,!! 
                          //GREFとGVALを表示してみる
GREF:^A(2)
GVAL:CC

^A(2)=CC
GREF:^A(4)
GVAL:データーCase

^A(4)=データーCase
GREF:^A(5)
GVAL: Cook

^A(5)= Cook
途中説明が書かれているように、グローバルのキー部がGREFに、データ部がGVALに含まれます。
これを使って様々な処理を記述できます。

例えば、Cを含むグローバルを消してしまう処理は以下のようになります。
Find every data node with: C
And execute code: Kill @GREF  // @演算を使って対象をKill
^A(2)=CC
^A(4)=データーCase
^A(5)= Cook

Global ^
USER>ZW ^A  //Cを含むものが消えていることを確認します
^A(1)="A"
^A(3)="日本語のデーター"
@演算や、$QS関数を使えば、大抵のことは出来そうです。

その他

管理ポータルでは、システムエクスプローラ→グローバル→検索/置換が同様の機能を提供しています。
Update