サポート > PC-MAPPING ヒント集 > スクリプト > 入力規則スクリプティング
入力規則スクリプティング
■ 概要
データベースウィンドウ、属性照会ウィンドウ、初期設定値ウィンドウ、属性付与ウィンドウ、属性検索ウィンドウ上で、入力確定イベントに対して、VBスクリプトを設定し、実行する事ができます。

■ 設定方法
  1. [データベース]リボン-[設定]-[定義]から[属性フィールドの設定]ダイアログボックスを表示、または、[プロジェクト]リボン-[プロジェクト設定]-[レイヤー]の各種ベクター要素パネルから[属性フィールドの設定]ダイアログボックスを表示します。
    「入力規則を適応」チェックボックスをOnにします。

  2. [入力規則・検証スクリプト設定]ウィンドウが表示されます。
    スクリプトを記述します。

■ リファレンス
Check(strPara1, lngPara2, lngPara3, strPara4)
解説
セルをダブルクリックして編集した後、フォーカスを他に移動して確定する際に実行されます。
引数
strPara1:入力確定時の値
lngPara2:データベース内部ID
lngPara3:フィールドID(0〜)
strPara4:対象ウィンドウ
strPara4 > 0:データベースウィンドウ上のレコード番号
strPara4 = 0:初期値設定ウィンドウ
strPara4 = -1:属性付与ウィンドウ
strPara4 = -2:属性検索ウィンドウ
戻り値
0 = フォーカス移動を許可しません
1 = フォーカス移動を許可します
戻り値の後ろに文字列を指定する事で、メッセージウィンドウを表示できます。
例えば、
return△"0△"△+△iNum△+△"文字まで";
(△は半角スペース)
注意事項
他のスクリプトによるデータ書き込みや、各種一括処理でデータが書き換えられた場合は、実行されません。
引数の対象ウィンドウは文字型です。必ず、数値型に変換してご利用下さい。
使用例
  1. フィールドの「表示桁数」欄に設定された値より文字数が多い場合、エラーメッセージを表示します。
    [JScriptの場合]
    //@JScript
    function Check(szData, dbID, iField, sRec)
    {
    var iRec = parseInt(sRec);//文字型を数値型に変換
    if(iRec == -2){//属性検索ウィンドウ時は入力規則をしない
    return 1;
    }
    else{
    var oDb = GetDbByID(dbID);//データベースの取得
    var oFi = oDb.GetCopyOfFieldInfo(iField);//フィールドの取得
    var iNum = oFi.Disp1;//表示桁数の取得
    if(szData.length > iNum){//表示桁数より入力文字数が多い場合、メッセージ表示し、フォーカス移動を許可しない
    return "0 " + iNum + "文字まで";
    }
    else{//指定文字数より少ない場合、フォーカス移動を許可
    return 1;
    }
    }
    }
    [VBScriptの場合]
    ‘@VBScript
    Option Explicit
    Function Check(szData, dbID, iField, sRec)
    Dim oDb, oFi, iRec, iNum
    iRec = Clng(sRec)'文字型を数値型に変換
    If iRec = -2 Then'属性検索ウィンドウ時は入力規則をしない
    Check = 1
    Else
    Set oDb = GetDbByID(dbID)'データベースの取得
    Set oFi = oDb.GetCopyOfFieldInfo(iField)'フィールドの取得
    iNum = oFi.Disp1'表示桁数の取得
    If Len(szData) > iNum Then'表示桁数より入力文字数が多い場合、メッセージ表示し、フォーカス移動を許可しない
    Check = "0 " & iNum &"文字まで"
    Else'指定文字数より少ない場合、フォーカス移動を許可
    Check = 1
    End if
    End if
    End Function

  2. フィールドの「表示桁数」欄に設定された桁数の数値以外の場合、エラーメッセージを表示します。
    例えば、「表示桁数」欄が5の場合、10000〜99999の値のみ許可します。
    [JScriptの場合]
    //@JScript
    function Check(szData, dbID, iField, sRec)
    {
    var iRec = parseInt(sRec);//文字型を数値型に変換
    if(iRec == -2){//属性検索ウィンドウ時は入力規則をしない
    return 1;
    }
    else{
    var iData = Number(szData);//文字型を数値型に変換
    if (isNaN(iData)) {//数値に変換できない場合、フォーカス移動を許可しない
    return "0 数値ではない";
    }
    else{//数値に変換できる場合
    var oDb = GetDbByID(dbID);//データベースの取得
    var oFi = oDb.GetCopyOfFieldInfo(iField);//フィールドの取得
    var iNum = oFi.Disp1;//表示桁数の取得
    if(szData.length != iNum){//数値の桁数が表示桁数と異なる場合、フォーカス移動を許可しない
    return "0 " + iNum + "桁ではない";
    }
    else{//数値の桁数が表示桁数と一致する場合、フォーカス移動を許可
    return 1;
    }
    }
    }
    }
    [VBScriptの場合]
    ‘@VBScript
    Option Explicit
    Function Check(szData, dbID, iField, sRec)
    Dim oDb, oFi, iRec, iNum, iData
    iRec = Clng(sRec)'文字型を数値型に変換
    If iRec = -2 Then'属性検索ウィンドウ時は入力規則をしない
    Check = 1
    Else
    If IsNumeric(szData) Then'数値に変換できる場合
    iData = Clng(szData)'文字型を数値に変換
    Set oDb = GetDbByID(dbID)'データベースの取得
    Set oFi = oDb.GetCopyOfFieldInfo(iField)'フィールドの取得
    iNum = oFi.Disp1'表示桁数の取得
    If Len(iData) <> iNum Then'数値の桁数が表示桁数と異なる場合、フォーカス移動を許可しない
    Check = "0 " & iNum & "桁ではない"
    Else'数値の桁数が表示桁数と一致する場合、フォーカス移動を許可
    Check = 1
    End If
    Else'数値に変換できない場合、フォーカス移動を許可しない
    Check = "0 数値ではない"
    End If
    End If
    End Function

  3. 入力した値が他のレコードに入力されている(重複する)場合、エラーメッセージを表示します(なお、レコード数が多い場合、処理速度が遅くなります。ご注意下さい)。
    [JScriptの場合]
    //@JScript
    function Check(szData, dbID, iField, sRec)
    {
    var iRec = parseInt(sRec);//文字型を数値型に変換
    if(iRec == -2){//属性検索ウィンドウ時は入力規則をしない
    return 1;
    }
    else{
    if(szData != ""){//空欄ではない場合
    var oDb = GetDbByID(dbID);//データベースの取得
    var oAL = CreateArrayLong();//整数配列オブジェクトの取得
    var iTemp = oDb.SearchRecByStr(iField, szData, oAL);//重複するレコードを検索
    if(iTemp != ""){//重複するレコードが見つかった場合
    var iFlg = 0;
    for(var i = 0; i < oAL.GetNum; i++){
    if(oAL.Data(i) == iRec){//本レコード以外の重複レコードを確認
    iFlg = 1;
    break;
    }
    }
    if(iFlg == 0){//本レコード以外で重複している場合、メッセージ表示し、フォーカス移動を許可しない
    return "0 " + "重複しています";
    }
    else{//本レコード以外で重複していない場合、フォーカス移動を許可
    return 1;
    }
    }
    else{//重複するレコードが見つからない場合、フォーカス移動を許可
    return 1;
    }
    }
    else{//空欄の場合、フォーカス移動を許可
    return 1;
    }
    }
    }
    [VBScriptの場合]
    ‘@VBScript
    Option Explicit
    Function Check(szData, dbID, iField, sRec)
    Dim oDb, oAL, iRec, iTemp, iFlg, i
    iRec = Clng(sRec)'文字型を数値型に変換
    If iRec = -2 Then'属性検索ウィンドウ時は入力規則をしない
    Check = 1
    Else
    If szData <> "" Then'空欄ではない場合
    Set oDb = GetDbByID(dbID)'データベースの取得
    Set oAL = CreateArrayLong()'整数配列オブジェクトの取得
    iTemp = oDb.SearchRecByStr(iField, szData, oAL)'重複するレコードを検索
    If iTemp <> 0 Then'重複するレコードが見つかった場合
    iFlg = 0
    For i = 0 To oAL.GetNum - 1
    If oAL.Data(i) = iRec Then'本レコード以外の重複レコードを確認
    iFlg = 1
    Exit For
    End If
    Next
    If iFlg = 0 Then'本レコード以外で重複している場合、メッセージ表示し、フォーカス移動を許可しない
    Check = "0 " & "重複しています"
    Else'本レコード以外で重複していない場合、フォーカス移動を許可
    Check = 1
    End If
    Else'重複するレコードが見つからない場合、フォーカス移動を許可
    Check = 1
    End If
    Else'空欄の場合、フォーカス移動を許可
    Check = 1
    End If
    End If
    End Function

■ 補足
入力規則スクリプティングは、VBScript、JScript(JavaScript)の言語を使用する事ができます。
使用するスクリプト言語は、[スタート]リボン-[システム環境設定]を実行し、[操作3]パネルにある「使用するスクリプト言語」の「VBScript」「JScript(JavaScript)」ラジオボタンから選択して下さい。