過去の桐井戸端BBS (桐ver.8)
17019 TBLが壊れているかどうかを一括処理やイベントで確かめる方法はありますか Rockey 2002/08/16-11:47
いつもお世話になります。

早速ですが、バックアップをする際、TBLファイルが壊れているのに保存するのを防ぐため、
下記のようにファイルを開いて、開けた時だけファイル更新でバックアップするようにしましたが、
TBLファイルが開けても壊れている場合があります。(頻繁に)
壊れたファイルをバックアップするという無駄な作業になって今います。

ファイルを開いて、項目集計や表整理をすると壊れているかどうかわかりますが、
一括処理やイベントはエラーになって終了してしまいます。

TBLファイルが壊れているかどうか判断して、
正常な時だけバックアップするような方法はないでしょうか?

ちなみに、TBLファイルは修復しようとしても
「レコードチェインに異常があります」と修復できず、
開いてみると項目がずれているレコードがあり、それを削除して
表整理、索引の再作成をすると修復されます。
もちろん削除したレコードは修復されません。

皆様にお知恵を拝借したいと思います。よろしくお願いします。

----------------KEVの一部----------------------

loop
&bktbl=#ファイル検索(&DPATH+"*.tbl",&i)
cond(&bktbl="")break
&tbl名=#ファイル名(&bktbl,2)
&i=&i+1
中止 表 1
表 &bktbl,表番号=1,モード=専有,リトライ=しない,終了状態=&EOC
if(&EOC=1)
代入 &MESS="ただいま "+&tbl名+".TBL ファイルを処理中...."
中止 表 1
update &bktbl,&BPATH
update &bktbl,"."
表 "保存復元.tbl",表番号=6,モード=専有
行挿入 [tbl名]=&tbl名,[状況]="ファイルは正常に保存",[備考]="OK"
終了 表 6
else
中止 表 1
表 "保存復元.tbl",表番号=6,モード=専有
行挿入 [tbl名]=&tbl名,[状況]="ファイルが開けません",[備考]="NG"
終了 表 6
end
end

17021 Re:TBLが壊れているか確かめる方法 ONnoji 2002/08/16-13:04
記事番号17019へのコメント
Rockeyさん、こんにちは。

「KD1032:データファイルが壊れています」が表示されると、一括はエラーで止まるでしょうけれど、
イベントではなんとかタイマーイベントへ引き継げますよ。

あまり参考にならないかとおもいますが…

壊れた表が手元に無いのでテキストファイルの拡張子を.tblして試ましたが、
1回だけ実行するタイマーイベントをONにして、
項目集計して、エラーしたかしないか変数に記録するというのはいかがでしょうか。

なお、エラーメッセージを止めることはできませんね。
「KD1032:データファイルが壊れています」が表示された後で、
「トホホ」が表示されます。

※フォームとタイマーは半角カタカナです。

*−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−*
名札 メイン
 変数宣言 局所,整数{&表が壊れている}
 オブジェクト操作 @フォーム.タイマー1 = "0"
 オブジェクト操作 @フォーム.タイマー値1 = "0.01"
 *

手続き定義開始 表テスト( )
 オブジェクト操作 @フォーム.タイマー1 = "1"
 &表が壊れている = 1

 表 "○○.tbl"
 項目集計 [××]

 * ここまで来ればエラーしていないので…
 &表が壊れている = 0

 * 正常な場合の処理をする

手続き定義終了


手続き定義開始 フォーム::タイマー1()
 オブジェクト操作 @フォーム.タイマー1 = "0"

 if ( &表が壊れている )
  確認 "トホホ"
  *止まってしまったマウスイベントをもう一度ONにするなど
 else
  *正常な場合の処理はここでしないほうがいいと思います。
 end

手続き定義終了
*−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−*


17022 Re:TBLが壊れているか確かめる方法 ONnoji 2002/08/16-13:13
記事番号17021へのコメント
Rockeyさん、こんにちは。

項目集計でエラーになった場合は試しておりません。m(__)m

表コマンドで即エラーの時には動きますけど、トホホと表示されます。

項目集計まで進んだ場合は、駄目かもしれません????
17023 Re:TBLが壊れているか確かめる方法 Rockey 2002/08/16-13:38
記事番号17022へのコメント
ONnojiさん


>表コマンドで即エラーの時には動きますけど、トホホと表示されます。

ONnojiさん、コメントありがとうございます。
早速そのまま真似てやりましたが、タイマーイベントの使い方が
いまいちわからないのでうまくいきません。トホホが出ません。

テキストファイルの拡張子をTBLにして
フォームはタイマー1イベントのチェックをオンにして
コマンドボタン1に 手続き実行 表テストとして、このボタンを
押したのですが、「KD1032データファイルが壊れています」と表示し
先に進みません。

すいません。動きを確認したいので、もう少しご説明を.....


17024 Re:TBLが壊れているか確かめる方法 ONnoji 2002/08/16-13:58
記事番号17023へのコメント
>早速そのまま真似てやりましたが、タイマーイベントの使い方が
>いまいちわからないのでうまくいきません。トホホが出ません。
>テキストファイルの拡張子をTBLにして
>フォームはタイマー1イベントのチェックをオンにして
>コマンドボタン1に 手続き実行 表テストとして、このボタンを
>押したのですが、「KD1032データファイルが壊れています」と表示し
>先に進みません。

Rockeyさん、こんにちは。

全くあたらしく、
NULLフォームをカード型で作って(編集対象表の無いフォーム)、

コマンドボタンを1つ作り

機能名:手続き実行
パラメータリスト:表テスト

と設定して、
この掲示板に投稿した内容をコピーして、
イベントに貼りつけて、
表コマンドと
項目集計コマンドをそちらの内容に変更して、

全角のフォームという文字を半角のフォームに全置換、
全角のタイマーという文字を半角のタイマーに全置換すると

動くと思います。

※この手順で当方は動くことを確認しております。(^^ゞ

17025 Re:TBLが壊れているか確かめる方法 ONnoji 2002/08/16-14:18
記事番号17024へのコメント
ONnojiさん

>>フォームはタイマー1イベントのチェックをオンにして

Rockeyさん、こんにちは。

タイマーにもいろいろなものがありまして、今回のタイマーは特殊な使い方です。

今回の1回だけ実行するタイマーは初期値でOFFにしておく必要があります。

おそらく、それが原因でしょうね。たぶん。

ですから、名札 メインでタイマーイベントを"0"にしておく必要があるわけです。

タイマー値もセットするのをお忘れにならないようにしてください。
タイマー値がゼロだと動かないです。(^^ゞ

すでにタイマー1を使っていたら、タイマー2を利用してください。

両方使っていたら???
どちらかを今回の1回だけ実行するタイマー専用にしてください。


17027 Re:TBLが壊れているか確かめる方法 Rockey 2002/08/16-14:50
記事番号17025へのコメント
ONnojiさん、できました。どうもありがとうございました。
これを参考にさせていただきます。
タイマーイベントの使い方も少し理解できました。(50%くらいですが)
一括処理の遅延コマンドの代用もできそうですね!
ファイルが壊れていても開ける表は今そのTBLがないので後ほどテストして見たいと思います。
この度はご丁寧にありがとうございました。
17042 表ファイルの破損について 佐田 守弘 2002/08/19-23:18
記事番号17019へのコメント
Rockeyさん
表ファイルの破損を簡単に調べられるかについて多少補足します。
表ファイルの破損は、様々です。

@OSレベルでの破損:メディアの物理的な破損、論理的なエラー
 このレベルだと、OS上でのファイル操作でエラーになります。
 桐がその表を読み込もうとしても、どこかで読み込めずにエラーになります。

A桐ファイルとしての破損
 OS上のファイルとしては正常でも、桐がただしい表ファイルとして
 読めないエラーです。このエラーにも、
 ・0ページエラー:定義情報の破損
 ・ページチェインエラー:データのつながり方のエラー
 ・その他:データページの記録内容のエラー、各種条件名、
  索引情報の破損など
 などがあります。エラーによって、どこで発見されるか一概には言えません。

Bデータ内容の破壊
 表としては正常でも、書かれている値が誤っているのもエラーの一種です。
 これはデータの内容をを見ない限り発見できません。

以上の通りで、破損の判定は結構面倒ではないかと思います。
このうち、
@は、OSの機能のディスクチェックで、Aは桐の表の検査修復で
行うのが最も良いのではないかと考えます。

佐田守弘(KS-00119)

戻る