• ベストアンサー

Access2000について

Access2000を使用しています。 フォームでウィザードを利用し、 テーブルへデータを書き込む状態(表形式)にしています。 いくつかのテキスト項目全てをNullでは書き込みが できないようにしたいと思っています。 しかし、登録した項目を削除したい場合、どうすればよいのでしょうか? 曖昧な書き方で申し訳ありません。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140971
noname#140971
回答No.1

Access の入力フォームで未入力登録を禁止すると様々な問題が発生します。 例えば、最初の入力データは完全入力可能で問題がなかったとします。 で、次のデータを最初から3つの項目を入力した時点でハタとミスに気付いたとします。 この場合は、前のレコードに戻って修正して4つ目の項目から入力を再開したいものです。 しかし、こういう入力フォームですと、必ず、必須入力欄の入力漏れが発生するでしょう。 で、対策ですが・・・。 1、入力フォームを閉じる時に、必須入力欄の未入力レコードの存在をチェック。 2、で、ユーザに<必須入力項目が入力されていない2つのレコードを削除します!>とアナウンス。 3、その後に、かかる不具合レコードを削除。 が、私のやり方です。 ※回答をする前に、全体の必須入力欄の扱いの考え方と削除のタイミングの考え方の確認を・・・。 ※で、質問者の構想は?

kkninolove
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

>Nullでは書き込みができないようにしたいと テーブルのフィールドのプロパティで「値要求」を「はい」にするとnullデータではレコードの追加ができないと思います。(スペースは可能だと思います。) >項目の削除 意味がはっきりとわかりませんが レコードを削除するという意味であれば DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70 の2行で削除できます。(コントロールウイザードでコマンドボタンを作成し、レコードの操作→レコードの削除を行うと生成されるコードです。)  新規レコード作成中に、一部のデータがnullのまま、レコードの削除をしようとすると一旦レコードを保存しようとしますので、その時点でエラーメッセージが出ます。 この場合は一旦すべてのレコードに何らかのデータ(スペースでも)を入れて(手入力でも、VBAによる自動入力でももかまいません)から削除する必要があります。

kkninolove
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。
noname#140971
noname#140971
回答No.2

午後5時ですので、処理コード8行を示しておきます。 Private Sub Form_Close()   Dim N    As Integer   Dim strWhere As String      strWhere = "Len(確認日 & '')"   N = DBCount("確認日", "tab1", strWhere)   If N Then     MsgBox "必須フィールドの入力漏れのレコードが" & N & " 件見つかりましたので削除します。"     CnnExecute "DELETE * FROM tab1 WHERE " & strWhere   End If End Sub これで、入力フォームを閉じる時に不具合レコードは削除されます。 tab1: ID__確認日 1___2008/10/09 2_____________ <-- 不具合レコード 具体的には、[ID=2]のレコードが削除されます。 フォームに書くVBAのコードは、8行程度です。 が、その中で DBCount関数、CnnExecute関数を使っています。 ですから、次のような自作関数を標準モジュールに登録する必要があります。 Accessには DCount関数が用意されていますが、DBCount関数が3倍速で動作します。 まあ、入力フォームを閉じる時の処理で時間がかかるのも問題なのでDBCount関数を使用しています。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute   Dim isOK As Boolean   Dim cnn As ADODB.Connection      isOK = True   Set cnn = CurrentProject.Connection   With cnn     .Errors.Clear     .BeginTrans     .Execute strSQL     .CommitTrans   End With Exit_CnnExecute: On Error Resume Next   cnn.Close   Set cnn = Nothing   CnnExecute = isOK   Exit Function Err_CnnExecute:   isOK = False   If cnn.Errors.Count > 0 Then     ErrMessage cnn.Errors(0), strSQL     cnn.RollbackTrans   Else     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"   End If   Resume Exit_CnnExecute End Function Public Function DBCount(ByVal strField As String, _             ByVal strTable As String, _             Optional ByVal strWhere As String = "", _             Optional ByVal ReturnValue = 0) As Variant On Error GoTo Err_DBCount    Dim N    Dim strQuerySQL As String    Dim rst     As ADODB.Recordset    Set rst = New ADODB.Recordset    strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable    If Len(strWhere) > 0 Then      strQuerySQL = strQuerySQL & " WHERE " & strWhere    End If    With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then        .MoveFirst        N = .Fields(0)      End If    End With Exit_DBCount: On Error Resume Next    rst.Close    Set rst = Nothing    DBCount = IIf(N <> 0, N, ReturnValue)    Exit Function Err_DBCount:    MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"    Resume Exit_DBCount End Function

kkninolove
質問者

お礼

ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A