初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2021-04-23 15:35:58

Riina
Guest

動作が重い時にスクリプト内容が飛ばされてしまいます。

こんにちは。質問お願いします。
バージョンは19を使用しています。

レンタルサーバーのファイルメーカーサーバーにデータを置いて接続して運用しています。
スクリプト内容が
Aテーブルの内容をBテーブルに新規レコードを作り、フィールド内容30項目ほどを記入
その後Aテーブルの繰り返しフィールドを元にしたデータをテーブルCにループして最大10ほどレコードを作るといったものがあります。

少し重めのスクリプトかと思うのですが、1000回に1回ほど稀にこのループで作成するレコードが作成されないことがありまして
操作している方に聞いたところ、回線かパソコンが重く動作が重いときがあり、そういう時は
そのスクリプトを発動するボタンを何回か押してしまうことがあったとのことです。
尚スクリプト前半部のAテーブルからBテーブルにレコードを作成するのは正常で、AからCへループ作成するのが稀に作成されないです。

自分なりに原因を考えたところ
①動作が重いときに処理が終わる前にスクリプトボタンをまた押したり、レイアウト移動など違う操作をした
②スクリプト内の待ち時間などがないので、動作が重くなったときにループ部分が飛ばされてしまった
と思ったのですが、こういったことが原因でスクリプト内容が飛ばされてしまうことはあるのでしょうか?

また、こういった場合の対処法で良い方法ありましたら、是非ご教授いただきたいです。
ご助力宜しくお願い致します。

#2 2021-04-23 16:47:56

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

スクリプトが、途中で中断されてしまうことは、通常はないはずです。
あるとするならば、何らかのレコードの排他がかかった、ではないでしょうか。実際のテーブル内容がわかりませんが、テーブルCへクライアントがアクセスするタイミングがあるでしょうから、それでは。
loop でレコードを作っているのでしたら、サーバー側のエンジンがレコードをアクティブにしている事を確認してレコードの設定を行い、失敗したら再試行する仕組みにしたほうがいいのでは。
データ整形を高速化したい
の最後のほうに提示しているスクリプトをみてください。

具体的な運用がわかりませんが、何か効率の悪い運用に思えるのですが。

Last edited by Shin (2021-04-23 19:11:16)

Offline

#3 2021-04-24 00:49:33

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

返信ありがとうございます。
リンク先を見てみました。
>>検索実行  //未同期のレコードを選択:同期成功 = ""

>>計算結果を挿入 [選択; リレーション::ID; ID]
の部分ですが、新規にレコードを作成でどのようにリレーションを貼るかが解りませんでした。
上から全部読んでみたのですが、自分の状況に合わせて解読するのが出来ず難航しております。

更に詳しくこちらの作りをお伝えすると
テーブルAを使用したレイアウトにテーブルCのポータルを設置して
ポータルの行へ移動 最後の
を使い1レコードずつ作成しています。
ループで記入する際、例えば3回ループがあったら、2回目だけ記入されなかったとかではなく
3回全てが記入されないというケースが100%なので、ループ自体が行われてないような感じです。

ご助力宜しくお願い致します。

#4 2021-04-24 01:42:55

まか
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

ボタン操作でスクリプトを実行する際は、対象のスクリプトを指定せずに、実行専用のスクリプトを作成。
If not IsEmpty ( $$スクリプトの実行 )
現在のスクリプト終了
else
変数を設定[$$スクリプトの実行;値:1]
スクリプト実行[対象のスクリプト]
EndIf

対象のスクリプトの末尾に
変数を設定[$$スクリプトの実行;値:""]を実行し、変数を削除

#5 2021-04-24 04:21:58

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

> Aテーブルの内容をBテーブルに新規レコードを作り、フィールド内容30項目ほどを記入
これは、問題ないのでしょうか。

> その後Aテーブルの繰り返しフィールドを元にしたデータをテーブルCにループして最大10ほどレコードを作るといったものがあります。
このloopが、
> テーブルAを使用したレイアウトにテーブルCのポータルを設置して
> ポータルの行へ移動 最後の
> を使い1レコードずつ作成しています。
なのでしょうか。ならば、失敗している時は、ポータルの行へ移動 でエラーが出ているはずです。そこかその後のフィールド設定のエラーを見てみるといいのでは。
これが、繰り返しフィールドそれぞれのデータが分解して入るのでしたら、テーブルCへ移動して、分解させるインポートしたほうが確実ではと思いますが。

Offline

#6 2021-04-24 07:04:32

himadanee
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

「サーバ上のスクリプトを実行」は使ってないのですよね?
スクリプトに一時停止のステップがなければ、実行中に他のスクリプトを実行(ボタンを押す)やレイアウトの切り替えは不可能なはずです。

「ループして最大10ほどレコードを作る」
最小は1?0?
ループの最初にExitを書いてて条件が間違ってるという人が最近いましたけど...

#7 2021-04-24 15:30:48

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

皆様返信ありがとうございます。

まかさん
$$は全体の共通の変数だったかと記憶してますが
もしAテーブルの一人目が1レコード目と二人目が2レコード目で同時にそのスクリプトをした場合
どちらかはIf not IsEmpty ( $$スクリプトの実行 )に引っかかるでしょうか?
※現在は1レコード目と2レコード目では同時にスクリプトを使いloopでCテーブルにレコードを作ったり出来ます。
レコードが分かれた場合は同時操作が可能にしたいです。

Shinさん
> Aテーブルの内容をBテーブルに新規レコードを作り、フィールド内容30項目ほどを記入
はい。これは問題なく今まででレコードが出来なかったことはありません。
loopでレコード作成は仰る通りその部分です。
ポータルの行へ移動 でエラーがあり行へ移動できなかった場合
>こかその後のフィールド設定のエラーを見てみるといいのでは。
これはどのようにエラーを見ることができるのでしょうか?

himadaneeさん
サーバー上のスクリプト実行は使っていません。
最小は0で、0の場合はIf get(対象レコード)でレコード作成せずスクリプトを終了させるか判定しています。
常に出来ないわけでなく、1000回に1回ほど(数百回に1回かもです)の稀に出る現象ですので、loopが間違っているというのは無さそうです。
>スクリプトに一時停止のステップがなければ、実行中に他のスクリプトを実行(ボタンを押す)やレイアウトの切り替えは不可能なはずです。
私もそういうものだと思っていたのですが、回線が重かったりでボタンを数度押してたこともあると聞いたので、それ含めて原因もあるものかと思ってしまいました。

#8 2021-04-24 19:07:39

まか
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

自分が書き込んだ内容の趣旨は、ボタンの連打防止です。
グローバル変数は、グローバルフィールドと同様に、各クライアントの値は独立していたと思います。
“次の場合にオブジェクトを隠す”でスクリプト実行中の表記を制御すれば、重い処理のスクリプトの実行のタイミングが確認できると思います。
ただ、今回の件はレコードのロックが絡んでるような...

#9 2021-04-25 21:55:26

danda
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

こういう場合、下記の場合が多い。
・サーバーのCPUに高負荷が掛かった状態で、さらに大きな負荷がかかる作業(在庫引当や他インポート作業等)を行うと
こういった現象が起こることが稀にある。(可能性は低いが)

・他の人がレコードを触ってて、処理できずに飛ばされる(飛ばしたレコードをチェックしておいて後から追加する等の処理が必要)

基本的に、飛ばされるなら飛ばされない仕組みを作ればいいだけなので、参考に頭を切り替えてスクリプトの見直しをすると、結構解決する。
デバッガを使い問題を切り分け、エラーコード及他の人がレコード触ってたらどうなるかとか、見てみる。

#10 2021-04-26 08:28:17

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

#2 でその点を回避するスクリプト例を提示しているのですが。
具体的な運用がわからないので、サンプルの作り用もないですしね。

Last edited by Shin (2021-04-26 08:38:05)

Offline

#11 2021-04-26 08:50:26

himadanee
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

Aテーブルの繰り返しフィールドを元にしたデータ
と言ってたのに、
最小は0で、0の場合はIf get(対象レコード)でレコード作成せずスクリプトを終了させるか判定しています。
というところが、何だか変ですね。
Count(繰り返しフィールド)が0の場合にスキップするのと、対象レコードがあるかどうかでの判定(Aでの対象レコードでのループ?)が、ごっちゃになっているような、ロジックの間違いの可能性がある?

#12 2021-04-26 19:57:11

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

まかさん
なるほど、仮に重いスクリプト実行中に他の動作が出来るとしたら、その動作が各個人で
グローバル変数を使い出来ないようにするということですね。
ユーザーの多動作が原因だった場合は有効ですね。

dandaさん
他の人がレコードを触っててというのは有り得ないです。
Aテーブルの違うレコードに同時アクセスは有り得ますが、同レコード同アクセスは無いです。
稀にしか起こらず、こちらでの再現性が無いため、飛ばされない仕組みというのがどのようにしていいやら難しいです。。。

Shinさん
後ほど詳細を記載するので、もし原因が解ればご助力いただければと思います。

himadaneeさん
実のところこれ以外にもテーブルを経由などしていまして、説明が長くなるため端折っていましたが
Aテーブルにレコードをループで作成するかどうかの判定フィールドがあり、その判定が "作成" のものを検索して
実際全てを説明するとAテーブルの繰り返しフィールドでもなくなるため、長くなりますが後で全行程を記載させていただきます。

#13 2021-04-26 21:52:51

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

9割書いたものが画面真っ白になって書き直しになり泣きそうになりました・・・。

全て書くと長くなり皆さんが読み疲れてしまうかと省略しておりましたが、私の説明不足なため、全て記載させていただきます。
以下が運用方法とスクリプト行程などです。

<運用方法>
自身で運営するガールズバーの精算や成績の記録用で運用しています。

<テーブル>
Dテーブル=お客様の座る席をレコードで作るテーブルです。
Aテーブル=明細のテーブルで、Dテーブルからの注文などを1注文ごと1レコードに記録します。
Bテーブル=席の売上などを記録するテーブルです。
Cテーブル=キャスト(女の子)の席の売上成績を記録するテーブルです。

<リレーション>
D-Bは席IDというDでレコードを作ると作成される固有のIDでリレーションしています。
D-Aも同じく席IDでリレーション
A-Cは営業日でリレーションしています。

<内容>
お客様が席についたら、Dテーブルでレコードを作り、ドリンクなど注文されたらAテーブルへ明細を作ります。
キャストの指名があると、その席に女の子が担当となり、その指名のAテーブル明細の判定フィールドには ”作成” の値が付きます。
この指名はDテーブルの席レコードの繰り返しフィールドで0名~最大10名まであります。
キャストの担当の席の売上は席に付いた担当の売上成績になるといった感じです。
最終的にお会計が終了したら、Dレコードの「会計終了」ボタンを押すとBテーブルに売上を記録し、Aテーブルの内容からキャスト売上を記録し
再度にDテーブルの席レコードをクリアして終了といったものです。

<会計終了のスクリプト内容>

If[Dテーブル::排他処理="1"] //ボタンを押した時に万が一他に操作している人が居たようの排他処理です。
 現在のスクリプト終了
End If
フィールド設定[Dテーブル::排他処理 ; "1" ]
レコード/検索条件確定[ダイアログあり:オン]

変数を設定[$営業日; 値: Dテーブル::営業日 ]
変数を設定[$席ID; 値: Dテーブル::席ID ]

//席の売上記録  スクリプト実行[席の売上記録]で以下を実行
フィールド設定[ Bテーブル::小計 ; Aテーブル::小計合計 ]
フィールド設定[ Bテーブル::支払い方法 ; Dテーブル::支払い方法 ]
・・・など30項目ほど記録

//キャスト売上記録 スクリプト実行[キャスト売上記録]で以下を実行  ※ここのレコードが対象が居ても稀に生まれないことがあります。
レイアウト切り替え [Aテーブルのレイアウト]
エラー処理[オン]
検索モードに切り替え
フィールド設定[ Aテーブル::営業日 ; $営業日 ]
フィールド設定[ Aテーブル::席ID ; $席ID ]
フィールド設定[ Aテーブル::判定 ; "作成" ]
検索実行
If [Get (対象レコード数)=0]
 レイアウトの切り替え[元のレイアウト]
 現在のスクリプト終了
End if

変数を設定[ $売上一人分; Truncate( 席総額 / Get (対象レコード数) ; 0 ]  //”作成”のキャストを席の総額で割り一人分の売上を算出

レコード/検索条件/ページへ移動 [最初の]
Loop
 ポータルの行へ移動[選択:オン; 最後の] //このレイアウトにはポータルは一つしかありません。Cテーブルと営業日で繋がっているポータルでレコード作成許可しています。
 フィールド設定[Cテーブル::営業日; Aテーブル::営業日]
 フィールド設定[Cテーブル::キャスト売上; $売上一人分]
 レコード/検索条件/ページへ移動 [次の; 最後まできたら終了:オン]
End Loop
レコード/検索条件確定[ダイアログあり:オン]
レイアウトの切り替え[元のレイアウト]

Dテーブルのレコードをクリア //Dテーブル::排他処理も同時にクリアされます。

以上のような感じになります。
大分長くなってしまいすみません。。。
何かおかしな箇所があればお教え下さい。
ただ、テーブル構成についてはもう後戻り出来ないくらい複雑になっているため
BテーブルとDテーブルを統合するなどは難しいかもです。
ご助力宜しくお願い致します。

#14 2021-04-26 23:07:05

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

テーブルAにレコードを作った後、アクティブになったままでレコード確定されていないとか

Last edited by Shin (2021-04-26 23:23:34)

Offline

#15 2021-04-26 23:25:30

Moz
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

スクリプトの中で FileMaker の排他によって実行されないと思われるのは Loop の中の[フィールド設定]くらいでしょうかね。
可能性としては Shin さんが書かれているようにスクリプトに書かれていない部分(他の操作やスクリプト)で
ポータルの親レコード(Aテーブル)が開いた状態になっている。

[検索実行]のあとで[エラー処理]をオフにしたら Loop でのエラーダイアログが出るので確認できます。
[エラー処理]はオンのままではダイアログを抑制してしまうので都度オンオフすることが推奨です。

Offline

#16 2021-04-27 00:01:42

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

Shinさん Mozさん
このスクリプトで毎回または頻繁にAテーブルからCテーブルにレコードが作られないのであればどこかに不備があるのが考えられるのですが
1000回に1回ほど稀にレコードが作られないといった現象が起こるのも仰られているAテーブルが開いている状態という原因があるということでしょうか?
要所要所でレコード/検索条件確定[ダイアログあり:オン]を入れるようにしているのですが、これでは方法としては足りないでしょうか?

#17 2021-04-27 06:56:56

Moz
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

カスタム App もスクリプトも「思ったとおりに動く」ではなく「作られたとおりにしか動かない」です。
見えている情報から FileMaker の排他の可能性があり、その確認を勧めています。
もちろん、すべてを見せて貰っていないので、見えてない部分に原因がある可能性も充分に考えられます。
[エラー処理]を入れているため、本来拾えているエラーダイアログを拾えていないことが分かります。
このままではエラーがあるのか無いのかハッキリしません。白黒付けてはどうかと提案しています。

少なくとも「動作が重いときにスクリプト内容が飛ばされる」という未知の不具合を FileMaker が抱えている可能性より
スクリプトまたは運用のどこかで FileMaker の排他によってレコードが作成できていない可能性のほうが高いでしょうね。

Last edited by Moz (2021-04-27 06:59:47)

Offline

#18 2021-04-27 23:17:40

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

稀に何等かの原因が起こりレコードがロックされるための可能性が高いということですね。
もう一度全てを見直してみて考えてみようかと思います。
皆様ご助力いただき、ありがとうございました。

#19 2021-04-28 07:55:27

himadanee
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

おかしいとしたら、End Loopの後に
レコード/検索条件確定[ダイアログあり:オン]
があるので、これはループの中に入れるべきでは?
「次のレコードへ移動」がレコード確定動作をしてしまうので、意味のないステップになってますよね。

#20 2021-04-28 08:48:49

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

Dテーブルの内容をクリアする、という運用を変更し、会計済み、というフラグで処理するように変更できれば、レコードの移行がない構造へ変更できます。その構造ですと、Aテーブルは不要になり、BCテーブルもAテーブルの内容を参照するだけになります。
内部がスパゲティー状態になっていると思いますので、根本から組み立て直したほうがいいのか、と思います。

Offline

#21 2021-04-28 17:22:17

Riina
Guest

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

himadaneeさん
なるほど、とりあえず一動作終わったらといった感じで入れてました。
Loop内に移動させてみます。

Shinさん
Dテーブルが不要になりABCでということでしょうか?
スパゲティ状態なのは自覚しており、自分でも何に使ってるのか解らないリレーションがあったりしてます。。。
中々1から作る気合を入れるのに時間がかかるかもしれませんが、今後暇になった段階で検討してみます。

#22 2021-04-29 10:05:43

Shin
Member

Re: 動作が重い時にスクリプト内容が飛ばされてしまいます。

動きの着眼が、テーブル だから、テーブルに客が来た、テーブルに注文、テーブルで会計、テーブルのデータを退避させてクリア、という面倒な動きになっているのです。
動きの基本を客にすれば、客が来た、テーブルと接続、テーブルを通して客に注文、客の会計、テーブルと切断、とすると、すべてのデータは常に客に紐付いた状態ですので、データの転記がありません。
キャストへの配分(詳細はわかりませんが)も、その時のキャスト数を持たせておけば、請求額を人数で按分した金額がそこにでます。それをキャストの出勤日からリレーションをかければ、面倒なデータ移行をさせずに計算できます。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] claudebot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.009 seconds, 10 queries executed - Memory usage: 605.06 KiB (Peak: 641.97 KiB) ]