Access 2000 修正更新

  初期処理



フォームのレコードソースには、テーブルを選択しています
移動ボタンは非表示です

フォーム用の更新用フラグとして

Dim bUpdate

を定義しています。

この変数は、更新ボタンをクリックして更新が確定した時にセットされます。そして、そのフラグは Form_BeforeUpdate でチェックされ、更新ボタン以外から発生する更新イベントをシャットアウトします

  
Private Sub Form_Load()

' 更新可能フラグ OFF
    bUpdate = False
    
' フィルタ適用 OFF
    Me.FilterOn = False
    
' 明細表示 OFF
    Me.Section(0).Visible = False
    
' 更新・キャンセルボタン disable
    Me.更新.Enabled = False
    Me.キャンセル.Enabled = False
    
' 表示エリアクリア
    Me.資格名.Value = ""
    
' 削除不能
    Form.AllowDeletions = False

End Sub
  



  フォーム更新イベントのコントロール



  
Private Sub Form_BeforeUpdate(Cancel As Integer)

' 更新ボタンをクリックして更新確認した時のみ更新可能
    If Not bUpdate Then
        Cancel = True
    End If
     
    bUpdate = False
    
End Sub
  



  更新ボタンの処理

最初に更新可能な状態であるかどうかチェックを行ないます。IsRec は、対象レコード数が 1 の時に True となります。更新可能であれば、更新確認をダイアログで確認させ、OK であれば bUpdate を True にして更新を行います

  
Private Sub 更新_Click()
    
    If IsNull(Me.資格コード.Value) Then
        MsgBox ("資格を選択して下さい")
        Exit Sub
    End If
    If IsNull(Me.学籍番号.Value) Then
        MsgBox ("学生を選択して下さい")
        Exit Sub
    End If
    
    If Not IsRec(Me) Then
        MsgBox ("対象レコードが存在しない為、更新できません")
        Exit Sub
    End If
    
    If MsgBox("更新しますか?", vbOKCancel) = vbOK Then
        bUpdate = True
        On Error Resume Next
        DoCmd.RunCommand acCmdSaveRecord
        If Err.Number <> 0 Then
            MsgBox (Err.Description)
        End If
        On Error GoTo 0
    End If
   
  

  
' *********************************************************
' 対象レコードの存在
' *********************************************************
Public Function IsRec(obj) As Boolean

    If obj.Recordset.RecordCount = 1 Then
        IsRec = True
    Else
        IsRec = False
    End If

End Function
  



  キャンセル

連結フィールドに対する変更が加えられている場合にのみ、Form を Undo します。これによって、カレントレコードの状態が編集前に戻されます

  
Private Sub キャンセル_Click()

    If Me.Dirty Then
        If MsgBox("入力をキャンセルしますか?", vbYesNo) = vbYes Then
            Me.Undo
            Me.Refresh
        End If
    Else
        MsgBox ("編集されていません")
    End If
    
End Sub
  



  終了

  
Private Sub 終了_Click()

    DoCmd.Close , , acSaveNo

End Sub
  



  データコントロール

このテーブルのキーは、二つあり、コンボボックスでデータが選択できるようになっています。初期画面ではどちらもデータが無い状態であり、両方選択されている場合のみフィルタを有効にします。

対象レコードが無い場合は、セクション(明細)は表示されません。また、更新ボタンもキャンセルボタンも使用できません

ここで重要なのが、Me.Undo という処理です。キーが変更されるとカレントレコードの状態は全て編集前の状態に戻り、Filter が正しく動作します。但し、非表示の場合前のデータが残るので、表示後は Reflesh する必要があります

  
Private Sub 学籍番号_AfterUpdate()

    If Not IsNull(Me.資格コード.Value) And _
        Not IsNull(Me.学籍番号.Value) Then
        Me.Undo
        Me.FilterOn = False
        Me.Filter = "学籍番号 = " & Me.学籍番号.Value
        Me.Filter = Me.Filter & " and 資格コード = " & Dd(Me.資格コード.Value)
        Me.FilterOn = True
        
        Me.Section(0).Visible = IsRec(Me)
    Else
        Me.Section(0).Visible = False
    End If
    
    Me.更新.Enabled = Me.Section(0).Visible
    Me.キャンセル.Enabled = Me.Section(0).Visible

    Me.Refresh

End Sub

Private Sub 資格コード_AfterUpdate()
    
    Me.資格名.Value = Me.資格コード.Column(2)
    
    If Not IsNull(Me.資格コード.Value) And _
        Not IsNull(Me.学籍番号.Value) Then
        Me.Undo
        Me.FilterOn = False
        Me.Filter = "学籍番号 = " & Me.学籍番号.Value
        Me.Filter = Me.Filter & " and 資格コード = " & Dd(Me.資格コード.Value)
        Me.FilterOn = True
        
        Me.Section(0).Visible = IsRec(Me)
    Else
        Me.Section(0).Visible = False
    End If

    Me.更新.Enabled = Me.Section(0).Visible
    Me.キャンセル.Enabled = Me.Section(0).Visible

    Me.Refresh

End Sub
  

  
' *********************************************************
' " 挟み込み
' *********************************************************
Public Function Dd(strValue)

    Dd = """" & strValue & """"

End Function
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加




SQLの窓  天気  IT用語辞典
Yahoo!ニュース  マルチ辞書
PHP マニュアル  Google URL短縮 


フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ