4 返信 最新の回答 日時: Feb 7, 2017 3:52 PM ユーザー:sintariran

    ポータルを用いて書き込み処理を複数ユーザで実施する方法

    sintariran

      FM Advance 15

      OS X 10.12

       

      「このリレーションシップを使用して、このテーブルでのレコード作成を許可する」にチェックを入れ、

      下記のような入力機能と入力した内容の履歴を表示する機能を兼任したポータルを作成しています。

       

      No     入力内容

      1        テスト1

      2        テスト2

      3        テスト3

      4        入力欄

       

      この形で開発を進めていて気づいたのですが、複数ユーザが同時に書き込みをしようと入力欄をアクティブにした場合、競合が発生してしまいます。

      結構なボリュームを組んでしまったので、なるべく修正量が少ない形で複数ユーザの競合が発生しないようにしたいのですがどのようにすればよろしいでしょうか。

       

      どなたか教えていただけますと幸いです。

        • 1. Re: ポータルを用いて書き込み処理を複数ユーザで実施する方法
          user14047

          複数人が同時に編集しようとする事象自体の発生は止めようがないので、

          OnRecordLoad か、OnObjectEnter かお望みのタイミングで

           

          エラー処理 [ オン ]

          レコード/検索条件を開く

          変数を設定 [ $error ; 値: Get ( 最終エラー ) ]

          If [ $error = 301 ]

            # 別のユーザがレコードを使用中の場合の処理

          End If

           

          こんなスクリプトで制御されてみてはいかがでしょうか?

          • 2. Re: ポータルを用いて書き込み処理を複数ユーザで実施する方法
            sago350@未来Switch

            ポータルのテーブル以外にも、ポータルを表示しているレイアウトのテーブルも排他がかかってしまって困ってらっしゃるんですね。

            「入力欄」以外の「テキスト1」「テキスト2」でも修正を始めると排他がかかるハズです。

             

            解決方法としては

            グローバルタイプのフィールドへ書き込んだデータを書き込むようにする。(レコードをロックする時間を短くする)

             

            ポータルのテーブルが設定されたレイアウトで修正する。(ポータル修正時に別のレイアウトへ移動する)

             

            といった所でしょうか。

            • 3. Re: ポータルを用いて書き込み処理を複数ユーザで実施する方法
              TailCapeT

              私もちょうど、この問題があり、動作を作り替えた経験があります。

               

              私は、必要情報を変数にして、今、リレーション先になっているテーブルで作ったレイアウトに移動し、

              新規レコードを作成、変数にした必要情報をフィールド設定で入力しています。

               

              ダイレクトに入力せずに、別テーブルの値やグローバルフィールドを作成しなければならない手間が

              ありますが、「やっぱやめ」の時に、不要なレコードが発生しにくいなど、利点も多いです。

               

              なにより、あまり排他が発生しない環境は安心出来ます。

              • 4. Re: ポータルを用いて書き込み処理を複数ユーザで実施する方法
                sintariran

                皆様

                 

                ご回答ありがとうございます。

                 

                user14047様のやり方が最も簡単そうですが、少し手間をかけても今後の開発のためにsago350様やTailCapeT様のようなグローバルフィールドへ入力したものをスクリプトでテーブルに書き込みに行く動作に変更しようと思います。

                 

                ちなみに検証していてわかったことですが、ポータルに限らず関連フィールドに複数ユーザで同時入力をしようとする場合にも競合が発生するようです。