ジョブ・グループの定義とジョブ・グループの例-1

By 神居 - Last updated: 金曜日, 12月 23, 2016

ジョブ・グループの定義(z/OS V2.2からのJES2の新たなジョブ・スケジューリング機能④)

JEC(JOB Execution Controls)によってグループ化したジョブを実行するには、JCLによってジョブ・グループを定義します。
ジョブ・グループ定義用に、JOBGROUP/ENDGROUP、GJOB、AFTER/BEFORE、JOBSET/ENDSET、SJOBといったステートメントが、z/OS V2R2より新たに追加されています。

グループに属するジョブ側のJCLには、SCHEDULEステートメントを追加します。既存ジョブのJCLの変更点としてはこれだけです。

※JCLのステートメントおよびパラメーターの具体的な詳細は、マニュアル「z/OS MVS JCL解説書」(SA88-7091-02以降のバージョン)を参照。


ジョブ・グループの例①

jobgrp1a

※図をクリックすると拡大できます。

シンプルなジョブ・グループの例です。従来のJES2では、先行するステップは1つずつ順番通りに実行される必要がありましたが、JECによってデータの依存関係にないステップをジョブ化することによって並行して実行できるようになり、最終ステップ(JOB-E)が完了するまでの時間が短縮されることが期待できます。
z/OSで処理されるジョブの多くは事務処理系のプログラムの実行ですから、たいていはI/Oバウンダリーです。並行して実行することでCPの遊休時間を減らし、システムをより効率良く運用させることにも繋がります。

Filed in オペレーション・運用

POSTCC(完了コード設定プログラム)機能追加版

By 神居 - Last updated: 日曜日, 12月 11, 2016

POSTCC:完了コード設定プログラム

POSTCCはパラメーターで指定された値を完了コードにして終了するプログラムです。実用的な処理は何もしません。好きなコードで終了するIEFBR14みたいなものです。JCLのCONDパラメーターのテストや、CLISTのERRORステートメント、&LASTCC変数の動きのテストなど、セルフスタディ用に使って下さい。
汎用に作ってあるので、z/OS以外のMSP、VOS3でも動作するはずです。MVS3.8でも動きます。またバッチ、TSOのいずれでも動作します。



ソースプログラム(アセンブラ)を添付しますので、必要ならばご自由に改造して下さい。»»» 「POSTCC.txt」


Filed in 関連ソフト、フリーウェア

5.TcpLinkスタンダードの空き画面を利用したTcplinkマクロの拡張性

By 岡田 - Last updated: 土曜日, 12月 10, 2016
14-3.非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(空き画面活用編)にてTcplinkの使っていない画面(ディスプレイセション)を経由してTcplinkからEXCEL(vba)で情報連携する手法を説明してしています。

この手法を作っている中で、Tcplinkマクロの有効範囲を広げられるではと思いました。以下説明します

Tcplinkマクロ起動オプションとしての活用

Tcplinkマクロには起動時に変数を引き渡すことができません。Tcplinkマクロ自身で変数がつかえません。

したがって、Tcplinkが起動された時に動作変更するにはマクロの中で条件判定をする必要がありました。
これをクリップボードと空き画面を使って起動時オプションとして使えないかと考えました。

方法は以下の通りです
1)Tcplinkマクロ起動直前に別のプログラム等でクリップボードに引き渡したい情報をコピーしておきます
2)Tcplinkマクロ起動直後に空き画面の特定の場所にクリップボードの内容をペーストします
3)特定領域の内容をif string命令で判定、判定に応じた処理をする

空き画面を変数格納領域として使う

上記で説明しましたが、Tcplinkマクロでは変数が使えません。したがって、変数の内容に応じて処理を切り替えるという分岐処理が不向きです
しかし、空き画面を変数格納領域として各自がそのときに応じて、格納するレイアウトを決めておくと、複数のTcplinkの間で値の受け渡しができるなど高度な対応ができるようになります

サイトによっては一つのパソコンから本番LPAR(区画)や開発LPAR(区画)など複数の区画にLOGONできるようです。
この場合、異なる区画の間の情報連携は共用ボリュームを使っていると思います。
しかし、マルチベンダなど共用領域がもてないサイトも考えられます。この場合、自分のパソコンのHDDに一度ダウンロードするなどで対応はできると思います。
Tcplinkスタンダードはマルチベンダ対応の端末エミュレータです。この空き画面を用いることで、異なる区間・異なるベンダ間の情報連携が出来ると考えています
Filed in Tcplinkマクロ活用

14-3.非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(空き画面活用編)

By 岡田 - Last updated: 水曜日, 12月 7, 2016
14-2にてvbaとTcplinkマクロをファイルを連携した方法を紹介し、
14-2(改)にてEXCLUDE,FLIP,HIDEコマンドを活用した抽出情報の処理高速化を紹介しました。

しかし、14-2(改)では画面のコピーとペーストの回数が減っただけで、ファイル書きこみ、ダウンロードする基本部分に変更はなく、SWAPによる画面の切り替え(SDSFの画面とダウンロードするファイル画面)もそのままでした

今回は、ファイル連携ではなく、Tcplinkで作業に使われていない空き画面を活用して処理する方法を紹介します

空き画面を使う利点

この手法の最大のメリットは処理が高速化できる点です

14-2(改)では1つの画面をSWAPコマンドで情報を読み込む画面と書き込む画面の切り替えを行い、最終的に書き込んだファイルをダウンロードするという手順でした

今回の手法はTcplinkの未使用画面(空き画面)に情報を書き込み、最終的にクリップボードを用いてEXCEL(vba)に情報を渡します
画面の切り替え、ファイルダウンロードの時間が無くなるため、同じデータの作業時間が14-2(改)と比較して半分になりました(40秒→20秒)

また、同じ処理をした場合のホスト負担が減ります
14-2(改)までは、2つの画面の制御からファイルのダウンロードまでをホストコンピュータに処理してもらう必要がありました
今回の手法はSDSF画面上で必要な情報をEXCLUDE,FLIP,HIDEで抽出し、その画面を空き画面に映します。ファイルへの書き込み、ダウンロード処理にかかるホスト負担が無くなります

本作業はTcplinkマクロ、vba双方の変更の他に、Tcplink(ホストリンク)エクスプローラの設定で使っていない画面をディスプレイセションに設定する作業が必要です

Tcplinkホストリンクエクスプローラによる空き画面の設定

%e3%82%a8%e3%82%af%e3%82%b9%e3%83%97%e3%83%ad%e3%83%bc%e3%83%a9%ef%bc%91

この画面はTcplinkスタンダードのホストリンクエクスプローラです。ディスプレイセションとプリンタセションをあわせて最大10セションの設定が可能です
(但し、ディスプレイセションは最大5セションまで)ディスプレイセションを6個設定しようとすると、ディスプレイセションが多すぎますとエラーになります

既に1番から4番をディスプレイセションとして設定しています。空き画面として今回10番をディスプレイセションとして設定します
設定するには該当する番号を選択後、プロパティを選択します
%e3%83%9b%e3%82%b9%e3%83%88%e3%83%aa%e3%83%b3%e3%82%af%e3%82%a8%e3%82%af%e3%82%b9%e3%83%97%e3%83%ad%e3%83%bc%e3%83%a9%ef%bc%92

画面10をディスプレイ定義にする事で、マクロで利用可能な空き画面になります
%e3%82%a8%e3%83%9f%e3%83%a5%e3%83%ac%e3%83%bc%e3%82%bf%e3%83%97%e3%83%ad%e3%83%91%e3%83%86%e3%82%a3

※Tcplinkでは画面サイズが3種類設定可能です。しかし、標準である24行×80桁以外の設定を使うにはホスト(VTAM、XNF等)とのネゴシエーションが必要なため、通信ができない空き画面では24行×80桁固定となります

空き画面利用時(サンプル)
%e7%94%bb%e9%9d%a2%ef%bc%92

Tcplinkマクロ

14-2(改)でダウンロードする区分メンバに対して操作していた作業を上記で作成した空き画面(セション10)に変更しています

空き画面に対して操作する場合は、「change session TCP3270-Ses10」を記載すれば、以後の操作はセション10に対する操作になります
(今、どこの画面にいるかマクロのコマンドをトレースしながら命令を書いていく必要があります)

change session TCP3270-Ses10
;paste領域消去 ・・・・・・・・・・空き画面10の9行目を1行目と同じ内容でペースト(この場合空白にする)します
edit copy (01,01) (01,70)
edit paste (09,01)
:
change session TCP3270-Ses01 ・・・以後、メイン画面01の操作
wait 1

空き画面で行えるのは、クリップボードに書かれている内容を指定の場所にペーストするだけです
14-2(改)の中でダウンロード前に実施していた整形作業はセション10ではできません。今回はコピー前の画面(セション01)で行います

メイン画面01の操作を空き画面にペーストして作業が終わった段階で画面10の内容をクリップボードにコピー。EXCEL(vba)に渡します

上のサンプル画面をクロップボードに入れた内容です(16行×46桁)

###・・・・+・・・・1・・・・+・・・・2・・・・+・・・・3・・・・+・・・・4・・・・+・・・・5
01:DATASET1
02:DATASET2
03:DATASER3
04:DATASER4
05:*********************************************
06:———————————————
07: ——————————————-
08:———————————————
09:111111 REC1 BLKSIZE = 11111 TYPE = FB
10:222222 REC2 BLKSIZE = 22222 TYPE = FBA
11:333333 REC3 BLKSIZE = 33333 TYPE = VB
12:444444 REC4 BLKSIZE = 44444 TYPE = VBA
13:*** **
14:
15:
16:
###・・・・+・・・・1・・・・+・・・・2・・・・+・・・・3・・・・+・・・・4・・・・+・・・・5

EXCEL(vba)の操作

14-2(改)まではファイルを1行ずつ入力していました。今回はクリップボードのため、上記の内容(16行×46桁)を一つの長いレコードとして扱う必要があります。

1レコードは46文字です。行間に改行コードが2バイト入ります。したがって、2レコード目は先頭から49バイト目になります。
これを繰り返して、以降のレコードを先頭から何バイトなのかを正確に把握します。以下のvbaは把握するためにテストして画面に表示した命令です

‘dataset1-8
‘ MsgBox “1:” & Left(buf, 46)
‘ MsgBox “2:” & Mid(buf, 49, 46)
‘ MsgBox “3:” & Mid(buf, 97, 46)
‘ MsgBox “4:” & Mid(buf, 145, 46)
‘ MsgBox “5:” & Mid(buf, 193, 46)
‘ MsgBox “6:” & Mid(buf, 241, 46)
‘ MsgBox “7:” & Mid(buf, 289, 46)
‘ MsgBox “8:” & Mid(buf, 337, 46)

ここまできたら、あとは該当するレコード番号を変数に入れるとか直接利用するなどの対応をします(replaceは余分は空白を消しています)

d1 = Left(buf, 45)
d1 = Replace(d1, ” “, “”)
d2 = Mid(buf, 49, 45)
d2 = Replace(d2, ” “, “”)
d3 = Mid(buf, 97, 45)
d3 = Replace(d3, ” “, “”)
d4 = Mid(buf, 145, 45)
d4 = Replace(d4, ” “, “”)

d1からd4に”DATASET1″から”DATASET4″が入ります
Filed in Tcplinkマクロ活用(拡張編)

日立VOS3のジョブステップ並列実行機能(JSPEC)と関連機能について

By 岡田 - Last updated: 土曜日, 11月 26, 2016
先日、Z/OSの並列実行機能について掲載されました。
私が関わったVOS3のジョブステップ並列実行機能(JSPEC)について、記憶を辿って順次掲載していきます

日立のジョブステップ並列実行機能(JSPEC)とは

VOS3で動作するJSPECは基本的に先日掲載された、Z/OSのジョブ並列実行と同じです。一つのジョブの流れの一部(ジョブステップ)を並列実行させることで、ジョブの終了時間を早める事を目的としています。
JSPECを使う場合、ユーザ側は並列実行させたいジョブステップのEXEC文に”JSPEC=YES”を追加するだけです
VOS3の場合、JSPEC=YESで指定された(先行ジョブステップと並列実行する)ジョブステップを”サブジョブ“と呼びます

#以下のジョブがあった場合、STEP3にJSPEC=YESの指定により、STEP3とSTEP4が並列実行されます。この場合STEP3がサブジョブとなります
//AAAAAAAA JOB CLASS=A・・・
//STEP1 EXEC PGM=PGM01
:
:
//STEP2 EXEC PGM=PGM02
:
:
//STEP3 EXEC PGM=PGM03,JSPEC=YES
:
:
//STEP4 EXEC PGM=PGM04
:
:


しかし、EXEC文でJSPEC=YESを指定しても、システム側でJSPECが使える環境になっていないとオペランドが無視若しくはJCLエラーになります
ジョブステップを並列に実行する事は、並列実行している時間にCPU(演算装置)に今まで以上の能力が求められる事になります。

詳細は「JSPECを実行するためのシステム側の設定」で説明します

日立のジョブステップ並列実行機能(JSPEC)のはじまり

VOS3でジョブステップ並列実行機能(JSPEC)はVOS3/FSからリリースされました。
VOS3/FSではCPUを並列に接続し、負荷の軽いCPUでバッチジョブや通信・TSS(TSO)などに実行を振り分ける「高速結合機構(HCCF)」がリリースされるなど、”並列(パラレル)”がキーワードでした。
HCCFのような高額なハードウェアを使えないサイトでも”並列”の恩恵を受けるための機能としてJSPECがあったと思っています。

JSPECを支援するツール、環境

ジョブステップが並列に実行される事は、今まで並列実行(別ジョブとして同時に実行)できなかった事が環境の整備などによって並列実行できるようになる事です。VOS3が用意しているツール、環境を紹介します

ジョブステップ並列実行支援機能「JSPEC/AID」

VOS3/FSでJSPECが初めてリリースされた時、JSPECを適用できるか否かを判断するツールがありました。それがJSPEC/AIDです。
JSPEC/AIDの入力データにJSPECを適用したいJCLを入れると、適用の可否などを判定結果としてリスト出力してくれました。
(VOS3/USではJSPEC/AIDは別の手段として提供されている可能性があります)

並列実行ジョブステップ間データ転送機能「PREST」(プレスト)

ジョブステップを並列実行する事で一番の問題になるのが先行ステップで得られたデータの受け渡しです。
先行ジョブステップで得られたデータを中間ワークに一時保管しておき、後続のジョブステップ、サブジョブでデータを入力します
ここで問題になるのが、中間ワークへの出力が完了するまで後続のジョブステップ、サブジョブを実行できない事です

そこで、用いられるのがPREST(Pararell REference and Synchronous Transfer facility)です

PRESTは元々VOS3/FSの前のOSであるVOS3/ASでリリースされた機能です。
VOS3/ASでのPRESTは「ジョブ間、ジョブステップ間でのデータ逐次渡し機能」だけでした。

VOS3/FSではさらに以下の機能をリリースし、JSPECへの適用範囲を拡大しました
1)データ多重転送機能
先行ジョブ・ジョブステップがPRESTに出力したデータを複数の後続ジョブ・ジョブステップ・サブジョブに同時転送する機能。これにより同じデータを利用する複数のジョブ・ジョブステップ・サブジョブの同時実行が可能になりました
2)データ分割転送機能
先行ジョブ・ジョブステップの出力を分割し、複数の後続ジョブ・ジョブステップ・サブジョブに転送する機能です。
prest_1

3)転送データバックアップ機能
PRESTによるデータ転送中、同時にバックアップを採取する機能
4)システム間データ転送機能
PRESTをシステム間で利用が可能になりました。これによりCPUの負荷分散が図れるようになりました

PRESTの仕組み

 PRESTは仮想メモリ上に確保される領域です。1レコードが入る程度の大きさしか確保されないため、PREST領域を使う時、SPACE情報は不要です。

 データセット名とUNIT=PRESTの記述だけで利用できたと記憶しています

 PRESTは一時領域のため、PRESTにデータを書き込むジョブ・ジョブステップ・サブジョブとデータを読み込むジョブ・ジョブステップ・サブジョブが同時に必要になります。
 UNIT=PRESTの指定があるジョブが実行された場合、OSはPREST領域にデータセット名が存在するかを探します
 あれば、データを読み込む側、なければデータを書き込む側と判断できます。
 (データセットをOPENする際のオプションREAD・WRITE・UPDATEとの組み合わせが合わない場合、エラーにしていたと思います)

 あとはPRESTにデータを書き込むジョブ・ジョブステップ・サブジョブから1レコードが書かれたら、データを読み込むジョブ・ジョブステップ・サブジョブにデータが渡されます。これの繰り返しです。
 PREST領域を同時に使えるジョブの数に制限は無かったと思いますが、ISMルールなどを用いてUNIT=PRESTの指定ができるジョブを制限する事は可能です。

JSPECを実行するためのシステム側の設定

 ここからはジョブステップ並列実行機能(JSPEC)を使えるようにするためのシステム側の設定についての説明です。
 JSPECだけを使えるようにする場合、システムパラメタ(JSS3PARM等)だけ設定する事で動作しますが、PRESTを使う場合はさらに入出力(IO)ゼネレーションパラメタの設定が必要になります。
 また、サブジョブが先行ジョブステップと同時実行することにより設定前よりCPUが高負荷となることから、ストーレジ設計の見直しが不可欠です

システムパラメタ(JSS3PARM等)、入出力(IO)ゼネレーションパラメタの設定
ストーレジ設計 等

システムパラメタ(JSS3PARM等)の設定

 システムパラメタ(JAASYS00など)でJSPEC=YESの指定が必要か否か記憶が定かではありませんが、JSS3PARMで記述するサブジョブ専用イニシエータの設定により、パフォーマンス・実行多重度(ジョブ)の設定を行うJAAIPS00に影響を与える可能性が考えられます。詳細は「VOS3 センタ運営」で確認して下さい

 JSS3初期設定パラメタ(JSS3PARM)では以下の設定が必要になります
 ・ジョブクラス毎にJSPECの実行を許可するか否かの設定
   JSPECの実行を許可するか否かをジョブクラス毎に設定します。省略値はJSPEC=NOのため、JSPECの実行を許可する場合、JSPEC=YESを明示指定します

   冒頭に記述したジョブの例は実行クラス”A”のため、JSS3PARMのジョブクラス”A”の設定にJSPEC=YESを指定しておく必要があります

 ・サブジョブ専用イニシエータの設定 
   通常のイニシエータ設定とは別に、サブジョブ専用のイニシエータを設定します。
   イニシエータ名称の後、CLASS=*(アスタリスク)を記述し、どこのジョブクラスにも属さないサブジョブ専用のイニシエータが出来ます

   ここで記述したサブジョブ専用イニシエータ(CLASS=*)の数が必然的にJSPEC(並列実行)多重度の上限となります

入出力(IO)ゼネレーションパラメタの設定

 PREST領域を使う場合、入出力(IO)ゼネレーションに設定が必要です。
 UNITNAMEマクロでUNIT=PRESTの一行を書くだけだったと記憶しています

ストーレジ設計

JSPECを適用する際、サブジョブを動作させるための専用イニシエータクラスを設定するなど、必要とするリソースが増加する可能性があるためストーレジ設計値に影響があります

詳細は「VOS3 ストーレジ設計」を参照してください

JSPECを適用する場合、もう一つ注意しなければならない点をお伝えします。
メインフレームコンピュータのシステム構成を検討するとき、担当部署はシステムに求められている業務を遂行するため、システムが必要とするリソース(CPU MIPS、メモリ量、DISK容量等)を算出し、金額に見合うハード構成を選定します

しかし、JSPECを使う事でハード構成選定時に検討したリソースを超過する可能性があります
それは、JSPECがジョブの終了時間を短縮する事が目的であり、サブジョブを同じ時間帯に実行させるため、実行に必要なリソースを(JSPEC適用前より)高く必要とするからです

したがって見積もり時に用いたリソースを超えるようなシステム稼働は想定していません

ところが、JSPECを使う事でハード構成選定時に検討したリソースを超過する可能性があります。JSPECがジョブの終了時間を短縮する事が目的であり、サブジョブを同じ時間帯に実行させるため、実行に必要なリソースを(JSPEC適用前より)高く必要とするからです


JSPECがリリースされる以前にもジョブの時間短縮の方法は検討されていました。
検討理由は多々あるのですが、その一例は中間データセットです。クローズされないと次に渡せないからです
対策方法には中間データセットの出力方法見直し、出力先の変更(仮想メモリ)です

VOS3/FSでJSPECがリリースされた時、ソフトウェア工場は耳にタコができるくらい私たちサイト担当者に、「JSPECを使ってくれ」という言葉を言いました「JSPEC/AIDを実行して、どのくらい改善されるか定量化してくれと、、」

でも、システムを管理している側にしてはリソースの事が前提にあったので、ソフトウェア工場からの言葉はあまり受け入れられないものでした


最後に、、
VOS3の場合、JSPECがもたらした恩恵はそんなに多くなかったというのが私の印象です
時代が遅すぎたという点もあったかもしれません

現在では、COD(キャパシティ・オンデマンド)があるので、お金があるサイトではある程度のリソースアップ(MPIS、メモリ)は出来ますが、、

※記載の内容に一部誤りがありましたので、修正しました
Filed in 日立VOS3システム運用編

ジョブを分割して同時に実行する、ジョブを先行/後続関係に基づいて実行する

By 神居 - Last updated: 木曜日, 11月 24, 2016

ジョブを分割して同時に実行する、ジョブを先行/後続関係に基づいて実行する(z/OS V2.2からのJES2の新たなジョブ・スケジューリング機能③)

z/OSでは、IMSやCICSなどのサブシステムを利用したオンライン・トランザクション処理やTSO配下でのISPFによる対話型処理を除けば、アプリケーションやユーティリティー・プログラムはジョブを定義してスケジュール(サブミット)することでバッチ・ジョブとして実行されます。これはバッチ処理と呼ばれる、メインフレーム・コンピューターに於ける最も基本となる処理形態です。ジョブはJCLによって記述され、1つのジョブは、実行するプログラムとそのプログラムが使用するデータを定義したジョブ・ステップで構成され、ジョブ内のジョブ・ステップは定義された順に上から下に向かって1つずつ順番に実行されます。
同時に数多くのジョブが並行して処理されるMVS(z/OS)オペレーティング・システムでは、JES(*1)を併用したジョブ管理が行われるのが基本で、特に日本国内では大多数のz/OSユーザーがJESとしてJES2を利用しています。JES2に於いては、ジョブ内の各ステップは実行順序が保証されますが、各々のジョブ間では実行順序に依存性はなく(*2)、ジョブ・クラスに対応したイニシエーターが空き次第、次から次へと実行されます。JES2は、CPU(プログラムを実行するイニシエーター空間)や印刷出力を行うハードウェア装置としてのプリンターなどのシステム資源に無駄な遊休時間が生じぬよう、ジョブを次から次へと実行し、帳票データとしてのSYSOUTデータセットの内容を次から次へとプリンターから書き出す、というジョブ・スケジューリングを行います。

*1 Job Entry Subsystem:ジョブ入力サブシステムのこと。入力サブシステムとなっているが、実際にはジョブの入力から実行と出力までの一連のジョブ処理サイクルを効率良く管理しスケジュールする。
*2 ジョブAが終わったらジョブBとジョブCを実行する、といった実行順序に基づく依存性の制御はJES2では行えない。


JECの機能を利用すれば、これまでなら並列実行可能なステップがあっても後続ステップの関係で同じジョブ内で順番に実行せざるを得なかった処理や、大量のデータを複数ジョブに分割して実行したいが、そのプログラムの出力を入力にする後続処理があって単純に分割できなかった処理などが、JES2の機能だけでこれまで以上にバッチ処理のスループット(*4)を上げるような運用ができるようになりました。

*4 単位時間あたりの生産性もしくは処理能力のこと。バッチ処理ではスループットが重要視され、反対にオンライン処理では、個々のトランザクション処理のレスポンス・タイムが重要視される。

Filed in オペレーション・運用

IBM zSystemに対応 Ubuntu 16.04 LTSリリース

By 岡田 - Last updated: 金曜日, 11月 4, 2016
先日、Ubuntu16.4LTSがリリースされました。

リリース内容の中に、IBM LINUX ONE 及び zSystemでの稼動ができるモジュールをサポートした旨記載があります。
詳細は以下を参照願います

https://wiki.ubuntu.com/XenialXerus/ReleaseNotes/Ja#IBM_LinuxONE_.2BMEowiDBz_z_Systems_.2BVBEwUQ_Ubuntu

詳細がわかりましたら、随時掲載いたします

Filed in メインフレーム・ソフトウェア

14-2(改).非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(ファイル編)

By 岡田 - Last updated: 日曜日, 10月 23, 2016
14-2にてvbaとTcplinkマクロをファイル連携した方法を紹介しましたが、今回Tcplinkマクロを改良しました。

EXCLUDE,FLIP,HIDEコマンドを使う事で、VSNの情報及びDCBの情報を一度にコピーと貼り付けする事を可能にしました(ASPENのGLOBALコマンドに対応します)

EXCLUDE:特定行の除外
FLIP:除外した行の表示(EXCLUDEと組み合わせて、特定行の表示としている)
HIDE:非表示行の制御(HIDE Xにより非表示行のメッセージを消している)

vbaの箇所は変更ありませんので、Tcplinkについて変更点を追記します

Tcplinkマクロの説明

今回修正したTcplinkマクロは以下になります。

01: change session TCP3270-Ses01
02: message “これからバックアップ一覧のデータ取得処理を始めます。”
03: message “取得したい情報が入っているジョブの左にカーソルを置いてOKして下さい。”
04: ;
05: wait 1
06: until input
07: STRING “SJ”
08: until input
09: STRING “SCRNAME SDSFS” (04,21)
10: until input
11: emulator key [ENTER]
12: STRING “SWAP LIST” (04,21)
13: until input
14: emulator key [ENTER]
15: until input
16: UNTIL STRING (03,20) “アクティブ ISPF 論理セッション”
17: move cursor (05,07)
18: until input
19: emulator key [ENTER]
20: ;
21: until input
22: STRING “SCRNAME BKUPI” (02,20)
23: until input
24: emulator key [ENTER]
25: until input
26: ;
27: string “2” (02,21)
28: emulator key [enter]
29: until input
30: string “‘BBBBBBBB.8.WORKFILE'” (14,26)
31: emulator key [enter]
32: until input
33: wait 1
34: string “F BKUPINFO”
35: emulator key [enter]
36: until input
37: wait 1
38: ;emulator key [newline]
39: ;wait 1
40: string “S” (06,2)
41: emulator key [enter]
42: until input
43: wait 1
44: string “RES”
45: emulator key [enter]
46: wait 1
47: ;
48: ;paste領域消去
49: edit copy (23,09) (23,75)
50: edit paste (04,09)
51: edit paste (05,09)
52: edit paste (06,09)
53: edit paste (07,09)
54: edit paste (08,09)
55: edit paste (09,09)
56: edit paste (10,09)
57: edit paste (11,09)
58: edit paste (12,09)
59: edit paste (13,09)
60: edit paste (14,09)
61: edit paste (15,09)
62: edit paste (16,09)
63: edit paste (17,09)
64: edit paste (18,09)
65: edit paste (19,09)
66: ;
67: string “SWAP SDSFS” (02,19)
68: until input
69: emulator key [enter]
70: wait 1
71: UNTIL STRING (03,2) “SDSF STATUS DISPLAY ALL CLASSES”
72: until input
73: emulator key [enter]
74: until input
75: string “RES” (02,15)
76: emulator key [enter]
77: until input
78: edit copy (11,33) (18,77)
79: wait 1
80: ;
81: STRING “SWAP BKUPI” (02,15)
82: until input
83: emulator key [ENTER]
84: until input
85: edit paste (04,17)
86: wait 1
87: ;
88: STRING “SWAP SDSFS” (02,18)
89: until input
90: emulator key [ENTER]
91: wait 1
92: until input
93: emulator key [pf3]
94: until input
95: STRING “?”
96: until input
97: emulator key [ENTER]
98: until input
99: emulator key [TAB]
100: emulator key [TAB]
101: until input
102: STRING “SE”
103: until input
104: emulator key [ENTER]
105: wait 1
106: until input
107: STRING “RES”
108: until input
109: emulator key [ENTER]
110: ;
111: ;VOL1-VOL8
112: ;
113: STRING “EX ‘ VOLS=’ ALL” (02,16)
114: until input
115: emulator key [ENTER]
116: until input
117: wait 1
118: STRING “FLIP” (02,16)
119: until input
120: emulator key [ENTER]
121: until input
122: wait 1
123: STRING “HIDE X” (02,16)
124: until input
125: emulator key [ENTER]
126: until input
127: wait 1
128: edit copy (04,34) (12,39)
129: ;
130: until input
131: wait 1
132: STRING “SWAP BKUPI” (02,15)
133: until input
134: emulator key [ENTER]
135: wait 1
136: until input
137: edit paste (04,09)
138: until input
139: STRING “SWAP SDSFS” (02,18)
140: until input
141: emulator key [ENTER]
142: wait 1
143: ;
144: ;DCB INFOMATION GET
145: ;
146: ;
147: :DCB1
148: emulator key [PF3]
149: emulator key [PF3]
150: until input
151: STRING “SE”
152: until input
153: emulator key [ENTER]
154: wait 1
155: STRING “RES”
156: until input
157: emulator key [ENTER]
158: wait 1
159: ;
160: STRING “EX ‘ICE090I 0 ‘ ALL” (02,15)
161: until input
162: emulator key [ENTER]
163: wait 1
164: STRING “FLIP” (02,15)
165: until input
166: emulator key [ENTER]
167: wait 1
168: STRING “HIDE X” (02,15)
169: until input
170: emulator key [ENTER]
171: wait 1
172: ;
173: ;DCB1-DCB8
174: ;
175: until input
176: edit copy (03,27) (10,76)
177: wait 1
178: ;
179: STRING “SWAP BKUPI” (02,15)
180: until input
181: emulator key [ENTER]
182: wait 1
183: until input
184: edit paste (12,09)
185: until input
186: ;
187: :OWARI
188: string “CHG データの終り ‘ ‘” (02,18)
189: emulator key [ENTER]
190: until input
191: wait 1
192: string “CHG ‘ ‘ ‘ ‘ ALL” (02,18)
193: emulator key [ENTER]
194: until input
195: wait 1
196: string “CHG ‘デ’ ‘ ‘ ALL” (02,18)
197: emulator key [ENTER]
198: until input
199: emulator key [insert]
200: move cursor (12,22)
201: string ” ”
202: move cursor (13,23)
203: string ” ”
204: move cursor (14,22)
205: string ” ”
206: move cursor (16,23)
207: string ” ”
208: emulator key [ENTER]
209: until input
210: string “CHG ‘,’ ‘ ‘ ALL” (02,18)
211: emulator key [ENTER]
212: until input
213: string “CHG ‘*’ ‘ ‘ ALL” (02,18)
214: emulator key [ENTER]
215: until input
216: string “CHG ‘-‘ ‘ ‘ ALL” (02,18)
217: emulator key [ENTER]
218: until input
219: string “SAVE” (02,18)
220: emulator key [ENTER]
221: until input
222: ;
223: ;ファイル転送
224: ;
225: string “=6” (02,18)
226: emulator key [ENTER]
227: until input
228: RECEIVE “C:\temp\BKUPINFO.txt” ‘BBBBBBB.8.WORKFILE(BKUPINFO)’ [JISCII CRLF
229: :
230: 終了処理
231: :

VSN情報を一括で得る

EXCLUDE,FLIP,HIDEを用いるために、今までS(SDSF DISPLAY)で開いていたJOBログをSE(ISPF EDITOR)に変更しています・・・102行目
(SからSEに変更した事で、STRINGで指定しているコマンド投入位置を変えています)

:
102: STRING “SE”
:
110: ;
111: ;VOL1-VOL8
112: ;
113: STRING “EX ‘ VOLS=’ ALL” (02,16)
114: until input
115: emulator key [ENTER]
116: until input
117: wait 1
118: STRING “FLIP” (02,16)
119: until input
120: emulator key [ENTER]
121: until input
122: wait 1
123: STRING “HIDE X” (02,16)

113行目でVOLの検索ですが、EX(EXCLUDEコマンド)に変更。さらに118行目でFLIPコマンドを投入する事でVOLSを含む行の表示に切り替えています。さらに123行目のHIDE Xコマンドにより非表示行のメッセージを消すことで、VOLSの行だけが画面に表示されるようになります。この画面をコピーすることで、VSNの情報が得られます。前のバージョンでは198行目までかかっていたVSN取得処理が142行目までに短縮できました

DCB情報取得(改良版)


143: ;
144: ;DCB INFOMATION GET
145: ;
146: ;
147: :DCB1
148: emulator key [PF3]
149: emulator key [PF3]
150: until input
151: STRING “SE”
152: until input
153: emulator key [ENTER]
154: wait 1
155: STRING “RES”
156: until input
157: emulator key [ENTER]
158: wait 1
159: ;
160: STRING “EX ‘ICE090I 0 ‘ ALL” (02,15)
161: until input
162: emulator key [ENTER]
163: wait 1
164: STRING “FLIP” (02,15)
165: until input
166: emulator key [ENTER]
167: wait 1
168: STRING “HIDE X” (02,15)
169: until input
170: emulator key [ENTER]
171: wait 1

操作方法はVSNと同じです。160行目でEXCLUDEコマンド、164行目でFLIP、168行目でHIDE Xを行う事で、欲しい情報がある行だけの表示になります

抜き出した情報の整形(変更)


188: string “CHG データの終り ‘ ‘” (02,18)
189: emulator key [ENTER]
190: until input
191: wait 1
192: string “CHG ‘ ‘ ‘ ‘ ALL” (02,18)
193: emulator key [ENTER]
194: until input
195: wait 1
196: string “CHG ‘デ’ ‘ ‘ ALL” (02,18)
197: emulator key [ENTER]
198: until input

EXCLUDE,FLIP,HIDEで処理が迅速化できましたが、整形処理に追加が必要になりました。画面の中の「データの終わり」までコピーしてしまうため、整形処理にて消す作業が増えました

188行目はDCB情報をコピーする済の余分なメッセージの削除、196行目はVSN情報をコピーする済の余分なメッセージの削除を追加しました
Filed in Tcplinkマクロ活用(拡張編)

”多機能マウス”を活用し、端末エミュレータの操作を効率良く行う

By 岡田 - Last updated: 木曜日, 10月 20, 2016
Tcplinkマクロを作っていくと、マクロの呼び出しに不便を感じてきます。
使用頻度の高いマクロはショートカットキーではなくて1ボタンで操作したいものです。

そんな時に使い始めたのが”多機能マウス”です

“多機能マウス”を使う事で以下の事を実践しています
1)Tcplinkマクロを特定のボタンに割り付けて、マウスのクリックだけで操作が可能になった
2)ISPF画面内のカーソルの移動及び、画面のスクロールをマウスだけで操作が可能になった
ISPFの場合、画面スクロールはPF7,PF8,PF10,PF11
ASPENの場合、画面スクロールはPF7,PF8,PF9,PF10 です

割り付けた動作はマウス内のオンボードメモリに記憶されるため、動作させるだけであればドライバは不要です
(但し、キー登録を行うためユーティリティが実行できる環境が別途必要になります)

多機能マウスの説明と選定理由

今回紹介したいのは、ELECOMのM-DUX70BKです。
m-dux70bk_01

本商品はホームページで「ゲーミングマウス」として紹介されていますが、ユーティリティを使う事で各ボタンにPFキーなどの割付が可能になっています。

私が数あるマウス(多機能マウス)から端末エミュレータ用マウスとして選定した理由の一つに、「カーソル移動」と「画面スクロール」の操作性に優れている点です。

メインフレームの操作をダム端末で行っていた時代から画面スクロールはPFキーでした。カーソルはキーボード右下に配置された矢印キーでしたが、画面スクロールをさせたいとき、キーボード上部のPFキーを押さなければならない。しかも矢印キーのように上下左右の配置ではなく、(殆どの場合)PFキーは一列になっていたため、”もどかしさ”を感じ続けていました。

ダム端末からパソコンの端末エミュレータに操作環境が移った時、カーソルの移動はマウスで可能になりましたが、マウス自体の機能制限から画面スクロールまで考慮されませんでした。
さらにISPFとVOS3とで(画面スクロールの)キー配列が異なるため、ここ半年、私の”もどかしさ”は倍増していました。

M-DUX70BKは長年の”もどかしさ”を解消する事が出来た製品です。

多機能マウスに「カーソル移動」、「画面スクロール」、「戻る」、PROFILEキーを配置

下の画像はマウスを拡大したものです。赤い矢印には「カーソル移動」、青い矢印には「画面スクロール」を割り付けました。
m-dux70bk_05

左右のカーソル移動は「サイドホイール」を使うことで(マウスを動かさなくても)右親指で操作が可能です。

また、「戻る」ボタンについても割付をしました。
WINDOWSではALT+左矢印、端末エミュレータではPF3(ISPF)又はPF11(ASPEN)です。
そしてPROFILEボタンを近くに配置しました。PROFILE1にはWINDOWSのボタンと配置し、PROFILE2には端末エミュレータのボタンを配置することで、ユーティリティがインストールできない(職場等の)パソコンでも現在のPROFILE番号を把握しながの操作ができます。
m-dux70bk_06

製品の詳細な仕様については、製品ホームページを確認願います
http://www2.elecom.co.jp/products/M-DUX70BK.html
Filed in 端末エミュレーター

100.ISPF(ボリューム内データセット一覧)とSDSFでブラウズコマンドを制御する

By 岡田 - Last updated: 木曜日, 10月 20, 2016
ZOSを使い始めてISPFやSDSFの使い方に慣れてきた頃です。

Tcplinkマクロを作ったいきさつ

長年操作してきたVOS3(ASPEN)との違いから、ISPF(ボリューム内データセット一覧)とSDSFの(スプール、実行JCL)で同じブラウズ(内容表示)でも投入するコマンドに以下の違いがあるため、時々入力するコマンドを間違えます

ISPF(ボリューム内データセット一覧)におけるデータセットのブラウズ・・・”B”コマンド
SDSFにおけるスプールのブラウズ・・・”S”、”SB”、”SE”コマンド(※)
SDSFにおける実行JCLのブラウズ・・・”SJ”コマンド(※)

(※)
“S”・・・SDSFのスプール表示(DISPLAY)
“SB”・・・ISPFによるスプールブラウズ表示(BROWSE)・・・上記”S”より一般的にこちらが使われるようです
“SE”・・・ISPFによるスプール編集表示(EDIT)
“SJ”・・・ISPFによるJCL編集表示

※VOS3(ASPEN)には”B”,”SB”,”SE”,”SJ”に相当する機能はありません。

ISPF(ボリューム内データセット一覧)で”S”を投入すると、投入した行のデータセットのデータセット情報を表示します。
逆にSDSFで”B”を投入するとコマンドエラーになります

そそっかしい私は、ISPFとSDSFで”SB”と”B”の違いを制御して欲しいとの思いから、Tcplinkマクロを作りました

Tcplinkマクロ

今回作成したTcplinkマクロは以下になります
(特定環境下で動作することを前提としているため、sessionコマンドは除外しています。また、ラベル名”volb”,”sdsfb”,”owari”は大文字、小文字の区別があります。注意して下さい)

01: ;ISPF 3->4 ボリュームリストで実行されたら”B”
02: ;SDSFで実行されたら”SB”を投入する
03: ;
04: ;
05: if string (01,02) “DSLIST – ”
06: jump true volb
07: if string (03,02) “SDSF ”
08: jump true sdsfb
09: jump owari
10: ;
11: :volb
12: string “B”
13: until input
14: emulator key [enter]
15: jump owari
16: ;
17: :sdsfb
18: string “SB”
19: until input
20: emulator key [enter]
21: ;
22: :owari

本マクロの動作条件
1)ISPFのボリュームリストの画面又はSDSFの(O),(H),(ST)のいずれかの画面である
2)カーソルがそれぞれ左の行(ライン)コマンド投入領域にあること

5行目,7行目で表示画面を判定、それぞれ11行目、17行目にジャンプする

11: :volb
12: string “B”
13: until input
14: emulator key [enter]
15: jump owari

11行目から15行目:ISPFのボリュームリスト(ボリューム内データセット一覧)時の処理
12行目で”B”を投入、15行目で抜ける

17: :sdsfb
18: string “SB”
19: until input
20: emulator key [enter]

17行目から20行目:SDSF画面時の処理
18行目で”SB”を投入、22行目へ

このマクロをTcplinkでショートカットキーに登録。マクロ機能を持つキーボード又はマウスで動作させています
Filed in Tcplinkマクロ(ZOS実践編)

14-2.非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(ファイル編)

By 岡田 - Last updated: 木曜日, 10月 6, 2016
クリップボードでは単一データによる連携をご説明しましたが、複数のデータを連携したい時、データセットのファイルによる連携が有効です

Tcplinkマクロを使い、自分が処理しやすいように連携するワークファイルを編集しておき、ファイル転送後、EXCEL(vba)で1行ずつ読み込み情報を埋め込んでいきます

今回のEXCEL(vba)ではクリップボードを使っていませんので、前回記載がもれていた”Microsoft Forms 2.0 Object Library”を参照設定する必要はありません

仮想テープにバックアップしたボリューム通し番号(VSN)とDCB情報を得る

作業で発生したファイルを一時保管先としてVT(仮想テープ)に保存する業務があります。この業務結果として以下の情報を自動的に得る処理です
1)一時保管先の仮想テープのボリューム通し番号(VSN)をJOBLOGから抽出する
2)1)のDCB情報をJOBLOGから抽出する

※上記1)と2)はそれぞれバックアップしたデータセット単位に処理します

作業の流れとして、、
A)excel(vba)で情報を埋める場所をクリックしてもらう
B)EXCEL(vba)からTcplinkマクロを実行する
C)Tcplinkマクロの中で、、
c1)「ワークファイルの初期化」
c2)「SDSFのSJ、SBのFINDコマンドを用いてVSN情報を抽出」
c3)「ワークファイルへ書き出し」・・・VSN情報が終わるまでC2-C3を繰り返す
c4)「SDSFのSBのFINDコマンドを用いてDCB情報を抽出」
c5)「ワークファイルへ書き出し」・・・DCB情報が終わるまでc4-c5を繰り返す
c6)「書き出したワークファイルを整形・書き込み」
c7)「ワークファイルをダウンロード」
D)EXCEL(vba)に制御が戻ったら、C7でダウンロードしたファイルを1行ずつ読み込み、情報設定・セルを移動していく

です

EXCEL(vba)の説明

今回のEXCEL(vba)は以下になります
01: Sub バックアップ一覧の情報を埋める()
02: Dim buf As String
03: Dim cb As Object
04: Dim ret As Long
05:
06: MsgBox “データを埋めたい処理欄の先頭のデータセットの左の場所をクリックしてOKして下さい”
07:
08: With CreateObject(“wscript.shell”)
09: ret = .Run(“C:\VTSVOL_DCBGET.mac”, 7, True)
10: End With
11:
12: ‘BKUPINFO READ->dataput
13: Open “C:\TEMP\BKUPINFO.txt” For Input As #1
14:
15: ‘start position memory
16: ar = ActiveCell.Row
17: ac = ActiveCell.Column
18:
19: ‘LINE1 VTS1・・・DSN,VSN
20: ‘LINE2 VTS2・・・DSN,VSN
21: ‘LINE3 VTS3・・・DSN,VSN
22: ‘LINE4 VTS4・・・DSN,VSN
23: ‘LINE5 VTS5・・・DSN,VSN
24: ‘LINE6 VTS6・・・DSN,VSN
25: ‘LINE7 VTS7・・・DSN,VSN
26: ‘LINE8 VTS8・・・DSN,VSN
27:
28: Line Input #1, buf
29: Do While buf <> “”
30:
31: ‘ MsgBox buf
32: ActiveCell.Value = Mid(buf, 9, Len(buf) – 8)
33: ActiveCell.Offset(0, 1).Select
34: ActiveCell.Value = Left(buf, 6)
35: ActiveCell.Offset(1, -1).Select
36: Line Input #1, buf
37:
38: Loop
39:
40: ‘LRECLまでLOOP
41: Line Input #1, buf
42:
43: Do While buf = “”
44: Line Input #1, buf
45: Loop
46:
47: Cells(ar, ac).Select
48: ActiveCell.Offset(0, 2).Select
49: ‘LINE09 DCB1 VTS1(LRECL,BLKSIZE,RECFM)
50: ‘LINE10 DCB2 VTS2(LRECL,BLKSIZE,RECFM)
51: ‘LINE11 DCB3 VTS3(LRECL,BLKSIZE,RECFM)
52: ‘LINE12 DCB4 VTS4(LRECL,BLKSIZE,RECFM)
53: ‘LINE13 DCB5 VTS5(LRECL,BLKSIZE,RECFM)
54: ‘LINE14 DCB6 VTS6(LRECL,BLKSIZE,RECFM)
55: ‘LINE15 DCB7 VTS7(LRECL,BLKSIZE,RECFM)
56: ‘LINE16 DCB8 VTS8(LRECL,BLKSIZE,RECFM)
57:
58: Do While buf <> “”
59:
60: ActiveCell.Value = Mid(buf, 40, InStr(40, buf, ” “) – 40)
61: ActiveCell.Offset(0, 1).Select
62: ActiveCell.Value = Mid(buf, 9, InStr(9, buf, ” “) – 9)
63: ActiveCell.Offset(0, 1).Select
64: ActiveCell.Value = Mid(buf, 26, InStr(26, buf, ” “) – 26)
65: ActiveCell.Offset(1, -2).Select
66:
67: Line Input #1, buf
68:
69: Loop
70:
71: Close #1
72:
73: End Sub

Tcplinkに制御を渡す前の処理

06: MsgBox “データを埋めたい処理欄の先頭のデータセットの左の場所をクリックしてOKして下さい”
07:
08: With CreateObject(“wscript.shell”)
09: ret = .Run(“C:\VTSVOL_DCBGET.mac”, 7, True)
10: End With

06行目でバックアップ情報を入れたい箇所の一番左上をクリックするように促します(埋め込みの始まり)
08-09行目でTcplinkマクロを実行、終了まで待ちます

Tcplinkマクロの説明

Tcplinkマクロは以下になります。(VSN及びDCBの抜き出し処理、画面エラー判定、終了処理は一部割愛しています)

01: change session TCP3270-Ses01
02: message “これからバックアップ一覧のデータ取得処理を始めます。”
03: message “取得したい情報が入っているジョブの左にカーソルを置いてOKして下さい。”
04: ;
05: wait 1
06: until input
07: STRING “SJ”
08: until input
09: STRING “SCRNAME SDSFS” (04,21)
10: until input
11: emulator key [ENTER]
12: STRING “SWAP LIST” (04,21)
13: until input
14: emulator key [ENTER]
15: until input
16: UNTIL STRING (03,20) “アクティブ ISPF 論理セッション”
17: move cursor (05,07)
18: until input
19: emulator key [ENTER]
20: wait 1
21: ;
22: until input
23: STRING “SCRNAME BKUPI” (02,20)
24: until input
25: emulator key [ENTER]
26: until input
27: ;
28: string “2” (02,21)
29: emulator key [enter]
30: until input
31: string “‘BBBBBBBB.8.WORKFILE'” (14,26)
32: emulator key [enter]
33: until input
34: wait 1
35: string “F BKUPINFO”
36: emulator key [enter]
37: until input
38: wait 1
39: ;emulator key [newline]
40: ;wait 1
41: string “S” (06,2)
42: emulator key [enter]
43: until input
44: wait 1
45: string “RES”
46: emulator key [enter]
47: wait 1
48: ;
49: ;paste領域消去
50: edit copy (23,09) (23,75)
51: edit paste (04,09)
52: edit paste (05,09)
53: edit paste (06,09)
54: edit paste (07,09)
55: edit paste (08,09)
56: edit paste (09,09)
57: edit paste (10,09)
58: edit paste (11,09)
59: edit paste (12,09)
60: edit paste (13,09)
61: edit paste (14,09)
62: edit paste (15,09)
63: edit paste (16,09)
64: edit paste (17,09)
65: edit paste (18,09)
66: edit paste (19,09)
67: ;
68: string “SWAP SDSFS” (02,19)
69: until input
70: emulator key [enter]
71: wait 1
72: UNTIL STRING (03,2) “SDSF STATUS DISPLAY ALL CLASSES”
73: until input
74: emulator key [enter]
75: until input
76: string “RES” (02,15)
77: emulator key [enter]
78: until input
79: edit copy (11,33) (18,77)
80: wait 1
81: ;
82: STRING “SWAP BKUPI” (02,15)
83: until input
84: emulator key [ENTER]
85: until input
86: edit paste (04,17)
87: wait 1
88: ;
89: STRING “SWAP SDSFS” (02,18)
90: until input
91: emulator key [ENTER]
92: wait 1
93: until input
94: emulator key [pf3]
95: until input
96: STRING “?”
97: until input
98: emulator key [ENTER]
99: until input
100: emulator key [TAB]
101: emulator key [TAB]
102: until input
103: STRING “S”
104: until input
105: emulator key [ENTER]
106: wait 1
107: until input
108: ;
109: ;VOL1
110: ;
111: STRING “F ‘ VOLS='” (04,21)
112: until input
113: emulator key [ENTER]
114: until input
115: wait 1
116: edit copy (05,25) (05,30)
117: ;
118: STRING “SWAP BKUPI” (04,21)
119: until input
120: emulator key [ENTER]
121: wait 1
122: until input
123: edit paste (04,09)
124: until input
125: STRING “SWAP SDSFS” (02,18)
126: until input
127: emulator key [ENTER]
128: wait 1
129: ;
130: ;VOL2
131: ;
132: emulator key [PF5]
133: emulator key [PF5]
134: until input
135: wait 1
136: edit copy (05,25) (05,30)
137: ;
138: STRING “SWAP BKUPI” (04,21)
139: until input
140: emulator key [ENTER]
141: wait 1
142: until input
143: edit paste (05,09)
144: until input
145: STRING “SWAP SDSFS” (02,18)
146: until input
147: emulator key [ENTER]
148: wait 1
149: ;
150: ;VOL3
151: ;
152: emulator key [PF5]
153: emulator key [PF5]
154: until input
155: wait 1
156: edit copy (05,25) (05,30)
157: ;
158: STRING “SWAP BKUPI” (04,21)
159: until input
160: emulator key [ENTER]
161: wait 1
162: until input
163: edit paste (06,09)
164: until input
165: STRING “SWAP SDSFS” (02,18)
166: until input
167: emulator key [ENTER]
168: wait 1
169: ;
170: ;VOL4
171: ;
172: emulator key [PF5]
173: emulator key [PF5]
174: until input
175: wait 1
176: edit copy (05,25) (05,30)
177: ;
178: STRING “SWAP BKUPI” (04,21)
179: until input
180: emulator key [ENTER]
181: wait 1
182: until input
183: edit paste (07,09)
184: until input
185: STRING “SWAP SDSFS” (02,18)
186: until input
187: emulator key [ENTER]
188: wait 1
189: ;
190: ;
191: ;VOL5chk
192: ;
193: emulator key [PF5]
194: emulator key [PF5]
195: until input
196: wait 1
197: if string (3,57) “*B”
198: jump true DCB1
199: ;
200: :
201: 5個目以降のVOL情報取得処理
202: :
203: ;
204: ;DCB INFOMATION GET
205: ;
206: ;
207: :DCB1
208: emulator key [PF3]
209: emulator key [PF3]
210: until input
211: STRING “S”
212: until input
213: emulator key [ENTER]
214: wait 1
215: ;
216: STRING “F ‘ICE090I 0 OUTPUT LRECL'” (04,21)
217: until input
218: emulator key [ENTER]
219: ;
220: ;DCB1
221: ;
222: until input
223: edit copy (05,18) (05,75)
224: wait 1
225: ;
226: STRING “SWAP BKUPI” (04,21)
227: until input
228: emulator key [ENTER]
229: wait 1
230: until input
231: edit paste (12,09)
232: until input
233: STRING “SWAP SDSFS” (02,18)
234: until input
235: emulator key [ENTER]
236: wait 1
237: ;
238: ;DCB2
239: ;
240: emulator key [PF5]
241: emulator key [PF5]
242: until input
243: edit copy (05,18) (05,75)
244: wait 1
245: ;
246: STRING “SWAP BKUPI” (04,21)
247: until input
248: emulator key [ENTER]
249: wait 1
250: until input
251: edit paste (13,09)
252: until input
253: STRING “SWAP SDSFS” (02,18)
254: until input
255: emulator key [ENTER]
256: wait 1
257: ;
258: ;DCB3
259: ;
260: emulator key [PF5]
261: emulator key [PF5]
262: until input
263: edit copy (05,18) (05,75)
264: wait 1
265: ;
266: STRING “SWAP BKUPI” (04,21)
267: until input
268: emulator key [ENTER]
269: wait 1
270: until input
271: edit paste (14,09)
272: until input
273: STRING “SWAP SDSFS” (02,18)
274: until input
275: emulator key [ENTER]
276: wait 1
277: ;
278: ;DCB4
279: ;
280: emulator key [PF5]
281: emulator key [PF5]
282: until input
283: edit copy (05,18) (05,75)
284: wait 1
285: ;
286: STRING “SWAP BKUPI” (04,21)
287: until input
288: emulator key [ENTER]
289: wait 1
290: until input
291: edit paste (15,09)
292: until input
293: STRING “SWAP SDSFS” (02,18)
294: until input
295: emulator key [ENTER]
296: wait 1
297: ;
298: ;DCB5chk
299: ;
300: emulator key [PF5]
301: emulator key [PF5]
302: until input
303: wait 1
304: if string (3,57) “*B”
305: jump true OWARI
306: ;
307: :
308: 5個目以降のDCB情報取得処理
309: :
310: ;
311: :OWARI
312: STRING “SWAP BKUPI” (04,21)
313: until input
314: emulator key [ENTER]
315: wait 1
316: ;
317: ;BKUPINFOファイル整形処理
318: ;
319: emulator key [insert]
320: move cursor (12,22)
321: string ” ”
322: move cursor (13,23)
323: string ” ”
324: move cursor (14,22)
325: string ” ”
326: move cursor (16,23)
327: string ” ”
328: emulator key [ENTER]
329: until input
330: string “CHG ‘,’ ‘ ‘ ALL” (02,18)
331: emulator key [ENTER]
332: until input
333: string “CHG ‘*’ ‘ ‘ ALL” (02,18)
334: emulator key [ENTER]
335: until input
336: string “CHG ‘-‘ ‘ ‘ ALL” (02,18)
337: emulator key [ENTER]
338: until input
339: string “SAVE” (02,18)
340: emulator key [ENTER]
341: until input
342: ;
343: ;ファイル転送
344: ;
345: string “=6” (02,18)
346: emulator key [ENTER]
347: until input
348: RECEIVE “C:\temp\BKUPINFO.txt” ‘BBBBBBBB.8.WORKFILE(BKUPINFO)’ [JISCII CRLF
349: :
350: 終了処理
351: :

前処理・・・ワークファイルを開く

02: message “これからバックアップ一覧のデータ取得処理を始めます。”
03: message “取得したい情報が入っているジョブの左にカーソルを置いてOKして下さい。”
04: ;
05: wait 1
06: until input
07: STRING “SJ”
08: until input

Tcplinkマクロでは、最初に情報を抽出するJOBLOGを得るため、02-03行にてメッセージを出力してVTSバックアップジョブのJOBLOGの左にカーソルを置くように促しています
07行目でSJを入力させて、当該JCLを表示させてコメント欄にある処理したデータセットのリストを取得します(説明に不要な部分はマスクしています)
bkup2

09: STRING “SCRNAME SDSFS” (04,21)
10: until input
11: emulator key [ENTER]
12: STRING “SWAP LIST” (04,21)
13: until input
14: emulator key [ENTER]
15: until input
16: UNTIL STRING (03,20) “アクティブ ISPF 論理セッション”
17: move cursor (05,07)
18: until input
19: emulator key [ENTER]
20: wait 1
21: ;
22: until input
23: STRING “SCRNAME BKUPI” (02,20)
24: until input
25: emulator key [ENTER]
26: until input
27: ;

12行目以降で裏画面(SWAP)を作るため、
・上の画面を9行目でSDSFSという名称に設定
・12行目から19行目で新しい画面を作る
・23行目で新しい画面(ワークファイルの画面)をBKUPIという名称に設定します
この時点で、裏画面のISPFメインメニューが出ている事になります

28: string “2” (02,21)
29: emulator key [enter]
30: until input
31: string “‘BBBBBBBB.8.WORKFILE'” (14,26)
32: emulator key [enter]
33: until input
34: wait 1
35: string “F BKUPINFO”
36: emulator key [enter]
37: until input
38: wait 1
39: ;emulator key [newline]
40: ;wait 1
41: string “S” (06,2)
42: emulator key [enter]
43: until input
44: wait 1
45: string “RES”
46: emulator key [enter]
47: wait 1
48: ;
49: ;paste領域消去
50: edit copy (23,09) (23,75)
51: edit paste (04,09)
:
66: edit paste (19,09)
67: ;

28-37行目でワークファイル’BBBBBBBB.8.WORKFILE(BKUPINFO)’を開き、50-66行目で余分なデータを削除します
50行目でcopyしている23行目は、画面で何も書かれていない領域です

バックアップ先VSN取得処理その1・・・対象データセット名をJCLのコメント欄から得る

VSN1の取得処理について説明します。129行目から202行目の処理は以下と同じです。(ワークファイルの書き込み行が変っているだけです)

68: string “SWAP SDSFS” (02,19)
69: until input
70: emulator key [enter]
71: wait 1
72: UNTIL STRING (03,2) “SDSF STATUS DISPLAY ALL CLASSES”
73: until input
74: emulator key [enter]
75: until input
76: string “RES” (02,15)
77: emulator key [enter]
78: until input
79: edit copy (11,33) (18,77)
80: wait 1
81: ;

68行目のSWAPコマンドで9行目の画面に戻りました。72行目でSDSFの画面に戻った事を確認。
7行目で”SJ”が入力されている状態です。(説明に不要な情報は画面から消しました)
bkup2

74行目のENTERでJCL画面を開きます。79行目で赤枠の中をコピーします。
(実際に動作している業務では設定によって最大8データセットを処理するため、赤枠のコピー範囲になっています)
bkup3

82: STRING “SWAP BKUPI” (02,15)
83: until input
84: emulator key [ENTER]
85: until input
86: edit paste (04,17)
87: wait 1
88: ;
82行目でワークファイルの画面に移り、86行目で上画面の赤枠の中を下画面の水色の枠にコピーします(画面は整形後の画面なのでハイフンや”*”はありません)
bkup1

バックアップ先VSN取得処理その2・・・各データセット毎にVSNを得る

89: STRING “SWAP SDSFS” (02,18)
90: until input
91: emulator key [ENTER]
92: wait 1
93: until input
94: emulator key [pf3]
95: until input
96: STRING “?”
97: until input
98: emulator key [ENTER]
99: until input
100: emulator key [TAB]
101: emulator key [TAB]
102: until input
103: STRING “S”
104: until input
105: emulator key [ENTER]
106: wait 1

89-91行目でJCL画面を閉じ、94-105行目でJOBLOGのバックアップ先のVSN情報があるSYSMSG画面を開きます。
SYSMSGだけに限定しているのは、JOBLOG全体を開くと検索対象のテキスト” VOLS=”が1データセットにつき2件抽出されるためです。
bkup4

107: until input
108: ;
109: ;VOL1
110: ;
111: STRING “F ‘ VOLS='” (04,21)
112: until input
113: emulator key [ENTER]
114: until input
115: wait 1
116: edit copy (05,25) (05,30)
111行目でSYSMSG画面内から’ VOLS=’を検索します。存在する場合、結果が5行目に出てくるので、黄色の中をコピーします
bkup41

117: ;
118: STRING “SWAP BKUPI” (04,21)
119: until input
120: emulator key [ENTER]
121: wait 1
122: until input
123: edit paste (04,09)
124: until input
125: STRING “SWAP SDSFS” (02,18)
126: until input
127: emulator key [ENTER]
128: wait 1
118行目でワークファイル画面に移り、123行目で一番目のデータセットの保管先であるVTS001を貼り付けます。以後、SYSMSG内でVOLS=が無くなるまで繰り返します
bkup1


バックアップDCB情報取得

続いて、DCB情報を取得します。こちらもDCB2以降の処理はDCB1と同じ(ワークファイルへの書き込み行が異なるだけ)なので、DCB1だけ説明します

203: ;
204: ;DCB INFOMATION GET
205: ;
206: ;
207: :DCB1
208: emulator key [PF3]
209: emulator key [PF3]
210: until input
211: STRING “S”
212: until input
213: emulator key [ENTER]
214: wait 1
215: ;
216: STRING “F ‘ICE090I 0 OUTPUT LRECL'” (04,21)
217: until input
218: emulator key [ENTER]
219: ;
220: ;DCB1
221: ;
222: until input
223: edit copy (05,18) (05,75)
224: wait 1
208-209行でSYSMSG画面を閉じ、211画面でJOBLOG全体を開き、216行目でFINDコマンドでDCB情報が表示されているメッセージID(IEC090I)を検索。
VSNと同じく5行目に検索結果が表示されるため、赤枠をコピーします
bkup5

225: ;
226: STRING “SWAP BKUPI” (04,21)
227: until input
228: emulator key [ENTER]
229: wait 1
230: until input
231: edit paste (12,09)
232: until input
233: STRING “SWAP SDSFS” (02,18)
234: until input
235: emulator key [ENTER]
236: wait 1
226行目でワークファイルの画面に移り、231行目でワークファイル9行目(画面12行目)に書き出し、233行目でJOBLOG画面に戻ります

ワークファイル後処理・・・整形とダウンロード

311: :OWARI
312: STRING “SWAP BKUPI” (04,21)
313: until input
314: emulator key [ENTER]
315: wait 1
316: ;
317: ;BKUPINFOファイル整形処理
318: ;
319: emulator key [insert]
320: move cursor (12,22)
321: string ” ”
322: move cursor (13,23)
323: string ” ”
324: move cursor (14,22)
325: string ” ”
326: move cursor (16,23)
327: string ” ”
328: emulator key [ENTER]
329: until input
330: string “CHG ‘,’ ‘ ‘ ALL” (02,18)
331: emulator key [ENTER]
332: until input
333: string “CHG ‘*’ ‘ ‘ ALL” (02,18)
334: emulator key [ENTER]
335: until input
336: string “CHG ‘-‘ ‘ ‘ ALL” (02,18)
337: emulator key [ENTER]
338: until input
339: string “SAVE” (02,18)
340: emulator key [ENTER]
341: until input
320-328行目で空白をインサートしてDCB情報の列をあわせています
330-337で不要な記号(カンマ、アスタリスク、ハイフン)をCHANGEコマンドで消去、339行目でSAVEします

342: ;
343: ;ファイル転送
344: ;
345: string “=6” (02,18)
346: emulator key [ENTER]
347: until input
348: RECEIVE “C:\temp\BKUPINFO.txt” ‘BBBBBBBB.8.WORKFILE(BKUPINFO)’ [JISCII CRLF
349: :
350: 終了処理
351: :
345行目でISPFのコマンド入力画面を開き、348行目でワークファイルをダウンロードします
これで、制御がEXCEL(vba)に戻ります

Tcplink実行後のEXCEL(vba)処理

Tcplinkマクロで得た情報がc:\temp\bkupinfo.txtにダウンロードされました。このファイルを入力して情報をセルに入れていきます

入力となるbkupinfo.txtのファイルフォーマットが以下の通りです
bkupinfo

Tcplink処理後のEXCEL(vba)は以下の通りです
11:
12: ‘BKUPINFO READ->dataput
13: Open “C:\TEMP\BKUPINFO.txt” For Input As #1
14:
15: ‘start position memory
16: ar = ActiveCell.Row
17: ac = ActiveCell.Column
18:
19: ‘LINE1 VTS1・・・DSN,VSN
20: ‘LINE2 VTS2・・・DSN,VSN
21: ‘LINE3 VTS3・・・DSN,VSN
22: ‘LINE4 VTS4・・・DSN,VSN
23: ‘LINE5 VTS5・・・DSN,VSN
24: ‘LINE6 VTS6・・・DSN,VSN
25: ‘LINE7 VTS7・・・DSN,VSN
26: ‘LINE8 VTS8・・・DSN,VSN
27:
28: Line Input #1, buf
29: Do While buf <> “”
30:
31: ‘ MsgBox buf
32: ActiveCell.Value = Mid(buf, 9, Len(buf) ? 8)
33: ActiveCell.Offset(0, 1).Select
34: ActiveCell.Value = Left(buf, 6)
35: ActiveCell.Offset(1, -1).Select
36: Line Input #1, buf
37:
38: Loop

13行目でTcplinkでダウンロードしたファイルをオープンします。
16-17行目で選択されているセルの場所を記憶します。
28行目で1レコード目を読み込みbufに入れます。
32行目で選択されているセルに9行目以降の内容(データセット名)を与えます
33行目で選択セルの位置を一つ右に移します
34行目で先頭6文字(VSN名)をセルに与えます
35行目で選択セルの位置を左斜め下(32行目で与えたデータセット名の一つ下)に移します
36行目で次のレコードを読み込みます

29行目、38行目の間がループとなり、bufの内容が続く限り32-36行目の内容を繰り返します

39:
40: ‘LRECLまでLOOP
41: Line Input #1, buf
42:
43: Do While buf = “”
44: Line Input #1, buf
45: Loop
46:
47: Cells(ar, ac).Select
48: ActiveCell.Offset(0, 2).Select
49: ‘LINE09 DCB1 VTS1(LRECL,BLKSIZE,RECFM)
50: ‘LINE10 DCB2 VTS2(LRECL,BLKSIZE,RECFM)
51: ‘LINE11 DCB3 VTS3(LRECL,BLKSIZE,RECFM)
52: ‘LINE12 DCB4 VTS4(LRECL,BLKSIZE,RECFM)
53: ‘LINE13 DCB5 VTS5(LRECL,BLKSIZE,RECFM)
54: ‘LINE14 DCB6 VTS6(LRECL,BLKSIZE,RECFM)
55: ‘LINE15 DCB7 VTS7(LRECL,BLKSIZE,RECFM)
56: ‘LINE16 DCB8 VTS8(LRECL,BLKSIZE,RECFM)
57:
58: Do While buf <> “”
59:
60: ActiveCell.Value = Mid(buf, 40, InStr(40, buf, ” “) ? 40)
61: ActiveCell.Offset(0, 1).Select
62: ActiveCell.Value = Mid(buf, 9, InStr(9, buf, ” “) ? 9)
63: ActiveCell.Offset(0, 1).Select
64: ActiveCell.Value = Mid(buf, 26, InStr(26, buf, ” “) ? 26)
65: ActiveCell.Offset(1, -2).Select
66:
67: Line Input #1, buf
68:
69: Loop
70:
71: Close #1
72:
73: End Sub

VSNとデータセットが含まれていない行は改行レコードのみになっています。
41-45行目でDCB情報が発生するまでレコードを読み続けます
47行目で1番目のデータセットを書き込んだセルの位置に戻り、48行目で右に2つ移ります
60行目でRECFM(40行目から1ワード分)をセルに与えます
62行目でRECFM(9行目から1ワード分)をセルに与えます
64行目でBLKSIZE(26行目から1ワード分)をセルに与えます
60,62行目で選択セルを右に1つ移します
65行目で次のRECFMの位置に選択セルを移します
58-69行目でループします

71行目でファイルをクローズします
bkupinfo2
Filed in Tcplinkマクロ活用(拡張編)

指定した時刻にジョブを実行する

By 神居 - Last updated: 水曜日, 10月 5, 2016

指定した時刻にジョブを実行する(z/OS V2.2からのJES2の新たなジョブ・スケジューリング機能②)



Filed in オペレーション・運用

z/OS V2.2からのJES2の新たなジョブ・スケジューリング機能

By 神居 - Last updated: 水曜日, 10月 5, 2016

2015年秋に出荷されたz/OS V2.2において、JES2のジョブ・スケジューリングにはいくつかの機能追加が行われています。1つが、ジョブ・デッドライン・スケジューリングで、ジョブの実行開始時刻や実行開始期限を指定できるようにした機能です。もう1つが、ジョブ実行制御(JEC:Job Execution Controls)機能です。
Job Execution Controlsは、近年のバージョン/リリース・アップの中でも大規模な機能追加で、既に完成されていて機能的には大きく変わることはないと思っていたJES2サブシステムに、新しいジョブ実行のスケジューリング機能を追加したものです。具体的には、複数のジョブをグループにまとめて並列実行できるようにする、グループ内でのジョブを先行/後続関係に基づいて実行する機能です。これらの機能によってより柔軟なジョブ運用ができるようになります。また、これまでは、JES2にその機能がないが故にISV製品などを導入して構築されてきたジョブの自動運用システム(ジョブ・ネットワーク)が、40年も経って今さらと言うかやっとと言うか、JES2単独の機能でも、ある程度なら手軽に構築できるようになります(*1)。


*1 豊富な機能を持ち、複雑なスケジューリング制御を行える、A-AUTOなどのISV製品のジョブ自動運用ソフトが不要になるわけではないが、これまではOS側にまったく同等の機能がなかった故に、ISVの独壇場であったジョブの自動運用分野に、基本的なものならz/OSだけでジョブ・ネットワークを構築できるようになったことは今後知っておく必要はあるだろう。今後は、当然ISV製品側でもJES2の新しいJEC機能を利用してのジョブ自動実行スケジューリングを機能強化したり、新たな管理機能を追加したりされるであろう。




Filed in オペレーション・運用

14-1.非定型操作にてEXCEL(vba)とTcplinkマクロを連携する(クリップボード編)

By 岡田 - Last updated: 火曜日, 9月 27, 2016
非定型操作によるEXCEL(vba)とTcplinkマクロの連携ですが、ご紹介したい方法が2つあります。
1)クリップボードによる連携
2)ファイルによる連携

です。
二つの区別ですが、”ジョブ名”や”ユーザID”といった単一データを取得・連携する際にはクリップボードで、複数のデータを連携する際にはファイルにまとめてダウンロード後当該ファイルを開いて情報を取得するようにしています

連携する場所にクリップボードを使うことで、EXCEL(vba)及びTcplinkマクロがシンプルで判りやすくなります

EXCELに記載したジョブ番号からジョブ名を取得する

今回紹介するマクロも実際に私が業務で使っているものです。

EXCELの中でジョブ名とジョブ番号を管理しているシートがあります。ジョブ名とジョブ番号はZ/OSのTSO(SDSF)から得るのですが、EXCELのセルにジョブ番号を手入力させておきジョブ名をTcplinkマクロを使ってZ/OSから取得します

本マクロはSDSFのフィルタリング機能を使っています。VOS3ではSYSOUTの状態を確認する方法としてASPEN(SYSOUT編集画面)やSOEDIT2を使いますが、それぞれフィルタリング機能が無かったと記憶しています。VOS3で活用される場合は、各自で確認・修正して下さい

EXCEL(vba)とTcplinkマクロをクリップボードを使って情報を橋渡しする

EXCEL(VBA)とTcplinkは固定化されているマクロですが、クリップボードに渡す情報を変える事で非定型操作が可能になります

excel-1
上の画面は今回の作業を実行するときのEXCELの状態を示しています

セルC3にジョブ番号を記載しておき、同時にアクティブセルの状態にしておきます。
ここからEXCEL(vba)を実行。その延長上でTcplinkマクロを実行させ、Tcplinkマクロが取得したジョブ名をB3セルに格納します

EXCEL(vba)の説明

以下がクリップボードによる連携をするために作成したマクロです

01: Sub sdsfからジョブ名持ってくる()
02: Dim ret As Long
03: Dim buf As String
04: Dim cb As Object
05:
06: Set cb = New DataObject
07:
08: buf = ActiveCell.Value
09:
10: Do
11:
12: With cb
13: .SetText buf
14: .PutInClipboard
15: End With
16:
17: With CreateObject(“wscript.shell”)
18: ret = .Run(“C:\jobnget.mac”, 7, True)
19: End With
20:
21: If ret <> 0 Then MsgBox “失敗”: Exit Sub
22:
23: ActiveCell.Offset(0, -1).Select
24:
25: With cb
26: .GetFromClipboard
27: buf = .GetText
28: End With
29:
30: ActiveCell = Left(buf, 8)
31:
32: ActiveCell.Offset(0, 1).Select
33: ActiveCell.Offset(1, 0).Select
34:
35: buf = ActiveCell.Value
36:
37: Loop While buf <> “”
38:
39: End Sub

クリップボードに情報を与える

06: Set cb = New DataObject
07:
08: buf = ActiveCell.Value
09:
:
11:
12: With cb
13: .SetText buf
14: .PutInClipboard
15: End With

6行目でクリップボードの宣言をしています
8行目でアクティブセルの内容をbufに登録、13-14行目でクリップボードにコピーしています

Tcplinkマクロを起動、終了まで待つ

17: With CreateObject(“wscript.shell”)
18: ret = .Run(“C:\sdsfget.mac”, 7, True)
19: End With
20:
21: If ret <> 0 Then MsgBox “失敗”: Exit Sub

17-19行目でTcplinkマクロを起動していますが、ポイントは18行目の.Runの第二オペランドの”7″です。”7″を指定することで、EXCEL(vba)はTcplinkマクロが終了するまで待機します。前回のEXCEL(vba)では”5″を指定していました

21行目は実行結果の判定です。.Runが正常終了しなかったときの判定です

Tcplinkマクロ

ここからTcplinkマクロの説明に入ります。
はじめに、本マクロを実行するときTSO画面はSDSFの(ST,O,H)のいずれかの画面になっている事が必要です。FILTER機能を動作させるためです(画面参照)
sdsf-filter1

C:\jobnget.macの内容
01: change session TCP3270-Ses01
02: ;
03: ;
04: ;message “OUTPUTクラスの確認処理です。SDSF(ST,O,H)を開いた状態にして下さい”
05: ;until string (03,02) “SDSF OUTPUT ALL CLASSES ALL FORMS”
06: ;
07: until input
08: string “FILTER OFF” (04,22)
09: emulator key [enter]
10: until input
11: string “PRE” (04,22)
12: emulator key [enter]
13: until input
14: move cursor (01,13)
15: until input
16: wait 1
17: emulator key [ENTER]
18: wait 1
19: until input
20: string “1” (03,13)
21: emulator key [enter]
22: until input
23: wait 1
24: string “JOBID” (15,13)
25: until input
26: string “EQ” (15,33)
27: until input
28: edit paste (15,38)
29: until input
30: emulator key [enter]
31: until input
32: wait 1
33: edit copy (07,07) (07,14)
34: wait 1
35: string “FILTER OFF” (04,22)
36: emulator key [enter]
37: until input
38: wait 1

FILTER機能を呼び出す

08: string “FILTER OFF” (04,22)
09: emulator key [enter]
10: until input
11: string “PRE” (04,22)
12: emulator key [enter]
13: until input
14: move cursor (01,13)
15: until input
16: wait 1
17: emulator key [ENTER]
18: wait 1
19: until input
20: string “1” (03,13)
21: emulator key [enter]
FILTER機能を動作させるため、現在動作しているFILTER機能を8行目で解除。14行目でFILTER機能を実行させます
20行目で”1″を指定し、FILTER機能の設定画面を出します
sdsf-filter2

FILTER機能に設定する

22: until input
23: wait 1
24: string “JOBID” (15,13)
25: until input
26: string “EQ” (15,33)
27: until input
28: edit paste (15,38)
29: until input
30: emulator key [enter]
24行目でJOBID、26行目でEQを入力し、28行目でジョブ番号(クリップボードの内容)を入力します
sdsf-filter3

情報の取得

sdsf-filter4

31: until input
32: wait 1
33: edit copy (07,07) (07,14)
34: wait 1
35: string “FILTER OFF” (04,22)
36: emulator key [enter]
37: until input
38: wait 1
クリップボードで設定したジョブ番号に該当する情報がある場合、SDSF画面7行目に表示されます。そこで33行目でジョブ名をクリップボードにコピーします。
該当する情報がない場合、クリップボードには空白が入ります

これでTcplinkマクロは終了し、制御がEXCEL(vba)に戻ります

Tcplinkマクロ実行後の処理(クリップボードのジョブ名をEXCEL(vba)で貼り付ける)

23: ActiveCell.Offset(0, -1).Select
24:
25: With cb
26: .GetFromClipboard
27: buf = .GetText
28: End With
29:
30: ActiveCell = Left(buf, 8)
31:

23行目でアクティブセルを一つ左にずらして、ジョブ名のセルに移します
25-28行目でbufにクリップボードの内容を移し、30行目でアクティブセルにbufの先頭8文字を入れます
excel-2

EXCEL(vba)補足・・・連続してジョブ名を取得する

EXCEL(vba)はdoループで囲っています

10: Do
:
:
32: ActiveCell.Offset(0, 1).Select
33: ActiveCell.Offset(1, 0).Select
34:
35: buf = ActiveCell.Value
36:
37: Loop While buf <> “”
38:
39: End Sub

これは、ジョブ番号が縦に連続して記載している場合を想定しています
32-33行目でアクティブセルを右下に移し、35目でc4セルの内容を確認、空白以外であったらループする仕組みにしています。これによって、連続してジョブ番号があっても連続して処理を実行します
excel-3

※記載もれがありました
EXCEL(vba)でクリップボードを扱う際、vbaのソースコードに”Microsoft Forms 2.0 Object Library”を参照設定する必要があります

この参照設定をしないと、DataObject が無いとコンパイルエラーになります
Filed in Tcplinkマクロ活用(拡張編)

現代の「メインフレームコンピュータ」を支えるエミュレータ(4)「コンソール装置のエミュレータ」

By 岡田 - Last updated: 土曜日, 9月 17, 2016
メインフレームコンピュータにはコンソール装置が必須です。

ハード的なコンソールとソフト的なコンソール

IPL後、「NIP処理の状態を表示・操作」したり、「OS,JES(JSS)等が出力するメッセージを表示・操作」します。

上記の二つはCPUにとっては同じコンソールでも意味合いが違います

・NIP処理メッセージを表示・操作する・・・ハード的なコンソール
 IPL時はOSが起動するための確認、準備をします。IO装置の確認。PAGE,SWAPボリュームの確認など

・OS,JES(JSS)等が出力するメッセージを表示・操作する・・・ソフト的なコンソール

ソフト的なコンソールはOSのシステムパラメタ(VOS3の場合JDECCDパラメタなど)で指定した装置に対して表示・操作しますが、ハード的なコンソールはOSが起動する前のため、別のパラメタで指定します。
VOS3の場合、IPLオプションでコンソールのアドレスを指定します。複数指定することも可能で、障害等でコンソールが使えない場合、後述しているアドレスのコンソール装置を順次チェックしていきます。

コンソール装置のエミュレータ登場の背景

論理資源分割(PR/SM、PRMF)が可能になってから、一つの物理CPUで複数のOS(LPAR)が起動できるようになりました。
cdsv1

しかし、各OSにそれぞれ各OS専用のコンソールが必要なため、コンソールをエミュレートする装置の必要性が出てきました

そこで開発されたのがコンソール装置のエミュレータです
ここでは、日立のコンソール装置のエミュレータ「コンソールデバイスサーバ(CDSV)」について説明します。

コンソールデバイスサーバの機能

cdsv2

コンソールデバイスサーバ(CDSV)には1つの装置につき、最大4つのディスプレイ装置(CRT)が接続可能です。
(上図では、1つのディスプレイ装置でLPAR1,LPAR2,LAPR3の計3つのコンソール画面(ウィンドウ画面)を表示させています)

コンソール画面はWINDOWSのように窓表示になっており、同時に4つのコンソール画面の表示が可能です。
操作する場合は、クリックして、ウィンドウをアクティブにした(対話権を得た)上でコマンドを入力します。
1つの画面には最大16LPARのコンソールを設定する事が可能です。CDSV装置1台では最大32LPARのコンソールを設定できたと記憶しています

CDSV登場前までは、コンソール装置の接続チャネルは専用チャネルでしか接続できませんでしたが、CDSVでは事前にチャネル毎にLPAR番号を設定しておく事でACONARC,ESCONなど共用可能なチャネルで接続できるようになりました

接続されるチャネルの設定、各画面の設定は「CDSV設定指示書」にて行います

CDSVの遷移

CDSVが登場した頃、日立のメインフレームコンピュータAP8000が登場した頃でした。
AP8000はIBMと日立の共同開発のコンピュータということもあったのでしょう。CDSVが登場時のOSはOS/2でした。

その後、IBMとの共同開発が解消され、CDSVのOSはwindowsベースに変更されています。

詳細はこちら日立の大型汎用コンピュータAP8000にIBMあり
Filed in メインフレーム・ハードウェア

DISP=RNWって便利です(再掲)

By 神居 - Last updated: 水曜日, 9月 14, 2016

今さらですが、追記して再掲載します。


JCLを使ってプログラムを動かすとき、DD文で新規にデータセットを作ってそこへアウトプットを出す場合に使うのが「DISP=(NEW,…)」。
テストの時など失敗したら同じJCLでRE-RUNを掛けたりするが、2回目以降はデータセットが出来てしまっているので、先行にDELETEのステップを追加するなど1回目の実行で出来てしまった中途半端なデータセットを消さなきゃいけないのがちょっと面倒だったりする。
ABENDした場合は、DISPの後処理でDELETEさせることが出来るが、ノーマルエンドでも結果が × ってことはよくあるが、ABENDしてないので出力先データセットはできてしまう。カタログしないデータセットなら先行にDELETEのステップを常に入れておけばいいのだけどやはり面倒ではある。
このような時、日立のVOS3にはDISPの第1パラメーターに「RNW」って言うのが指定できる。RENEWですね。新規の割り当てをするという意味ではNEWと同じなのだが、同名データセットが存在していれば一旦それをスクラッチしてから新たに作成し直してくれるという機能を持つ。このRNW、使ってみると結構便利。z/OS(MVS)とMSPでは使えないのが残念な、これはいいよなって思う機能。


z/OSとMSPには、JCLにDISP=RNW機能がないので、先行に古いデータセットを削除するステップを追加することになるが、以下にその例を示します。

UNITとVOLを定義したDISP=(OLD,DELETE)は、例えデータセットが存在しなくてもエラーにならないことを利用したもの。ただし、このサンプルがきれいに動くのは、出力データセットをカタログしない場合に限る。出力データセットがカタログされている場合は、先行の削除ステップでUNITとVOLパラメーターを指定しなければよいが、2回目以降の実行でないとうまく動かない(初回は出力先データセットが存在しないためカタログ参照でエラーとなりJCLエラーになってしまう)。だからといってUNITとVOLパラメーターを指定すると、2回目以降の実行でデータセットは削除されてもカタログは残ってしまう。そのため後続ステップでカタログに失敗(NOT CATLG 2)する。同じVOLへの再作成ならまだしも、異なるVOLへの作成だとカタログと矛盾することになり後で面倒なことになる。
今日のz/OSの運用では、基本的にデータセットはカタログして利用することになっているのでひと工夫必要になる。

出力先データセットがカタログされるのであれば、この例のように先行の削除ステップでのDISPにはOLDではなくMODを指定し、VOLを指定しないことがポイント。
データセットが存在していれば削除とアンカタログがなされ、存在していなければ一旦ストレージ・ボリュームに割り振られて削除される(MODはなければ作り、あれば最終レコードに追加する、という特性を持つ)。出力先データセットがカタログされる場合、このサンプルに習えば、初回の実行(旧データセットが無い状態)でも2回目以降(旧データセットがある状態)の実行でも両方正しく動く。
なお、同じDSNの重複記述は修正漏れなどを誘発しやすいので、SETステートメントで実際の名前を割り当てるようにしてある。※SETステートメントは、z/OSでのみ利用可能。MSPにも同様の機能はあるが、プロシージャー内でしか使えなかったはず…

Filed in 知っておくと便利なテクニックなど

13.Tcplinkマクロで処理した結果を再びPCに持ってきて後処理する。

By 岡田 - Last updated: 水曜日, 9月 7, 2016
12-2までの処理でvbaで作成したTcplinkマクロを実際に実行するところまで、前回は説明しました。

今回はTSO画面の結果をPCに持ってくるところの説明です。

「TSO画面の結果を持ってきて後処理」となると漠然としすぎていますので、実際に処理している内容の一部を改変してご説明する事にしました

メインフレームで使っているボリュームの使用率をPCで管理する

メインフレームの作業に従事している私は、使用許可されているボリュームが限定されています。
ジョブの中間ワークだったり、業務と業務の間の連携用データセットを保管するボリュームです。

このボリュームの空き容量が少なくなると、実行する業務に支障がでるため、日々使用量を監視して逼迫したボリュームは不要なデータセットの削除や他のボリュームにデータセットを引越しさせるなどの対処を行います。

Z/OS(ISPF)ではボリュームの使用率をメニュー3→4でV(VTOC情報の表示)で確認します。
VOS3ではASPENのメインメニューから6→6の@LISTVOLで出します。

今回はZ/OS(ISPF)の処理ついてご説明します
処理内容は以下のとおりです。

1)ISPF(VTOC情報の表示)で表示する画面の使用率の部分を別の区分メンバに集約
A)ISPFで区分メンバを編集モードで開く
B)SPLITで画面を切り替え、VTOC情報の表示を実行、特定ボリュームの使用率を画面に出す
C)特定行をコピー、SPLITコマンドで再び区分メンバに移り、書き込む

※複数ボリュームがある場合、上記B),C)を繰り返す

2)1)のメンバを更新後、TcpLinkのreceive命令でパソコンにダウンロード
3)EXCELに取り込む

<はじめにTcplinkマクロです>
01: change session TCP3270-Ses01
02: ;window minimum
03: ;
04: :
05: :
06: LOGON 処理からISPFメインメニューまで
07: :
08: :
09: string “2”
10: emulator key [enter]
11: until input
12: wait 1
13: string “‘抽出結果を格納する区分データセット名'” (14,26)
14: emulator key [enter]
15: until input
16: wait 1
17: string “F VOLUSE”
18: emulator key [enter]
19: until input
20: wait 1
21: string “S” (06,2)
22: emulator key [enter]
23: until input
24: wait 1
25: string “RES”
26: emulator key [enter]
27: wait 1
28: ;;;
29: move cursor (01,12)
30: until input
31: emulator key [PF2]
32: until input
33: ;
34: ;SPLITでISPFメインメニュー
35: ;
36: string “3”
37: emulator key [enter]
38: until input
39: wait 1
40: string “4”
41: emulator key [enter]
42: until input
43: wait 1
44: string “V”
45: until input
46: wait 1
47: string “AAAAAA” (11,31)
48: emulator key [enter]
49: wait 1
50: edit copy (10,20) (10,77)
51: wait 1
52: ;
53: move cursor (01,12)
54: until input
55: emulator key [PF2]
56: until input
57: wait 1
58: string “AAAAAA ” (04,09)
59: wait 1
60: edit paste (04,16)
61: wait 1
62: ;;;
63: move cursor (01,12)
64: until input
65: emulator key [PF2]
66: until input
67: wait 1
68: emulator key [PF3]
69: until input
70: wait 1
71: string “BBBBBB” (11,31)
72: emulator key [enter]
73: wait 1
74: edit copy (10,20) (10,77)
75: wait 1
76: ;
77: move cursor (01,12)
78: until input
79: emulator key [PF2]
80: until input
81: wait 1
82: string “BBBBBB ” (05,09)
83: wait 1
84: edit paste (05,16)
85: wait 1
86: move cursor (01,12)
87: until input
88: emulator key [PF2]
89: until input
90: wait 1
91: emulator key [pf3]
92: until input
93: wait 1
94: string “CCCCCC” (11,31)
95: emulator key [enter]
96: wait 1
97: edit copy (10,20) (10,77)
98: wait 1
99: ;
100: move cursor (01,12)
101: until input
102: emulator key [PF2]
103: until input
104: wait 1
105: string “CCCCCC ” (06,09)
106: wait 1
107: edit paste (06,16)
108: wait 1
109: move cursor (01,12)
110: until input
111: emulator key [PF2]
112: until input
113: wait 1
114: emulator key [pf3]
115: until input
116: wait 1
117: ;
118: string “DDDDDD” (11,31)
119: emulator key [enter]
120: wait 1
121: edit copy (10,20) (10,77)
122: wait 1
123: move cursor (01,12)
124: until input
125: emulator key [PF2]
126: until input
127: wait 1
128: string “DDDDDD ” (07,09)
129: wait 1
130: edit paste (07,16)
131: wait 1
132: ;
133: ;FILE TRANS PROCESS
134: ;
135: emulator key [pf3]
136: until input
137: wait 1
138: emulator key [pf3]
139: until input
140: wait 1
141: emulator key [pf3]
142: until input
143: wait 1
144: ;
145: ;(TOP MENU)
146: ;
147: string “6”
148: emulator key [enter]
149: until input
150: wait 1
151: receive “C:\temp\VOLUSE.txt” ‘抽出結果を格納する区分データセット名(VOLUSE)’ [jiscii crlf
152: WAIT 10
153: ;
154: :
155: :
156: LOGOFF 処理
157: :
158: :


※LOGON、LOGOFF処理は各自で挿入してください

VTOC情報を一時保管する区分データセット(VOLUSE)を開く

09: string “2”
10: emulator key [enter]
11: until input
12: wait 1
13: string “‘抽出結果を格納する区分データセット名'” (14,26)
14: emulator key [enter]
15: until input
16: wait 1
17: string “F VOLUSE”
18: emulator key [enter]
19: until input
20: wait 1
21: string “S” (06,2)
22: emulator key [enter]
23: until input
24: wait 1
25: string “RES”
26: emulator key [enter]
27: wait 1

ISPFのTOPメニューから2(編集)を選択後、オープンするデータセットに13行目の区分データセット名を入れ、表示されるメンバ一覧から17行目のVOLUSEを選択するものです。25行目から27行目はインフォメーションメッセージを消すための措置なので、RESの必要のない場合ははずしてかまいません

13行目の区分データセットは各自で変えてください

特定ボリュームのVTOC情報を表示、ワークデータセットに画面情報を書き出す

特定ボリューム(上記ではAAAAAAからDDDDDDの4ボリューム)のうち、BBBBBB以降は繰り返しになりますので、AAAAAAについて説明します

29: move cursor (01,12)
30: until input
31: emulator key [PF2]
32: until input
33: ;
34: ;SPLITでISPFメインメニュー
35: ;
36: string “3”
37: emulator key [enter]
38: until input
39: wait 1
40: string “4”
41: emulator key [enter]
42: until input
43: wait 1
44: string “V”
45: until input
46: wait 1
47: string “AAAAAA” (11,31)
48: emulator key [enter]
49: wait 1
50: edit copy (10,20) (10,77)
51: wait 1
52: ;
53: move cursor (01,12)
54: until input
55: emulator key [PF2]
56: until input
57: wait 1
58: string “AAAAAA ” (04,09)
59: wait 1
60: edit paste (04,16)
61: wait 1

29行目から43行目で、以下の処理をしています。
29行目から32行目・・・全画面に対してSPLITコマンドを実行し、裏画面の状態でメインメニューを出します
画面イメージは以下の通りです
ispf%e3%83%a1%e3%82%a4%e3%83%b3

※私がテストした時は、SPLITの裏画面が全画面表示できるようにISPFの設定を変えています。各自の設定を確認して下さい。
ISPFの設定画面の”分割画面の常時表示”の設定をOFFにすると、SPLITの裏画面が全画面表示できるようになります。
ISPFの画面SPLITは行単位で操作が可能ですが、VOS3のSPLITは全画面SPLITしか出来ません。SPLIT時は画面右上にSPLITのメッセージが出ていた記憶があります。

36行目から43行目・・・メインメニューから3→4にてボリューム情報を処理できる画面にします
画面イメージは以下の通りです
ispf%e2%86%923%e2%86%924

44行目から51行目・・・ボリューム情報処理画面にてAAAAAAのVTOC情報を表示する操作を行い、画面に情報を表示します。
画面の情報から50行目にて10行,20カラム目から77カラム目までをクリップボードにコピーします(コピー範囲は一瞬画面に白枠で表示されます)
画面イメージは以下の通りです
ispf_volv

53行目から61行目にてSPLITで表画面を開き、VOLUSE区分データセットの4行目(メンバの1行目)に情報を書き出します
AAAAAAからDDDDDDまで繰り返し書き出したときの画面イメージは以下の通りです
%e3%83%af%e3%83%bc%e3%82%af%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab

VOLUSEの情報をパソコンにダウンロード

132: ;
133: ;FILE TRANS PROCESS
134: ;
135: emulator key [pf3]
136: until input
137: wait 1
138: emulator key [pf3]
139: until input
140: wait 1
141: emulator key [pf3]
142: until input
143: wait 1
144: ;
145: ;(TOP MENU)
146: ;
147: string “6”
148: emulator key [enter]
149: until input
150: wait 1
151: receive “C:\temp\VOLUSE.txt” ‘抽出結果を格納する区分データセット名(VOLUSE)’ [jiscii crlf
152: WAIT 10

151行目のreceive(Tcplinkコマンド)でファイルをダウンロードしたいのですが、これにはコマンドを実行する領域が必要です。
そこで、131行目までに表示していたVOLUSE画面を閉じて、メインメニューに戻り、6の画面に移動して処理をするようにしています。
147行目の時点でISPFメインメニューに戻っている事を確認して下さい(確認する処理は省略しています)

ダウンロードしたファイルのイメージは以下のようになります
AAAAAA 4 使用率 . : 4 最大 . . : 35,100 2,340
BBBBBB 51 使用率 . : 9 最大 . . : 8,295 553
CCCCCC 64 使用率 . : 1 最大 . . : 17,968 1,197
DDDDDD 0 使用率 . : 1 最大 . . : 49,005 3,267

1カラム目から6カラム目・・・抽出対象のボリューム
8カラム目から10カラム目・・・ボリュームの使用率(%)
33カラム目から36カラム目・・・VTOC領域の使用率(この数字が100%になると、ボリューム使用率が少なくてもデータセットの新規割り当てが出来ない)
52カラム目から57カラム目・・・連続して空いている領域で最も大きいサイズ(トラック) この数字が少ない場合、デフラグの検討をする
60カラム目から65カラム目・・・ 同上(シリンダ)

ダウンロードしたファイルをEXCELに取り込む

EXCELにてテキストファイルを取り込みます。
パソコン上でのファイル名が特定されている事、ファイル自体もカラム位置が定まっているため、left,mid,right関数を使って特定セルに書き出す事ができます

excel(vba)でテキストファイルを読み込む方法は複数あるのですが、今回はLINE INPUTを使うことにします。1行1行処理しますので、わかりやすいです

c:\temp\VOLUSE.TXTを読み込むvbaは以下の通りです

01: Sub VOLUSE_READ()
02: Dim buf As String, n As Long
03: Open “C:\temp\voluse.txt” For Input As #1
04: Do Until EOF(1)
05: Line Input #1, buf
06: n = n + 1
07: Cells(n, 1) = buf
08: Loop
09: Close #1
10: End Sub

vbaを実行すると、以下のようになります(フォントはMSゴシックにしています)
voluse


次回は拡張編の最後とします。
今回は特定ボリュームの使用率を取得する方法でしたが、Tcplinkの中に特定ボリュームを指定しているため、定型的操作でした
次回は不定型操作について書きます
EXCELのセルに記載しているJOB番号からSDSFでジョブ名を取得、EXCELに持ってくる手法を書きます
Filed in Tcplinkマクロ活用(拡張編)

現代の「メインフレームコンピュータ」を支えるエミュレータ(3)「磁気テープ(ライブラリ)エミュレータ」

By 岡田 - Last updated: 日曜日, 9月 4, 2016
第三回目は「磁気テープ(ライブラリ)」のエミュレータです

メインフレームコンピュータと磁気テープの深い歴史

コンピュータとしてメインフレームシステム産声を上げたと同時に磁気テープはともに発展してきました。

wikiによると、磁気テープは第二次世界大戦のドイツで実用化されていた技術を戦後アメリカが持ち帰り、メインフレームコンピュータのデータ保管向けに進化させたものです

vt1

上の図は、磁気テープが外部保管媒体としてメインフレームコンピュータシステムを支え始めてから、磁気テープライブラリ装置が1990年初頭に登場するまでのテープ操作イメージです。テープのマウント要求がコンソール装置若しくはテープ制御装置のパネルに表示されると、コンピュータ室に出入りできるオペレータがテープ保管庫から要求されているテープ(オープンリール、カートリッジ型など)を駆動装置にマウントします

テープ操作にはこの時、以下の問題を常に抱えていました
・テープの要求からマウントまで秒から分単位の待ち時間が発生する事
・オペレータが不在の時間帯はテープ要求ができない(時間的制約)事

そこで登場したのが磁気テープを装置内に図書館のように整然と保管した「磁気テープライブラリ装置」です

磁気テープライブラリ装置の登場により仮想テープの概念が見えてきた

vt2

磁気テープライブラリ装置は日立の場合、1991年に磁気テープライブラリ装置としてH-6951が登場し、以後H-6952と進化しました

磁気テープライブラリ装置を用いる場合、常駐ラン(リージョン)として制御プログラムが必要です。オペレータの代わりをさせるためです
日立の場合、磁気テープライブラリ装置を制御するプログラムとして「DMFLSS」がそれに該当します。

磁気テープライブラリ装置制御プログラムの仕事は次のとおりです。
1)磁気テープライブラリ装置に格納の際、登録したラベル情報(管理情報)とOS(データ管理)から要求されたマウント要求を比較し、管理情報に登録されている保管媒体への要求であれば、テープ装置に対して指示を出す
2)保管媒体の入庫(ENTRY)、出庫(EXIT)で発生するラベル情報をもとに管理情報を変更する
3)磁気テープライブラリ装置が停電等で障害となったときのメンテナンス機能

磁気テープライブラリ装置(右下のハード装置)が行う主な作業としては以下3点があります
A)テープが保管されている保管領域から要求が発生したテープをアームロボットが抜き取り、左側の駆動装置にマウントする
B)駆動装置から出てるテープをアームロボットが受け取り、再び保管領域の元の場所に戻す
c)駆動装置の稼働時間を累積しており、定期的に保守領域にあるクリーニングテープをマウントする

当時、テープに保管される媒体はCT400を主体とする”カートリッジ型磁気テープ”でしたが、このテープを装置内に4000巻から6000巻保管すると、装置自体巨大化すると同時にアームロボットの走行距離も長くなるため、ハードウェアのメンテナンスがとてもシビアで難しい装置となりました。

磁気テープライブラリ装置によるメリットは以下のものがあげられます
1)マウントにかかる時間が秒から1,2分オーダーと極端に短くなった
2)オペレータが不在の時間帯でもライブラリ装置に入庫しておけば、いつでもテープ処理が可能になった

しかし、磁気テープライブラリ装置の導入・維持管理に以下の制約が必要になりました
A)装置に対して、免震対策が必須だった点
B)装置内を走行するアームロボットが頼りにする”ガイドレール”に凸凹がない(特に繋ぎ目)点

さらに、BCP(事業継続計画)を考慮した時、保管領域のテープデータを外部に持ち出すには膨大な時間が必要であることから、磁気テープライブラリ装置自体が時代に合わなくなってしまいました

そこで仮想テープという技術が必要になりました

仮想テープ(ライブラリ装置)の概念

vt3

仮想テープ(ライブラリ装置)は、磁気テープライブラリ装置をそのままエミュレーションしたものです。
日立では仮想テープライブラリ装置を制御するプログラムとして「DMFVTLS」がそれに該当します。
(DMFVTLSのVTはVIRTUAL TAPEの略です。そのため、仮想テープは単にVTと呼ばれる場合もあります)

磁気テープライブラリ装置の中にあった保管領域のテープ情報を媒体情報を保管する専用ディスクに格納します

仮想テープライブラリ制御プログラムは、磁気テープライブラリ制御プログラム同様、常駐ラン(リージョン)として稼動し、管理情報内のラベル情報とOS(データ管理)からの要求を比較し、仮想テープに保管しているテープに対する要求であれば、媒体情報を保管している専用ディスクから情報を読み出し、テープのIOを行います

仮想テープ(ライブラリ装置)のメリットとして、、
1)媒体のデータを保管する専用ディスクに移すことで、今までマウントにかかっていた時間がほぼ無くなります。JCL、プログラムを殆ど変更しなくてもターンアラウンドタイムが短くなるという点も挙げられます。
2)磁気テープライブラリの導入には(設置スペースやコスト面など)ハードルが高かったが、仮想テープはハードルが低いため、導入しやすい。また、磁気テープライブラリ装置では駆動装置もハードウェアのため、テープIOの多重度に制約が生じます。仮想テープ(ライブラリ)で使う仮想用の駆動装置はハードウェアではなく、ソフト的にOSに見せているため(IO装置ゼネレーションをする事で)増やす事が可能です。結果テープIOの多重度を高める事ができます。
3)専用ディスクにデータを保管しているため、当該ディスクをリモートコピー(外部転送)する事でBCPへの対応が容易になります


次回はコンソールのエミュレータ(コンソールデバイスサーバ)について説明します
Filed in メインフレーム・ハードウェア

12-2.z/OS(TSO)の文字モードを判定・制御する

By 岡田 - Last updated: 水曜日, 8月 31, 2016
Tcplinkのマクロをvbaで作るテストの段階でマクロを動作する時に考慮する必要がある事項にぶつかりました。

それは、TSOの文字モードの判定と制御です。

これはz/OSのTSOを使って判った事なのですが、TSO(Tcplink)ではALT+F2で文字モードをセション内で切り替える事ができます
キーを押下する毎に英小文字とカタナカ文字のモードが交互に切替わります

<文字モードが英小文字の時の画面>
英小文字2

<文字モードがカタカナの時の画面>
カタカナ2


Tcplinkマクロを利用している際、文字モードが特定条件でしか動作しない場合があり、(通貨記号”¥”円マークを使う場合など)
この場合、現在動作しているセションの文字モードを判定して、動作する文字モードに変更する事が必要になります

この処理をTcplinkマクロで行える事を確認しました

TSOで文字モードを判定、制御する方法

以下がマクロ文です(02,04行目の通貨記号”円マーク”は半角で登録してください)

01|move cursor (06,07)
02|STRING “¥¥”
03|wait 1
04|if string (06,07) “¥”
05|jump false altf2
06|jump altf0
07|;
08|:altf2
09|message “文字モードを変更します”
10|emulator key [reset]
11|until input
12|emulator key [character mode]
13|;
14|:altf0
15|  :

処理の内容を説明します。
6行,7桁目に2行目で入力した円マークを4行目で判定、円マークであればaltf0に飛んで15行目以降の処理を続行します。円マークでない場合、altf2に飛んでメッセージを出した後、[character mode]を入力。文字モードを変更します


日立のTSSの1バイト文字モード

日立VOS3で長年エンジニアとしてTSSなどの作業をしていた時、文字コードで苦労する事はありませんでした。

VOS3では独自の1バイト文字コードとして(拡張EBCDIK、EBCDIKダッシュ)が主流となっており、通常運用されています。数字、英大文字、カタカナ、特殊記号をベースに、空いているコードに英小文字を当てはめています。今回、コード表は取得できなかったのですが、日立のTSSユーザであれば簡単にコード表を作れると思います。

拡張EBCDIK(EBCDIKダッシュ)コードが出来たのは、1989年から1990年初頭だったと記憶しています。
最初に目にしたのは「VOS3 C」のマニュアル付録に掲載されていた拡張EBCDIK(EBCDIKダッシュ)コード表です。

当時、日立はVOS3で稼動するC言語として「VOS3 C」をリリースしました。
C言語は英小文字でソースコードを作りますが、カタカナ入力も欠かせないと判断し、拡張EBCDIK(EBCDIKダッシュ)コードを作ったようです。今は「最適化C」となっていますが、拡張EBCDIKコード表が付録に掲載されていなかったというのが私の記憶です。

拡張EBCDIKは日立独自の1バイトコードのため、VOS3から他のシステムにリプレースする場合、MVS互換システムへのリプレースであっても英小文字等のコード変換が必要になります。

SYS1.PARMLIB(JAASYS00)でシステムで使う1バイトコードを設定できますので、他社リプレース前に確認する事は可能と思います。
Filed in Tcplinkマクロ活用(拡張編)

12.生成したTcplinkマクロをEXCEL(vba)から直接起動する

By 岡田 - Last updated: 日曜日, 8月 28, 2016
Tcplinkマクロをvbaから起動するのは、WSH(Windows Script Host)を使います
WSHの機能を使って、書き出したマクロを実行します。前回の説明と合わせてvbaを記載しますが、今回の説明部分は28から31行目になります

01|Sub tcplink生成サンプル()
02|Dim buf2 As String
03|’マクロ命令生成
04| buf2 = “;コメント1” & vbNewLine
05| bun2 = buf2 & “;コメント2” & vbNewLine
06| buf2 = buf2 & “change session TCP3270-Ses01” & vbNewLine
07|
08| buf2 = buf2 & “message “”データセット名” & ActiveSheet.Range(“A1”).Value & “で実行します。よろしければOKして下さい””” & vbNewLine
09| buf2 = buf2 & “UNTIL STRING (01,4) “”待ちメッセージ””” & vbNewLine
10| buf2 = buf2 & “message “”後続処理を実行します。よろしければOKして下さい””” & vbNewLine
11|’クリップボード
12|With CB
13| .SetText buf2
14| .PutInClipboard
15|End With
16|’マクロ登録
17| rc = Shell(“notepad.exe C:\TcpLinktest.mac”, vbNormalFocus)
18| If rc <> 0 Then
19| Application.SendKeys “%EA”, True
20| Application.SendKeys “%EP”, True
21| Application.SendKeys “%FS”, True
22| Application.SendKeys “%FX”, True
23| Else
24| MsgBox “起動に失敗しました”
25| End If
26|
27|MsgBox “tcplinkマクロを起動します”
28|’マクロ実行
29| With CreateObject(“Wscript.Shell”)
30| .Run “C:\TcpLinktest.mac”, 5
31| End With

生成されるTcplinkマクロ
01|;コメント1″
02|;コメント2″
03|change session TCP3270-Ses01
04|message “データセット名 EXCELのA1セルの内容 で実行します。よろしければOKして下さい”
05|UNTIL STRING (01,4) “待ちメッセージ”
06|message “後続処理を実行します。よろしければOKして下さい”


Tcplinkマクロの実行方法の違いによる記述方法の違い

TcpLinkマクロを実行する方法は2通りあります
1)開いているセッション画面からマクロを実行する方法
2)エクスプローラにあるファイルを直接実行する方法

今回は、vbaからマクロを実行するため、2)に該当します。

1)と2)でマクロ記述方法に違いがあります。2)で実行する場合、使うセッション画面名をマクロ内に記述しておく必要があります。セッション画面名を記述していない状態で2)の実行を行うと、画面名が指定されていない旨のエラーメッセージでマクロが処理されません
※実機検証の結果、セッション画面を1画面しか設定していない場合でも、2)で実行する場合にはセッション画面名を指定する必要があるようです

マクロの命令文には、どこからマクロが呼び出されたのかを判定するものが無いようです。1)と2)の起動の違いをプログラムで制御できる事が判りましたらお知らせします

2)で実行する場合、上のvbaで以下の記述を入れています
06| buf2 = buf2 & “change session TCP3270-Ses01” & vbNewLine

生成されるTcpLinktest.macでは、以下の所になります
03|change session TCP3270-Ses01


この命令で、TCP3270-Ses01のセッション画面で4行目以降の処理を行う事になります。
このマクロを実行する際、なんらかのセッション画面が開いている事を前提としていますが、全くセッション画面が開いていない場合を想定する場合は、change session を open session に変更する必要があります

次回は、Tcplinkマクロで処理した結果をEXCELに取り込む方法を説明します
Filed in Tcplinkマクロ活用(拡張編)