[AS/400]バックアップ&FTPダウンロードスクリプト

概要

開発プログラムの納品時、ライブラリ一括で持っていくのは簡単ですが、実際には、修正メンバーのみ持っていく事も多いです。
ですので、複数のメンバー名とソースファイル名を指定して、SAVF に保管し PC にダウンロードするスクリプトを作りました。
ついでに、客先からデータファイルを持って帰る事もあるので、複数のオブジェクト名を指定して SAVF に保管し PC にダウンロード出来る様にもしました。
ついでなので、ライブラリバックアップも出来るようにしました(^o^)。

良い子のお約束

このページに書かれている事を実行して、何が起こっても私は知りません。
まぁ、このページに到達された方なら大丈夫でしょうけど(^o^)。

環境とか

使い方

スクリプト re977001.hta の固定値をご自分の環境に合わせて変更し、起動して下さい。
『移送用ライブラリ』に保管ファイルが作られます。また、保管ファイルの名前は固定です。
BASP21 と iSeries Access とか Client Access は、自力でインストールして下さい。
当然ですが、保管ジョブとFTPは別ジョブなので、移送用ライブラリに QTEMP は使えません。

スクリプトのソース

[re977001.hta:ここから]======================================================================
<html>
<head>
    <HTA:APPLICATION
        APPLICATIONNAME="AS保管&ダウンロード"
        ICON="wupdmgr.exe" 
        SCROLL="no"

    />
    <style type="text/css">
    <!--
        body,select,input,td    {
            font-family         : monospace;
        }
        h1  {
            margin-top          : 0.5em;
            padding-top         : 0.2em;
            padding-bottom      : 0.2em;
            margin-bottom       : 0.5em;
            padding-left        : 1em;
            color               : #3333ff;
            background-color    : #99ffff;
            font-size           : 130%;
        }
        p   {
            margin-top          : 0 em;
            padding-top         : 0 em;
            padding-bottom      : 0 em;
            margin-bottom       : 0 em;
        }
        textarea.data_list  {
            font-family         : monospace;
            font-size           : 150%;
        }
        textarea.log_list   {
            font-family         : monospace;
        }
        input.pc_file   {
            width               : 23em;
        }
        input.text  {
            font-family         : monospace;
            width               : 8em;  
        }
    -->
    </style>

</head>
<body onload="onload_proc()">
<form id="form_main" onsubmit="">
<h1 id="page_title">対象AS</h1>
<p>保管するオブジェクト名・ソースメンバー名を、改行で区切って入れて下さい。</p>
<table >
<tr><td colspan="2">
    <input type=button onclick="Download_source_member()" value="メンバー@" />
    <input type=button onclick="Download_object()" value="オブジェクトA" />
    <input type=button onclick="Download_Lib()" value="ライブラリB" />
</td></tr>
<tr>
    <td>
        <textarea class="data_list" name="member_lists" rows="13" cols="10"></textarea>
    </td>
    <td class="form_options">
        <dl>
            <dt>ダウンロードフォルダ(末尾の \ は無くても可)@AB</dt>
            <dd>
                <input class="pc_file"  name="data_dir" value="C:\_D\_Dairy\" />
            </dd>
            <dt>ソースファイル@</dt>
            <dd>
                <select name="Source_file_name" size="5" >
                    <option value="QCLPSRC,QCLPSAVF,112">QCLPSRC</option>
                    <option value="QDDSSRC,QDDSSAVF,92" >QDDSSRC</option>
                    <option value="QDSPSRC,QDSPSAVF,112">QDSPSRC</option>
                    <option value="QPRTSRC,QPRTSAVF,112">QPRTSRC</option>
                    <option value="QRPGSRC,QRPGSAVF,112" selected>QRPGSRC</option>
                </select>
            </dd>
            <dt>対象AS@AB</dt>
            <dd>
<!--
                <input class="text" name="AS_SYSTEM" value="" />
-->
                <select name="AS_SYSTEM" size="2" >
                    <option value="192.168.100.100" selected>自社</option>
                    <option value="192.168.100.110" >客先</option>
                </select>
                <input name="SAV_PRV"    type="checkbox">TGTRLS(*PRV)
                <input name="SAV_DTACPR" type="checkbox">DTACPR(*HIGH)
            </dd>
            <dt>保管対象ライブラリ名@AB</dt>
            <dd>
                <input class="text" name="AS_lib_from" value="PGMLIB" />
            </dd>
            <dt>移送用ライブラリ名@AB(QTEMP不可)</dt>
            <dd>
                <input class="text" name="AS_lib_to" value="QGPL" />
            </dd>
            <dt>ユーザーID/パスワード@AB</dt>
            <dd>
                <input class="text" name="AS_UID" value="" />
                /<input class="text" name="AS_PWD" value="" type="password"/>
            </dd>
        </dl>
    </td>
</tr>
</table>
<textarea class="log_list" id="results" rows="12" cols="80"></textarea>
</form>

<script language="VBScript">
    option explicit

    Const C_title_text = "AS保管&ダウンロード"
    '接続初期値
    Const C_Default_AS      = "192.168.100.100"
    Const C_Default_user    = "USERID"
    Const C_Default_pass    = "PASSWORD"
    Const C_window_width    = 615
    Const C_window_height   = 680

    dim rt,i
'--------------------------------------------------------------------------------
'オブジェクトのダウンロード
Sub Download_object()

    dim L_AS400
    dim L_conarray
    dim L_SRCF,L_SAVF,L_SRCF_LEN
    dim L_AS_CMD,L_cmd_str
    dim LA_member,L_member
    dim L_FTP
    dim L_server_file,L_Local_file

    '1.AS/400接続
    '3.移動用SAVFの削除&作成
    '5.ソースファイルのSAVFへの保管(たーげっとも考慮)
    '6.SAVFのFTPダウンロード

    '1.AS/400接続
    Set L_AS400 = createobject("cwbx.AS400System")
    L_AS400.define  document.all("AS_SYSTEM").value
    L_AS400.UserID  = document.all("AS_UID").value
    L_AS400.Password    = document.all("AS_PWD").value

    Set L_AS_CMD = createobject("cwbx.Command")
    Set L_AS_CMD.system = L_AS400

    On Error Resume Next
    '3.移動用SAVFの削除&作成
    L_SAVF = "OBJECTSAVF"
    L_cmd_str = "DLTF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    'こけても無視
    If Err = -2147467259 Then Err.Clear

    L_cmd_str = "CRTSAVF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    '4.保管オブジェクト文字列の作成 → L_SRCF
    L_SRCF ="("
    LA_member = Split(document.all("member_lists").value,vbcrlf)
    for i = 0 to UBound(LA_member)  'それぞれのメンバー毎の処理
        L_member = trim(LA_member(i))
        if L_member <> "" then  'ブランク行は無視で。
            L_SRCF = L_SRCF & L_member & " "
        end if
    next
    L_SRCF = L_SRCF & ")"

    '5.ソースファイルのSAVFへの保管
    L_cmd_str = "SAVOBJ " & L_SRCF
    L_cmd_str = L_cmd_str  & " " & document.all("AS_lib_from").value
    L_cmd_str = L_cmd_str  & " *SAVF SAVF("
    L_cmd_str = L_cmd_str  & document.all("AS_lib_to").value & "/" & L_SAVF & ")"
    if document.all("SAV_DTACPR").checked  then 
        L_cmd_str = L_cmd_str  & " DTACPR(*HIGH)"
    end if
    if document.all("SAV_PRV").checked  then 
        L_cmd_str = L_cmd_str  & " TGTRLS(*PRV)"
    end if

    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str

    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    On Error Goto 0

    '6.SAVFのFTPダウンロード
    Set L_FTP = CreateObject("basp21.FTP")  ' WSH
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if
    '接続
    rt = L_FTP.Connect(document.all("AS_SYSTEM").value,document.all("AS_UID").value,document.all("AS_PWD").value)
    If rt <> 0 Then
        Call S_add_result("FTP接続失敗" & vbcrlf & document.all("AS_SYSTEM").value)  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if

    'ダウンロード
    L_server_file   = document.all("AS_lib_to").value & "/" & L_SAVF
    L_Local_file    = document.all("data_dir").value & "\" & L_SAVF
    Call S_add_result("get " & L_server_file & " " & L_Local_file)  '結果メッセージの表示
    rt = L_FTP.GetFile(L_server_file,L_Local_file,1)  ' バイナリファイルの受信
    If rt <> 1 Then
        Call S_add_result("FTPGET失敗" & vbcrlf & L_server_file & vbcrlf & L_Local_file & vbcrlf & L_FTP.GetReply())  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if

    Set L_FTP = Nothing
    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    Call S_add_result("ダウンロード完了")   '結果メッセージの表示

end sub

'--------------------------------------------------------------------------------
'ライブラリダウンロード
Sub Download_Lib()

    dim L_AS400
    dim L_conarray
    dim L_SRCF,L_SAVF,L_SRCF_LEN
    dim L_AS_CMD,L_cmd_str
    dim LA_member
    dim L_FTP
    dim L_server_file,L_Local_file

    '1.AS/400接続
    '2.移動用SRCFの削除&作成
    '3.移動用SAVFの削除&作成
    '4.ソースメンバーのコピー
    '5.ソースファイルのSAVFへの保管(たーげっとも考慮)
    '6.SAVFのFTPダウンロード

    '1.AS/400接続
    Set L_AS400 = createobject("cwbx.AS400System")
    L_AS400.define  document.all("AS_SYSTEM").value
    L_AS400.UserID  = document.all("AS_UID").value
    L_AS400.Password    = document.all("AS_PWD").value

    Set L_AS_CMD = createobject("cwbx.Command")
    Set L_AS_CMD.system = L_AS400

    L_SAVF = trim(document.all("AS_lib_from").value)
    if len(L_SAVF) > 10 Then
        L_SAVF = left(L_SAVF,10)
    end if

    On Error Resume Next
    '3.移動用SAVFの削除&作成
    L_cmd_str = "DLTF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    'こけても無視
    If Err = -2147467259 Then Err.Clear

    L_cmd_str = "CRTSAVF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    '5.ソースファイルのSAVFへの保管
    L_cmd_str = "SAVLIB " & document.all("AS_lib_from").value & " *SAVF SAVF("
    L_cmd_str = L_cmd_str  & document.all("AS_lib_to").value & "/" & L_SAVF & ")"
    L_cmd_str = L_cmd_str  & " SAVACT(*LIB)"
    if document.all("SAV_DTACPR").checked  then 
        L_cmd_str = L_cmd_str  & " DTACPR(*HIGH)"
    end if
    if document.all("SAV_PRV").checked  then 
        L_cmd_str = L_cmd_str  & " TGTRLS(*PRV)"
    end if

    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str

    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    On Error Goto 0

    '6.SAVFのFTPダウンロード
    Set L_FTP = CreateObject("basp21.FTP")  ' WSH
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if
    '接続
    rt = L_FTP.Connect(document.all("AS_SYSTEM").value,document.all("AS_UID").value,document.all("AS_PWD").value)
    If rt <> 0 Then
        Call S_add_result("FTP接続失敗" & vbcrlf & document.all("AS_SYSTEM").value)  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if
    'ダウンロード
    L_server_file   = document.all("AS_lib_to").value & "/" & L_SAVF
    L_Local_file    = document.all("data_dir").value & "\" & L_SAVF
    Call S_add_result("get " & L_server_file & " " & L_Local_file)  '結果メッセージの表示
    rt = L_FTP.GetFile(L_server_file,L_Local_file,1)  ' バイナリファイルの受信
    If rt <> 1 Then
        Call S_add_result("FTPGET失敗" & vbcrlf & L_server_file & vbcrlf & L_Local_file & vbcrlf & L_FTP.GetReply())  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if

    Set L_FTP = Nothing
    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    Call S_add_result("ダウンロード完了")   '結果メッセージの表示

end sub

'--------------------------------------------------------------------------------
'ソースファイルのダウンロード
Sub Download_proc()

    dim L_AS400
    dim L_conarray
    dim L_SRCF,L_SAVF,L_SRCF_LEN
    dim L_AS_CMD,L_cmd_str
    dim LA_member
    dim L_FTP
    dim L_server_file,L_Local_file

    '1.AS/400接続
    '2.移動用SRCFの削除&作成
    '3.移動用SAVFの削除&作成
    '4.ソースメンバーのコピー
    '5.ソースファイルのSAVFへの保管(たーげっとも考慮)
    '6.SAVFのFTPダウンロード

    '1.AS/400接続
    Set L_AS400 = createobject("cwbx.AS400System")
    L_AS400.define  document.all("AS_SYSTEM").value
    L_AS400.UserID  = document.all("AS_UID").value
    L_AS400.Password    = document.all("AS_PWD").value

    Set L_AS_CMD = createobject("cwbx.Command")
    Set L_AS_CMD.system = L_AS400

    On Error Resume Next
    '2.移動用SRCFの削除&作成
    L_conarray = split(document.all("Source_file_name").value,",")
    L_SRCF =    L_conarray(0)
    L_SAVF =    L_conarray(1)
    L_SRCF_LEN =    L_conarray(2)

    L_cmd_str = "DLTF " & document.all("AS_lib_to").value & "/" & L_SRCF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    'こけても無視
    If Err = -2147467259 Then Err.Clear

    L_cmd_str = "CRTSRCPF " & document.all("AS_lib_to").value & "/" & L_SRCF & " RCDLEN(" & L_SRCF_LEN & ") IGCDTA(*YES)"
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if
    '3.移動用SAVFの削除&作成
    L_cmd_str = "DLTF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    'こけても無視
    If Err = -2147467259 Then Err.Clear

    L_cmd_str = "CRTSAVF " & document.all("AS_lib_to").value & "/" & L_SAVF
    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    '4.ソースメンバーのコピー
    LA_member = Split(document.all("member_lists").value,vbcrlf)
    for i = 0 to UBound(LA_member)  'それぞれのメンバー毎の処理
        if LA_member(i) <> "" then  'ブランク行は無視で。

            L_cmd_str = "CPYSRCF " & document.all("AS_lib_from").value & "/" & L_SRCF
            L_cmd_str = L_cmd_str  & " " & document.all("AS_lib_to").value & "/" & L_SRCF
            L_cmd_str = L_cmd_str  & " " & LA_member(i)
            Call S_add_result(L_cmd_str)
            L_AS_CMD.run L_cmd_str

            If Err.Number <> 0 Then
                Call S_add_result(Err.Description)  '結果メッセージの表示
                Set L_AS_CMD = Nothing
                Set L_AS400 = Nothing
                exit sub
            end if
        end if
    next

    '5.ソースファイルのSAVFへの保管
    L_cmd_str = "SAVOBJ " & L_SRCF
    L_cmd_str = L_cmd_str  & " " & document.all("AS_lib_to").value
    L_cmd_str = L_cmd_str  & " *SAVF SAVF("
    L_cmd_str = L_cmd_str  & document.all("AS_lib_to").value & "/" & L_SAVF & ")"
    if document.all("SAV_DTACPR").checked  then 
        L_cmd_str = L_cmd_str  & " DTACPR(*HIGH)"
    end if
    if document.all("SAV_PRV").checked  then 
        L_cmd_str = L_cmd_str  & " TGTRLS(*PRV)"
    end if

    Call S_add_result(L_cmd_str)
    L_AS_CMD.run L_cmd_str

    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if

    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    On Error Goto 0

    '6.SAVFのFTPダウンロード
    Set L_FTP = CreateObject("basp21.FTP")  ' WSH
    If Err.Number <> 0 Then
        Call S_add_result(Err.Description)  '結果メッセージの表示
        Set L_AS_CMD = Nothing
        Set L_AS400 = Nothing
        exit sub
    end if
    '接続
    rt = L_FTP.Connect(document.all("AS_SYSTEM").value,document.all("AS_UID").value,document.all("AS_PWD").value)
    If rt <> 0 Then
        Call S_add_result("FTP接続失敗" & vbcrlf & document.all("AS_SYSTEM").value)  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if

    'ダウンロード
    L_server_file   = document.all("AS_lib_to").value & "/" & L_SAVF
    L_Local_file    = document.all("data_dir").value & "\" & L_SAVF
    Call S_add_result("get " & L_server_file & " " & L_Local_file)  '結果メッセージの表示
    rt = L_FTP.GetFile(L_server_file,L_Local_file,1)  ' バイナリファイルの受信
    If rt <> 1 Then
        Call S_add_result("FTPGET失敗" & vbcrlf & L_server_file & vbcrlf & L_Local_file & vbcrlf & L_FTP.GetReply())  '結果メッセージの表示
        Set L_FTP = Nothing
        exit sub
    end if

    Set L_FTP = Nothing
    Set L_AS_CMD = Nothing
    Set L_AS400 = Nothing

    Call S_add_result("ダウンロード完了")   '結果メッセージの表示

end sub

'--------------------------------------------------------------------------------
'結果ログの追加
sub S_add_result(P_msg)
    dim L_time,L_time_text

    L_time = time
    L_time_text = right("00" & datepart("h",L_time),2) & ":" & right("00" & datepart("n",L_time),2) & ":" & right("00" & datepart("s",L_time),2)

    document.all.form_main("results").value = document.all.form_main("results").value & L_time_text & " " & P_msg & vbcrlf

end sub
'--------------------------------------------------------------------------------
'添付オブジェクト操作
Sub Download_source_member()

    if document.all.form_main.member_lists.value <> "" then
        Download_proc()
        msgbox "ダウンロードが完了しました。"
    else
        msgbox "ダウンロードするソースメンバー名を指定して下さい。"
    end if

end sub
'--------------------------------------------------------------------------------
sub onload_proc()

    document.title = C_title_text
    document.all("page_title").innerText = C_title_text
    rt = window.resizeTo(C_window_width,C_window_height)

    '初期値設定
    document.all("AS_SYSTEM").value = C_Default_AS
    document.all("AS_UID").value = C_Default_user
    document.all("AS_PWD").value = C_Default_pass

end sub
'--------------------------------------------------------------------------------
</script>
</body></html>
[re977001.hta:ここまで]======================================================================