FileMaker 「関数と計算式」 中級編(10章)

FileMaker公式テキスト中級編!!!

中級編では、
中級開発者として複数の利用者を想定してシンプルなカスタムAppを作成する
といった内容になります。

全16章です。
前回は、9章『レイアウトツール』について学びました。
👉FileMaker 中級編(9章)

今回は、10章『関数と計算式』についての知識を学びます。

関数と計算式

 

[計算式の指定]ダイアログ

計算式のダイアログには大きく分けて3つあります。

  • データの計算
    構造設計(データの計算)
  • 論理値の計算(真か偽)
    画面設計(レイアウトの計算)
  • 一時的な値の計算
    機能設計(機能の計算)
  画面設計 機能設計 構造設計
計算内容 論理判定 一時的な値を計算 データの計算
主たる計算場所 レイアウト スクリプト変数 計算計算タイプのフィールド
評価タイミング 表示された時に
(必要な時に)
利用するときに
(必要な時に)
索引に依存
計算結果 論理値(1or 0) テキスト 結果タイプに依存
(左下で選択する)

計算結果の評価のタイミング(データの計算)

データの計算では、評価のタイミングが索引に依存しています。
少し詳しく確認します。

●索引あり
評価のタイミング: フィールドの値が変更された時
計算結果の特徴: 検索は早い
計算式の特徴: 同じテーブルのフィールド値を使用

●索引なし
評価のタイミング: 参照された時、スクリプトで使用しようとした時
計算結果の特徴: 検索に時間がかかる場合が多い
計算式の特徴: 取得関数の利用・非保存フィールド値の使用、関連レコード値使用 など

[次のコンテキストからこの計算式を評価する:]⇨評価する場所
ここのTOは必ずアンカーのTOにする。

計算式パネル

●演算子と記号ボタン(計算式パネルの右縦に配置された演算子ボタン)
4 つのグループに分かれています。

・文字列演算子と記号
・比較演算子
・算術演算子
・論理演算子

●文字列演算子と記号
テキストタイプのフィールド値や文字列テキストを扱うために使用する演算子
「&」 テキストの連結
「” “」 文字列としてテキストを記述する時
「¶」 改行

●比較演算子
数字や日付タイプのフィールド値や文字列テキストを扱うために使用する演算子
「=」「≠」「>」 「<」「≧」「≦」

●算術演算子
「+(加算)」「-(減算)」「*(乗算)」「/(除算)」「^(累乗)」があります。
( ) は優先順位を指定します。
通常、計算式は左から右に評価され、加算と減算よりも乗算と除算 が先に実行されますが、( ) を使用すると、( ) の中の式が先に評価されます。

●論理演算子
「not」「and」「or」「xor」があります。

not 値を偽から真、または真から偽に変更する 1つの式に使用
and 右と左、両方の値が死んである場合のみ真 2つの式の組み合わせに使用
or 左と右のどちらかの値が真である場合は真 2つの式の組み合わせに使用
xor 左と右のどちらか一方の値だけが真の場合は真 2つの式の組み合わせに使用

関数(データの計算)

FileMaker Pro には、たくさんの関数が用意されています。
関数 >>> あらかじめ定義されている名前がついた特定の演算です。
そして結果を1つ返すものです。

引数

関数には引数が必要なものがあります。
必須、あるいはオプションとしてなど様々です。

主に以下を使います。

  • 定数(任意の文字列やフィールド名など)
  • フィールドのデータ
  • 変数
  • 他の関数の結果

テキストの引数はダブルクォーテーションマーク「”」で囲む必要があります。

 

※また、フィールド名を引数として指定する場合は、原則として
その計算式が評価されるコンテキスト(表示させるレイアウト)のTO が指定されていないと正しい結果が返りません。

引数を「日付関数」で確認してみます。

Year ( 日付 )関数

引数は1つです。
指定した「日付」の 4 桁の年を返します。
Year ( “2018/08/25” )
のようにテキストの引数で日付を入力すると「2018」と結果を返します。

Year ( 発行日 )
「発行日」フィールド(日付タイプ)があり、そのフィールド名を引数として入力すると。。。データが2018/8/25 だった場合、「2018」を返します。


Year ( Get(日付) )
Get(日付)関数を引数として入力すると、今日が2018/8/25だった場合、「2018」を返します。

『Date ( 月 ; 日 ; 年 )関数』

引数は 3 つです。
指定した「月」「日」「年」のカレンダー上の日付を返します。

Date ( 8 ; 25 ; 2018 )
のように数字で引数を入力すると「2018/8/25」と結果を返します。
数字は「”」で囲む必要 はありません。

Date ( 8+2 ; 25 ; 2018 )
のように式も含んだ引数を入力しても「2018/10/25」と結果を返します。

 

Date ( 1 ; 2 ; Year ( 発行日 ) )
「発行日」フィールド(日付タイプ)があり、そのフィールド名を引数として入力すると、
データが 2018/8/25 だった場合、「2018/1/2」を返します。

🌟データビューアと引数

『この式、ちゃんと動くかな……』と思ったらデータビューアで確認できます。
・メニュー[ツール][データビューア]⇨[監視]タブ『+』をクリック

※注意があります。データビューアの計算式ではコンテキストの指定が必須です。
(完全修飾名)

関数の種類

関数は、用途によりいくつかの種類に分かれています。次表が主な種類と特徴です。

テキスト関数 テキストの情報、分析、並べ替え、抽出、作成に使用することができます。
書式設定関数 指定されたテキストの色、フォント、サイズ、およびスタイルを変更することができます。
数字関数 数値データを操作します。
日付関数 日付を計算したり日付情報を操作したりします。
時刻関数 時刻を計算したり時刻情報を操作したりします。
タイムスタンプ関数 タイムスタンプは、特定のイベントが発生した正確な日付と時刻を記録するなど、
様々な同期処理に使用されます。
オブジェクト関数 オブジェクトタイプフィールドに格納されているデータの計算、操作、
情報の取得を行います。
日本語関数 日付部分を日本語で返します。また、日付、数字、およびテキストの値を
他のデータタイプや日本語の仮名に変換します。
JSON 関数 JSON 形式のデータを解析、作成、変更、および書式設定します。
統計関数 フィールドに含まれる数値 ( 関数によっては日付や時刻 ) の統計分析を実行します。
財務関数 財務情報の計算を行います。
例えば PMT 関数を使用すると、ある利率のローンで車を購入する際の月々の支払い額を
計算することができます。
三角関数 度、角度、およびその他の幾何情報の計算を行います。
論理関数 指定した条件が真か偽かを評価します。
FileMaker Pro では、条件が真の場合に「1」、条件が偽の場合に「0」を返します。
GetField 関数は、別のフィールドの内容を返すこともできます。
その他の関数 フィールドとレイアウトオブジェクトに関する情報を返します。
取得関数 スクリプト内のエラーを監視したりファイルまたは実行されているステータスに関する
情報を取得できます。取得関数の多くは定期的に変更される情報を結果として返します。
スクリプトで最新情報を取得する使い方が最も適切です。
またはフィールドオプションの初期値の設定にも有用です。
非保存でない計算タイプフィールドに Get ( 時刻 ) 関数が配置および保存される場合、
新しいレコードが作成された場合にのみ時刻が更新されます。
デザイン関数 現在開いているカスタム App ファイルの構造に関する情報を返します。
例えば すべてのレイアウト名やフィールド名を取得することができます。
モバイル関数 FileMaker Go での使用が前提です。

よく使うものをいくつか記述します。さらに詳しい情報はヘルプを参照してください。

UUID

FileMaker Pro のデフォルトは「主キー」フィールドに計算値自動入力で Get (UUID) 関数が設定されています。

67574151-F1FC-4ECB-8787-3BE8AA9B7D3F

『Get(UUID)』
結果は 16 進数(128bit)のランダムな文字列です。
評価されるたびに新しい文字列を返します。

『Get(UUID 番号 )』
結果は 24 進数(192 ビット)のランダムな数字です。
評価されるたびに新しい数字を返します。

 

※データは数字の方が処理速度が早い特性があります。
状況に応じて、UUIDをテキストか番号か考える必要が出てくるでしょう。

※UUID(Universally Unique IDentifier)は全世界でユニークになる(重複する確率が限りなく 0 である)識別子です
FileMaker Pro 独自の考え方ではなく標準化がなされている世界的なものです。
この特性を主キーに活用できます。

数字関数

カスタム App では、よく数値を取り扱います。
お金や個数、件数などです。
今回の見積作成カスタムAppでは、消費税額の端数は四捨五入しました。

『Round( 数値 ; 桁数 ) → 四捨五入』

Round( 123.45 ; 0 )
数字「123」が返ります。 桁数は、小数点以下を表します。
小数点以下が不要な場合は桁数を「0」で式を指定します。

↓↓↓他にも端数処理に使用できる関数があります。

『Truncate( 数値 ; 桁数 )』 指定した小数点以下の桁で切り捨て
『Ceiling( 数値 )』 少数がある場合、整数を切り上げた数値
『Floor ( 数値 )』 一番小さい整数より下を切り捨て
『Int( 数値 )』 数値の整数のみ

↓↓↓その他

『Mod( 数値 ; 除数 )』
数値を除数で割った余り

 

Mod( 7 ; 2 )
数字「1」を返します。
7÷2=3で余り1なので、この余り部分を返します。


日付や時間の計算に使用したり、2で割った余りが 1 なら数値は奇数であると判断するために使われることがあります。

『Random』
0 以上 1 未満の乱数

.99035877187065557425
のような小数点以下の数字を返します。
評価されるたびに新しい結果を返します。


●例えば、0 から 9 の間の乱数が必要な場合
Int ( Random * 10 )
10かけるので9.9035877187065557425
Intは整数のみ表示なので、この場合9を返す。

 

●0 は不要で 1 から 10 の間の乱数が必要な場合は、次のような式で得られます。
Int ( Random * 10 ) + 1
10かけるので9.9035877187065557425
Intは整数のみ表示なので、この場合9。+1なので10を返す。

『Abs( 数値 )』
数値の絶対値

Abs ( -5 )
数字「5」を返します。 正数が結果として返ります
絶対値は「0」からの距離を捉えるのに役立ちます。


よくある使用方法としてGet(システムプラットフォーム)関数ではWindowsプラットフォームの場合「-2」 が返りますが、Abs 関数で絶対値化して取り扱うことがあります。

『Sign( 数値 )』
正か負か0か

 

Sign( -12345 )
数字「-1」を返します。 指定された数値が負の場合は「-1」ゼロの場合は「0」正の場合は「1」を返します。

 

請求後の入金の残高有無などを確認するために役立ちます。

テキスト関数 1

『Length( テキスト )』
指定したテキストの文字数(空白や改行も数えます)

Length( “あいうえお” )
数字「5」を返します。

「見積情報」テーブルの「件名」フィールドを 30 字までに制限する。
「計算式で制限」で、 Length( 件名 ) ≦ 30 と、設定することもできます。
この計算式は論理値(0または1)が結果として返ります。

 

なお、 結果の判断基準は、次のように考えています。
・30 文字までは「1」エラーではない
・31 字以上は「0」エラー

↓↓↓単語数を数える関数もあります。

『WordCount( テキスト )』
指定したテキストの単語数

WordCount ( “あいうえお かきくけこ” )
数字「2」を返します。

 

WordCount ( “あい,うえお、かきく。けこ” )
数字「4」を返します。
(空白や改行と記号(, 、 。)などが単語の区切りになります)

↓↓↓改行区切りの行数を数えるには

『ValueCount( テキスト )』
改行区切りの値数(行数)

ValueCount( “カレー ¶ハンバーグ¶オムライス¶ナポリタン” )
数字「4」が返ります。

 

関数を組み合わせて値一覧の行数を求めることも可能です。
ValueCount ( ValueListItems ( “10_見積作成管理” ; “見積状況” ) ) は、
「10_ 見積作成管理 .fmp12」の「見積状況」値一覧の行数の数字「3」が返ります。
(ValueListItems ⇨値一覧の情報を返す)

↓↓↓空白を取り除く場合

Trim( テキスト )
文字列の前後にあるスペースを削除

 

TrimAll( テキスト ; 全角詰め ; タイプ )
→ 文字列にあるスペースを削除する

 

全角詰め
全角スペースを取り除くには、全角詰めを真 (1) に設定します。
全角スペースを削除しない場合は、全角詰めを偽 (0) に設定


●タイプ(0〜3)
0 :ローマ字以外の文字とローマ字の間のすべてのスペース
(ローマ字の間には常にスペースが 1 つになるようにする)
1 :ローマ字以外の文字とローマ字の間に常に半角スペース
(ローマ字の間には常にスペースが 1 つになるようにする)
2 :ローマ字以外の文字の間のスペース
(ローマ字の間に複数スペースがある場合にスペースが 1 つになるようにする)
3 :すべてのスペース

↓↓↓文字列から一部だけを取り出すには

『Left( テキスト ; 文字数 )』
左から指定した文字数を取り出す

Left( “あいうえお” ; 2 )
テキスト「あい」が返ります。

↓↓↓その他

『Right( テキスト ; 文字数 ) 』 右から指定した文字数を取り出す
『Middle( テキスト ; 先頭文字位置 ; 文字数 ) 』 指定した位置から文字数を取り出す


『LeftWords( テキスト ; 単語数 ) 』  左から指定した単語数を取り出す 『RightWords( テキスト ; 単語数 ) 』  右から指定した単語数を取り出す 『MiddleWords( テキスト ; 先頭単語位置 ; 単語数 ) 』  指定した位置から単語数を取り出す

↓↓↓任意の文字だけを取り出すには

『Filter( フィルタするテキスト ; フィルタテキスト )』
指定したテキストを取り出す

例えば、数字文字列だけを取り出したいとき

Filter( “(03)-1234-56789” ; “0123456789” ) → テキスト「03123456789」が返ります。

改行区切りに関する事ここから下

↓↓↓改行区切りのテキストから任意の 1 行だけを取り出すには

『GetValue( 値一覧 ; 値番号 )』
値番号の1行を取り出す(末尾に改行なし)

 

GetValue( “カレー ¶ハンバーグ¶オムライス¶ナポリタン” ; 2 )
テキスト「ハンバーグ」が返ります。

↓↓↓改行区切りのテキストから、上から指定した数の行を取り出す

『LeftValues( テキスト ; 値数 )』
上から指定した数の行を取り出す(末尾に改行あり)

 

LeftValues( “カレー ¶ハンバーグ¶オムライス¶ナポリタン” ; 2 )
テキスト「カレー ¶ ハンバーグ ¶」が返ります。

↓↓↓その他

『RightValues( テキスト ; 値数 )』
下から指定した数の行を取り出す(末尾に改行あり)

『MiddleValues( テキスト ; 値開始位置 ; 値数 ) 』
指定した開始位置からの数の行を取り出す(末尾に改行あり)

↓↓↓改行区切りから任意の行を取り出すには

『FilterValues( フィルタするテキスト ; フィルタ値 )』
指定したテキスト行を取り出す(末尾に改行あり)

 

「カレー ¶ ハンバーグ ¶ オムライス ¶ ナポリタン」の改行区切りテキストから「カレー」 と「オムライス」を取り出したいときは、
FilterValues( “カレー ¶ハンバーグ¶オムライス¶ナポリタン” ; “カレー ¶オムライス” )
テキスト「カレー ¶ オムライス ¶」が返ります。

日本語関数

日本語は、漢字、ひらがな、カタカナ、英数字、記号と、それらの全角半角を場面ごとに使い分けることがあります。
例えば、縦書き印刷をする住所のために数字を漢数字にする場合などです。

『Hiragana( テキスト )』 指定したテキストの半角全角カタカナをひらがなにする
『KanaHankaku( テキスト )』 
指定したテキストの全角カタカナを半角にする
『KanaZenkaku( テキスト )』 
指定したテキストの半角カタカナを全角にする
『KanjiNumeral( テキスト )』 
指定したアラビア数字を漢数字にする
『Katakana( テキスト )』 
指定したテキストのひらがなを全角カタカナにする
『RomanHankaku ( テキスト )』
 指定したテキストの全角の英数字と記号を半角の英数字と記号にする

↓↓↓フィールドオプションでも設定できますが、ふりがなも関数で取得できます。

『Furigana( テキスト{ ; オプション } ) 』
指定したテキストのふりがなを指定したオプションの文字種類のふりがなにする (思ったようなふりがなが結果として返らない場合もあります)


1 とオプション指定なし :ひらがな
2 :全角カタカナ
3 :全角ローマ字
4 :半角カタカナ
5 :半角ローマ字

 

Furigana( “山田太郎” ; 5 )
テキスト「yamadatarou」が返ります。

実際に使ってみましょう!(入力値の自動化)

●「商品情報」の「商品名」フィールドの前後に余分な空白が入らない
[フィールドオプション][フィールド値の自動化][計算値]
・[フィールドに既存の値が存在する場合は置き換えない]を オフ

Trim ( Self ) Selfは入力された値(自分自身)です。

●「顧客情報」の「郵便番号」フィールドに半角 ハイフン、数字のみ入力
[フィールドオプション][フィールド値の自動化][計算値]
・[フィールドに既存の値が存在する場合は置き換えない]を オフ

Filter ( RomanHankaku ( Self ) ; “-0123456789” )
Filter ( フィルタするテキスト ; フィルタテキスト )
フィルタテキスト・・・取り出すテキストを入力
フィルタするテキスト・・・対象になるテキストを入力

「フィルタするテキスト」は Seif だけでは良くない!

全角の数字が入力されてしまうかも。。。
それを想定して、

RomanHankaku ( テキスト )全角を半角に変換する関数も設定しておきます!

●「顧客情報」の「会社名」フィールドに全角のカナ(半角のカナが入らないようにする)
[フィールドオプション][フィールド値の自動化][計算値]
・[フィールドに既存の値が存在する場合は置き換えない]を オフ

KanaZenkaku ( Self ) 

実際に使ってみましょう!(入力値の制限)

条件が合致していれば入力を認める。

●「見積情報」の「期限日」フィールドに 発行日より期限日が大きくなければいけない
[フィールドオプション][フィールド値の制限][計算式で制限]

発行日 ≤ Self

レイアウトと計算式(レイアウトの計算)

レイアウト上の計算式について確認します。
レイアウト上の計算は真偽を判断するための論理判定でしたね。

[次の場合にオブジェクトを隠す]

この機能は、計算式の結果の論理値によって
次のように表示をコントロールするものです。

・計算式の条件に一致する 「1(真 = True )」 → 非表示
・計算式の条件に一致しない 「0(偽 = False)」 → 表示

↓↓↓以前の学習。。。
「見積状況」フィールドに「結果確定済」が入力されるまでは「見積結果」フィールドは表示しない(入力できない)ようにしています。計算式は次の内容でした。
見積管理::見積状況 ≠ “結果確定済” → 結果の論理値(0/1)が利用されている

↓↓↓2 つの文言の比較は、関数を使った計算式で記述することも可能です。

1、「見積詳細」レイアウトでレイアウトモードに切り替えます。
2、[次の場合にオブジェクトを隠す]の設定を変更します。
(「見積結果」フィールドは、「注文あり 注文なし」のラジオボタンとして表示されています)

a. 「見積結果」フィールドをクリックします。
b. 右パネルのインスペクタの「データ」タブの[動作]の[次の場合にオブジェクトを隠す]を以下の計算式に変更します。


not Exact ( 見積管理::見積状況 ; “結果確定済” )

『Exact ( テキスト ; 比較テキスト ) 』
指定したテキストと比較テキストの比較結果「一致しているかどうか」を数字で返す。
結果は論理値(0/1)
・一致する 「1(真 = True )」
・一致していない「0(偽 = False)」

 

「一致」は大文字、小文字も同じである必要があります。
比較対象がオブジェクトタイプフィールドの場合、同じ設定で格納(埋め込みまたは参照で保存)されている必要があります。

●not 演算子
Exact のような論理値を返す関数の結果を逆転させるために使用します。

not Exact ( 見積管理::見積状況 ; “結果確定済” )
比較対象が一致している 「0(偽 = False)」 比較対象一致していない 「1(真 = True )」

次の式も同様の結果となります。
Exact ( 見積管理::見積状況 ; “結果確定済” ) = 0

●比較演算子
演習以前の計算式では「≠」で比較していました。これは比較演算子の 1 つです。
次の記号で2つのデータを比較する計算式は
論理値「1(真 = True )」または「0(偽 = False)」を返します。

・=
・≠ または <> ・>
・<
・≧ または >= ・≦ または <=

条件付き書式

フィールドに「条件付き書式」を設定することで、フィールド条件によって表示の方法を変える設定ができます。


条件付き書式も論理値(0/1)を利用するものです。
・計算式の条件に一致する 「1(真 = True )」・・・書式を適用する
・計算式の条件に一致しない 「0(偽 = False)」・・・書式を適用しない

条件は、
・値の範囲
・計算式
これらを 1 つあるいは複数の設定が可能です。

●一番優先の表示
条件付き書式はレイアウトオブジェクトに設定され ているスタイルを上書きして表示されます。
つまり、テーマやスタイルに関係なく表示されます。(表示は保存されません)

↓↓↓販売終了の商品の表示を変える設定をしてみましょう!

1、⌘L レイアウトモード
2、「c_商品番号と商品名」のフィールドを右クリック
[条件付き書式…]をクリック

3、「条件付き書式」ダイアログが表示
[追加]をクリック
下部の設定ができるようになります。

4、[条件] 2種類
・値が・・・フィールドの値を設定(特定の値)
・計算式が

「計算式が」をクリック。[指定…]をクリック。

5、計算式を入力
商品管理::販売状態 ≠ 1
[OK]

※販売状態が1(販売中)ではない場合、表示が○○になる。

6、[書式]を設定する。
[文字色:] グレーに設定
[OK]

※条件付き書式を設定すると、フィールド右下に◆のマークが表示される。

↓↓↓条件を複数指定することもできます

「見積リスト」の「見積状況」フィールドで以下を条件式書式で設定
「お客様検討中」・・・レコードを太字
「結果確定」・・・レコードをグレー

1、全フィールドを指定。
右クリック。[条件付き書式…]をクリック。

2、[追加]をクリック。「計算式が」をクリック。[指定…]をクリック。
3、計算式を入力
Exact (見積管理::見積状況; “お客様検討中” )
「見積管理::見積状況」が「お客様検討中」と一致すれば1(真)を返す。

[条件]「太字」を選択。

4、[追加]で2つ目の計算式を設定する。
Exact (見積管理::見積状況; “結果確定済” )

[条件]「文字色:」グレーを選択。

[OK]

●リスト形式で大量のレコードがある場合
「条件付き書式」を複数設定すると、データ量が多くなることで他の操作に影響が出ることがあるので、気をつけましょう😥

●複数の条件付き書式
複数の条件では、上から順番にすべてが評価されて合致した条件が適用されます。
条件は行をクリックして上下に移動し、並べ替えをすることが可能です。

複数の条件を同じレイアウトオブジェクトに設定する場合、矛盾があると想定した結果になりません。必ず、いくつかのパターンのデータでテストして確認してください。

↓↓↓ボタンオブジェクトを使った条件付き書式

●「見積状況」によってボタンの表示が変わるように設定

今回はボディパートいっぱいにボタンを配置してみます。

1、⌘Lレイアウトモード
ボタン配置。範囲選択し、ボタンを作成。

2、ボタンが選択されたままの状態で、「右パネル」「位置タブ」
「▼位置」
「位置」左辺0 上辺150 「サイズ」幅1024 高さ80

3、「外観タブ」
「▼グラフィック」
「塗りつぶし」単色 しろ 「線」なし 「角丸の半径:」0

 

4、「条件付き書式」の設定。右クリック[条件付き書式…]をクリック。
※フィールドではないため条件が[計算式で]のみになる

見積管理::見積状況 = “お客様検討中”

[書式] 「塗りつぶし色:」ピンク

5、2つ目の計算式の設定
見積管理::見積状況 = “結果確定済”

[書式] 「塗りつぶし色:」グレー

[OK]

現在のままでは、設定がレイアウト画面の一番前のレイアーにあるため、塗りつぶししか表示されていない。

 

「位置タブ」「▼配置と整列」
[配置] 最背面へ移動のボタンをクリック

 

「外観タブ」「▼グラフィック」
「塗りつぶし」なし
※なし にすることで「現在のレコードが青くなる」という設定が復活する。


↓↓↓取得関数によって得られるデータを元に条件付き書式を設定しましょう

現在の状態では、ボディパートの背景にボタンがあることが分かりにくいです。

●レイアウトモード時は表示色を変える設定をしましょう。

1、「条件付き書式」の設定。右クリック[条件付き書式…]をクリック。

2、計算式の入力
Get ( ウインドウモード ) = 0
↑取得関数(現在のウィンドウのモード)

3、[書式] 「塗りつぶし色:」なし

4、条件付き書式 の順番を変更
※上から順番に実行されるため

これでブラウズモードでは、
①ブラウズモードでは塗りつぶしなし
②「見積状況」が お客様検討中 の場合は ピンク
③「見積状況」が 結果確定済 の場合は グレー
になるように設定できました。

 

5、レイアウトモードで塗りつぶし色を緑に設定します。
※レイアウトモードでは緑に塗りつぶり。
ブラウズモードでは状況に応じて 透明、ピンク、グレー に表示されるようになりました。

関数 その 2

別のタイプの関数を確認します。

取得関数

この種類の関数は引数を指定せず、そのまま使います。
主に「いま○○はどうなっているか」を知ることができる関数です。スクリプトでよく使います。

『Get ( ウインドウモード )』
現在のウインドウモードを評価した値を返します。


0 :ブラウズモード
1 :検索モード
2 :プレビュー 
3 :印刷中
4 :レイアウトモード(データビューアで確認するときに使います)

テキスト関数 2

文字列の操作とは少し違う関数も用意されています。

『GetAsDate( テキスト )』
テキストに含まれる日付を返す

テキストタイプフィールドに “2018/1/1” と入力されている場合、
計算式で日付として取り扱うには G e t A s D a t e 関数を使います 。

1( 0 0 0 1 / 1 / 1 )か ら 1 4 6 0 9 7 0( 4 0 0 0 / 1 2 / 3 1 ) までの日付を表す数字を
日付に変換することが可能です。

GetAsDate(“2018/1/1”)
テキスト「2018/01/01」が返ります。

GetAsDate(789012)
テキスト「2161/03/29」が返ります
これらの特性を利用して、経過日数を計算することも可能です

『GetAsNumber( テキスト )』
テキストに含まれる数字を返す

 

GetAsNumber(” あ 1 い 2 う 3″)
数字「123」が返ります。

『Quote( テキスト )』
指定されたテキストを「”(ダブルクォーテーションマーク)」で囲むことで、そのテキストが そのままテキスト形式で返ります。
Evaluate関数などで評価されないように利用できます。

Quote ( 2+2 )
テキスト「4」が返ります。

Quote (“2+2”)
テキスト「2+2」が返ります。 → 「”」で囲んだためです。

『Substitute ( テキスト ; 検索テキスト ; 置換テキスト )』
指定したテキストを検索して置換

※大文字と小文字を区別します。
アルファベットを含む文字列を置換する場合には注意が必要です。

 

Substitute ( “ファイトメーカー” ; “ト” ; “ル” )
テキスト「ファイルメーカー」が返ります。

置換する文字列は一度に複数指定して記述できます。
置換の順番は、最初の置換をした結果に対して2つ目の置換、その結果に対して3つ目の置 換 … と評価されます。
複数の置換を指定する場合は順番に気をつけます。

 

Substitute (“fileMaker pro” ;[“f” ; “F”] ; [“p” ; “P”] ; [“Pro” ; “Pro 19”] )

Substitute (
“fileMaker pro” ;
[“f” ; “F”] ; //この時点では「FileMaker pro」
[“p” ; “P”] ; // この時点では「FileMaker Pro」
[“Pro” ; “Pro 19”] // →「FileMaker Pro 19」 )
テキスト「FileMaker Pro 19」が返ります。

論理式(0 か 1 か)

オブジェクトの[次の場合にオブジェクトを隠す]や条件付き書式では、
設定した計算式の結果は、0 または 1 として返ります。
その結果を元に FileMaker Pro が判断し動作します。

他にも、If 関数や、 ポータルフィルタも論理式の結果で動作が分岐しています。

●データタイプと論理式
文字列 ( テキストタイプのデータ ) を比較演算子で評価した論理式の結果は、少し曖昧な評価の結果が返ることに注意してください。
比較演算子では文字列の大文字と小文字を区別しません。

以下の計算式は 1(真)を返します。
“A” = “a”

文字列の大文字と小文字を区別して比較するには、Exact 関数を使います。
Exact ( テキスト ; 比較テキスト )
次の式は 0(偽) を返します。
Exact ( “A” ; “a” )

レイアウトと計算式 その 2

レイアウト上の計算式について、別の機能を確認します。

ポータルフィルタ

ポータルは、表示されるデータをフィルタ(絞り込み)が可能です。計算式で条件を指定します。
※「現在のテーブル」のポータルでは動作しません。

1、レイアウトモードで、ポータルをクリック
「ポータル設定」のダイアログ
2、[ポータルレコードのフィルタ]にチェック
[指定…]から計算式を入力して設定できます。

あくまでも、リレーションを使わず、レイアウト上でフィルタをかけているだけなので、実際のデータは変わりません。

 

ということは。。。
グローバルフィールドを使います!

●ポータルに表示している見積履歴を、「見積状況」の選択によって表示されるレコードが変わるように設定していきます。
(ポータル上に「見積状況」を選択するフィールドを設置し、選択条件に合致したレコードのみを表示するようにフィルタの設定をします。)

<設定のための準備>
・ユーティリティのテーブルに
「g_見積状況|フィルタ用」のグローバル格納のフィールドを作成します。

↓↓↓設定していきます。

1、⌘L レイアウトモード
「見積履歴」のあるポータルに「見積状況」を選択するためのフィールドを配置します。
「z_ユーティリティ」の「g_見積状況|フィルタ用」フィールドを配置

2、このフィールドに「右パネル」「データタブ」から[値一覧]を設定して、ポップアップメニューで ・作成 ・お客様検討中 ・結果確定済 からのみ選択できるようにします。

3、ポータルの設定をします。
「見積履歴」のポータルをクリック。
「位置タブ」で名前を入力 見積履歴ポータル

 

4、ポータルをダブルクリック。
[ポータルレコードのフィルタ]にチェック


計算式を入力
If (
 z_ユーティリティ::g_見積状況|フィルタ用 = 見積管理|履歴|自己::見積状況 ; 1 ; 0
)

条件が一致していれば式が正しいので1、間違っていれば0

※1(真)の場合のみ関連レコードを表示します。

計算式は、1つしか書いていませんが、実際は履歴全てに対して計算が行われ、結果に合致しているものが表示されます。

現在だと。。。
履歴のレコードが10レコードある場合、10回の計算が行われます!

ブラウズモードで動作確認をしたところ、表示されません💦

なぜでしょう。。。
表示の内容が変わった場合は再読み込みしなければ反映されないからです!

メニュー「レコード」「ウインドウ内容の再表示」をクリック。
反映されるようになりました〜😆

 

毎回ウインドウ内容の再表示が必要なのは、操作がわかりづらいし面倒です。
これを自動で行うために「スクリプトトリガ」と「スクリプト」を使います。

※スクリプトトリガについての詳しい説明は、次章でおこないます。

フィールドにスクリプトトリガを割り当てて、実行するスクリプトを作成します。

1、⌘L レイヤーモード
「g_見積状況|フィルタ用」フィールドを右クリックします。

2、[スクリプトトリガ設定 …]を選択します。
[スクリプトトリガ設定]ダイアログが表示されます。

3、「OnObjectSave」を オン にします。

「OnObjectSave」 
新しいデータが入力され確定(保存)したタイミングでスクリプトが実行します。
更新時に、設定した計算式の評価が起きて結果が返り、フィルタが動作します。

4、[スクリプト指定]ダイアログが表示されます。
「+」ボタンをクリックします。

5、「見積履歴ポータル更新」と名前を入力します。
スクリプトステップとオプション(オブジェクト名)を設定します。
ポータルの更新 [見積履歴ポータル]

※スクリプトトリガでは、一行でも(単一ステップ)必ずスクリプトとして保存する必要がありあます!

6、[OK]

これで、見積状況をポップアップで選択するだけで、自動的にポータルの更新が行われるようになりました😆

 

でもこれだと、
見積状況ごとに履歴が分かれてるから
全履歴が一覧で見れません。。。わかりづらい。

ポータルフィルタのリセットを考えます。
リセットできれば、設定前の履歴一覧を表示させることができるはずです😃

●ポータルフィルタをリセットするボタンを設定します。

1、レイアウト上にボタンを配置
「ボタン設定」ダイアログが表示

2、❌マークを指定
[処理:]「スクリプト実行」を選択
「スクリプト指定」のダイアログが表示

3、➕をクリック
「フィルタフィールドクリア」と名前を入力します。

4、スクリプトステップとオプションを設定します。2行。

消去 [z_ユーティリティ ::g_見積状況|フィルタ用 ]
ポータルの更新 [見積履歴ポータル]

※[z_ユーティリティ ::g_見積状況|フィルタ用 ]のフィールドを消去します。
その後、ポータルの更新をして変更内容を反映させます。

 

[OK]

 

●フィルタがリセットされている時、全てのレコードを表示させる設定をします。
([ポータルレコードのフィルタ]の計算式を設定することで実現します)

1、ポータルをダブルクリック
2、[ポータルレコードのフィルタ]の[指定…]をクリック
3、計算式を入力していきます。
If (
IsEmpty ( z_ユーティリティ ::g_見積状況|フィルタ用 ) ; 1 ;

z_ユーティリティ ::g_見積状況|フィルタ用 = 見積管理|履歴|自己::見 積状況 )
※空であれば全てのポータルの行(レコード)の論理値を1にする
空でなかった場合、見積状況が等し行(レコード)は1、違えば0

 

sEmpty ( フィールド ) このフィールドの中身が空かどうかの判断

 

[OK]

ポータルフィルタと集計タイプフィールド

ポータルフィルタで表示されているデータと連動した集計結果を表示するにはどうしたらよいでしょうか。
フィルタは設定されたポータルオブジェクトでのみ動作します。
集計タイプフィールドをレイアウト上に配置するだけでは集計結果は連動しません。

 

 

 

 

ポータルフィルタ(複数のフィールドの条件)

同じポータル上で複数のフィールドを配置し、関連した複数の絞り込みを行うこともできます。
[ポータルレコードのフィルタ]の計算式を設定することで実現できます。

If (
IsEmpty ( z_ユーティリティ ::g_見積状況|フィルタ用 ) ; 1 ;
z_ユーティリティ ::g_見積状況|フィルタ用 = ユーティリティ管理_顧客|選択_見積::見積状況)

and

 

If (
IsEmpty ( z_ユーティリティ ::g_見積結果|フィルタ用 ) ; 1 ;
z_ユーティリティ ::g_見積結果|フィルタ用 = ユーティリティ管理_顧客|選択_見積::見積結果)

andで2つの条件を繋げます。

●and 演算子
計算式では「&」は、左右を連結するための演算子ですが、「and」は検索条件の and と同じ意味で使われます。

関数 その 3

別のタイプの関数を確認します。

日付と時刻に関する関数

日付、時刻、日付と時刻のタイプスタンプは検索や、スクリプトの条件分岐によく使われます。

『Year( 日付 )』   指定した日付の4桁の年
『Month( 日付 )』 指定した日付の月(1から12の数字)
『 Day( 日付 )』 指定した日付の日(1から31の数字)

↓↓↓日付の情報についても関数でわかります。

『WeekOfYear( 日付 )』 指定した日付の年の1/1からの経過週数

『YearName( 日付 ; 形式 )』 指定した日付の和暦年(指定した形式)
(「令和」では 0は「令和」、1は「(令)」、2は「R」と表示
なお「1」年は「元」年表示)

『MonthName( 日付 )』  指定した日付の月(8月などの名前)

 

『DayOfYear( 日付 )』 指定した日付の年の1/1からの経過日数
『DayOfWeek( 日付 )』 指定した日付の曜日(1〜7の数字)
(1 は「日曜日」から 7 は「土曜日」)
『DayName( 日付 ) 』  指定した日付の曜日(「日曜日」などの名前)

任意の数字を指定することで日付を作成します。
↓↓↓この関数はよく使用します☝️

『Date( 月 ; 日 ; 年 ) 』  指定した月、日、年のカレンダー上の日付

 

Date( 2 ; 31 ; 2020 )
2020/03/02 が返ります
Date( 15 ; 1 ; 2018 )
2019/03/01 が返ります
※15月は1年3ヶ月だから。。。2018+1 で 2019/03/01

※存在しない日付は、カレンダーにある日付として結果を返します。

↓↓↓Dateと他の日付関数、 取得関数の組み合わせも便利です。

Date(Month(Get( 日付 )) ; 1 ; Year(Get( 日付 )))  今月1日
日だけが1日と初めから設定されている
Date(Month(Get( 日付 )) ; 1 ; Year(Get( 日付 )))-1  先月末日
今月の1日から1日引くので先月末

和暦や曜日をレイアウト上で表示されることが目的であれば、
インスペクタの「データ」タブの [データの書式設定]で見た目を設定することもできます。

●日付、時刻と数字
FileMaker Pro は内部的には日付や時刻を数値として扱っています。
日付は 1 日単位
時刻、タイムスタンプは秒単位で計算ができます。

日付や時刻、タイムスタンプを計算式で使用したとき、結果タイプの指定によっては
次のような数値として表示されます。
正しいタイプを指定すれば正しく表示されるので大丈夫です。

・日付は、0001 年 1 月 1 日を「1」として経過した日数分カウントした数値
・時刻は、午前 0:00:00 を「1」として経過した秒数をカウントした数値
・タイムスタンプは、0001 年 1 月 1 日の午前 0:00:00 を「1」としてカウントした数値

↓↓↓時刻も日付のような関数が用意されています。

『Hour( 時刻 )』 指定した時刻の時(0〜23)
『Minute( 時刻 )』 指定した時刻の分(0〜59)
『Seconds( 時刻 )』 指定指定した時刻の秒(0〜59)
『Time ( 時 ; 分 ; 秒 )』 指定した時、分、秒の値から計算した時刻

 

Time(Hour(Get( 時刻 )) ; 1 ; 1 )  現在時の1分1秒
Time(Hour(Get( 時刻 )) ; 1 ; 1)+3600 現在時1時間後の1分1秒

※日付関数と取得関数を組み合わせて使用できます。1時間は3600秒で取り扱います。

↓↓↓タイムスタンプには以下の関数があります。取得関数もあります。

『Timestamp ( 日付 ; 時刻 )』  指定した日付と時刻のタイムスタンプ
『Get ( タイムスタンプ )』  現在のタイムスタンプ
『Get ( ホストのタイムスタンプ )』   現在のホストのタイムスタンプ

タイムスタンプから日付や時刻だけを取り出すことができます。
↓↓↓以下のテキスト関数を使用します。

『GetAsDate ( テキスト ) 』  指定したテキストの日付
『GetAsTime ( テキスト ) 』  指定したテキストの時刻
『GetAsTimestamp ( テキスト )』  指定したテキストのタイムスタンプ

 

GetAsDate ( Get( タイムスタンプ ) )
今日の日付を返します。

さらに時刻としては以下の取得関数があります。
↓↓↓1秒以下が計れます。

『Get( 現在の時刻 UTC ミリ秒 )』
現在の協定世界時刻 (UTC) にミリ秒単位で適合させた近似値

 

ミリ秒単位の結果、例えば「63601728323332」を返します。スクリプトで処理時間を計るときなどに便利です。

 

●何の日付や時刻なのか
取得関数が返す日付や時刻、タイムスタンプは、
クライアントまたはサーバー(Get ( ホストのタイムスタンプ ) のみ)の
パソコンの日付や時刻の設定に基づいています。

論理関数 1

論理関数は、指定した条件を評価し、その論理値(真か偽か)に従って結果を出す関数です。
これは条件の分岐のために使用可能です。

●If 関数

『If ( 条件 ; 結果 1 { ; 結果 2} )』
条件が1(真 = True )なら結果1、0(偽 = False)なら結果2

 

※If 関数は、2 つの結果を指定できます。
2 つ以上の結果が必要なら Case 関数を使用します。

●Case 関数

『Case ( 条件1 ; 結果1 {;条件2 ; 結果2 ; … ; デフォルト値} ) 』
それぞれの条件を順に評価し1(真 = True )の条件が見つかったらその条件の結果
(どの条件も真でなければデフォルト値)

 

 「消費税額」フィールドの端数処理の方法を、「端数処理」フィールドに1, 2, 3のいずれかの数値指定する場合は、次のようにします(「端数処理」フィールドに1、2、3 外の数値が入力されているか、空欄だと端数処理されません)。

Case (
端数処理 = 1 ; Round( 消費税額 ; 0 ) ; 
  //四捨五入
端数処理 = 2 ; Truncate( 消費税額 ; 0 ) ;  
//切り捨て
端数処理 = 3 ; Ceiling( 消費税額) ;  
   //切り捨て
消費税額 )

※Case関数では記述された順番に条件を評価します。

数値や日付の範囲が条件だったら、条件を大きい順あるいは小さい順に並べることで単純に記述できます。

 「金額」フィールド(数字)に入力される数値で、割引率を結果として出す計算式は、次のように記述します。

Case (
金額 < 1000 ; “” ;    // 割引なし
金額 < 2000 ; “.01” ;  // 1%割引
金額 < 3000 ; “.02” ;  // 2%割引
“.05”)        //5%割引

↓↓↓Case 関数に似た構文では Choose 関数があります。

●Choose 関数

『Choose ( 条件 ; 結果0 { ; 結果1 ; 結果2…} ) 』
条件の整数値に従った 1 つの結果
※Choose関数ではCase関数のように複数の条件を指定しません。

 「評価」 フィールドに文字列を入力するためには、以下のように計算式を作成します。「評価レベル」フィー ルドに0/1/2/3 のいずれかの数値で指定する形です。

Choose (
評価レベル ;   
//条件
“評価なし” ;   
//結果0または空欄
“不可” ;    
//結果1
“可” ;     
//結果2
“良” ;     
//結果3
)

●論理値を返す関数

『IsEmpty ( フィールド )』
数字が返ります。 指定したフィールドが空欄か他のエラーが発生したら「1(真 = True )」 それ以外の場合は「0(偽 = False)」

『IsValid ( フィールド )』
数字が返ります。 指定したフィールドが無効なら「0(偽 = False)」 それ以外の場合は「1(真 = True )」

 

『GetAsBoolean ( データ )』
数字が返ります。
・指定したデータがゼロ以外の数値なら
「1(真 = True )」それ以外は「0(偽 = False)」
・指定したデータがオブジェクトタイプフィールドでデータが含まれている場合は 「1(真 = True )」それ以外は「0(偽 = False)」

●not 演算子
これらに not 演算子をつけると結果を逆転させることができます。
「件名」フィールドが空欄でないかどうかを確認するには、次の計算式となります。

not IsEmpty ( 件名 )
空欄でなかったら「1」 空欄だったら「0」 が返ります。

 

IsEmpty 関数や IsValid 関数は、フィールドのデータを評価するだけではなく、関連レコードの有無や関連、関連ファイルがあるかどうかを判断することに使用できます。

 「顧客管理」TO と関連している「顧客管理 _ 見積」TO があり、関連レコードがある かどうかを確認するには次のように判断できます。

IsEmpty ( 顧客管理_見積::顧客外部キー )
関連レコードがなければ「1」、あれば「0」が返ります。

IsValid ( 顧客管理_見積::顧客外部キー )
関連レコードがなければ「0」、あれば「1」が返ります。

 「顧客管理」TO の取引状態にデータが入力されているかどうかを確認する

 

GetAsBoolean ( 顧客管理::取引状態 )
「1」が入力されていれば「1」、空欄あるいは「0」が入力されていれば「0」

真偽値(フラグ) >>> レコードの状態を示すものとして数字タイプフィールドを 0/1 あるいは空欄 /1 のどちらかが入力されるようにフィールドオプションで設定したりレイアウト上でコントロールすることで「1」の場合に関連が成立する照合フィールドとしたり、検索条件として扱うことが可能です。
そのような項目を真偽値、フラグなどと呼びます。

●Self 関数
これまでにも使用した Self 関数は、独特のものです。
フィールドオプション、条件付き書式、ポッ プアップヘルプ、プレースホルダテキストで使用します。Self 関数を使用した計算式は、特定のフィールド名を持たないためコピーと貼り付け(ペースト)で使用できます。

●Evaluate 関数

指定した式を計算式として評価します。

 

『Evaluate( 式 {;[ フィールド1; フィールド2; フィールド3;…]}) 』
「式 ; 」のあとの「フィールド」が変更されると計算式が再評価されて結果が更新されます。

 

Evaluate ( 2+2 )
「4」
Evaluate ( Quote ( “2+2” ))
「2+2」
Evaluate ( GetField ( “2+2” ) )
「4」

●サーバーサイドで実行するスクリプトの注意

Evaluate 関数をサーバーサイドで実行するスクリプトで利用する場合には、評価する関数名は英語でなければいけません。
スクリプトの作成時や後述するカスタム関数の作成時に注意してください!

●Let 関数

変数を取り扱う関数です。変数はいくつでも指定できます。

『Let ( {[} 変数1 = 式1 { ; 変数2 = 式2…]} ; 計算 )』

Let (
変数を指定する ;
指定した変数を使用した計算式
)

その他の関数

次のような関数が用意されています。

●フィールド名を指定する関数
スクリプトなどで完全修飾名のフィールドを指定する場合に使用します。
TO(完全修飾名)付きのテキストが結果として返るので、計算式やスクリプトのコンテキストに合致するように指定できます。

『GetFieldName ( フィールド名 )』
指定したフィールドの完全修飾名

変数(機能に関する計算で使用)

変数は、ある値を他の記号または名前へ代入して使用することです。
スクリプトおよび計算式で一時的に使用するテキスト、数値、時間などの値を保存しておくのに便利です。

●3種類の変数

変数         
関数で変数を使う。
任意の文字列を変数名に代入し、Let 関数の計算式の中でのみ使用するもの


$ 変数 ローカル変数 
スクリプト内で宣言(登録) スクリプトが終了するまで有効(終了したら削除される)

計算の場所:レイアウトの上
計算の対象:現在or対象のレコード 関連レコード 取得関数で得られるデータ
※計算式で求めた結果を一時的に保持しておくことに使用


$$ 変数 グローバル変数 
スクリプト内で宣言(登録) ファイルを閉じるまで有効、もしくはクリアするまで有効

計算の場所:レイアウトの上
計算の対象:現在or対象のレコード 関連レコード 取得関数で得られるデータ
※計算式で求めた結果を次の処理に使うことに使用
※計算式で求めた結果をレイアウト上に表示することに使用

『機能に関する計算』で 一時的な計算式 を記述する場合。。。

変数はテキストとして扱われます!!!!

変数を日付、数字として計算しないといけない場合は、
GetAsDate関数などを使い、テキストを日付や数字に直してから扱う必要があります。

間違いやすいので注意が必要です😳

関数 その 4

論理関数 2

特別な関数も用意されています。

●ExecuteSQL 関数
この関数は SQL クエリーを実行するものです。
リレーションシップ無関係に値を取ることができます。

SQL(Structured Query Language) >>> データベースに対して処理を命令するための言語です。

クエリー(query) >>> データベースへの問い合わせのことです。
つまり『SQLクエリー』は、SQL という言語で記述された データベースへの問い合わせ命令のことです。

『ExecuteSQL (SQLクエリー; フィールド区切り ; 行区切り { ; 引数…} ) 』
フィールド区切り: 結果のフィールドの区切り
行区切り: 結果が複数レコードの時の区切り文字
引数: SQLクエリー内に「?」を記述してその代入のデータを設定するダイナミック引数

SQL クエリー: FileMaker Pro の関数とは別の命令語、構文、文法が定められています。この定めに従って記述される命令文のことを「ステートメント」と呼びます。

SQL クエリーにはいくつかの種類がありますが ExecuteSQL 関数で使用できるものは限定されています。「SELECT」のみが実行可能です。
↓↓↓

●SELECT
データベースのテーブルのレコードを抽出するものです。
以下のような構文である必要があります。

SELECT
[ 抽出するフィールドの指定 ]
[FROM 抽出するフィールドのテーブルのTO名] [WHERE 条件式]
(構文の中の、FROM や WHERE は、FROM 句、WHERE 句と呼ばれます)

●ExecuteSQL 関数とリレーションシップグラフ
FileMaker Pro では直接テーブルに対してクエリーを実行するのではなく TO を使用してテー ブルに命令を出します。
しかし、この関数で実行する SQL クエリーは指定した TO のコンテキストには縛られません。リレーションシップグラフで関連が設定されていても、関係ありません。
テーブル同士の関係は、FROM 句の中で JOIN を使って結合(関連)を指定します。

●予約語
SQL には制限や予約語が FileMaker Pro とは別に存在します。
予約済みの言葉は使えません。
●日付の書式
日付は「YYYY-MM-DD」で取り扱います。
ExecuteSQL 関数の日付の返り値も同様の書式です。
● エラー
文法が間違っているなどの理由でエラーになった場合「?」を返します。
●「?」のダイナミック引数
SQL クエリーの中に「?」を指定して、ダイナミック引数を使用して代入することができます。

 「見積管理」TO の「発行日」フィールドが 2020 年 8 月 4 日のレコードを抽出するには、次のように記述します。
(SQL クエリーは文字列で記述されるため、「”」を使用するには「\” (macOS)」と記述します)

ExecuteSQL (
“SELECT *
FROM \”見積管理\”
WHERE \”発行日\” = ‘2020-08-04’ ”
; “” ;”” )

赤線部分がSQLクエリーの部分

※TO名やフィールド名が全角文字、記号から始まる、「.」が含まれるなどの場合「”」で囲む 必要があります。
「2020-08-04」のような文字列を記述するには「’」で囲む必要があります

 

※「*」
ワイルドカードです。「SELECT * 」と記述すると FROM で指定したすべての列(フィールド) を取得するという意味になります。

 

※任意のフィールドを指定するには
SELECT id, \”発行日\”,\”期限日\”  のように「,」で区切って指定します。

●ダイナミック引数の利用

WHERE 句で、発行日が「今日」のものを抽出したいのであれば、Get ( 日付 ) で取得した「YYYY/ MM/DD」を「YYYY-MM-DD」に変更しなければならないのでしょうか???

ExecuteSQL (
 ”SELECT *
 FROM \”見積管理\”
 WHERE \”発行日\” = ‘” &
 Year(Get(日付))&”-“&Month(Get(日付))&”-“&Day(Get(日付))&
“‘” ; “” ; “” ; )

 

※「”」の前後には半角スペースなどを入力しないでください

↓↓↓ダイナミック引数を使用したほうが簡単です。

ExecuteSQL (
“SELECT *
 FROM \”見積管理\”
 WHERE \”発行日\” = ?”
; “” ;”” ; Get(日付))

 

※「”」の前後には半角スペースなどを入力しないでください

「?」は、いくつでも使用できます。引数の指定は ? が記述された順番に指定します。
ダイナミック 引数には、フィールドを指定できます。
※注意点としては、このフィールドは他の関数と同じです。
ダイナミック引数にフィールドを使用する場合は、ExecuteSQL 関数を実行するコンテキストに注意をする必要があります。

●返ってくるデータ

ExecuteSQL を実行して返ってくるデータは、以下のようなものです。
区切りの指定をしないと、 フィールドは「,」、レコードは改行で区切られます。

22761E61-342D-4183-969D-322222E67A31,2018-06-18 17:21:09, Admin,2018-06-28 12:17:53,Admin,2018-06-07,10001,127958,見 積テストデータ1,2018-07-07,118480,9478,,結果確定済,注文あり,50E70A0E- 9970-48BC-9333-98BD9BB7BD24,8BC80074-AB63-4CC5-B6DF- BDEB424C3C1B,.08,, 様 ,127958

レコードの順番は ORDER BY 句でソート順を指定しなければ作成順になります。

難しいので。。。

『ExecuteSQL について』の更に詳しい説明は、FileMaker Pro のヘルプ、製品のマニュアルや、 「Claris FileMaker SQL リファレンスガイド」(https://help.claris.com/ja/sql-reference.pdf)

を参照してください。

オブジェクト関数

多くの属性名が用意されています。
注意点としてメタデータはバイナリファイルによっては付加されていないことがあります。

『GetContainerAttribute( ソースフィールド ; 属性名 ) 』
指定したフィールドの、指定した属性名のメタデータ

メタデータ >>> あるデータに付属して持っているデータ

↓↓↓オブジェクトがイメージの場合の大きさの情報

『GetHeight ( ソースフィールド ) 』
イメージの高さ(ピクセル)
『GetWidth ( ソースフィールド )』
イメージの幅(ピクセル)

↓↓↓イメージの縦横比はそのままで指定したポイントサイズ以下のサムネールを取得するには

『GetThumbnail ( ソースフィールド ; 幅に合わせる ; 高さに合わせる ) 』
(ソースフィールドはオブジェクトタイプフィールドか、サムネールを取得したいイメージへのファイルパスを指定)

サムネール >>> FileMaker Pro はイメージのサムネールを自動的に生成してレイアウトの表示に使用しています。 [オブジェクトの]管理ダイアログで、そのサムネールの持ち方を設定することが可能です。

↓↓↓論理値を返します

『VerifyContainer ( ソースフィールド )』
オブジェクトデータが FileMaker 以外を使用して変更または削除された場合 「0(偽 = False)」、それ以外の場合は「1(真 = True )」

↓↓↓イメージと Base64 についての関数は

『Base64Encode ( ソースフィールド )』
指定したフィールドに格納されているイメージを Base64 フォーマットのテキスト に変換
Base64Decode ( テキスト {; 拡張子を含むファイル名} )
Base64 フォーマットでエンコードされたテキストからオブジェクトに変換

※イメージを文字列にすること
Base64 はデータを 64 種類の英数字と記号で表現しています。画像を文字列として転送に使用することが可能です(Base64 の文字列に変換して転送しデコードして画像に戻す)。

統計関数

統計処理を行う関数です。
統計関数は、1 テーブルの任意のフィールドを複数指定することもできますが、主に関連レコードのフィールドのデータを集計するためによく使用されます。

『Sum ( フィールド {; フィールド…} ) 』
指定したフィールド内の空白を除いた値すべての合計

↓↓↓他には

『Average ( フィールド {; フィールド…} )』
指定したフィールドの空白を除く有効な値すべての平均
『Count ( フィールド {; フィールド…} ) 』
指定したフィールドの空白を除く有効な値の数
※関連レコード数を数えるためにCount 関数を使用する場合は、主キーのような空欄不可のフィー ルドを指定します。
『Max ( フィールド {; フィールド…} ) 』
指定したフィールドの最大値
『Min ( フィールド {; フィールド…} ) 』
指定したフィールドの最小値

関連レコードのフィールドについて統計関数で集計する場合、非保存の計算結果になります。また 関連テーブルのレコード数が増えるに従って時間がかかるようになります。

例えば、レイアウトに統計関数で関連レコードを指定している非保存の計算タイプフィールドや 集計タイプフィールドをたくさん配置すると表示に時間がかかることがあります。

☝️これを短縮するには、非保存の計算タイプフィールドや、集計タイプフィールドの配置を減らしたり、ポップオーバー、 ポップアップヘルプなど、ユーザが任意のタイミングで行うアクションをきっかけに結果が表示され るようにレイアウトで工夫します。

また、計算タイプフィールドとして集計するよりも、スクリプトで集計してからデータを入力するようにすると入力されたフィールドに索引が作成されるため、表示や検索に時間がかからなくなります。

●List 関数
とても便利な関数です。関連レコードの指定したフィールドのデータの改行区切りテキストをスクリプトで使用するために利用できます。

『List ( フィールド {; フィールド…} ) 』
フィールド内の空白を除く値の改行リスト

JSON 関数

JSON データを解析および変更するための関数がいくつか用意されています。

JSON >>> 『名前(要素):値 のペア』で構成されたデータの記述方式です。データサイズが軽量でデータオブジェクトを転送する様々な Web サービスで使用されています。
詳しくは「JSON の紹介」(https://www.json.org/json-ja. html)を参照してください。

※JSONデータは、REST APIを使用してWebサービスなどから取得します。
REST APIREST(REpresentational State Transfer) API(Application Programming Interface)

API >>> 簡単に言えば、ある OS やアプリケーションや Web サービスの機能について外部から呼びだして利用できるようにするインターフェースのことです。インターフェースには、ルールが決まっています。

REST >>> Web サービスの設計モデルです。簡単に説明すると、ある特定の URL に HTTP メソッドで問い合わせを行うと HTTP メソッドで答えが返ってくるようなもの、と考えてください。URL には処理 (POST や GET など)と、必要に応じて変数(パラメータ)を指定します。

論理関数 3 再帰の関数

繰り返して処理を実行するための関数が用意されています。
「再帰」のためのものです。再帰は,関数の中で自分自身を呼び出して処理を繰り返すことです。

●While 関数

『While([初期変数]; 条件 ;[ロジック]; 結果 )』
条件が真(1)の間、[ロジック]を繰り返してから、結果を返します。

 

→ 次のように動作します。
1 初期変数引数を評価します。
2 条件引数を評価します。
3 条件が:
真(0 以外の数値結果)の場合、ロジックを評価してから 2 番目のステップを繰り返す 偽(0)の場合、繰り返しを停止して結果を返す

 

●条件
条件が正しく評価されることに注意します。なんらかにより停止条件が偽(0)にならない場合、規定数まで処理を繰り返して「?」を返して再帰を強制終了します。
●繰り返し回数は 50000 回
While 関数の繰り返しは 50000 回までに制限されています。または SetRecursion 関数で最大繰り返し数を設定することもできます。

●SetRecursion 関数

『SetRecursion (式 ; 最大繰り返し) )』
式の再帰とループの最大繰り返し数を設定します。
式が最大繰り返しを超えると「?」を返します。

カスタム関数

FileMaker Pro では標準で用意されている関数に加え、開発者が独自の関数を作成することができます。次のクライアントで利用できます。

・FileMaker Pro  ・FileMaker Go  ・FileMaker WebDirect

カスタム関数に必要なもの

カスタム関数はファイルごとに定義が必要です。
作成、設定などに、次のものが必要です。

・[完全アクセス]アクセス権セットのアカウント

カスタム関数には以下の特徴があります。

・長くて複雑な計算式を、シンプルな関数名に置き換える
・何度も利用する計算式を、シンプルな関数名に置き換える

カスタム関数の作成

「開発者かどうか」を論理値で返す関数を作成してみます。

1、[ファイル]-[管理]-[カスタム関数]メニューを選択します。
[カスタム関数の管理]ダイアログが表示されます。

2、[新規 …]をクリックします。

3、[カスタム関数を編集]ダイアログが表示されます。
・[関数名]   「開発者かどうか」
・[関数の引数]   空欄(この関数には引数がありません。)
・[新規関数]  計算式を入力します。
Get ( 現在のアクセス権セット名 ) = “[Full Access]”

 

4、[OK]を何度かクリックしてダイアログを閉じます。

★必ずテストする
カスタム関数を作成したとき、すべてのアクセス権セット、すべてのクライアントのハードウェア OS で確認します。

 

★ファイルごとに作成する
カスタム関数は、ファイルごとに定義します。他のファイルのものを利用することはできません。 しかし、他のファイルからインポートができます。

再帰のカスタム関数を作成します。2種。

・Case 関数を使って

1、[ファイル]-[管理]-[カスタム関数]メニューを選択します。
[カスタム関数の管理]ダイアログが表示されます。

2、[新規 …]をクリックします。

3、[カスタム関数を編集]ダイアログが表示されます。
・[関数名]   「CF 再帰ドット」
・[関数の引数]  「テキスト」「ドット数」の順番で登録します。
・[新規関数]  計算式を入力します。

Case (
 ドット数 > 0 ;
 CF再帰ドット(テキスト & “・” ; ドット数-1 ) ; テキスト )

 

4、[OK]を何度かクリックしてダイアログを閉じます。

・If 関数を使って

3、[カスタム関数を編集]ダイアログが表示されます。
・[関数名]   「CF 再帰左から文字」
・[関数の引数] 文字列」「数字」 の順番で登録します。
・[新規関数]  計算式を入力します。

 

If(
 数字 > 0 ;

 CF再帰左から文字( 文字列 ; 数字-1 ) &
  Left ( 文字列 ; 数字 )& ¶ )

カスタム関数の利用

●特徴
・複雑な計算を独自の関数とすることで、シンプルになる。
・何度も利用する計算式を独自の関数とすることで、シンプルになる。
・再帰の計算の実行(v18からWhileが登場)

●使い所
・カスタムApp内で、何度も利用する計算
年齢などよく利用する計算は、毎回書くのは手間がかかります。
あらかじめ、カスタム関数で設定しておけば記述が楽になります。
・将来計算方法が変更になりそうなところ
途中で計算方法が変わった場合、カスタム関数の内容を修正するだけで、一斉に計算式が修正できます。

●まとめてファイルに置いておく

自身のライブラリファイルに今まで作ったカスタム関数を保存していけば、使いたい時にカスタムAppにインポートして使うことができます👍

 

他の開発者がこれまでに作成したカスタム関数が公開されている Web サイトがあります。
代表的なものをご紹介します。

・Brian Dunning’s FileMaker Custom Functions https://www.briandunning.com/filemaker-custom-functions/recentlist.php


以上で10章は終わりです。

次回は11章「スクリプトと自動化」について学習していきます😳

コメント

タイトルとURLをコピーしました