FileMakerあれこれブログ

FileMakerに関する、あれやこれやの解決策や小技など、思い付いたものをどんどん書き込んでいきます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ダブルクリック

久々の更新です。
ダブルクリックでスクリプトを実行するようにしたいとお考えの方は、結構いらっしゃるんじゃないかと思います。

今回は、値一覧の代わりにポータルの別ウィンドウを表示して、そこから値を選択(ダブルクリック)したら、メインのウィンドウのフィールドに値がセットされるスクリプトです。

まずはスクリプトを作成します。

If [ IsEmpty ( $$Row ) ] //変数$$Rowに値が入っていなかったら
変数を設定 [ $$Row ; 値: Get(アクティブポータル行番号) ] //クリックしたポータル行番号を変数に取得(行番号でなくても何か値を入れればOK)
スクリプト一時停止/実行 [ 間隔(秒): 0.3 ] //0.3秒程度の待ちを入れる
変数を設定 [ $$Row ; 値: "" ] //0.3秒の間に2回目のクリックが無かったら変数をクリアする

Else //変数$$Rowに値が入っていたら(0.3秒以内にもう一度クリックした場合)
変数を設定 [ $$Row ; 値: "" ] //変数をクリア
変数を設定 [ $TokuCd ; 値: Toku_Self_TokuCd::TokuCd ] //ポータルから必要な情報を変数にセット
変数を設定 [ $TokuName ; 値: Toku_Self_TokuCd::TokuName ] //ポータルから必要な情報を変数にセット
ウィンドウを閉じる [ 現在のウィンドウ ] //先にウィンドウを閉じる
フィールド設定 [ Sample::TokuCd ; $TokuCd ] //メインのウィンドウのフィールドに、取得した値をセット
フィールド設定 [ Sample::TokuName ; $TokuName ] //メインのウィンドウのフィールドに、取得した値をセット
フィールドへ移動 [] //フィールド移動で値を確定
全スクリプト終了 //このままでは1回目のクリックのスクリプトが一時停止しているので、ここで完全に終了させる

End If


次にポータルの別ウィンドウレイアウトを作成します。
矩形のオブジェクトに先ほど作成したスクリプトを設定します。
その矩形オブジェクトを、ポータルのフィールドの下に配置します。

DoubleClick03.jpg

DoubleClick04.jpg

これでOKです!
ブラウズモードにして、ポータル行をダブルクリックすると、クリックした行の値が、メインウィンドウのフィールドにセットされます!

スポンサーサイト

テーマ:ソフトウェア - ジャンル:コンピュータ

レイアウトへのメモ書き

スクリプトトリガや条件付き書式などを使って、少し凝ったレイアウトを作成すると、どこにどんな設定をしたのか、作った本人でさえ分からなくなってしまうことが多々あります。
スクリプトトリガや条件付き書式なら、セットしたフィールドやオブジェクトの右下に小さなマークが付くので、注意して見れば分かりますが、レイアウトにスクリプトトリガをセットした場合や、オブジェクト名を設定した場合などは、メニューからレイアウト設定画面を開いて確認したり、いちいちオブジェクトを選択して、インスペクタから一つ一つ確認していかないと見付けられません。

そんな問題を解決する、ちょっとした方法です。
私が考えたわけではないですが、多くの開発者が使っている方法です。

オブジェクト名などを付けたフィールドの横に赤文字のテキストを配置し、そこに下記のような条件付き書式を設定します。

条件式:(計算式が) Get ( ウィンドウモード = 0 )
その他書式設定から、フォントサイズを500ポイントにして、さらにスタイルを「下付き」にします。

こうすることで、レイアウトモードにした時だけに表示されるメモ書きになります。
オブジェクト名の表示だけでなく、レイアウトのスクリプトトリガが設定されている旨の注意書きや、その他色々なメモ書きに応用できます。

※この機能はVer.11までは有効ですが、残念ながらVer.12では適用できなくなりました...

LayoutMemo01.jpg

LayoutMemo02.jpg

テーマ:ソフトウェア - ジャンル:コンピュータ

ポータルを含むレコードの複製(応用)

ポータルを含むレコードの複製の応用です。
複製する回数を指定することと、複製した親レコードに連続した日付を入力していくスクリプトを実現されたいと、リクエストをいただきました。

まずは複製回数を入力するグローバルフィールドを、フィールドタイプ「数値」で親テーブルに作成し、複製を実行するレイアウトに配置します。

続いて「ポータルを含むレコードの複製」のスクリプト(定番でもひねった方の何れでも可)にスクリプトステップを追加していきます。

--------------------------------------------------

複製回数を入力するフィールド:gQuot(数値のグローバルフィールド)
日付を入力する親テーブルのフィールド:Date(日付フィールド)


If [ gQuot ≤ 0 ] //複製回数が0または入力していなかったらエラーメッセージを表示
カスタムダイアログを表示 [ "確認" ; "複製回数を入力してください。" ]
Else //複製回数が入力されていたら、以下のスクリプトを実行
 Loop
 変数を設定 [ $Rep; $Rep + 1 ] //複製回数をカウントする変数をセット
 変数を設定 [ $count; 値:"" ] //2個目のLoop回数をカウントする変数をクリア※ここを忘れるとLoopが止まらなくなるので注意してください。

 変数を設定 [ $sn2; 値:GetNextSerialValue ( Get ( ファイル名 ) ; "sn" ) ]
 変数を設定 [ $Lines; 値:Count ( SalesH_SalesD_Sn::sn ) ]
 Loop
 変数を設定 [ $count; 値:$count + 1 ]
 ポータル内の行へ移動[ 選択; ダイアログなし; $count ]
 レコード/検索条件複製
 フィールド設定 [SalesD::fksn; $sn2]
 Exit Loop If[ $count ≥ $Lines ]
 End Lopp
 レコード/検索条件複製


 フィールド設定 [SalesH::Date; SalesH::Date + 1] //複製前から入力されていた日付に1を加算(1日送ることになる)
 Exit Loop If[ $Rep ≥ gQuot ] //$Repの値が複製回数(gQuot)の数値に達したらLoop終了※ここも忘れるとLoopが止まらなくなるので注意してください。
 End Loop
 フィールドへ移動[]

End If

--------------------------------------------------

※青字の部分は、前回の「ポータルを含むレコードの複製」と同じです。

テーマ:ソフトウェア - ジャンル:コンピュータ

ポータルを含むレコードの複製

受注伝票、売上伝票などのように、親レコードに対して複数の子レコード(関連レコード)を持っていて、それをポータルで表示しているようなデータを、ポータルも含めて丸ごと複製しようとすると、意外と難しかったりします。
やり方は何通りもあると思いますが、定番なスクリプトと、ちょっとひねったスクリプトを紹介します。

テーブル構成は
親テーブル:SalesH
子テーブル:SalesD
リレーションキー:SalesH::snとSalesD::fksn
※フィールド「SalesH::sn」は自動番号入力の設定

まずは定番スクリプトです。
--------------------------------------------------
変数を設定 [ $sn; 値:SalesH::sn ] //複製する親レコードのシリアルNoを変数に取得
レコード/検索条件複製 //先に親レコードを複製する
変数を設定 [ $sn2; 値:SalesH::sn ] //複製した親レコードのシリアルNoを変数に取得
レイアウト切替え [「SalesD」 (SalesD) ] //子レコードのレイアウトに移動
エラー処理 [ オン ]
検索モードに切り替え[]
フィールド設定 [SalesD::fksn; $sn] //複製する親レコードのシリアルNoで子レコードを検索
検索実行[]
If[ Get ( 対象レコード数 ) ≥ 1 ] //検索して該当するレコードがあったら下記のスクリプトステップを実行
レコード/検索条件/ページへ移動[ 最初の ] //先頭のレコードに移動してからLopp開始する
Loop
Exit Loop If[ SalesD::fksn ≠ $sn ] //親レコードとのリレーションキーフィールドの値が変数$snと違っていたらLoop終了
レコード/検索条件複製 //子レコードを複製する
フィールド設定 [SalesD::fksn; $sn2] //複製した子レコードのリレーションキーフィールドに複製した親レコードのシリアルNo(変数$sn2)をセット
レコード/検索条件/ページへ移動[ 最初の ] //先頭のレコードに移動
レコードを対象外に //このレコードはすでに複製済みなので、対象外にする
End Loop
End If
レイアウト切替え[ 元のレイアウト ]
--------------------------------------------------

これでOKです。


続いて、ちょっとひねったスクリプトです。
--------------------------------------------------
変数を設定 [ $sn2; 値:GetNextSerialValue ( Get ( ファイル名 ) ; "sn" ) ] //複製する親レコードの次のシリアルNoを関数で取得し、変数にセット
変数を設定 [ $Lines; 値:Count ( SalesH_SalesD_Sn::sn ) ] //複製するポータルの行数を変数にセット
Loop
変数を設定 [ $count; 値:$count + 1 ] //ループカウンター用変数を設定
ポータル内の行へ移動[ 選択; ダイアログなし; $count ] //$countの値の行に移動
レコード/検索条件複製 //先に子レコードを複製していく
フィールド設定 [SalesD::fksn; $sn2] //複製した子レコードのリレーションキーフィールドに複製した親レコードのシリアルNo(変数$sn2)をセット
Exit Loop If[ $count ≥ $Lines ] //変数$countが変数$Lines(ポータル行数)に達したらLoop終了
End Lopp
レコード/検索条件複製 //ここで親レコードを複製する
フィールドへ移動[]
--------------------------------------------------

以上で完了です。

ちょっとひねったスクリプトでは、ポータル行を選択した状態で「レコード複製」を行うと、ポータル行が複製される機能を応用しています。

テーマ:ソフトウェア - ジャンル:コンピュータ

パスワードを完全に伏字にする

パスワードを入力する時に、入力と同時に伏字にする方法です。
スクリプトトリガを使って、1文字入力したら即座に伏字「*」に置き換えてしまいます。

まずはスクリプトを作ります。

----------------------------------
変数を設定 [ $Chara; 値:$Chara & User::PassEnter ]
変数を設定 [ $Length; 値:Length ( User::PassEnter ) ]
If [ Length ( User::PassEnter ) ≥ 1 ]
フィールド設定 [ User::PassEnter; Left ( User::PassEnter ; Length ( User::PassEnter ) - 1 ) & "*" ]
End If
フィールド設定 [ User::Password; Left ( User::Password & Rigth ( $Chara ; 1 ) ; $Len ) ]

----------------------------------

次に、パスワードの入力フィールド(User::PassEnter)に、このスクリプトをOnObjectModifyのスクリプトトリガに設定します。

これで完了です。
何か文字を入力すると即座に伏字「*」に変換されていき、実際のパスワードは「User::Password」のフィールドに格納されていきます。
バックスペースでパスワードを何文字か消すと「User::Password」のパスワードも消えていきます。

パスワードを日本語で入力した場合、一文字ずつ確定させていけば、トリガが正しく機能しますが、連続で複数文字入力してから確定すると、うまく伏字になりません。
パスワード入力フィールドのインプットメソッドを「直接入力」にして、半角英数が入力されるようにしておいた方が良いですね。

テーマ:ソフトウェア - ジャンル:コンピュータ

チェックマークを入れる

一覧表示されたレコードにチェックマークを付けて行きたい場合のスクリプトです。
下記の方法でしたら、ネットワーク共有しているデータベースに対して、複数の人が同時にチェックマークを入れても対処できます。

理屈は、チェックした行のシリアルNoを変数に取得し、改行区切りされたシリアルNoのリストを作ります。
そのリストの中に、シリアルNoが含まれているレコードだけが、計算フィールドに「1」を返すようにします。
そのフィールドのデータ書式を「論理値」とすることで「1」の場合には「✓」が表示されます。
グローバル変数と計算フィールドで表現していますので、ネットワーク共有から複数の人が同時にチェックマークを入れても、別々に処理することができます。

理屈が分かった?ところで、早速作ってみましょう。
まず、チェックマークを表示したいテーブルに、桁数が固定されたシリアルNoのフィールドと、計算フィールドを作ります。

シリアルNoフィールド
CheckMark04.jpg

計算フィールド
計算式は下記画像の通りですが、索引オプションの「計算結果を保存せず必要時に再計算する」にチェックを入れてください。

CheckMark02.jpg
CheckMark03.jpg

次にスクリプトを作成します。
-----------------------------------------------------------------
変数を設定 [ $$List; 値:If (
PatternCount ( $$List ; "¶" & 商品マスタ::SN ) ;
Substitute ( $$List ; "¶" & 商品マスタ::SN ; "" ) ;
$$List & "¶" & 商品マスタ::SN
) ]
ウィンドウ内容の再表示
-----------------------------------------------------------------
次に一覧レイアウトにフィールドとボタンを配置します。
まずは矩形オブジェクトを配置します。

CheckMark05.jpg

次に先ほど作成したチェックマークを表示する計算フィールドを配置します。
このフィールドは入力できないように、インスペクタのフィールド入力のチェックを外しておきます。
また、フィールドの枠も表示しないようにしておきます。
そしてこれを矩形の上に重ねます。

CheckMark06.jpg

CheckMark09.jpg


このフィールドのデータ書式設定を、インスペクタの画面から「論理値」に設定し、値が「0」以外の場合は「✓」、値が「0」の場合は空欄にします。
CheckMark07.jpg

このフィールドオブジェクトにボタンを設定します。
先ほど作成したスクリプトを割り当てます。
CheckMark08.jpg

これでOKです。
表の右端に配置した矩形をクリックすると、クリックした行にだけチェックマークが入り、もう一度クリックするとチェックマークを消すことが出来ます!
チェックマークを全て消去する場合は、スクリプトでこの変数の値をクリアすれば良いです。
CheckMark10.jpg

テーマ:ソフトウェア - ジャンル:コンピュータ

プログレスバー

FileMakerの標準機能で、プログレスバーを作ってみました。
処理の進捗を示すプログレスバーですが、さすがに重いスクリプトの本当の進捗をバーに示すことは難しいので、疑似的なものとして作ってみました。

まずは、スクリプトを作成します。

Loop
ウィンドウ内容の再表示[] //ウィンドウ内容の再表示を逐次行わないと、条件付き書式の色設定が反映されない
変数を設定 [ $count ; 値:$count + 1 ]
変数を設定 [ $wait ; 値:"" ]

Loop
変数を設定 [ $wait ; 値:$wait + 1 ] //バーが徐々に伸びていくように、ループを使った「待ち」を入れる
Exit Loop If [ $wait ≥ 1000 ] //カウント数を変えることで、バーが伸びる速度を変えられる
End Loop

Exit Loop If [ $count > 20 ] //バーのコマ数は20個にしました
End Loop

次にレイアウトにプログレスバーを作成します。
ProgressBar01.jpg
ボタンの矩形を20個横にならべます。スクリプトは何も割り当てません。
それぞれに条件付き書式を設定します。
一番左の矩形には $count ≥ 1 の条件の時、背景色を青に設定。
次の矩形には $count ≥ 2 の条件の時、背景色を青に設定...という具合に条件を設定していきます。

ProgressBar02.jpg

これでOKです。
早速、スクリプトを実行してみましょう!
ProgressBar03.jpg
バーが徐々に伸びていく感じに出来ました!

テーマ:ソフトウェア - ジャンル:コンピュータ

名前の一部を伏字にしたい

このところ色々と忙しくて、長いこと放置してしまいました...久々の書き込みです。

個人情報保護などで、名前の一部を伏字にしたい場合の計算式です。
偶数文字目が「*」に置き換わります。
名前なので、最大10文字で作ってあります。

例えば、野田佳彦さんの場合は「野*佳*」と表示されます。

Let ( [
$text = TrimAll ( 「テキストフィールド」 ; 3 ; 3 ) ;
$length = Length ( $text ) ;
$t1 = Middle ( $text ; 2 ; 1 ) ;
$t2 = Middle ( $text ; 4 ; 1 ) ;
$t3 = Middle ( $text ; 6 ; 1 ) ;
$t4 = Middle ( $text ; 8 ; 1 ) ;
$t5 = Middle ( $text ; 10 ; 1 ) ] ;
Left ( $t1 & "*" & $t2 & "*" & $t3 & "*" & $t4 & "*" & $t5 & "*" ; $length )
)

名前を入力するフィールドとは別に、伏字入りの名前を表示する計算フィールドを作成し、そこに上記の計算式を設定します。
「テキストフィールド」には名前を入力するフィールド名をセットします。
苗字と名前の間のスペースなどを除去するように、TrimAll関数を入れてみました。

他にもやり方は色々あると思いますが、Let関数を使った簡単な計算式でやってみました。
式内の$t1~$t5の部分を増やしていけば、長い文字数にも対応できます。

テーマ:ソフトウェア - ジャンル:コンピュータ

レイアウトのコピー

コピーしたいレイアウトが沢山あって、それを複数のファイルに分けて貼り付けたい時など、コピー元のレイアウトを何ページも送りながらコピーペーストしていくのは結構面倒な作業です。
Advancedバージョンでも、テーブルインポートの機能はありますが、レイアウトはインポート出来ないですね...
それでも、コピー元のレイアウトを、いちいちページをめくらずにコピー出来たら、かなり作業は軽減されるのではないでしょうか?
実はそんな裏ワザがあったんです!

まずは、コピー元のファイルにグローバルフィールドを「オブジェクト」のフィールドタイプで、コピーしたいレイアウトの数分だけ作ります。

LayoutCopy02.jpg

次に新規レイアウトを作成し、先ほど作成したグローバルフィールドを、そのレイアウトに配置します。
全部のフィールドが1画面に収まるような大きさで配置していきます。

LayoutCopy03.jpg

そして、レイアウトモードのまま、コピーしたいレイアウトのオブジェクトを全選択してコピーします。

LayoutCopy01.jpg

オブジェクトフィールドを配置したレイアウトに切り替え、ブラウズモードにします。
オブジェクトフィールドの1つを選択し、ペーストすると、オブジェクトフィールドにレイアウトが貼り付けられます!

LayoutCopy04.jpg

これをコピーしたいレイアウトの数だけ繰り返します。
そうすると、1つの画面(レイアウト)に、コピーしたい全てのレイアウトを表示することができます。

LayoutCopy05.jpg

ここからは、もう簡単です。
オブジェクトフィールドのレイアウトを1つずつコピーして、移行先のファイルをレイアウトモードにして貼り付けていくだけです。

この機能、かなり古いバージョンからあったみたいですが、私もつい最近知りました...以外な便利機能です。

テーマ:ソフトウェア - ジャンル:コンピュータ

ポータル行のハイライト

マウスのスクロールボタンなどで、明細画面に表示されるレコードを送っていくと、現在どの明細情報が表示されているかを、ポータル行をハイライトさせて明示する方法。

下図のような感じで、現在明細情報が表示されている行はどれなのかをハイライトさせたい。

PortalHighLight_01.jpg


まずは明細画面に紐付けられているテーブルの、自己リレーションを設定します。
何かの値が必ず入っているフィールド同志をリレーションさせ、演算子は「x」を使います。

PortalHighLight_02.jpg

次に明細画面レイアウトにポータルを配置します。
関連するリレーションは先ほど設定したものです。
表示したいフィールドをポータルに配置したら、そのフィールドの塗りを「なし」にします。
続いて白い矩形オブジェクトをボタンツールで作成し、ポータル行の大きさに合わせます。
「ボタン」で作成しましたが、スクリプトを関連付ける必要はありません。
矩形オブジェクトは、ポータル内のフィールドの背面に設置します。

PortalHighLight_03.jpg


そして、このオブジェクトを右クリックして、条件付き書式を設定します。
「条件」は、このレコードを特定するフィールド(シリアル番号など)と、先ほど設定した自己リレーションの同フィールドの値が同じだったら...という計算式にします。
「書式」は塗りつぶし色をハイライトさせたい色に設定します。

PortalHighLight_04.jpg


これでOKです。
ブラウズモードに切り替えると、ポータルのどこかの行がハイライトされていると思ます。
そして、マウスのスクロールなどで詳細画面を送っていくと、ポータル行のハイライトが移動していきます!

テーマ:ソフトウェア - ジャンル:コンピュータ

次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。