FileMakerあれこれブログ

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

スポンサーサイト

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

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

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

テーブル構成は
親テーブル: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の部分を増やしていけば、長い文字数にも対応できます。

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

FC2Ad

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