アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセス初心者です。
テーブル1にNo.というフィールドがあります。そのフィールドは、データ型:数値型。フィールドサイズ:長整数型。インデックス:なし(重複なし)。にしてあります。
フォームでNo.に値を入れた時、同じ数字がある場合にエラーエッセージを出して、No.を再度入れなおすようにしたいのです。
現在同じ数字がある場合は、データが保存されずエラーメッセージも表示されていません。(ちなみにNo.に使用している数字は6桁です)
どなたかご教授ください。よろしくお願い申し上げます。

A 回答 (4件)

項目「NO」の更新前処理に次のようにコードを記述してみてわ。



=======================================================
Private Sub NO_BeforeUpdate(Cancel As Integer)

Dim DB As Database
Dim R As Recordset
Dim FLG As Integer
Set DB = CurrentDb
SQL = "SELECT * FROM テーブル1 WHERE NO = " & NO

If IsNull(NO) Then
FLG = 1 '登録
Else
Set R = DB.OpenRecordset(SQL, dbOpenSnapshot)
If R.EOF Then
FLG = 1 '登録
Else
FLG = 2 'キャンセル
End If
R.Close
End If

If FLG = 1 Then
'登録処理の実行

Else
'処理をキャンセル
MsgBox "このNoは既に登録されています。"
Cancel = True
SendKeys "{ESC}"
End If

End Sub
=======================================================


※DCOUNTでも出来ますが件数が多くなると処理時間がかかる場合があります。
 処理時間の事を考えるとRECORDSETをOPENするやり方をお勧めします。
    • good
    • 0
この回答へのお礼

KAERU_VXVさん。ありがとうございます。できました!処理時間はやはり重要だと思うので、KAERU_VXVさんのを利用させていただきます。本当にありがとうございました。

お礼日時:2006/07/12 22:07

もう少し、チェックの全体像を見直したがいいかも知れませんね!



1、重複チェックに落とし穴がありそうです。
2、必須入力列か否かで Else文が決まります。
3、ヌル値を許容するか否かで Else文が決まります。

Private Sub Num_Exit(Cancel As Integer)
  If Len(Me.Num & "") Then
    Cancel = CBool(DCount("*", "テーブル1", "Num=" & Me.Num) > 0)
    If Cancel Then
      MsgBox "既存のデータと同じNo.が入力されました!別の値を入力してください。", _
          vbOKOnly + vbExclamation, "重複エラー"
    End If
  Else
    '
    ' 必須入力列か否かで処理が分かれる!
    '
    ・・・・・・・・・    
    '
    ' ヌル値を許容するか否か!
    '
    ・・・・・・・・・    
  End If
End Sub

一見、これで重複エラー、必須入力列チェック、ヌル値チェックがされていそうです。
ですが、これでも、まだ問題点があります。
カレントレコードもカウントの対象であることを考慮していないからです。

strWhere= "Num=" & Me.Num & " AND ID<>" & Me.ID
Cancel = CBool(DCount("*", "テーブル1", strWhere) > 0)

と、レコードをユニークに識別する列でのチェックを条件文に付加するべきと思います。

この回答への補足

s_huskysさんから教えていただいたものでできました!私のミスで動かなかっただけでした。ごめんなさい。本当にありがとうございました。

補足日時:2006/07/12 22:03
    • good
    • 0
この回答へのお礼

s_huskyさんありがとうございます。
教えていただいたもので試してみたのですが、チェックがうまくかけられていないようでした。ごめんなさい。アクセスは初心者なもので、条件とか設定がうまくできなかったのだと思います。
現在の状況は、テーブルのNo.の数値型をテキスト型にしてみたところエラーが出なくなりました。本当に解決したかは微妙なのですが、このまま進めてみようと思います。いろいろとアドバイスありがとうございました。

お礼日時:2006/07/12 17:40

> ・・・が、しかし、ココの箇所の入力をやめて(空白)次のレコードに動こうと


> したり終了しようとするとエラーが出ます。

レコードの入力自体をキャンセルしてもよければ、

> Cancel = True
の前後あたりに、

Me.Undo
を入れてみてください。

この回答への補足

Gin_Fさん。ありがとうございます。Me.UndoをCancel = Trueの前とか後ろとかに入れてみました。しかし、エラーメッセージは変わらず出てきます。
If DCount("No.", "テーブル1", _
"No.=" & Me!No. & "") > 0 Then
ここでダメみたいです。何とかなるものなのでしょうか?
ちなみにここは、必須入力でもなく、nullでもokにしておきたいのですが・・・
ご教授願えませんでしょうか?

補足日時:2006/07/12 11:37
    • good
    • 0
この回答へのお礼

Gin_Fさん。ありがとうございました。
いろいろと試してみたところ、テーブルのNo.の数値型をテキスト型にしてみたところエラーが出なくなりました。これで解決?!したのかは微妙ですが・・・。
Gin_Fさん色々とアドバイスありがとうございました。

お礼日時:2006/07/12 17:29

> インデックス:なし(重複なし)。

にしてあります。

インデックスを設定して、重複なしにすれば登録する前にエラーメッセージが
でると思いますけど、それではダメなんでしょうか?

メッセージを独自に設定したいのであれば、入力規則プロパティとエラーメッセージプロパティを
使えばできます。

Microsoft Office アシスタント: フォームのデータの入力検査または制限
http://office.microsoft.com/ja-jp/assistance/HP0 …

Microsoft Office アシスタント: DCount 関数
http://office.microsoft.com/ja-jp/assistance/HP0 …

この回答への補足

Gin_Fさん早速ありがとうございます。
実は、インデックスは別の箇所に使用していまして、この箇所にはついておりません。
記していただいたアドレスを参考に色々と調べまして、
Private Sub No._BeforeUpdate(Cancel As Integer)
If DCount("No.", "テーブル1", _
"No.=" & Me!No. & "") > 0 Then
Beep
MsgBox "既存のデータと同じNo.が入力されました! " & _
"別の値を入力してください。", _
vbOKOnly + vbExclamation, "重複エラー"
Cancel = True
End If
End Sub
としてみたらうまくいきました!???
・・・が、しかし、ココの箇所の入力をやめて(空白)次のレコードに動こうとしたり終了しようとするとエラーが出ます。
実行時エラー3075 クエリ式'No.='の構文エラー:演算子がありません。といわれてしまいます。
もし、回避方法があれば教えていただけないでしょうか?

補足日時:2006/07/11 23:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す