2017-07-07 9 views
0

メインフォームと複数のレコードを表示するサブフォームがあります。メインフォームでチェックボックスをオンにすると、サブフォームのすべての "BoxLblTime"と "Material Arrived"フィールドを更新します。MS Access:サブフォームレコードをループするとエラー '3021'が発生する

1)メインフォーム上のチェックボックスがチェックされ、二つのフィールド:このコードを使用して、いくつかの異常な動作があり

Private Sub MaterialArrived_chkbx_Click() 
    Dim temp As Variant 
    Dim tempString As String 
    Dim ctl As Control 

    'If checkbox is checked 
    If Forms("JOBS Form").Controls("MaterialArrived_chkbx").Value < 0 Then 

     Dim rs As Object 
     'Get records of subform 
     Set rs = Forms("JOBS Form").[Order Form].Form.Recordset 
     'Loop until end 
     Do While Not rs.EOF 
     rs.Edit 
     'Update the two fields 
     rs![Material arrived] = True 
     rs!BoxLblTime = Now() 
     rs.Update 
     rs.MoveNext 
     Loop 
     Set rs = Nothing 
    End If 
End Sub 

:これはチェックボックスがクリックされたときに実行されるVBAコードでありますサブフォームで更新されます。しかし、サブフォームのチェックボックスをオフにして、メインフォームチェックボックスを再チェックすると、サブフォームチェックボックスはオフのままです。

2)メインフォームのチェックボックスをオンにすると、2つのフィールドが更新されます。しかし、サブフォームのチェックボックスをオフにした場合、サブフォームレコードの新しいセット(次または後)に移動し、メインフォームのチェックボックスをオンにすると、エラーが表示されます。 '3021'現在のレコードがありません。

この異常な動作はなぜ発生しますか?

編集:ここでは が更新クエリのアプローチを使用して私のコードです:

Private Sub MaterialArrived_chkbx_Click() 
    If Forms("JOBS Form").Controls("MaterialArrived_chkbx").Value < 0 Then 

     With CurrentDb().QueryDefs("Update Orders") 
     .Parameters("[Material Arrived]").Value = True 
     .Parameters("[BoxLblTime]").Value = Now() 
     .Execute dbFailOnError 
     End With 
     Forms("JOBS Form").Form.Requery 
    End If 
End Sub 

しかし、私は「アイテムコレクションに見つかりません」エラーを取得しています。

+0

おそらくRecordsetCloneを使用する必要があります。レコードセットオブジェクト変数を宣言する必要はありません。 – June7

+0

レコードを変更したくない場合にのみ使用するべきだと思いましたか?しかし、私はレコードを更新したい。 – Jaitnium

+0

おっと、申し訳ありませんが、無視しています。 – June7

答えて

1

私は別のアプローチを提案します。

更新クエリを作成し、が到着したことを示すブールパラメータをの値で渡します。

'Call update query 
Private Sub MaterialArrived_chkbx_Click() 
    With CurrentDb().QueryDefs("Update Orders") 
     .Parameters("[prmMaterialArrived]").Value = Me.MaterialArrived_chkbx.Value 
     .Parameters("[prmID]").Value = Me!ID 
     .Execute dbFailOnError 
    End With 
    Me.[Order Form].Form.Requery 
End Sub 


'SQL 
PARAMETERS [prmMaterialArrived] Bit, [prmID] Long; 
UPDATE T 
SET T.[Material arrived] = [prmMaterialArrived], T.BoxLblTime = Now() 
WHERE (((T.ID)=[prmID])); 
+0

私はこれを試して、それがどのように進むのか教えてあげます。 – Jaitnium

+0

更新クエリを作成し、2つのフィールドを追加して、サンプルコードで正しい名前を置換しましたが、最初のパラメータ(Material Arrived)に対して「コレクションに見つかりません。 – Jaitnium

+1

フィールド名を確認しましたか?あなたは一見を持って更新SQLとコードを投稿できますか? –

関連する問題