FC2ブログ

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です!
ブラウズモードにして、ポータル行をダブルクリックすると、クリックした行の値が、メインウィンドウのフィールドにセットされます!

スポンサーサイト

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

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

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

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

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

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

複製回数を入力するフィールド: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

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

次のページ

FC2Ad

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