過去の桐井戸端BBS (桐ver.9)
20354 重複禁止のチェックを入れた項目への入力で重複禁止のエラーが出たら再度同じ項目に戻って処理をしたい 2003/05/15-12:34
いつもお世話になります。
TBL設定で 【ID番号】と言う項目に重複禁止をチェック入れイベント処理を行っています。
イベント中に同じID番号が入力された場合 重複禁止ですとエラーが表示されるのですが、
確認OKを押すと 次のイベント処理がされてしまい困っています。
重複禁止のエラーが出たとき 再度同じ項目に戻って処理が出来ないでしょうか
この様なエラーを確認できる関数などはないのでしょうか?
項目制約式で指定した場合は その範囲以外でしたら エラーが出て 
その同じ項目で再入力できるので有難いのですが・・・
よろしくお願いします
                     
20356 Re:TBL設定 重複禁止について 悲しげ 2003/05/15-15:49
記事番号20354へのコメント
どもっ、信さん

似てような経験があります(V8で)。この点について若干足掻いてはみましたが、
最終的には「重複禁止とイベントは相性が悪いのだろう」と諦めました。
で、どうしたかと云うと、重複禁止が問題となるのは、私の場合、新規ID登録の場合に限られてましたから、
次のように逃げました。
別表たる新規登録専用の作業表に入力して、当該IDが元マスター表で既存か
どうかを検索してから、登録(読み込み)またはキャンセル(読み込みさせない)。

20357 Re:TBL設定 重複禁止について うにん 2003/05/15-16:56
記事番号20354へのコメント
いまいち意味がわからないのですが、

>TBL設定で 【ID番号】と言う項目に重複禁止をチェック入れ
>イベント処理を行っています。
>イベント中に同じID番号が入力された場合 重複禁止ですとエラーが表示される

「イベント中」といってもイベントハンドラ実行中なら入力ができないと思うのですが。

>のですが、確認OKを押すと 次のイベント処理がされてしまい困っています。

>重複禁止のエラーが出たとき 再度同じ項目に戻って処理が出来ないでしょうか
>この様なエラーを確認できる関数などはないのでしょうか?

行挿入エラーイベントや行訂正エラーイベントで&処理中止を設定すればできると思うのですが。
V9からの新機能ですね。

20358 なぜそこでイベントが 佐田 守弘 2003/05/15-18:22
記事番号20354へのコメント
信さん
どう言った流れのイベント処理を行っているのかが、質問文に書かれていないので、
予測での判断になってしまいますが。

一般的にフォームでイベント処理を行う場合、ID番号に限らず、項目値の入力を含む
表へのデータ追加や編集操作を行うときには、イベントは動作していないはずだと
思うのですが。通常、そういった形で作ると思います。
(一括処理で行追加等を行っているなら別です。)

入力後イベントであれば、項目値に書き込まれる前に発生し、イベントが終ってから
項目値への書き込みが行われ、ここで重複チェックが行われます。
またソース値更新であれば重複禁止チェックが終った後で、発生するはずだと思います。

重複禁止のチェック時にイベントが動いているという部分をもう少しお伝え下さい。

佐田守弘(KS-00119)
20370 Re:TBL設定 重複禁止について 悲しげ 2003/05/16-01:39
記事番号20354へのコメント
なるほど、うにんさん、佐田さんがおっしゃるとおり、確かに#20354は、
殆どわかりにくい書き方でしたね。

「イベント中に」と云うのも何のイベントなのか、「次のイベント処理がされてしまい」ってのも何のイベントなのかが不明ですから、
もしかして私が想像したものとは違うかもしれません。
私が以前に遭遇したのは(今となっては記憶も薄いが)こう云うことです。

一連の処理をイベントで組んでいた場合、この重複禁止に抵触してエラーが出てしまったら、
その時点でイベントは死んでしまい(信さんの云うような「次のイベント処理がされ」るのではなく)、
再度イベントを立ち上げる(wfmを再度開く)しか無いようことが発生していました。
古典一括だと、エラーでcmd自体が終了される場合と継続される場合が
ありましたが、「重複禁止」エラーでは処理は継続していたと思います。
でも、イベント的一括処理だと、終了ではないが、その後のイベントが無効となってしまった訳です(と記憶しています)。
これを避けるに、例えば、当該重複禁止項目値の「入力後」イベントで、
既存データの検索を試みたり(非表示モードで他レコードにかかる「検索」コマンドは使えないから
一寸トリッキーになった)、色々足掻いたあげく、
どうもシックリと来ないので、結局はID的項目(重複禁止がらみ)の新規登録は
別表作業表を使うことでしのぐことにしてきた次第です。

ただし、v9では、うにんさんが仰るとおり、「行挿入エラー」「行訂正エラー」イベントが登場しましたから、
これで試してみることを私もお勧めしておきます。自分のデータを試してはいないのですけど。(^^;)

20372 Re:TBL設定 重複禁止について 悲しげ 2003/05/16-11:22
記事番号20370へのコメント
補足します。
エラー時の挙動は、v8のspによって微妙に違ったと記憶しています。
それと、もうひとつ前提を書いておくのを忘れてました。
私が書いたのは、モーダルフォーム上での挙動でした(正確にはモーダルフォームからモーダルフォームを呼び出して、
そのまたモーダルフォームからモーダルフォームを呼び出して……)。
エラー時の挙動は、モーダルフォーム上でのものと非モーダルフォーム上では、確か異なっていたと記憶します。
──ただし、これらの記憶も曖昧ではありますが(^^;)、でも何れにせよ対策は同じかと思います。
20377 Re:TBL設定 重複禁止について 2003/05/16-12:36
記事番号20354へのコメント
悲しげさん・うにんさん・佐田さん ご指摘有難う御座います。
イベント自体あまりわかっていないので、わかり辛い記載でスミマセン
確かに、皆さんがおしゃられている ID番号の項目入力中は 
イベントは動作していない。そうであれば、ソース値更新前に重複禁止チェックが、
発生することになりますね。
なぜこの様にならないのか?疑問ですので リストを出しますのでご覧下さい。
【ID番号入力前のイベント】
手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
行追加 終了状態=&終了状態,[確認フラグ]=1,[入力年月日]=#日時値
ジャンプ 行番号=最終行
メソッド呼び出し @tID.フォーカス設定()
メソッド呼び出し @フォーム.更新モード設定(2)
手続き定義終了

【ID番号入力後のイベント】
手続き定義開始 tID::ソース値更新()
項目値代入 [タイムS]=#時刻
メソッド呼び出し @t入力者.フォーカス設定()
 end
手続き定義終了

この様な書き方をすると ID番号入力を入力後 重複のエラーが出ずに入力者の項目に移動入力後、
重複禁止チェックのエラーがでます。
そこで仕方なく、
手続き定義開始 tID::ソース値更新()
  メソッド呼び出し @フォーム.更新モード設定(0)
 項目値代入 [タイムS]=#時刻

メソッド呼び出し @フォーム.更新モード設定(0)を追加することによりID入力後に 重複の
エラーが表示されるようになったのですが、エラー確認した後、入力者項目に移動し
再び重複のエラーが出るようになりました。
@フォーム.更新モード設定(2)が問題だったのですね?次の項目までも更新モードは継続しているからかなぁと思います。

うにんさん・悲しげさんがご推薦して頂いた フォーム::行訂正エラーが出たとき下記の対応を考えましたら上手くいきました。
 V9で良かったと喜んでいます。
手続き定義開始 フォーム::行訂正エラー(長整数 &エラーコード・・・)
if(&エラーコード=1147)
項目値代入 [ID]=#U
  ・
手続き定義終了
【ID番号入力後のイベント】
手続き定義開始 tID::ソース値更新()
メソッド呼び出し @フォーム.更新モード設定(0)
 if([ID]=0)
メソッド呼び出し @tID.フォーカス設定()
メソッド呼び出し @フォーム.更新モード設定(2)
else
   メソッド呼び出し @フォーム.更新モード設定(2)
   項目値代入 [タイムS]=#時刻
  メソッド呼び出し @t入力者.フォーカス設定()
 end
手続き定義終了

この様な 処理で対応しております。
みなさんご指摘いただきまして有難う御座います。ちょっと勉強になりました。m(_ _)m
20381 Re:TBL設定 重複禁止について 悲しげ 2003/05/16-15:46
記事番号20377へのコメント
どもっ、信さん
#20377で挙げられた前段の方は、実は文意を殆ど理解できませんが(^^;)、
ま、「行訂正エラー」イベントの方でうまく行ったみたいなのでいいんじゃないでしょうか。
私も、深部を詮索はせずに、次の機会にはこれ「行*エラー」イベントを使おうと思います。
20382 Re:TBL設定 重複禁止について 2003/05/16-18:46
記事番号20381へのコメント
悲しげさんどうも有り難う御座います
桐V9のNEWイベント
「行*エラー」イベントはこのために作られたのではないかと
信じております (^^)/
エラーコードで処理も出来るので当方にとっては
大変便利です。

戻る