システム室においてコーディングすること

ドキュメントもなく、ミーティングも進捗のみ。実装内容は個々に任せる。
コストセンターなのでスピードが重視される。延びたぶんはすべて経費に掛かってくるから遅いのはよろしくない。ただし、他部署バックアップの観点から見れば遅くなることもありうる。後者を全力で排除しつつマネジメントしているのはすごいな。
話を戻すけど、システム室の基幹系チームに共通の文化が蔓延していれば、可読性やコーディングスピードはあがるのではないか。というのは、思っていたことだ。
ドキュメント類がないのであれば、「共通の設計思想=コードレビューや作法の浸透」の重要性はさっきのメリットを受ける上で上がる。個々のメンバーが本当に時間に余裕を持って、実装も落ち着いて、レベルの安定したものを提供できるならいいが、メンバーの入れ替わりが短期間でちょいちょいあるとき、しかも入ってくるのがレベル0の人間の場合、レベル高いものに染め上げるのが安心だよ。また、既存のメンバーのレベル参照にもなる。チームが全体としてひとつの生き物みたいに高レベルで安定することが必要だと思う。
今日投げられた案件で出会ったコードは終わってた。回さなくていいものを回して、既存部分にしか重複チェックを行わず新規部分は重複し放題、対になる振替元コードと振替先コードがどちらか欠けてもOK、更新ボタンを押すとエラーのあるなしに関わらず一度マスタを削除するので、エラーの状態で画面を終了すると綺麗にマスタが0レコードになる。
即、売上が減ったりはしないかもしれない。でも、これの入力を行うユーザ、これで納品書だの移動伝票だのを起こして依頼を飛ばすユーザの苦労は増える。基幹系という大事な部分で、意図的にではなくマスタを空にする挙動はどう考えてもおかしい。こういう実装をなくすためにも、どういう方針でとか、仕様書は大事なんじゃなかろうかー。

企業におけるシステム室/表現方法について

表現方法で(コードで)オリジナリティが出せれば面白いなと思う。それはそう思う。
でも可読性のほうが大事だ。可読性はそのコミュニティ(職場)にルールがあれば従うべき。それがそのコミュニティでの可読性を上げるから。
可読性を上げてなににコミットするのかといえば、スピード・生産性だ。事業会社のシステム室はコストセンターだ。コストセンターの不必要なオーバーワークは、ただでさえ売上をうまない部署なのだから必要ない。必要なのは、既定の時間内にスムーズに役割を果たすこと。
事業会社じゃなくても、郷に入っては郷に従え的な観点で、(コミュニティ全員が)なじみのすぐに使える方法を使うのは当然なんだろう。
一つのコミュニティが、まるで一つの生き物のようにスピードを有すること。部署の本質なのだろうか。。セル組織ってなんだかあったな。

カーソルが当たっているサブファイル上のレコードナンバーを取得する

SFLCSRRRN

サブファイルカーソルレコードナンバーなるキーワードが存在する。
使用例

FMTC01  SFLCTL
SFLCSRRRN(&AAA)
AAA   5S H

SFLCSRRRN記述特徴

  • サブファイルコントロールへ記述する。
  • キーワード上のパラメータは'&'が必要。
  • サブファイルコントロールに隠しフィールドを5Sで設定する必要がある。

あとはPGM中で好きに使用できます。
このキーワード探してる時にRTNCSRLOCってのも見つけたんだけど、こっちはフィールド名やレコード様式名を取得できるらしい。ユーザ業務向けには使う場面はなさそうだ。開発向けにツール作ったりする場合は出番ありそうだけど。。

重複チェック

サブファイル上のたとえば製品コードの重複チェックを行うとき。

状況


デフォルメしてるけどこんな感じ。1行(新規登録行)の画面フィールド群の下に、10行くらいファイルの内容を表示したサブファイルレコード(変更行)が並んでいる。この一画面で新規変更削除を行う。削除は空欄にしてF1。レコードに製品コードは一つ。したがって、1VS10と10VS10のチェックになる。

まっさきにやろうとしたこと

新規登録はチェックしやすいので、変更されたものについてのチェックが肝。変更したレコードのみ読み込むREADCとかあったよね使いたい。
そうしてやってみたらあまりの使いづらさに泣いた。

READC
  • サブファイルに対してREADCして、変更があるレコードを読み込む。
  • 変更があるレコードAをREADC+サブファイルで毎回読みたい場合、SFLNXTCHGのフラグを設定してオンにしないと一度だけしか読めない。
  • オンするためにUPDATEをまず変更レコードすべてにかけないといけないはず。チェックはいるたびにやるのがなんだか気持ち悪かった。同じレコードもオンにするので。

上記を踏まえて決定

READCではなく、999個*1の配列(ARREYとする)を用意してそれで進めることにした。ファイルに変更行く前のチェックなので、単純にサブファイル上で重複がないか探せばよい。ARREYにインデックス2つつけて、DO文で回しつつARREY(N)とARREY(X)を比べていけば*2いいけど総力戦すぎてもっとショートな下記方法へ。

  1. サブファイルを書き出す時、サブ配列(ARREYSV)に格納。
  2. 画面を抜けたらサブファイルをARREYへ格納。
  3. #MAIN:ARREY(N)とARREYSV(N)を比べて、ブランクではなく変更されている要素を拾い出す。
  4. #SUB :自分で自分を探してるので一度はあたる。
  5. それを乗り越えて探す。
#MAIN
       Z-ADD   1      N
 N      DO    W@RRN1 
 ARREY(N)  IFNE   *BLANK
 ARREY(N)  ANDNE   ARREYSV(N)  
       EXSR   #サブ
       ENDIF 
       ADD    1      N
       ENDDO
#SUB
       SETOFF           90
 ARREY(N) LOOKUP  ARREY(L)    90
 *IN90    IFEQ   *ON
 N      IFEQ   L
       ADD    1     L
       SETOFF           90
 ARREY(N) LOOKUP  ARREY(L)    90
       ENDIF
 *IN90    IFEQ   *ON     
 //ゲット
       ENDIF 
       ENDIF

90の中に90が出てきて気持ち悪いけど。あとLOOKUPは探し当てたときにオンになるだけで、オフにはしてくれない。自分で伏せてやらないといけなかったはず。。

READCでやるには

READCでSFLNXTCHGのフラグを立てつつすべて拾う。それでサブファイルの内容を格納した配列をLOOKUPすればいいんじゃないかな?

*1: チェックするアイテムの個数が多くないから使える。なんとなく好きじゃない。READCから直接やりたかった。

*2:コードはこっちのほうが短いかもね

月数算出

四月始まりを変換するヤツ。
@@mmがもらったパラメータ:月。

こんなの

D仕様書

D     TAB1     S        2       0       DIM(12) CTDATA PERRCD(12)	
D     TAB2     S        2       0       DIM(12) ALT(TAB1)	

C仕様書

C               Z-ADD   @@MM    N      2        0	 
C       N       LOOKUP  TAB1    TAB2                    30
C       30      MOVE    TAB2    N	 	 	 
C      N30      Z-ADD   0       N	 	 	 

ケツ部分

"**"
040105020603070408050906100711081209011002110312

データ転送ソフト

二つの転送方法

as/400エミュレータはクライアントアクセス(CA)とパーソナルコミュニケーション(PCOM)がある。同じ端末上で共存はできないようだ。as/400をエミュレートする部分は同じだが、転送の方法が違う。

見分け方

転送ファイル(バッチ)を作成しても、どちらもTTOファイルとなって見分けがつかない。中身をノートパッドとかでのぞけばわかるが。また、プロパティのところとか、ウィンドウズのスタートメニューからソフトをみたりとかでも、わからない。CAでもPCOMと表示されたり、消していなかったためにスタートメニュー上では二つフォルダがあるなんてこともあった。見分ける方法はエミュレータ画面から転送画面を呼び出して、そこに図が入っていればCA、入っていなければPCOMである。なんだか微妙な方法だ。

データ転送実行に際して

また、同時に生成されるFDFファイル(ファイル定義が入っている)はチェックマークを外すことで生成させないことが可能だが、他人の端末でTTOファイルを実行すると生成されるようだ。外しミスかもしれないけど。このファイルはなくてもデータ転送できる。なぜ外部で定義を持とうとするのか全く分からない。
CAはTTOファイルを実行すると元ファイル先ファイルパスが表示される。PCOMはでない。
初回稼働のみか、サインオンを要求される。
CAはサインオンを覚えてくれない(らしい)のでスタートアップに飲み込ませるようのバッチを置いてある。

CLP作っててよく忘れること

CL以外の修正をよくやるので忘れる。今回思い出したのがこちら。

  • CLで変数宣言して、ロジックで使用しないとコンパイラおばさんに怒られる。
  • 実行ジョブの情報を取得したい場合はRTVJOBAコマンド。
    • OUTQやジョブIDも取得可能。
    • 各パラメータは固定の長さで取得される。
  • CL中で値の長さを短くしたい場合、CHGVARに%SSTを埋め込む。
    • CHGVAR  VAR(&AA)  VALUE(%SUBSTRING(&BB 1 2))
    • 変数と値のところを逆にすると、変数中の指定バイトへセットが行える。

なんだかsubstringをよく忘れるんだよね。。RPG中だと、変数を区切って宣言するのが簡単で目立つ。