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

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

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

You are not logged in.

Announcement

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


#1 2014-03-13 13:57:19

いちたすに
Guest

ポータルを使用した排他処理

いつも勉強させてもらってます。(長い文章ですみません)
Fms11×1、 Fmp11 win7 ×8台です。

現在、案件管理などに使用している元テーブル数が8個、テーブルオカレンスとしているのが37個ほどあり、ER図は親子関係も分からないくらいぐちゃぐちゃ状態で整理中なのですが、この際、以前から困っていた「処理中に横から入ってきてもらいたくない排他処理」をちゃんとやりたいと思っています。

明細数が10万を超えるテーブルが3つほどあり、ひとつひとつロックするのは途方もないので、対象レコードや全置き換えなどの最中に横から入って書換わらない様にしたいと考えています。また、エラーが発生した場合、元の状態に復帰できないか思案しています。

そこで、過去の質問の中の
https://fm-aid.com/bbs2/viewtopic.php?id=772 でHiroさんが紹介してくれたポータルを使用することによってロックが可能というLink先を読みました。

ポータル上で複数レコードを同時にロックしたい場合、レコードロック用のテーブルを作り、親に対し子のポータルは関連になるので同時にロック設定が可能かと思うのですが、親レコード数が30あれば、都度ロック処理を行うということなのでしょうか。これだと、レコードロック用のテーブルを作る意味がなくなっちゃうのかなと、元のレイアウトでよいのかなって思うのですが、足りない頭ですみません・・・


<子ポータルロック>

エラー処理
レイアウト切り替え ["レイアウト名"]
オブジェクト移動[オブジェクト名:"子テーブル"]
Loop
   レコード/検索条件を開く
   変数を設定[$erko;値:Get ( 最終エラー )]
   Exit Loop if[$erko ≠ 0]
   ポータル内の行へ移動[選択;次の;最後まできたら終了]
End Loop

#1行1行ループさせてロックする方法で、作ってみたのですが、エラーが発生した場合、元に戻すのは、
#単純に

if[$erko≠ 0]
  レコード/検索条件復帰
End if

でよいのでしょうか?
あれ?戻ったのかどうか確認できないか・・・

#2 2014-03-13 14:37:50

Layouter
Guest

Re: ポータルを使用した排他処理

そこはまだロック作業の途中だから、確定でもいいのでは。
全部ロックし終わって、何か処理をした後に中止したい場合は、復帰

だけど、処理中にユーザ操作があるならユーザが確定させないようにトリガの設定とか
処理中にクライアントがこけると無条件に確定されてしまうとか

#3 2014-03-13 15:17:25

いちたすに
Guest

Re: ポータルを使用した排他処理

Layouter wrote:

そこはまだロック作業の途中だから、確定でもいいのでは。
全部ロックし終わって、何か処理をした後に中止したい場合は、復帰

だけど、処理中にユーザ操作があるならユーザが確定させないようにトリガの設定とか
処理中にクライアントがこけると無条件に確定されてしまうとか

Layouterさん、ご忠告ありがとうございます。

そうですよね、これじゃロックできないですよね
やはり、処理中のクライアント操作が予想されまして・・・、本当なら誰も居なくなった後か、朝早く処理するのがいいのでしょうけど・・
トリガ使ってもっと思案してみます。

#4 2014-03-13 15:59:13

Hiro
Member

Re: ポータルを使用した排他処理

30のマルチ照合キー一覧にOR照合するポータルを組めば、一括ロックが掛けられますが...。

Offline

#5 2014-03-13 16:51:32

いちたすに
Guest

Re: ポータルを使用した排他処理

Hiro wrote:

30のマルチ照合キー一覧にOR照合するポータルを組めば、一括ロックが掛けられますが...。

えっ、えっ!?
マルチ照合テキストを作って、そこに親テーブルIDを30改行させてOR照合するポータルを作るっていうことでしょうか?
ということは、親テーブルとマルチ照合のための別テーブルが必要になるのかなぁ・・・

さっそくやってみます。

Hiroさん、度々ありがとうございます。

#6 2014-03-13 18:34:10

いちたすに
Guest

Re: ポータルを使用した排他処理

Hiroさん、凄いです!ありがとうございます。
何度か子テーブルのキーの照合で失敗しましたが、新たに作ったマルチキーテキストを置くテーブル自体が排他制御テーブルになりました。
このマルチキーテーブルのテキストをIDにして、親テーブルIDで結んだポータルと、子テーブルに新たに作った親IDのポータルの照合して親子ポータルの両方を置けば、一括ロックも親子の関連ロックもこのテーブルひとつでいけそうです。
レコードロック用のテーブルを別途作る事に意味が無いと思っていましたが、たぶんこの事だったのかと・・・やっと気付きました。
私の能力では到底考えもつかない方法なのでとても感謝しています。


後は、マルチキーを制御してロックのスクリプトをしっかり組めれば、の話ですが、なんとかいけそうな気がしてきました。

Layouterさん、スクリプトはもう少し考えてみます。

#7 2014-03-14 11:51:58

いちたすに
Guest

Re: ポータルを使用した排他処理

スクリプトは

エラーがあった場合
「割り込んでます」というダイアログを作って上記のまま復帰で、エラーがなければ続行確定すれば、いいような気がしました。

コピーしたテストFileでしっかり検証して、よければ移植したいと思います。
たぶん運用的に関連ファイルだけロックという事はなさそうなので、一括オンリーにしたいと思います。
書換えについてもこの排他制御テーブルで出来そうなので、相当楽になりそうです。


Layouterさん、Hiroさん、ありがとうございました。

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.008 seconds, 7 queries executed - Memory usage: 517.62 KiB (Peak: 522.52 KiB) ]