スプール・デバイス
ここでは、InterSystems IRIS® データ・プラットフォームのスプーリングについて説明します。
概要
InterSystems IRIS® Data Platform では、印刷出力をプリンタまたは画面に直接送信することも、後で印刷するためにスプール・グローバルに保持することもできます。InterSystems IRIS スプーリングは、ユーザのオペレーティング・システムで実行されるスプーリングから独立しています。
InterSystems IRIS スプーリングは、今すぐに印刷する代わりに、プログラムの出力を ^SPOOL 添え字付きグローバルに自動的に保存する技術です。プリンタに ^SPOOL グローバルのコンテンツを送信することで、後で出力を印刷できます。ここでは、このスプーリング機能の 2 つの使用方法について説明します。その 1 つは ObjectScript コマンド (OPEN、USE、WRITE、CLOSE) を使用する方法で、もう 1 つは %IS ユーティリティと %SPOOL ユーティリティを使用する方法です。
スプール・デバイスのオープンと使用
現在のネームスペースのスプール・グローバルに出力を送信するには、そのスプーラを開き、出力デバイスとして指定します。
スプーラは InterSystems IRIS で提供される事前定義のデバイスです。スプーラには、デバイス・テーブルでデバイス番号 2 が割り当てられています。このデバイス番号を使用して、OPEN コマンド、USE コマンド、CLOSE コマンド内でスプーラ・デバイスを識別します。
スプーラ・デバイス情報には、管理ポータルからアクセスできます。[システム管理]、[構成]、[デバイス設定]、[デバイス] の順に選択します。番号が 2 のデバイスと SPOOL というデバイスがあります。既定では、これらは同じ物理デバイス (デバイス 2) にマップされ、同じオプション値を持っています。
InterSystems IRIS スプーラを現在のデバイスとして設定する場合、InterSystems IRIS は、グローバル ^SPOOL のデバイス 2 に送信されるあらゆる出力を現在のネームスペースに格納します。各 ^SPOOL 行は、別々のグローバル・ノードに格納されます。
InterSystems IRIS スプーラを開き、現在のデバイスを設定する方法には以下の 2 種類があります。
-
OPEN コマンドと USE コマンドを発行します。
-
%IS ユーティリティを起動します。
スプーリング・デバイスへの OPEN コマンドと USE コマンド
OPEN コマンドと USE コマンドを発行して、スプーリング・デバイスを直接開くことができます。
OPEN 2:(doc_num:index) USE 2
パラメータ | 定義 |
---|---|
doc_num | 開くスプール・ドキュメント (ファイル) の番号。スプール・ドキュメントは、^SPOOL グローバルに格納されています。既定は 1 です。 |
index | スプール・ドキュメント内の 1 以上の行番号。既定は 1 です。 |
これらは位置パラメータです。両方のパラメータを省略すると、パラメータ値は既定の (1:1) になります。第 1 パラメータ (doc_num) を設定し、第 2 パラメータ (index) を省略できます。この場合の既定は 1 です。第 2 パラメータを設定する場合、第 1 パラメータは必ず指定します。
InterSystems IRIS は、これらの値を使用し、出力する行を判断します。doc_num パラメータは、^SPOOL グローバルの最初の添え字として処理されます。index パラメータは、^SPOOL グローバルの 2 番目の添え字として処理されます。
USE コマンド
コマンド OPEN 2:(doc_num:index) の実行後、デバイス 2 に USE 2 コマンドを発行すると、InterSystems IRIS は以降の出力をすべて、^SPOOL(doc_num:index) のスプーラに送信します。各出力行は、^SPOOL に別々のグローバル・ノードとして格納されます。
WRITE コマンド
^SPOOL グローバルに行を書き込むには、行終了文字で終了する WRITE コマンドを発行します。以下はその例です。
/* Writing to the ^SPOOL global */
OPEN 2
USE 2
WRITE "First line of text",!
WRITE "Second line of text",!
CLOSE 2
/* Displaying the ^SPOOL global */
WRITE ^SPOOL(1,1),^SPOOL(1,2)
各行は、行終了文字 (感嘆符) で終了し、別のグローバル・ノードに格納されます。
しかし、一行の出力を作成するために、複数の WRITE コマンドを使用する場合もあります。WRITE に行終了文字がない場合、次に続く WRITE コマンドが、同じ出力行に出力を追加します。両方とも同じグローバル・ノードに書き込みます。この行は、行終了文字が発行されるか、スプーラが閉じるまでバッファに保持され、スプール・グローバルには書き込まれません。
以下の例では、CLOSE が発行されると 1 つのグローバル・ノードが書き込まれます。
/* Writing to the ^SPOOL global */
OPEN 2
USE 2
WRITE "First half of line "
WRITE "Second half of line"
CLOSE 2
/* Displaying the ^SPOOL global */
WRITE ^SPOOL(1,1)
行終了文字は、一般的には WRITE コマンド・コード文字の ! (感嘆符) です。これは、キャリッジ・リターン (ASCII 13) と改行 (ASCII 10) の組み合わせと同等のものです。行を終了するには、これらの制御文字の両方が必要です。キャリッジ・リターン (ASCII 13) のみを発行すると、新規の行ノードを開始するのではなく、キャリッジ・リターンが行ノードに連結されることになります。ターミナルでは、このような行は、キャリッジ・リターンの後のテキストによってその前のテキストを上書きしたものとなります。
次の例では、^SPOOL ファイルの 2 つの行ノードのみが書き込まれます。
/* Writing to the ^SPOOL global */
OPEN 2
USE 2
WRITE "AAAAAAAAAA",$CHAR(10),$CHAR(13)
WRITE "BBBBBBBBBB",$CHAR(13)
WRITE "XXXX",!
CLOSE 2
/* Displaying the ^SPOOL global */
WRITE ^SPOOL(1,1),^SPOOL(1,2)
詳細は、"ObjectScript ランゲージ・リファレンス" の "OPEN" コマンド、"USE" コマンド、"WRITE" コマンド、および "CLOSE" コマンドを参照してください。
スプーリングと特殊変数
^SPOOL に書き込む場合、InterSystems IRIS は特殊変数である $X と $Y を継続的に更新します。$X は現在のインデックス行に書き込まれた文字数を示し、$Y は現在 OPEN されている行数を示します。$Y の値は、ノード・インデックスと同じである必要はありません。以下はその例です。
/* Writing to the ^SPOOL global */
OPEN 2:(2:3)
USE 2
WRITE "Hello " SET x1=$X,y1=$Y,z1=$ZA
WRITE "world",! SET x2=$X,y2=$Y,z2=$ZA
WRITE "Good to see you",! SET x3=$X,y3=$Y,z3=$ZA
CLOSE 2
/* Displaying the ^SPOOL global */
WRITE ^SPOOL(2,3),^SPOOL(2,4)
WRITE !,"$X=",x1," ",x2," ",x3
WRITE !,"$Y=",y1," ",y2," ",y3
WRITE !,"$ZA=",z1," ",z2," ",z3
例えば、最初の WRITE は $X=6 (現在の列数) を設定し、2番目、3番目のWRITE は (改行があるため) いずれも $X=0 を設定します。また、最初の WRITE は $Y=0 を設定し、2 番目は(改行があるため) $Y=0、3 番目は $Y=2 を設定します。書き込まれる行は ^SPOOL(2,3) と ^SPOOL(2,4) です。インデックス番号を決定するには $ZA を使用します。
スプール・ファイルに書き込むには、次に有効なインデックス番号で $ZA 特殊変数を設定します。したがって、index=3 に書き込み、行ターミネータを含まない場合、(次の WRITE コマンドがインデックス 3 に継続して書き込むので) $ZA=3 になります。しかし、行ターミネータを含む場合、$ZA=4 となります。
USE コマンドは、OPEN コマンドで指定されたスプール・ファイルの doc_num を含むように $ZB を設定します。
$IO 特殊変数は、スプール・ファイルへの書き込みで変更されません。通常 $IO は、現在のデバイスの ID を含むように USE コマンドでリセットされます。しかし、スプーラのように出力のみを行うデバイスを使用している場合、$IO は現在の入力デバイスの ID を継続して持ちつづけます。
詳細は、"ObjectScript ランゲージ・リファレンス" の特殊変数 "$X"、"$Y"、"$ZA"、"$ZB"、および "$IO" を参照してください。
スプール・デバイスのクローズ
デバイス 2 で CLOSE を発行すると、システムは、ノード ^SPOOL(doc_num,2147483647) を自動的に設定し、スプール・ドキュメントのクローズに関する情報と出力で使用された最大のインデックス番号に関する情報を格納します。
ネームスペースの変更
開いている状態のスプール・デバイスでネームスペースを変更すると、そのスプール・デバイスは自動的に閉じ、その後でネームスペースの変更が反映されます。^SPOOL グローバルを閉じると、そのレコードは正しいデータベースに書き込まれます。
ジョブの中止処理
スプール・デバイスを開き、現在のディレクトリをディスマウントした後、HALT コマンドまたは SYS.ProcessOpens in a new tab クラスの Terminate($JOB)Opens in a new tab メソッドを発行すると、InterSystems IRIS は、このスプール・デバイスに対する以降のアクセスに対して毎回必ず <PROTECT> エラーを返すようになります。この状態を避けるには、開いているすべての SPOOL デバイスが自動的に閉じるようにネームスペースを変更します。
^SPOOL グローバルの表示
すべての添え字付きのグローバルと同様に、以下に示すように WRITE コマンドを発行することによってスプール・ファイルにある行を表示できます。
WRITE "1st spool file node: ",^SPOOL(1,1),!
ただし、スプール・ファイル自体を表示および編集するには、管理ポータルに移動し、[システムエクスプローラ] の [グローバル] を選択します。現在のネームスペースを選択し、SPOOL グローバルを見つけ、[データ] をクリックします。これによって、次の例のようなスプール・ファイル・データが表示されます。
次のスプール・ファイルでは、(!) 終了文字によってスプール・ファイルの各ノード行が終了します。終了文字はスプール・ファイルの一部で、$CHAR(13,10)(Return と Line Feed) としてテキスト文字列に連結されます。
^SPOOL(1,1)=<<"First line of text"_$C(13,10)>> ^SPOOL(1,2)=<<"Second line of text"_$C(13,10)>> ^SPOOL(1,2147483647)={59605,43605{3{
次のスプール・ファイルには、行終了文字がありません。2 つの WRITE コマンドが 1 つのノード行を書き込みました。このノード行はスプール・ファイルを閉じることによって終了しました。
^SPOOL(1,1)=First half of line Second half of line ^SPOOL(1,2147483647)={59605,43725{2{
次のスプール・ファイルでは、キャリッジ・リターンと改行文字は WRITE コマンドに明示的にコード化されました。$CHAR(10) 改行文字は新規のノード行を開始し、$CHAR(13) キャリッジ・リターン文字はこれらのノード行に連結されます。
^SPOOL(1,1)=<<"AAAAAAAAAA"_$C(10)>> ^SPOOL(1,2)=<<$C(13)_"BBBBBBBBBB"_$C(13)_"XXXX"_$C(13,10)>> ^SPOOL(1,2147483647)={59605,44993{3{
このスプール・ファイルを閉じるとき、InterSystems IRIS がファイルの最終行を作成します。この行は、リテラル 1,2147483647、つまり、$HOROLOG 形式 (59605,44993) の日付と時刻、最終行を含むスプール・ファイルの行数から構成されています。
これらのスプール・ファイルのテキスト行は、管理ポータルの [システムエクスプローラ] の [グローバル] オプションで、その SPOOL グローバルの [データ] 表示を使用して編集または削除できます。
%IS ユーティリティを使用するスプーラのオープン
%IS は、ユーザがスプール・デバイスと、%SYS ネームスペースの ^%IS グローバルで定義された他のデバイスを選択できる便利なユーザ・インタフェースを提供します。%IS を使用すると、指定したスプール・ファイルを作成し、そのファイルにテキスト行を書き込めます。%SPOOL ユーティリティを使用して、このスプール・ファイルを印刷できます。
%IS ユーティリティを使用して開いたスプール・ファイルのみが、%SPOOL ユーティリティを使用して操作できます。
%IS を使用してスプール・ファイルを作成するには、以下の手順を実行します。
-
%IS ユーティリティを起動し、以下のスプーラを開きます。
>DO ^%IS
-
“Device” プロンプトで「“2”」またはニーモニック「“SPOOL”」を入力します。
-
“Name” プロンプトで、スプール・ドキュメント (ファイル) 名を入力します (スプール・デバイスを開かない場合は、“Name” プロンプトで Enter キーを押します)。既存のスプール・ドキュメント名を入力すると、%IS はその名前が正確かどうか、ファイルの最後の行を表示するかどうか、また新規情報を追加する場所を選択するかどうかを尋ねます。新規の名前を入力すると、%IS は新規ドキュメントを生成するかどうかを尋ねます。新規スプール・ドキュメントを生成するには、Enter キーを、“Name” プロンプトを再表示するには「No」を入力します。
-
“Description” プロンプトで、説明を 1 行入力します。見やすいコードにするには、スプールされたドキュメントの詳細を別々の行に置き、1 行が長すぎる場合は、70 文字で次の行に送ります。
以下の例は、“TESTING SPOOL FUNCTIONALITY” 行を ^SPOOL グローバルに書き込みます。IO は、%IS が “Device” プロンプトで指定したデバイスに設定された変数です。
%SYS>DO ^%IS
Device: 2
Name: SPOOLFILE not found
Create new document 'SPOOLFILE'? Yes => <RETURN>
Description: This is my test spool file
%SYS>USE IO WRITE "TESTING SPOOLING FUNCTIONALITY",!
%SYS>CLOSE IO
%SPOOL を使用するスプールされたドキュメントの管理
%SPOOL ユーティリティを使用して、InterSystems IRIS スプール・デバイスにアクセスするときに作成されたスプール・ファイルを管理します。InterSystems IRIS スプーリングは、システム・スプーリングとは独立しています。
InterSystems IRIS のスプーリングは、プログラムの出力を直ちに印刷するのではなく、グローバル ^SPOOL に自動的に保存する技術です。プリンタにグローバルのコンテンツを送信することで、後で出力を印刷できます。
%SPOOL ユーティリティを使用して、現在のネームスペースの ^SPOOL グローバルで、スプール・ドキュメントの印刷、リスト、または削除を行うことができます。特定のネームスペースからスプーラにドキュメントを送信する場合、そのネームスペースから %SPOOL ユーティリティを実行して目的のドキュメントにアクセスする必要があります。
%IS ユーティリティを使用して開いたスプール・ファイルのみが、%SPOOL ユーティリティを使用して操作できます。
%SPOOL は、どのスプーリング・オプションを選択するかを尋ねます。以下を入力することで、3 つの機能のいずれかを選択できます。
-
機能のメニュー番号
-
機能名の最初の文字
また、疑問符 (?) を入力すると、これらの機能のリストを表示できます。
以下の例は、スプーリング機能の選択方法を示しています。ここでは、Print を選択しています。
%SYS>DO ^%SPOOL
Spool function: ?
The available spool functions are:
1) Print
2) List documents
3) Delete document
Enter the number or first few characters of the name of the
spool function you want.
Spool function: 1 Print
以下のセクションでは、以下のタスクを実行する %SPOOL ユーティリティの使用方法を説明します。
-
スプール・ドキュメントの印刷
-
スプール・ドキュメントのリスト
-
スプール・ドキュメントの削除
%SPOOL を使用した印刷
%SPOOL ユーティリティ・メニューのオプション 1 の Print を使用して、任意のデバイスでの ^SPOOL グローバルのドキュメントの印刷、中断された印刷の再開、高品質プリンタへの用紙の手送りを行うことができます。出力をスプーラに送信することで、出力デバイスがドキュメントを印刷する間は、他のプロセスで使用できるようにターミナルが開放されます。
スプール・ドキュメントが完全に作成される前または作成された後のどちらかで、印刷を開始できます。プリンタが新規の出力を再開する場合、印刷プロセスを 5 秒間停止した後、その間蓄積されたすべての出力を印刷します。この印刷プロセスは、スプール・ドキュメントが閉じた時期を認識し、そのドキュメントの処理が完了すると終了します。
%SPOOL がドキュメントを印刷するとき、印刷が完了したページの記録を保持します。また、ページ番号でドキュメントのソートを行い、選択したページの最初から印刷を行うことができるように、ページ・インデックスの作成も行います。
印刷を停止した場合 (例えば、ターミナル出力中に Ctrl-c を押して停止した場合や、プリンタが故障した場合)、一部が印刷されて中断したページの先頭から印刷できるほか、ドキュメント内の任意のページの先頭から印刷を再開することもできます。InterSystems IRIS は、ページ・カウント内のドキュメントの開始点から、フォーム・フィードをページとしてカウントしません。
%SPOOL では、デスプールという語で印刷処理を表現します。ドキュメントの印刷が完了 (デスプール) した場合のみ、Despool start-end 列と説明行に値が存在します。
印刷機能の使用法
-
“Spool function:” プロンプトで「1」を入力します。
-
“Name:” プロンプトで、ヘルプ・テキストを表示するには「?」を入力します。現在のネームスペースにある既存のスプール・ドキュメントをすべて一覧表示するには「??」を入力し、スプール・ドキュメントを印刷するにはその名前を入力します。%SPOOL は、それが適切なドキュメントであるかを確認します。
-
%SPOOL から 印刷を開始するページを尋ねられた場合は、ドキュメントのページ番号を入力します。最初のページから開始するには Enter キーを押します。印刷プロセスがまだ取得していないページの先頭から印刷を開始しようとすると、WARNING: Printing hasn't reached this point というメッセージが表示されます。この警告メッセージの後、%SPOOL は、指定したページから印刷を開始するかどうかを尋ねます。「No」と入力すると、“Start at page:” プロンプトに戻ります。「Yes」と入力すると、%SPOOL はページの最初の数行を表示して、印刷するページであるかどうか確認することを求めます。
-
印刷する部数の入力を求められます。
-
%SPOOL では、印刷するドキュメントとして、他のスプール・ドキュメント名を入力できます。Enter キーを押して “Name:” プロンプトに応答すると、出力デバイスとその右側のマージンを尋ねられます。それに対して応答し、印刷を開始します。
%SPOOL は各ページの後にフォーム・フィードを発行して、画面に表示するか、プリンタで印刷するかを確認します。
以下の例では、(この場合は SPOOLFILE と呼ばれる) ^SPOOL グローバルでドキュメントを印刷する方法を示しています。ドキュメントは、MYPRINTER と呼ばれるデバイスで印刷されます。
%SYS>DO ^%SPOOL
Spool function: 1 Print
Name: ??
# Name Lines Spool start Despool start-end
1 SPOOLFILE 1 30 Aug 2:23 pm 30 Aug 2:25 pm-2:25 pm
This is my test spool file
Name: SPOOLFILE
1 SPOOLFILE 30 Aug 2003 2:23 pm this is my test spool file
SPOOLFILE has 1 pages.
Is this correct? Yes=>Y
Start at page: 1=>Y
How many copies? 1=>Y
Name:RETURN
Print spooled files on
Device: MYPRINTER RETURN Parameters: "WNS"=>
Free this terminal? Yes =>Y
Starting Job in background . . . started.
Spool function:
スプールされたドキュメントのリスト
%SPOOL ユーティリティ・メニューのオプション 2 は、%SPOOL の現在の実行場所であるディレクトリについて、現在スプールされているドキュメントのリストを表示します。Despool start-end 値がない場合は、ドキュメントはまだデスプール (印刷) されていないということです。
スプールされた各ドキュメントの説明は、ドキュメントに関する残りの情報の後に、1 つまたは複数の行に表示されます。
以下の例では、オプション 2 が選択されています。その結果、スプーラに保存されている 2 つのドキュメントが表示されます。最初は 8 月 30 日の午後 2 時 23 分に保存され、同じ日の午後 2 時 25 分に印刷されました。2 番目は 3 月 4 日の午前 11 時 39 分に保存され、同じ日の午前 11 時 42 分に印刷されました。
Spool function: 2 List documents
# Name Lines Spool start Despool start-end
1 SPOOLFILE 1 30 Aug 2:23 pm 30 Aug 2:25 pm- 2:25 pm
This is my test spool file
3 LONGFILE 1 04 Mar 11:39 am 04 Mar 11:42 am- 11:42 am
This is a very long description line that shows you what happens when you
have a long description. It shows you how the text wraps from line to line.
This particular description was made intentionally long, so as to wrap at least
twice.
スプールされたドキュメントの削除
%SPOOL ユーティリティ・メニューのオプション 3 の Delete Documents で、1 つ以上のスプール・ドキュメントを削除できます。%SPOOL で名前の入力を要求されたら、削除するドキュメント名を入力するか、?? を入力して現在のネームスペースにあるスプール・ドキュメントを表示します。ヘルプ・テキストを表示するには ? を入力します。
%SPOOL は、それが適切なドキュメントであるかどうか、さらにそのドキュメントを本当に削除するかどうかを尋ねます。「“Yes”」と答えると、%SPOOL によってドキュメントが削除され、次に削除するドキュメント名を入力できるようになります。
以下の例は、SPOOLFILE と呼ばれるスプールされたドキュメントを削除します。
Spool function: 3 Delete document
Name: ??
# Name Lines Spool start Despool start-end
1 SPOOLFILE 1 30 Aug 2:23 pm 30 Aug 2:25 pm- 2:25 pm
This is my test spool file
Name: SPOOLFILE
1 SPOOLFILE 30 Aug 2003 2:23 pm this is my test spool file
SPOOLFILE has 1 pages.
Is this correct? Yes=>Y
Delete SPOOLFILE? No=> Y [Deleted]
Name: