はじめに
スタジオからクラスを削除すると、内部でストレージ情報等が残ります。
そうすると、同じストレージ名を持つ別名のクラスが作成できなってしまいます。
これでは、クラスのリネームが出来なくなります。
これは困る。綴りを間違えたとか、よくあるネタですよね。
今回はゴミを残さず、綺麗さっぱりと削除する方法をご紹介いたします。
当然リネームもできますよ!
先ずはスタジオからクラスを削除したらどのような状態になるか
下記手順で検証を行います。
- 検証対象のクラスを作成する
- 作成したクラスを削除する
- 同じストレージ名で、クラス名が異なるクラスを作成する
では、検証開始です!
1. 検証対象のクラスを作成する
先ずは検証対象のクラスを作成します。
作成条件は特に指定はありませんが、分かりやすいように下記名称で命名しました。
・クラス名「developer.data.Delete.cls」
・ストレージ情報「^developer.data.DeleteD、I、S」
ついでに、データも100件程作成します。
2. 作成したデータクラスを削除する
次は、1.で作成したクラスを削除します。
スタジオであれば、クラス名を右クリックし「クラス’xxxx’を削除」を選択し、確認画面で「OK」をクリックすることでクラスは削除ができます。
この時点で、データクラスは削除となりますが、グローバル自体は残存している状態になります。
3. 同じストレージ名で、クラス名が異なるクラスを作成する
データクラスのリネーム作業になりますね。
作業の流れとしては、新規クラスとして「developer.data.Delete.cls」と異なる名前をつけます。
適宜保存した後、ストレージ情報を「^developer.data.DeleteD、I、S」に書き換えて、コンパイル実行。
クラスをリネームしたい時に行うシナリオですよね。
では、下記条件で新規クラスを作成し、コンパイルまで行ってみます。
・クラス名「developer.data.DeleteX.cls」
・ストレージ情報「^developer.data.DeleteD、I、S」
コンパイル時にアラートが発生します。
アラートの内容は、ストレージ情報が既に使用されているため、同じ名称は付けてはダメって事です。
残存しているグローバルが影響している可能性があるので、一旦グローバルを削除して再度コンパイルを実施します。
やっぱり駄目でした。
グローバルは関係ないですね。
クラスを削除しても、内部でストレージ情報を持っているため、そちらを削除しないと同じストレージ名を使う事が出来ないようです。
削除したクラスのストレージ情報を削除する
既に削除してしまったクラスのストレージ情報を削除するコマンドを実行します。
引数は、「削除したクラス名」になります。
w ##Class(%ExtentMgr.Util).DeleteExtent("developer.data.Delete")
ターミナルで上記コマンドを実行した後、先ほどエラーが発生してコンパイルできなかったクラスを、再度コンパイルしてみます。
04/23/2024 18:06:30 に修飾子 'cuk /checkuptodate=expandedonly' でコンパイルを開始しました。
クラスのコンパイル中 developer.data.DeleteX
テーブルのコンパイル中 developer_data.DeleteX
ルーチンのコンパイル中 developer.data.DeleteX.1
コンパイルが正常に終了しました (所要時間: 0.317秒)。
コンパイルが無事通りました、ではデータが作成・取得できるか試してみたいと思います。
s obj=##class(developer.data.DeleteX).%New()
s obj.num=1
s obj.name="Russell,Ralph W."
w obj.%Save() // -> 1
グローバルも無事作成されたようです。
名称も、元の「developer.data.Delete.cls」のストレージ情報を引き継げたようですね。
グローバルを残して別クラスに引き継げるか?
ここが気になるところですよね。
では、一旦「developer.data.DeleteX.cls」を削除して、「developer.data.DeleteY.cls」を同じクラス構成で作成したいと思います。
クラスをリネームすると思って下さい。
コマンドで確かめてみます。
※リネーム過程は繰り返しになるので割愛致します。
s obj=##class(developer.data.DeleteY).%OpenId(1)
w obj.name // -> Russell,Ralph W.
データが正常に引き継げた事が分かります。
これでリネーム作業も容易に行えるようになりました。
削除前のクラスをコマンドで完全に削除する
まだ存在しているクラスをコマンドで削除します。
下記コマンドを実行する事でクラスの削除を行います。
ストレージ情報とグローバルは削除しません。
w $system.OBJ.Delete("developer.data.DeleteY")
第2引数に「e」を渡すことで、ストレージ情報もグローバルも全て削除されます。
w $system.OBJ.Delete("developer.data.DeleteY","e")
では、ターミナルにて実行してみましょう。
実行後クラスが削除され、グローバルも削除されました。
※「developer.data.DeleteI」が検索されていますが、中身は存在していません。
ストレージ情報も削除されているので、一番最初に作成したクラス「developer.data.Delete.cls」が再度作成できました。
04/23/2024 18:33:10 に修飾子 'cuk /checkuptodate=expandedonly' でコンパイルを開始しました。
クラスのコンパイル中 developer.data.Delete
テーブルのコンパイル中 developer_data.Delete
ルーチンのコンパイル中 developer.data.Delete.1
コンパイルが正常に終了しました (所要時間: 0.376秒)。
ただし、グローバルが削除されたので、データの引継ぎは行えません。
s obj=##class(developer.data.Delete).%OpenId(1)
w obj // -> null ※レコードが無い為、objはnullとなる
終わりに
クラスを作成した後スペルミスを発見した時は、即修正したいですよね。
そんな時に使用するコマンドを2つご紹介いたしました。
お互い性質の異なるコマンドなので、状況に合わせて使い分けて下さい。