タグ: FileMaker16

FileMakerで変数にテキストを設定する際、一般的には「変数を設定」スクリプトステップを使うことが多いのではないかと思います。「変数を設定」スクリプトステップは、FileMakerに変数という機能が登場したVer.8から存在しています。

さて、この変数へのテキスト設定という場面で、「テキストを挿入」スクリプトステップも使えるということをご存知だったでしょうか。「テキストを挿入」スクリプトステップは、もとは指定したフィールドにテキストを挿入するためのものでしたが、Ver.16でテキストの挿入先として変数も指定することができるようになりました。

「変数を設定」スクリプトステップが用意されているにも関わらず、わざわざ「テキストを挿入」スクリプトステップを使うメリットはあるのでしょうか。

両スクリプトステップの違いを見ていきましょう。

 


 

【1】挿入する値として指定できるものの違い

「テキストを挿入」で指定できるのは、その名の通り、テキスト(文字列リテラル)のみです。変数などを指定することはできません。例えば「$a」と記述すると、「$a」というテキストがセットされます。

「変数を設定」スクリプトステップは、文字列リテラルだけでなく、変数やフィールド、関数などを指定することができます。「$a」と記述すると、$aという変数にセットされている値がセットされます。「”$a”」と記述すると、「$a」というテキストがセットされます。

したがって、固定のテキストを挿入する時はどちらのスクリプトステップも使用可能ですが、それ以外の場合は「変数を設定」を使用することになります。


 

【2】ダブルクォーテーションの扱いの違い

「変数を設定」スクリプトステップの場合、挿入するテキスト全体をダブルクォーテーション(”)で囲む必要があります。そのため、挿入するテキストにダブルクォーテーションを含んでいる場合は、エスケープ処理が必要です。具体的には、テキスト内のダブルクォーテーションの前にバックスラッシュ(日本語環境では¥マーク)を付けます。

 

一方「テキストを挿入」スクリプトステップでは、全体をダブルクォーテーションで囲む必要がありません。したがって、テキスト内にダブルクォーテーションを含む場合でも、エスケープなしで記述することができます。

テキスト内にダブルクォーテーションが多く含まれる場合(例えばHTMLソースなど)は、「テキストを挿入」スクリプトステップが便利です。


 

【3】上書き/追記の指定の違い

すでにテキストがセットされている変数を更新する場合、内容を上書きするケースと、テキストを追記するケースとがあります。それぞれのスクリプトステップで、上書き・追記の指定のしかたに違いがあります。

 

[3-1]変数を設定

「変数を設定」スクリプトステップでは、上書きと追記とで「値」の書き方が異なります。

 

・上書き

「値」に上書きするテキストを入力します。

・追記

「値」に「$変数名 & “追記するテキスト”」 を入力します。

 

 

[3-2]テキストを挿入

「テキストを挿入」スクリプトステップの場合、テキストの内容に違いはありません。「内容全体を選択」チェックボックスによって上書き・追記を指定します。

 

・上書き

「内容全体を選択」チェックボックスをONにします。

・追記

「内容全体を選択」チェックボックスをOFFにします。

 

これについては好みが分かれるところだと思います。
(個人的には、「テキストを挿入」の「内容全体を選択 = 上書き」、というのが直感的でないように思います。)


 

【4】処理速度の違い

変数($message)にテキスト(あいうえおかきくけこさしすせそたちつてと)をセットする処理をループで繰り返し実行し、その時間を測定しました。

・上書き

ループ回数 テキストを挿入 変数を設定
10,000回 1秒 0秒
50,000回 3秒 3秒
100,000回 5秒 5秒
200,000回 10秒 13秒
400,000回 21秒 24秒

上書きの処理時間は、両スクリプトステップにほとんど差はありませんでした。

・追記

ループ回数 テキストを挿入 変数を設定
10,000回 1秒 1秒
50,000回 3秒 38秒
100,000回 5秒  2分56秒
200,000回 10秒 11分11秒
400,000回 22秒 44分11秒

追記処理の速度は、ループ回数が増えるにつれて大きな差が生じました。
「テキストを挿入」は上書き処理と変わらない時間で処理しているのに対し、「変数を設定」は指数関数的に時間が遅くなっていきました。


 

【結論】

以上のことから、「テキストを挿入」を変数に対して使用するメリットは、ダブルクォーテーションのエスケープ処理が不要だという点と、大量テキストの処理が高速に行えるという点だと言えそうです。

例えばHTMLをWEBビューアで表示するケース。HTMLヘッダ部分は、ダブルクォーテーションを含む定型文であることが多いと思います。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://hoge/fuga.js"></script>
...

他にも、jsonを扱う際にもダブルクォーテーションが数多く登場します。
フィールドや変数の値をjsonに反映する場合は「変数を設定」を使用することになりますが、定型の箇所には「テキストを挿入」を使うと便利かもしれません。

また、大量の固定テキストを扱うことはあまりないかもしれませんが、そういう場面では「テキストを挿入」を採用することも選択肢の一つとして覚えておくと良さそうです。

詳細

時々お問い合わせがある自動ログイン問題。
便利なんですが、パソコンの使用者が変わって同じアカウントでパソコンにログイン(あまりよろしくないのですが)とか
共有のパソコン一台を色々な人が使用しているとか、という時に誰かが自動ログインにチェックをしてしまうと、それ以降の人の個別アカウントが使用できなくなることがあります。

今回はその情報をリセットする方法をご紹介。

🔷Windows
ファイル検索で「資格情報」と検索しましょう!

すると、「資格情報マネージャー」が出てきます。
WINSOWS資格情報 をクリックし、対象のファイル名
FileMakerだと「FM:<ファイル名>」と登録されているかと思います。

🍎MAC
名称が「キーチェーン」になります。
Mac の「キーチェーンアクセス」アプリケーション で、キーチェーンが隠れている場合は、
「表示」>「キーチェーンを表示」と選択します。

「キーチェーン」リストでキーチェーンを選択します。

「ファイル」>「キーチェーン<キーチェーン名>を削除」と選択します。

「参照を削除」をクリックします。

詳細

上がってほしくない消費税、ですが10%に上がってしまいます。
お客様のシステムで時々あるのですが、昔はそうそうに上がらなかった消費税のため固定や直接指定されているシステムがあったりします。
この機会に汎用的な運用に切り替えるのはいかがでしょう?!

【利点】
・過去の消費税の期間が分かる!
・未来の消費税を前もって登録できる!(消費税変更日に張り付いて変更なんてしなくても大丈夫!)
・軽減税率のように複数の消費税登録時に複数表示が可能になる!

 今回は簡単に作成!消費税マスタ、応用編は簡易経過措置付き★のご紹介!

今回の経過措置は4/1前までの契約の場合は8%
それ以降で、10/1を超えた契約は10%計算です!きゃーーー

<豆知識という名のメモ!>経過措置とは?

企業だと長いスパンでの契約があるかと思います。消費税8%だった時に契約したのに完了時&支払時は10%という時の消費税をどうするか!という決まりだそうです。
ですが、経過措置が適用される契約とされない契約があるそうですのでご注意を!今回のファイルには契約の判別を備え付けておりませんのであしからず!
 詳しくは国税庁のHPで! http://www.nta.go.jp/index.htm
消費税率等の引上げについて(平成31年(2019年)10月1日~)あたりを参照です。(2019年5月情報)

.

見本のファイルはこちら>>ダウンロードファイル
.

★初級レシピ

 マスターに登録した消費税を、どんなレイアウトでもドロップダウンで取得しよう!
★初級1:ドロップダウン表示・・・簡単に表示非表示が行われてなんて便利!
★初級2:表示順指定しちゃうぞ!・・・表示非表示しつつ、選択もしやすくなっちゃう!

①データーベース

【消費税マスタ】
・表示順
・消費税
・消費税開始日
・消費税終了日
・削除フラグ
・表示順
・経過措置開始日(応用編で使用)
・経過措置施行日(応用編で使用)

【システムマスタ】
・ct_1 …どこでも使えるようにグローバルフィールド

①-1)マスターテーブルの登録方法
消費税情報を登録していきます。
・消費税率を数字で入力、消費税の開始日、終了日の登録を行います。
 開始日終了日を入れることで、事前に消費税の登録が可能に!
・「表示順」は★初級2のドロップダウンリストのソート用です。
・削除フラグチェックのために、消費税0を作成。
・経過措置は応用編にて。

①-2)リレーションシップを作成します
ここで削除フラグとシステムマスターを連結!

削除フラグが1になったものは表示されなくなるようにします。

②値一覧の作成

★初級1ドロップダウン用の値一覧を作成します
名称は「Ci_消費税_フィールド設定」
消費税フィールドを選択し、ここで「次のテーブルから関連レコードの値のみ含める」でシステムマスタ(M0000_System)を選択します。

★初級2ドロップダウン用の値一覧を作成します
名称は「Ci_消費税_ソート」
初級1と同じ設定をしたら、2番目のフィールドを指定し、「2番目のフィールドのみ表示」にチェック。

③レイアウト設定

 フィールドに設定します
 ★初級1ではドロップダウンリストに「Ci_消費税_フィールド設定」
 インスペクタのデータ書式設定でパーセントにしておきます。

 ★初級2ではポップアップメニューで「Ci_消費税_ソート」にします。
 こちらは計算式で%表示するように設定しているので書式設定は不要です。

⑤完成

これで完成です。簡単!簡易!

★応用編レシピ

ここからは応用編!ちょっと難しくなります。タイトルをクリック!

★応用編3レシピ
 スクリプトで取得!現在の日付から判別し、最新の消費税を取得しちゃう!

スクリプト

 既存のスクリプトに設定しやすいように、新規作成スクリプトをかませています。
 メインスクリプトは「T_消費税_シンプル」
 ・消費税マスタを開始日と終了日で検索し、結果の消費税を返すだけです。

 ・受け取った返却値を作成したレコードの消費税にセット!
これで完成です。!

サンプルファイルの新規ボタンを押下して見ましょう!

★応用編4レシピ
 検索の応用です!
 マスターテーブルの経過措置フィールドがここで使用されます

スクリプト設定

 ・契約日は必須になります。
 ・前回の消費税検索でget(日付)で行っていたのを契約日で検索するように変更します。
 ・検索内容は応用編3のレシピとほぼ一緒です。ソートは開始日に変更して、対象のデータを取得。

 ・取得したデータの最初の行を変数にセットして順番にチェックしていきます。
 ・経過措置前の場合は取得した消費税、後の場合は納品日の日付で消費税の取得を行ってます。

 ・納品日は必須ではないです。その場合は契約日の時点の消費税を返します。
 

サンプルファイルの契約日、納品日を変更して、経過措置ボタンを押下して見ましょう!

もっと応用アドバイス
・応用編4をもっとシンプルにしたい!汎用的にしたい!
  という場合は引数を使って、検索スクリプトを分けてしまいましょう!
  引数は日付です。受け取り側は変数にセットしましょう。

・関数が使える方 難易度高め★★★
 アドバンスド機能が使える事前提ですが、関数を作成しちゃいましょう!
 そうすることで、フィールドの計算式で「=税抜金額 * 0.08」と記入しているものに対し「=税抜金額 * gettax(契約日)」と直すだけで、消費税を取得する関数を作成できます。
  今回のソースの場合関数の中身はこんな感じになります。
 Let ( [
%日付=Get(日付);
%一覧 = ExecuteSQL ( "SELECT M0100.\"Fd_経過措置_指定日\"
, M0100.\"Fd_経過措置_施行日\"
, M0100.\"Fn_消費税\"
FROM \"M0100_tax\" AS M0100
WHERE M0100.\"Fd_開始日\" <= ?
AND M0100.\"Fn_削除Fg\" is null
order by M0100.\"Fd_開始日\" desc"
;"¶"; "¶" ;%日付);

$開始日 = GetValue ( %一覧 ; 1);
$終了日 = GetValue ( %一覧 ; 2);
$消費税 = GetValue ( %一覧 ; 3)
<!---- チェック処理省略 --->
];
$消費税
)

詳細

FileMaker Ver13~16と、17の違い

FileMakerのVer13で登場した「次の場合にオブジェクトを隠す」は、条件式を満たす場合に該当オブジェクトを非表示にする機能です。
「条件を満たすまでボタンを押されたくない」「権限のある人にだけ値を見せたい」といった仕様を実現することができます。

 

その「次の場合にオブジェクトを隠す」機能の仕様が、Ver17から下記のように変わりました。
「条件式がエラーと評価された場合、オブジェクトは必ず非表示になる」
では、Ver16以前はエラーを含む場合でも表示されていたのかというと、必ずしもそうではありません。

 

様々なエラーを含む条件式を設定し、Ver16(以前)とVer17とで動きを確認してみましょう。

サンプルファイル: hide_object.fmp12

 

準備

「sample」テーブルを作成し、「Field1」「Field2」という名前のフィールドを作成します。

リレーションシップグラフで、「sample 2」「sample 3」というテーブルオカレンスを作成します。

sampleテーブルオカレンスを紐づけたレイアウトを作成し、ボタンオブジェクトを7つ配置します。
それぞれのボタンの「次の場合にオブジェクトを隠す」に、条件式を入力します。

A.sample::Field2

B.sample 2::Field1

C.sample 3::Field1

D.(1/0)

E.(1/0) = 2

F.(1/0) ≠ “?”

G.(1/0) = “?”

sampleテーブルからField2フィールドを削除します。

リレーションシップグラフからsample 3テーブルオカレンスを削除します。

 

結果

Ver16以前

Ver17

 

1.式内のフィールドが参照できない場合(A,B,C)

フィールドを削除した場合や、現在のレイアウトから参照できないテーブルオカレンスを参照している場合など。
Ver17では非表示なのですが、16以前では隠されません。

 

2.式全体がエラーとなる場合(D)

例えば条件式を「1/0」(ゼロ除算)とすると、式はエラーとなります。
この場合、Ver17でもVer16以前でもオブジェクトは非表示となります。

 

3.式の一部にエラーを含む場合1(E,F,G)

条件式を「(1/0) = 2」とすると、左辺がエラーとなります。
式にエラーを含んでいますので、Ver17ではオブジェクトは非表示となります。
一方Ver16以前ですが、左辺は”?”を返します。
その結果、「”?” = 2」という式になります。
この式は成立しないため、式全体としてはFalse(偽)を返します。
その結果、オブジェクトは隠されません。
どちらも非表示となりますが、その過程が異なるのです。

では、「(1/0) ≠ “?”」という条件式だとどうなるでしょうか。
もちろんVer17では非表示となります。
Ver16以前では「”?” ≠ “?”」となり、式全体としてはFalse(偽)を返します。
その結果、オブジェクトは隠されません。

さらに「(1/0) = “?”」の場合。
Ver17では非表示。
Ver16以前では「”?” = “?”」となり、式全体としてはTrue(真)。よってオブジェクトは隠されます。

 

まとめ

  削除したフィールドを参照 他のリレーショングループを参照 削除したテーブルオカレンスを参照 1/0 (1/0)=2 (1/0)≠”?” (1/0)=”?”
Ver.17 非表示 非表示 非表示 非表示 非表示 非表示 非表示
Ver.13~16 表示 表示 表示 非表示(※1) 表示 表示 非表示(※2)

※1:式全体がエラーのため ※2:式が成立するため

 
こうしてみると、Ver16以前の判定はややこしく感じますね。
Ver17でスッキリ整理された、ということになるかと思います。

なお、既存のFileMakerファイルのVerを上げた際、表示・非表示の状態が変わってしまう可能性がありますので、しっかり確認しておきましょう。

詳細