過去の桐井戸端BBS (桐ver.8)
11106 共有ファイルの併合ができない soon 2001/05/02-08:18
ネットワークで桐v8sp6を使用しています。

パソコンAでファイルAを共有更新で開いて、レコードを編集中に、

パソコンBで一括処理で、

 表 &ファイルA,モード=共有更新
   併合 &ファイルB ・・・

で併合をかけると、併合がかからないようです。
なぜでしょうか。

併合がかからないときはメッセージを出すとか何か対策はあるでしょうか。

11107 共有ファイルの併合は難しいでしょう 佐田 守弘 2001/05/02-11:49
記事番号11106へのコメント
soonさん

併合は、元来は桐固有の専有モード用に作られた機能です。
通常の状態では一般的に共有モードで使うのは難しいと思います。

と言いますのは、御質問の
> 表 &ファイルA,モード=共有更新
>    併合 &ファイルB ・・・
ですが、表Bから共有更新中の表Aに対して併合を行うには、表Aを専有モードでファイルロックしなければなりません。
なぜかと言うと、併合は表編集と違って、表の全レコードに対してまとめて更新を掛ける機能ですから、
全レコードつまりファイル全体をロックして、他のユーザーの利用を制限しなければなりません。
もし併合時に他にユーザーがいて、そのユーザーによって編集中のレコードをロックされていると、
そのレコードだけ併合ができなくなり、表全体の整合性が失われてしまいます。
このために、他にユーザーがいると、併合ができなくなってしまうと考えられます。

私も試してはいませんが、何か方法はあるとは思います。
一番良いのは、専有モードで開いて併合を行う事だと思います。
専有モードで開けない場合には、エラーを出してみてはどうでしょうか。
あるいは、併合前に全レコードをロックして(ロックできるレコード数に制限あり)おくとか、
トランザクションコマンドを使って一連の処理を行うなどを試してみて下さい。

佐田守弘(KS-00119)
11108 Re:共有ファイルの併合は難しいでしょう soon 2001/05/02-13:38
記事番号11107へのコメント
ありがとうございます。

>一番良いのは、専有モードで開いて併合を行う事だと思います。専有モードで
>開けない場合には、エラーを出してみてはどうでしょうか。

具体的にどのようなコマンドを使えばよいでしょうか。
教えていただければ幸いです。


11111 Re:共有ファイルの併合は難しいでしょう 佐田 守弘 2001/05/03-00:43
記事番号11108へのコメント
soonさん

>具体的にどのようなコマンドを使えばよいでしょうか。
まず表を開く部分は、
表 &ファイルA,モード=専有,リトライ=しない,終了状態=&結果
で開いてみて下さい。
その結果が、「&結果」に代入されています。
後はケースコマンドの中でこの値を判断し、メッセージボックスコマンドで使用中のメッセージなどを出すなどすればよいでしょう。

例えば次の様になります。
ケース開始
 ケース (&結果=1)
  併合 ・・・・・
 ケース その他
  メッセージボックス "併合処理","表は使用中のため開けません" \
        ,アイコン=!,ボタン指定=1,&確認
 ケース終了

内容はコマンドを見ての通りで、専有で開ければそのまま併合を行います。
開けない場合には、メッセージボックスを表示し、確認を行えば終わります。

リトライを指定し、専有で開けるまで繰り返す方法もありますが、いつ開けるかからないので、
一回開いて見てだめなら諦める方が良いかと思います。

佐田守弘(KS-00119)
11113 Re:共有ファイルの併合は難しいでしょう soon 2001/05/04-21:34
記事番号11111へのコメント
ありがとうございました。
この方法でやってみます。

11114 Re:共有ファイルの併合について 正くん 2001/05/04-21:45
記事番号11106へのコメント
soonさん

私も含めこのことで悩んでいる人は多いのではないでしょうか。
LAN上で使う以上、マスターファイルなどは共有で開きたいですし、その状態で更新できないと値打ちが半減です。
併合コマンドはDOS桐の最初からあって多機能ですが、それ故か他のユーザーが1つのレコードでも更新中であれば実行できません。
併合の実行結果を変数で参照してみても、プログラムとしては何か不自然な気がします。
それでは他のユーザーが更新中かどうかを事前に見分ける確実な方法があるのかと言えばちょっと見当たりません。
私の知っている範囲で使えそうなのは、関数 #ロック可能行数 くらいです。

使い方としては、例えば

表 "ファイルA", モード=共有更新
ロック ,終了状態=&ロック結果
if ( &ロック結果=1 .and #ロック可能行数=813 )
   併合 "ファイルB" ・・・
else
確認 "表は使用中です。併合処理はできません。"
end

最初に1行ロックしているのは、他のユーザーに自分がこれから一時的に表全体を
更新することを念の為明示しています。同じことを他のユーザーも行うようにします。

私自身も勉強中ですのでうまくいくか確信はありません。間違っていたらごめんなさい。


11119 Re:共有ファイルの併合について soon 2001/05/09-11:52
記事番号11114へのコメント
ありがとうござました。

早速この方法も試してみます。

戻る