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
[+]ボタン:単一ステップ 新規レコード/検索条件
[×]ボタン:単一ステップ レコード/検索条件削除



-----

0 件のコメント:

コメントを投稿