ACS(IBM Access Client Solutions) のMacroから別のMacroを呼び出す方法

最近ACS(IBM Access Client Solutions)のマクロを編集する機会があった。

マクロといえば、Excelのマクロなら編集・実行したことがある方が多いかもしれない。
ACSにおいてもだいたい同様だ。

マクロを使いたいという目的は基本的に「操作の自動化」である。
マクロを実行することにより、あらかじめ登録しておいた操作を、途中でオペレータが介入することなく自動実行が可能である。
これは5250画面の枠内だけでなく、右クリックで出てくるメニューやタイトルバーにある動作も実行できるのだ。
(実行させるCLプログラムの作りによって、オペレータ入力介在させることも可能。これは別記事に書く）

登録方法はエミュレータ画面から「アクション」「マクロ」「マクロの記録」を選択して保管場所（あらかじめ登録する）と名前（xxxx.macのような命名規則)を指定して、記録を開始し、終わったら「アクション」「マクロ」「マクロの停止」
ちなみに、下のポップアップに「OK」で答えないと記録は開始されないので、注意が必要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702564/211758cd-008f-b811-caaa-81ae95874d36.png)
さて、マクロの登録での悩ましい問題は、途中でミスすると、最初からやり直しになる点である。動画をワンカットで撮ろうとするのと同じである。どこかで失敗すると、最初からやり直しとなる。		
これはあまり生産的ではないので、動画ならいくつかの細かいカットに分けて編集するのが普通である。		
マクロでも同じことだ。つまり、いくつかの細かいシーンに合わせて動作を記録し、後でそれらを「つなぐ」のである。		
同様に、プログラミング言語やスクリプト言語で同様のことを志向する場合、細かくモジュール化して「つなぐ」必要性が出てくるのだが、特性の違いがあるので注意したい。		
		
一般的に、プログラムでは１つのMainプログラムを配置して、そこからSubプログラムを順次実行するという形態を取る。
```
	PGMA	
	CALL PGMB	
	CALL PGMC	
	CALL PGMD	
```		
しかし、ACSMacroではこの形態をサポートしていない。このため、つなぐ手段としては、			
```		
	PGMA	
	CALL PGMB 
    
    PGMB	
	CALL PGMC	
		
	PGMC	
	CALL PGMD	
```		
のように、各モジュール内に次プログラムを記述し実行するのである。		
		
これでは「部品化」というモジュール化のメリットを損なうことになるが、この形態しかできないため、仕方ない。		
しかも、この「次プログラム」の指定の仕方がやや面倒である。		
ネットを検索したが、まとまったサンプルに乏しいので、こちらで共有するのがこの記事の目的である。（ここまで長かった）		
		
下は、5250画面からCLプログラムを実行するサンプルである。		
```
<HAScript name="21PTFINFO" description="" timeout="60000" pausetime="300" promptall="true" blockinput="true" author="t-bab" creationdate="2024/06/13 10:42:44" supressclearevents="false" usevars="false" ignorepauseforenhancedtn="true" delayifnotenhancedtn="0" ignorepausetimeforenhancedtn="true" continueontimeout="false">					
					
    <screen name="画面1" entryscreen="true" exitscreen="false" transient="false">					
        <description >					
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />					
        </description>					
        <actions>					
            <input value="CALL SYSINF21C[enter]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />					
        </actions>					
        <nextscreens timeout="0" >					
            <nextscreen name="画面2" />					
        </nextscreens>					
    </screen>					
					
    <screen name="画面2" entryscreen="false" exitscreen="false" transient="false">					
        <description >					
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />					
            <numfields number="156" optional="true" invertmatch="false" />					
            <numinputfields number="12" optional="true" invertmatch="false" />					
        </description>					
        <actions>					
            <input value="[pf6]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />					
        </actions>					
        <nextscreens timeout="0" >					
            <nextscreen name="画面3" />					
        </nextscreens>					
    </screen>					
					
    <screen name="画面3" entryscreen="false" exitscreen="true" transient="false">					
        <description >					
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />					
            <numfields number="156" optional="true" invertmatch="false" />					
            <numinputfields number="12" optional="true" invertmatch="false" />					
        </description>					
        <actions>					
            <input value="[pf12]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />					
        </actions>					
        <nextscreens timeout="0" >					
        </nextscreens>					
    </screen>					

```

こちらの次工程として、"22TCPINFO.mac"というマクロを実行する例をご紹介する。
 変更箇所① 最後のscreen name=節のexitscreen=属性を"true"から"false"に変更する
 変更箇所②のnextscreens=節に<nextscreen name= />節を追加する。
nextscreen name=の値は、画面数の連番になっているはずなので、最後の画面＋１にするとよいだろう
```
    <screen name="画面3" entryscreen="false" exitscreen="false" transient="false">			
        <description >			
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />			
            <numfields number="156" optional="true" invertmatch="false" />			
            <numinputfields number="12" optional="true" invertmatch="false" />			
        </description>			
        <actions>			
            <input value="[pf12]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />			
        </actions>			
        <nextscreens timeout="0" >			
            <nextscreen name="画面4" />			
        </nextscreens>			
    </screen>			

```
さて、「つなぐ」ための画面として、
追加箇所①「画面4」の記述を追加する。1行目の
   entryscreen="true" exitscreen="true"
および、6行目のマクロの名前（拡張子は.macでも.MACでもよい）が大文字・小文字まで一致していること
がこの追加のキモである。（合ってないとMacro not foundとなる）

```
    <screen name="画面4" entryscreen="true" exitscreen="true" transient="false">	
        <description >	
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />	
        </description>	
	<actions>
	   <playmacro name="22TCPINFO.mac" transfervars="No Transfer" />
	</actions> 
        <nextscreens timeout="0" >	
        </nextscreens>	
    </screen>	

```
修正を施した結果は以下のようになる

```
<HAScript name="21PTFINFO" description="" timeout="60000" pausetime="300" promptall="true" blockinput="true" author="t-bab" creationdate="2024/06/13 10:42:44" supressclearevents="false" usevars="false" ignorepauseforenhancedtn="true" delayifnotenhancedtn="0" ignorepausetimeforenhancedtn="true" continueontimeout="false">	
	
    <screen name="画面1" entryscreen="true" exitscreen="false" transient="false">	
        <description >	
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />	
        </description>	
        <actions>	
            <input value="CALL SYSINF21C[enter]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />	
        </actions>	
        <nextscreens timeout="0" >	
            <nextscreen name="画面2" />	
        </nextscreens>	
    </screen>	
	
    <screen name="画面2" entryscreen="false" exitscreen="false" transient="false">	
        <description >	
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />	
            <numfields number="156" optional="true" invertmatch="false" />	
            <numinputfields number="12" optional="true" invertmatch="false" />	
        </description>	
        <actions>	
            <input value="[pf6]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />	
        </actions>	
        <nextscreens timeout="0" >	
            <nextscreen name="画面3" />	
        </nextscreens>	
    </screen>	
	
    <screen name="画面3" entryscreen="false" exitscreen="false" transient="false">	
        <description >	
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />	
            <numfields number="156" optional="true" invertmatch="false" />	
            <numinputfields number="12" optional="true" invertmatch="false" />	
        </description>	
        <actions>	
            <input value="[pf12]" row="0" col="0" movecursor="true" xlatehostkeys="true" encrypted="false" />	
        </actions>	
        <nextscreens timeout="0" >	
            <nextscreen name="画面4" />	
        </nextscreens>	
    </screen>	
	
    <screen name="画面4" entryscreen="true" exitscreen="true" transient="false">	
        <description >	
            <oia status="NOTINHIBITED" optional="false" invertmatch="false" />	
        </description>	
	<actions>
	   <playmacro name="22TCPINFO.mac" transfervars="No Transfer" />
	</actions> 
        <nextscreens timeout="0" >	
        </nextscreens>	
    </screen>	
</HAScript>	

```
参考ドキュメント「マクロ・プログラミング・ガイド」 HCL社が提供しているこれが一番親切でわかりやすい
https://help.hcl-software.com/zie/zieweb/2.0/ja/doc/macro/macro_hodpreface.html