みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
こんなスクリプトを使ったりしてます。
■テーブル
・TableA
gDate 日付、グローバル
date 日付
■リレーション
TableA::gDate = TableA2::date (自己連結)
■スクリプト
スクリプト名: 日次レコードを作成
変数を設定 [$date; 値:Get(スクリプト引数)]
変数を設定 [$end; 値:Date(Month($date)+1;0;Year($date))]
レイアウト切り替え [「レイアウトA」(TableA); アニメーション:なし]
変数を設定 [$d; 値:Date(Month($date);1;Year($date))]
Loop
フィールド設定 [TableA::gDate; $d]
If [IsEmpty(TableA2::date)]
新規レコード/検索条件
フィールド設定 [TableA::date; $d]
End If
Exit Loop If [Let($d=$d+1;$end<$d)]
End Loop
レイアウト切り替え [元のレイアウト; アニメーション:なし]
■使い方
適当な場所で以下のように呼び出します。
スクリプト実行 [指定:一覧から;「日次レコードを作成」; 引数:"2024/01/01"]
日付部分は無視されますが、日付として認識される値を渡す必要があります。
渡した日付を含む月の、1~末日分のレコードを重複しないよう作成します。
チポさんの指摘から、分かり難い部分に追記しました。
GetAsTime(Average ( タイム ) )
例えばこのようなものを作りたいのだと思いますがどうでしょう。
※検索対象にする普通のデータテーブル
テーブル名:人物
フィールド:氏、名、氏名、性別、生年、誕生日(フィールドタイプはテキストや日付など)
※検索条件入力用
テーブル名:検索用
フィールド:氏、名、氏名、性別、生年、誕生日(フィールドタイプは全てテキストのグローバルフィールド)
レイアウト:人物一覧
ヘッダ部設置フィールド:検索用::氏、検索用::名、検索用::氏名、検索用::性別、検索用::生年、検索用::誕生日
ボディ部設置フィールド:人物::氏、人物::名、人物::氏名、人物::性別、人物::生年、人物::誕生日
※ヘッダ部設置フィールドには、スクリプトトリガ「OnObjectSave」にスクリプト「人物検索」を設定
スクリプト:人物検索
検索モードに切り替え[一時停止:オフ]
if[1<>Get(ウインドウモード)]
検索モードに切り替え[一時停止:オフ]
End If
if[1=Get(ウインドウモード)]
フィールド設定[人物::氏; 検索用::氏]
フィールド設定[人物::名; 検索用::名]
フィールド設定[人物::氏名; 検索用::氏名]
フィールド設定[人物::性別; 検索用::性別]
フィールド設定[人物::生年; 検索用::生年]
フィールド設定[人物::誕生日; 検索用::誕生日]
検索実行[]
End If
※Get(ウインドウモード)でやってるのは特定の状況でデータが上書きされるのを防ぐおまじないです
多分やりたいのはこういうことではないでしょうか。
今回は検索用の入力欄を別のテーブルにしていますが、「人物」テーブルに検索用のグローバルフィールドを作っても問題ありません。
試しにPNGの透過画像をpaint.netで開き、全コピーしてFMに貼り付けると背景が白くなりますね。
エクスプローラーからファイルを直接FMにドラッグすると、透過を維持した画像がドロップされます。
アプリで透過画像をコピーした時のクリップボードを見てみると表面上は単なるBITMAPで保持されているようなので、クリップボードとFMのペースト機能の都合ではないでしょうか。
スライドコントロールの左右をアンカーしておいて、スライドのパネル上にフィールドを設置すれば何となく近いことが出来るような気はします。
スクリーンのサイズによっては絶対表示されないフィールドが出てきますし、パネル切替で対応するにしてもメンテナンスが面倒なのであまりおすすめ出来ませんが。
顧客テーブルの g_有効 と繋げて絞り込むのではなく、ポイントテーブルで現在有効なポイントを算出してからそれを合計した方がいいかもしれません。
・顧客ポイントテーブル
ポイント消費 (ポイント消費時、「ポイント増」のレコードに対して有効期限の古い順に消費量を記録)
有効ポイント =if(判定 ; ポイント増 - ポイント消費 ; 0)
この状態で顧客テーブルとポイントテーブルを顧客番号で繋ぐと、ポイント増合計、ポイント減合計、ポイント消費合計、有効ポイント合計を全てsumで取得出来ます。
チポさんの言うようにポイント消費時に複数のポイント増レコードに対してポイント消費を記録しなければならない場合もありますが、有効期限に間に合わず無効になってしまったポイントも自動で弾けるので各ポイント数自体は扱いやすくなると思います。
閲覧履歴テーブルを作ってカウントアップの代わりに履歴レコード作成するのも一つの手ですね。
ロックは問題にならないし、閲覧者や閲覧日時も取れますし。
SQL = "SELECT \"@@F1@@\" FROM \"@@TO@@\" WHERE \"@@F2@@\" = ?"
もしくは
SQL = Substitute ( SQL ; [ "@@TO@@" ; Quote(TO) ] ; [ "@@F1@@" ; Quote(F1) ] ; [ "@@F2@@" ; Quote(F2) ]
としたらどうでしょう。
両方ではなくどちらかで。
スクリプト名:ツールバー
If[Get(アカウントアクセス権セット名)="[Full Access]"]
メニューバーの表示切り替え [ロック(L):オフ; 表示する]
ツールバーの表示切り替え] [レコードの編集ツールバーを含める; 表示する]
End If
というスクリプトを作ってスクリプトメニューに表示するチェックをONにしておき、ワークスペースの上の方に置いておけばCTRL+1でスクリプト実行出来るので、隠れてしまった画面でCTRL+1 をして表示させてますね。
GetNthRecord関数はおそらくコールごとに通信が発生するので、レイテンシの影響が大きいのではありませんか?
Shinさんの言うようにListを使うか、ExecuteSQLで一括取得してからループ処理した方がよいのではないかと思います。
3つ以上重なってるときは出来ませんが、ドラッグでまとめて選択した後に前面のオブジェクトを選択解除し、背面だけ選択されている状態になったら十字キーで移動することはありますね。
一応参考までに、
データビューアの「監視」タブに式を追加してExecuteSQLを実行すると、エラーの時に「?」ではなくエラーの内容が表示されます。
解決になってますが、WebDirect は
Get(システムプラットフォーム)=4
で判定できると思います。
テーブルAにBの最新レコードのIDを持たせ、それと連結したテーブルB’を一覧で表示してみてはどうでしょう。
■追加フィールド
テーブルA::最新所在地ID 計算タイプ(もしくは自動入力の計算値) if(テーブルA::更新日時;テーブルB::ID;Self)
※テーブルAの更新タイムスタンプを「更新日時」、テーブルBの主キーを「ID」と仮定
■リレーション
テーブルA::最新所在地ID = テーブルB’::ID
これで一覧にテーブルBではなくテーブルB’のフィールドを設置します。
Aからみて1対1になるので早いと思います。
ただ更新タイムスタンプがトリガなので、ロックしただけで更新しなかったりレコード復帰された場合は更新されない可能性があります。
スケジュールやなにがしかのタイミングで テーブルA::最新所在地ID <> テーブルB’::ID のレコードを訂正する処理が必要です。
私が対応した案件では格段に一覧表示が早くなったのと、常時リアルタイムで最新を確認するわけではなかったため、この問題は訂正処理で許容出来ました。
許容出来ない場合はShinさんの案の方がいいですね。
レイアウトテーブルからみて連結先が1なのか多なのかが重要です。
無関係かもしれませんが、とりあえず単位を cm ではなく pt に変更してから調整してみてはどうでしょう。
cm で調整すると pt単位で小数点になることがあるようですが、小数点部分がどうなっているのか不思議に思います。
レイアウトは全て「レイアウトメニューに表示させる」をオフにしておき、開発専用のドロップダウンを設置しておくのはどうでしょう。
完全アクセス限定の透明なレイアウト選択用ドロップダウンをほぼ全レイアウトの左上に設置して、自分ではそちらを使うようにしています。
ドロップダウンの設定は以下のような感じです。
・変数用テーブル「val」にフィールドを作成
reflesh 数字
layouts 計算 Evaluate("LayoutNames(Get(FileName))";reflesh)
layoutSelector テキスト グローバル
・値一覧「レイアウトリスト」を作成
フィールド値 val::layouts
・スクリプト「レイアウト選択」を作成
レイアウト切り替え[val::layoutSelector; アニメーション:なし]
・レイアウトにフィールド「val::layoutSelector」を設置
コントロールスタイル:ドロップダウンリスト or ポップアップメニュー
値一覧:レイアウトリスト
OnObjectModify:レイアウト選択
次の場合にオブジェクトを隠す:Get(アカウントアクセス権セット名) <> "[Full Access]"
塗りつぶし:単色 カラー:透明(塗りつぶし:なし だと若干扱いづらい)
レイアウトを追加したりレイアウト名を変更した時は、val::reflesh = not val::reflesh をしてレイアウトリストを更新します。
一例として。
クリアしたいフィールドを配置したレイアウト(例:レイアウトX)を用意し以下のスクリプトを実行すると、配置されたフィールドに全て空白が設定されます。
配置してあれば、他のテーブルのフィールドもクリアされます。
エラー処理[オン]
レイアウト切り替え[「レイアウトX」(table);アニメーション:なし]
If[Get(最終エラー)]
現在のスクリプト終了[テキスト結果:]
End If
変数を設定[$table; 値:Get(レイアウトテーブル名)]
変数を設定[$list; 値:FieldNames( Get(ファイル名); Get(レイアウト名))]
変数を設定[$max; 値:ValueCount( $list)]
変数を設定[$i; 値:0]
Loop
Exit Loop If[Let( $i=$i+1; $max<$f)]
変数を設定[$field; 値:GetValue( $list; $i)]
変数を設定[$full; 値: If( Position( $field; "::"; 1; 1); ""; $table & "::") & $field]
変数を設定[$tmp; 値:FieldRepetitions( Get(ファイル名); Get(レイアウト名); $full)]
変数を設定[$rep; 値:GetAsNumber( GetValue( Substitute( $tmp; " "; ¶);1))]
変数を設定[$r; 値:1]
Loop
フィールドを名前で設定[$full & "[" & $r & "]"; ""]
Exit Loop If[Let( $r=$r+1; $rep < $r)]
End Loop
End Loop
レイアウト切り替え[元のレイアウト;アニメーション:なし]
フィールドを設置する手間はありますが、スクリプトで設定するよりは多少マシかなと。
OnPanelSwitch トリガで設置しているオブジェクトをチェックして、空なら次のパネルに移動するとか
Ceiling((小計+消費税)/100)*100
とかですかね。
ただし、これだと総額が切り上げになっていて個室手数料だけを切り上げている訳ではありません。
可能ならですが、15の現サーバーはそのままにして、別の新規サーバーにクリーンインストールした方が良いかもしれません。
15のサーバーとファイルは稼働・公開中のまま、別サーバーに19のインストールとスケジュールのコピー等をし、さらに共有予定ファイルのコピーで動作確認しておけば、最後にIPまたはドメインの変更だけで確実に乗り換えることが出来ると思います。
問題が発生した場合は15のサーバーで再公開することも出来ますし。
うちでは再起動ではありませんが、ファイルメーカーが起動直後にクラッシュするという報告がありました。
報告があったPCのOSは以下のものでした。
───────────────
エディション Windows 10 Pro
バージョン 20H2
インストール日 2020/10/20
OS ビルド 19042.1052
エクスペリエンス Windows Feature Experience Pack 120.2212.2020.0
───────────────
※インストール日以外が全く同じOSのPCで2件報告あり
Windows7や8では今のところ同様の報告がありません。
設定等を触る余地がなくウインドウが真っ白のままクラッシュするため、対策の余地がありませんでした。
一度アンインストール後に再インストールし、アップデートを行わないことで起動は出来ましたが、その後の再アップデートは試していません。
検索モードで検索条件を入力するのではなく、
・検索条件を入力するグローバルフィールドを用意
・グローバルフィールドの条件で検索するスクリプトを作成
として新規ウインドウで検索条件を入力させ、元のレイアウトに戻って検索スクリプトを実行すれば実現できないでしょうか。
グローバルフィールドの初期化やフィールドを増やした時などに手間が掛かる欠点はありますが、どこからでも検索条件を設定できると思います。
条件付書式で直接計算するのではなく、一旦計算フィールドで結果を出してみてはどうでしょう。
■検査結果を入力するテーブルに追加する計算フィールド
フィールド名:白血球状態
計算式:
Case(isEmpty(白血球);""
;白血球>=動物種血液検査正常値DB::白血球数の正常高値;1
;白血球<=動物種血液検査正常値DB::白血球数の正常低値;-1
;0)
■レイアウトの条件付書式
条件1:白血球状態=1
書式1:赤
条件2:白血球状態=-1
書式2:青
計算フィールドになっていれば確認も容易でしょうし。
リレーションやレイアウトの都合でファイルメーカーが自動的に開いたファイルは、親ファイルに連動して自動的に閉じられます。
ですが外からスクリプトが実行されると、自動的に開かれていたファイルでもユーザーが開いたファイルとみなされるようで、親ファイルを閉じても連動しなくなります。
外から呼び出されるスクリプトの最後に
ファイルを閉じる[現在のファイル]
を追加、または呼び出し側で呼出先のファイルを閉じるステップを追加すれば、また親ファイルに連動して閉じられるようになります。
ファイルを閉じるステップを実行しても参照に必要なファイルが強制的に閉じられることはないので、気軽に追加しておいて問題ありません。
追記:表示できるウインドウがあればそれが表示されると思いますが、非表示のウインドウしか残っていない場合は何も表示出来ないため、ファイルメーカーの起動センターが表示されるのだと思われます。
テキスト成型時は桁合わせ等で関数を使うことが多いためほぼスクリプトでやっていますが、文字を追加したり連結するだけで良い場合は確かにマージフィールドの方が楽そうですね。
内容編集する場合もレイアウト修正だけで済みますし。
[ Generated in 0.007 seconds, 7 queries executed - Memory usage: 657.89 KiB (Peak: 697.43 KiB) ]