ファイル: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)
スクリプト: Receive_AddEditSearchRequest(JSON)
スクリプト: Fire_Search
スクリプト: _SpecialValue(json)
スクリプト: Fire_EditSearchRequest
スクリプト: Fire_AddSearchRequest
スクリプト: Close_Card
スクリプト: OnLastWindowClose
スクリプト: GetSearchRequestAsJSON
スクリプト: SetSearchRequestFromJSON
レイアウト名:SpecialValue
[+]ボタン:単一ステップ 新規レコード/検索条件
[×]ボタン:単一ステップ レコード/検索条件削除
-----
リレーション:
スクリプト:
-----
スクリプト: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 件のコメント:
コメントを投稿