2019年12月10日火曜日

FileMaker 検索条件を保存、保存した検索条件で検索を実行。SearchRequestMaker

FileMaker 検索条件を保存、保存した検索条件で検索を実行。
ファイル:SearchRequestMaker 一つで、複数のファイル・テーブル・レイアウトに対応。


Windows 10
FileMaker 16,17,18

Mac OS 10.13.3
FileMaker Pro 18

iOS13
FileMaker Go 18

完成品 ※Ver.2.0になっています。

ご支援頂ける場合、ご購入頂けると幸いです。
SearchRequestMaker.zip(500円)
https://fm-aid.stores.jp/items/5defaa7c7d31c9050a865abb
Ver.2.0
https://qbxxdp.blogspot.com/2020/01/filemaker-searchrequestmaker-ver20.html

作成方法

 テーブル:          



フィールド(テーブル:SearchRequest)

フィールド(テーブル:SpecialValue)
 *フィールド: _k |タイプ: テキスト|式: GET(UUID)

 リレーション:     


 スクリプト:     


-----
スクリプト:Receive_Card(FileName,LayoutName)
変数を設定[$arg; 値: Get(スクリプト引数) ]
変数を設定[$$TargetFileName; 値: GetValue($arg ; 1 ) ]
変数を設定[$LayoutName; 値: GetValue($arg ; 2 ) ]
レイアウト切り替え[「SearchRequest」 (SearchRequest) ]
検索モードに切り替え[]
フィールド設定[SearchRequest:: FileName; "==" & $$TargetFileName ]
フィールド設定[SearchRequest:: LayoutName; "==" & $LayoutName ]
エラー処理[オン]
検索実行[]
エラー処理[オフ]
新規ウインドウ[スタイル: カード; 名前: "Card_SearchRequest"; 使用するレイアウト: <現在のレイアウト>; 閉じる: はい; 最小化: いいえ; 最大化: いいえ; サイズ変更: いいえ; メニューバー: いいえ; 親ウインドウを淡色表示: はい; ツールバー: いいえ ]
-----
スクリプト: Receive_AddEditSearchRequest(JSON)
変数を設定[$json; 値: Get(スクリプト引数) ]
変数を設定[$FileName; 値: JSONGetElement($json; "file") ]
変数を設定[$LayoutName; 値: JSONGetElement($json; "layout") ]
変数を設定[$_kSearchRequest; 値: JSONGetElement($json; "_kSearchRequest") ]
If[not IsEmpty($_kSearchRequest) ]
検索モードに切り替え[]
フィールド設定[SearchRequest:: _k; "==" & $_kSearchRequest ]
エラー処理[オン]
検索実行[]
エラー処理[オフ]
Else
新規レコード / 検索条件
変数を設定[$_kSearchRequest; 値: SearchRequest:: _k ]
End If
フィールド設定[SearchRequest:: FileName; $FileName ]
フィールド設定[SearchRequest:: LayoutName; $LayoutName ]
フィールド設定[SearchRequest:: JSON; JSONDeleteElement($json ; "_kSearchRequest") ]
フィールドへ移動[]
スクリプト実行[「Receive_Card(FileName, LayoutName) 」; 引数: $FileName & ¶ & $LayoutName ]
レコード / 検索条件 / ページへ移動[最初の]
Loop
Exit Loop If[$_kSearchRequest = SearchRequest:: _k ]
レコード / 検索条件 / ページへ移動[次の; 最後まできたら終了 ]
End Loop
フィールドへ移動[SearchRequest:: Title ]
-----
スクリプト: Fire_Search
If[SearchRequest:: gPauseSearch = 1 ]
変数を設定[$json; 値: JSONSetElement(SearchRequest:: JSON ; "PauseSearch"; "1"; JSONString ) ]
Else
変数を設定[$json; 値: SearchRequest:: JSON ]
End If
#SpecialValue
スクリプト実行[「_SpecialValue(json) 」; 引数: $json ]
変数を設定[$json; 値: Get(スクリプトの結果) ]
変数を設定[$URi; 値: Let([_URi = "fmp://$/{FileName}?script=SetSearchRequestFromJSON&$json={json}"]; Substitute(_URi ;["{FileName}" ; SearchRequest:: FileName];["{json}" ; GetAsURLEncoded($json)] ) ) ]
URL を開く[$URi][ダイアログなし]
変数を設定[$WindowStyle; 値: Get(ウインドウスタイル) /* 「0」(ゼロ) - ウインドウがドキュメントウインドウの場合 「1」- ウインドウがフローティングドキュメントウインドウの場合 「2」- ウインドウがダイアログウインドウの場合 「3」- ウインドウがカードの場合 */ ]
If[$WindowStyle = 3]
ウインドウを閉じる[現在のウインドウ]
End If
-----
スクリプト: _SpecialValue(json)
変数を設定 [ $json; 値:Get(スクリプト引数) ]
If [ IsEmpty ( $json ) ]
現在のスクリプト終了 [ ]
End If
変数を設定 [ $record_array; 値:JSONGetElement ( $json ; "record" ) ]
変数を設定 [ $record_ListKeys; 値: JSONListKeys ($record_array; "") ]
変数を設定 [ $MAX; 値:ValueCount ( $record_ListKeys ) ]
Loop
Exit Loop If [ Let([$n=$n+1];$n>$MAX) ]
変数を設定 [ $record_Key; 値:GetValue ( $record_ListKeys ; $n ) ]
変数を設定 [ $record; 値:JSONGetElement ($record_array ; $record_Key) ]
変数を設定 [ $record_data; 値:JSONGetElement ($record; "data") ]
変数を設定 [ $field_ListKeys; 値: JSONListKeys ($record_data; "") ]
変数を設定 [ $MAX2; 値:ValueCount ( $field_ListKeys ) ]
変数を設定 [ $k; 値:0 ]
Loop
Exit Loop If [ Let([$k=$k+1];$k>$MAX2) ]
変数を設定 [ $field_Key; 値:GetValue ( $field_ListKeys ; $k ) ]
変数を設定 [ $TEXT; 値:JSONGetElement ( $record_data ; $field_Key ) ]
変数を設定 [ $val; 値:Substitute ( $TEXT 
; [GetNthRecord ( SpecialValue::SpecialValue ; 1 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 1 ))] 
; [GetNthRecord ( SpecialValue::SpecialValue ; 2 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 2 ))] 
; [GetNthRecord ( SpecialValue::SpecialValue ; 3 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 3 ))]
; [GetNthRecord ( SpecialValue::SpecialValue ; 4 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 4 ))] 
; [GetNthRecord ( SpecialValue::SpecialValue ; 5 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 5 ))] 
; [GetNthRecord ( SpecialValue::SpecialValue ; 6 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 6 ))] 
.....
; [GetNthRecord ( SpecialValue::SpecialValue ; 256 ) ; Evaluate (GetNthRecord (SpecialValue::Formula ; 256 ))] ) ]
変数を設定 [ $json; 値:JSONSetElement ( $json ; "record[" & $record_Key & "].data." & $field_Key ; $val ; JSONString ) ]
End Loop
End Loop
現在のスクリプト終了 [ 結果: $json ]
-----
スクリプト: Fire_EditSearchRequest
#SearchRequest
変数を設定 [ $URi; 値:Let([ _URi= "fmp://$/{FileName}?script=GetSearchRequestAsJSON&$_kSearchRequest={_kSearchRequest}" ];
Substitute ( _URi ; ["{FileName}" ; SearchRequest::FileName] ; ["{_kSearchRequest}" ; SearchRequest::_k] ) ) ]
URL を開く [ $URi ] [ ダイアログなし ]
-----
スクリプト: Fire_AddSearchRequest
#SearchRequest
If [ IsEmpty ( $$TargetFileName ) ]
カスタムダイアログを表示 [ タイトル: "!"; メッセージ: "対象ファイルが設定されていません。¶" & "[$$TargetFileName=null]"; デフォルトボタン: 「OK」, 確定: 「はい」 ]
現在のスクリプト終了 [ ]
End If
変数を設定 [ $URi; 値:Let([ _URi= "fmp://$/{FileName}?script=GetSearchRequestAsJSON" ]; Substitute ( _URi ; ["{FileName}" ;
$$TargetFileName] ) ) ]
URL を開く [ $URi ] [ ダイアログなし ]
-----
スクリプト: Close_Card
ウインドウを閉じる [ 現在のウインドウ ]
全スクリプト終了
-----
スクリプト: OnLastWindowClose
フィールド設定 [ SearchRequest::gPauseSearch; "" ]
フィールドへ移動 [ ]
────────────────────────────────────────

対象ファイルで使用するスクリプト


スクリプト: GetSearchRequestAsJSON
変数を設定 [ $WindowMode; 値:Get (ウインドウモード) /* 「0」- ブラウズモード 「1」- 検索モード 「2」- プレビューモード 「3」-印刷中の場合 */ ]
If [ $WindowMode<>1 ]
カスタムダイアログを表示 [ タイトル: "!"; メッセージ: "ERROR:検索モードでは有りません。"; デフォルトボタン: 「OK」, 確定: 「はい」 ]
現在のスクリプト終了 [ 結果: "ERROR:検索モードでは有りません。" ]
End If
変数を設定 [ $TableName; 値:Get ( レイアウトテーブル名 ) ]
変数を設定 [ $FieldNameList; 値:Let ( [ $query = " SELECT TableName ,FieldName FROM FILEMAKER_FIELDS WHERE TableName = ? AND FieldClass = 'Normal' AND FieldType NOT LIKE 'global%' /*除外 グローバルフィールド*/ AND FieldType <> 'binary' /*除外 オブジェクトフィールド*/ " ]; ExecuteSQL ( $query ; "::" ; "";$TableName ) ) ]
変数を設定 [ $FieldNameList; 値:FieldNames (Get ( ファイル名 ) ; Get ( レイアウト名 )) ]
レコード/検索条件/ページへ移動 [ 最初の ]
変数を設定 [ $i; 値:0 ]
Loop
変数を設定 [ $MAX; 値:ValueCount ( $FieldNameList ) ]
変数を設定 [ $n; 値:0 ]
変数を設定 [ $record; 値:"" ]
#2019/12/13|$json_d 初期化を追加
変数を設定 [ $json_d; 値:"" ]
Loop
Exit Loop If [ Let([$n=$n+1]; $n>$MAX) ]
変数を設定 [ $FieldName; 値:GetValue ($FieldNameList ; $n ) ]
変数を設定 [ $val; 値:Evaluate ( $FieldName ) ]
#2019/12/13|If [ not IsEmpty ( $val ) ]を追加
If [ not IsEmpty ( $val ) ]
#$FieldName内の[]は、()に置換
変数を設定 [ $json_d; 値:Let([ _val=$val ;_key=Substitute ( $FieldName ; ["[" ; "("] ; ["]" ; ")"]) ]; JSONSetElement ( $json_d; _key ; _val ; JSONString ) ) ]
End If
End Loop
変数を設定 [ $RequestOmitState; 値:Get (検索条件除外状態) ]
変数を設定 [ $record; 値:JSONSetElement ($record; "RequestOmitState" ; $RequestOmitState ; JSONString ) ]
変数を設定 [ $record; 値:JSONSetElement ($record; "data" ; $json_d ; JSONObject ) ]
変数を設定 [ $record_array; 値:JSONSetElement ($record_array; "["&$i&"]" ; $record ; JSONObject ) ]
レコード/検索条件/ページへ移動 [ 次の; 最後まできたら終了 ]
変数を設定 [ $i; 値:$i+1 ]
End Loop
変数を設定 [ $json; 値:JSONSetElement ($json ; "file" ; Get ( ファイル名 ) ; JSONString ) ]
変数を設定 [ $json; 値:JSONSetElement ($json ; "table" ; $TableName ; JSONString ) ]
変数を設定 [ $json; 値:JSONSetElement ($json ; "layout" ; Get ( レイアウト名 ) ; JSONString ) ]
変数を設定 [ $json; 値:JSONSetElement ($json ; "record" ;$record_array ; JSONArray ) ]
If [ not IsEmpty ( $_kSearchRequest ) ]
変数を設定 [ $json; 値:JSONSetElement ($json ; "_kSearchRequest" ; $_kSearchRequest ; JSONString ) ]
End If
スクリプト実行 [ 「Receive_AddEditSearchRequest(JSON)」; 引数: $json ]
現在のスクリプト終了 [ 結果: $json ]
-----
スクリプト: SetSearchRequestFromJSON
If [ IsEmpty ( $json ) ]
変数を設定 [ $json; 値:Get(スクリプト引数) ]
End If
If [ IsEmpty ( $json ) ]
現在のスクリプト終了 [ ]
End If
変数を設定 [ $layout; 値:JSONGetElement ( $json ; "layout" ) ]
変数を設定 [ $table; 値:JSONGetElement ( $json ; "table" ) ]
変数を設定 [ $PauseSearch; 値:JSONGetElement ( $json ; "PauseSearch" ) ]
変数を設定 [ $record_array; 値:JSONGetElement ( $json ; "record" ) ]
変数を設定 [ $record_ListKeys; 値: JSONListKeys ($record_array; "") ]
レイアウト切り替え [ $layout ]
検索モードに切り替え [ ]
変数を設定 [ $MAX; 値:ValueCount ( $record_ListKeys ) ]
Loop
Exit Loop If [ Let([$n=$n+1];$n>$MAX) ]
If [ Get ( 対象レコード数 )<$n ] 新規レコード/検索条件 End If レコード/検索条件/ページへ移動 [ $n ] [ ダイアログなし ] 変数を設定 [ $record_Key; 値:GetValue (
    $record_ListKeys ; $n ) ] 変数を設定 [ $record; 値:JSONGetElement ($record_array ; $record_Key) ] 変数を設定 [ $record_data;
    値:JSONGetElement ($record; "data" ) ] 変数を設定 [ $field_ListKeys; 値: JSONListKeys ($record_data; "" ) ] 変数を設定 [
    $RequestOmitState; 値:JSONGetElement ( $record ; "RequestOmitState" ) ] If [ $RequestOmitState ] レコードを対象外に End If
    変数を設定 [ $MAX2; 値:ValueCount ( $field_ListKeys ) ] 変数を設定 [ $k; 値:0 ] Loop Exit Loop If [ Let([$k=$k+1];$k>$MAX2) ]
    変数を設定 [ $field_Key; 値:GetValue ( $field_ListKeys ; $k ) ]
    変数を設定 [ $FieldName; 値:Substitute ( $field_Key ; ["(" ; "]"]; [")" ; ")"] ) ]
    変数を設定 [ $FieldName; 値:If ( PatternCount ( $field_Key ; "::" ) ; $field_Key; $table & "::" & $field_Key) ]
    エラー処理 [ オン ]
    フィールドを名前で設定 [ $FieldName; JSONGetElement ( $record_data ; $field_Key ) ]
    エラー処理 [ オフ ]
    End Loop
    End Loop
    If [ $PauseSearch <> 1 ]
        エラー処理 [ オン ]
        検索実行 [ ]
        エラー処理 [ オフ ]
    End If
現在のスクリプト終了 [ ]
-----

 レイアウト:     

レイアウト名:SearchRequest

レイアウト名:SpecialValue
[+]ボタン:単一ステップ 新規レコード/検索条件
[×]ボタン:単一ステップ レコード/検索条件削除



-----

2019年12月4日水曜日

FileMakerでGoogle Route Mapを表示、Google Maps JavaScript API v3使用

FileMakerでGoogle Route Mapを表示
距離を取得
所要時間を取得
動作検証
Windows 10
FileMaker 13,14,15,16,17,18

Mac OS 10.13.3
FileMaker Pro 18

iOS13
FileMaker Go 18

サンプルファイル
GRouteMap_Limited.zip(無料)管理者権限無し
https://fm-aid.stores.jp/items/5de7b105b080e01d0f22c8d9


有料サンプル
ご支援頂ける場合、ご購入頂けると幸いです。
GRouteMap_Unlimited.zip(500円)管理者権限あり
https://fm-aid.stores.jp/items/5de7b36cd20039790920e1d6


Google Maps JavaScript API
APIキー取得方法は、以下を参照して下さい。
https://qbxxdp.blogspot.com/2019/11/filemakergoogle-mapgoogle-maps.html


Google Route Map を利用するには、「Maps JavaScript API」と「Directions API」を有効にする必要があります。
「APIキー取得方法」ですでに「Maps JavaScript API」は有効になっていると思います。
※Google Route Mapでは「Geocoding API」はいりません。


「API の制限」を設定している場合は、「Directions API」も追加。


APIキーをコピー

FileMaker
[歯車]アイコンをクリック


APIキーを貼り付け

「出発」「目的地」を入力し、[Go]ボタンをクリックでルートマップが表示されます




2019年11月30日土曜日

WEBフォームの値をイイ感じのJSONにする。JSONからWEBフォームへ再入力。

WEBフォームの値をイイ感じのJSONにする。
JSONからWEBフォームへ再入力可能で、WEBフォームのテスト入力に便利。

サイトにjQueryが読み込まれている必要があります。

自社サイトでWEBフォームをPOSTする場合に活用したり、
WEBフォームの入力テストで何度も再入力したり.....

https://www.1-firststep.com/」さんのサンプルフォームをお借りして動作を見ていきましょう。
Google ChromeでサンプルWEBフォームを開きます。
https://www.1-firststep.com/samplephp/mailform-v7.2.1/index.html
フォームに入力。


[F12]キーを押して、デベロッパーツールを開く
Consoleに以下のJavaScriptを貼り付けて実行。

function create_json(obj_form) {
    var items = Get_checkbox_radio_name(obj_form);
    var serialize = obj_form.serializeArray();
    var json_data = {};
    for (idx in serialize) {
        var key = serialize[idx]["name"];
        var value = serialize[idx]["value"];
        value = value.replace(/\n\r/g, '\n').replace(/\r\n/g, '\n').replace(/\n/g, '\n').replace(/\t/g, '\t').replace(/\\/g, '\\').replace(/\"/g, '\"');
        var _index = items.indexOf(key);
        if (_index >= 0) {
            var arr = [];
            if (json_data[key]) { arr = json_data[key]; }

            arr.push(value);
            json_data[key] = arr;

        } else {
            json_data[key] = value;
        }
    }
    return json_data;
}

function Get_checkbox_radio_name(obj_form) {
    var _array = [];
    var _obj = $(obj_form).find("select,:checkbox,:radio");
    _obj.each(function (index, element) {
        _array.push($(element).attr('name'));
    });
    return _array;
}

var data_obj = create_json($('form'));
JSON.stringify(data_obj);

赤枠部分に作成されたJSONが、表示されます。
※自社サイトでWEBフォームをPOSTする場合にも扱いやすい形式になっていると思います。



JSONを使ってWEBフォームへ再入力。

以下のJavaScriptの {JSON} 部分に上記の JSONデータを入力し、再入力用のJavaScriptを作成

var data_obj={JSON};

$.each(data_obj, function (index, value) {
    if ($.isArray(value) === false) {
        $('*[name="' + index + '"]').val(value);
    }
    if ($.isArray(value) && $.isPlainObject(value) === false) {
        $('*[name="' + index + '"]').val(value);
    }
    if ($.isArray(value)) {
        $.each(value, function (index, value) {
            var n = index;
            if ($.isPlainObject(value)) {
                $.each(value, function (index, value) {
                    $('*[name="' + index + '"]').eq(n).val(value);
                });
            }
        });
    }
});

var data_obj={
    "company": "会社名",
    "name_1": "日本",
    "name_2": "太郎",
    "read_1": "にほん",
    "read_2": "たろう",
    "mail_address": "abc@d.com",
    "mail_address_confirm": "abc@d.com",
    "gender": [
        "男性"
    ],
    "target": [
        "女性"
    ],
    "postal": "100-0000",
    "address": "東京都千代田区",
    "phone": "00-0000-0000",
    "schedule": "2019/11/30 14:20",
    "product": [
        "iPhone6"
    ],
    "use": [
        "iPhone6s"
    ],
    "kind[]": [
        "WEBサイトについて",
        "キャンペーンについて",
        "ご意見・ご要望"
    ],
    "response[]": [
        "メールでの返信を希望"
    ],
    "contents": "お問い合わせの内容",
    "message": "愛の告白"
};

$.each(data_obj, function (index, value) {
    if ($.isArray(value) === false) {
        $('*[name="' + index + '"]').val(value);
    }
    if ($.isArray(value) && $.isPlainObject(value) === false) {
        $('*[name="' + index + '"]').val(value);
    }
    if ($.isArray(value)) {
        $.each(value, function (index, value) {
            var n = index;
            if ($.isPlainObject(value)) {
                $.each(value, function (index, value) {
                    $('*[name="' + index + '"]').eq(n).val(value);
                });
            }
        });
    }
});

Google ChromeのデベロッパーツールのConsoleにJavaScriptを貼り付けて実行。
WEBフォームに値が再入力されます。


お気に入りにJavaScriptスキームとして登録しておけば、WEBフォーム入力テスト時に1クリックで再入力が可能です。