2016-08-23 4 views
1

レコードをテーブルに追加するために保存された挿入クエリがあります。クエリのパラメータは、バインドされていないフォームから取得します。表の2つのフィールドは、はい/いいえのデータ型です。これらのフィールドのフォームコントロールはチェックボックスです。ここでMS Access 2013がVBAから奇妙なエラーで挿入クエリを呼び出す

が保存されたクエリが「qryInsertLog」

ある
PARAMETERS UserPar Text (255), ApprovedByPar Text (255), CCedByPar Text (255), 
      UnitIdPar Short, NotePar LongText, Z3Par Bit, Z5Par Bit, FollowupNotesPar LongText; 

INSERT INTO tblLogBook ([User], ApprovedBy, CCedBy, UnitID, Notes, Z3, Z5, FollowupNotes) 

SELECT [UserPAR] AS Expr1, [ApprovedByPar] AS Expr2, [CCedByPar] AS Expr3, 
     [UnitIDPar] AS Expr4, [NotePar] AS Expr5, [Z3Par] AS Expr6, [Z5Par] AS Expr7, 
     [FollowupNotesPar] AS Expr10; 

ここに私のフォーム上のボタンを救うに縛ら私のVBAコードさ:

Private Sub cmdSaveandNew_Click() 

Dim db As DAO.Database 
Dim qdf1 As DAO.QueryDef 

Set db = CurrentDb 
Set qdf1 = db.QueryDefs("qryInsertLog") 

'put form parameters into insert query 
qdf1.Parameters(0).Value = Me.cboUser.Value 
qdf1.Parameters(1).Value = Me.cboApprover.Value 
qdf1.Parameters(2).Value = Me.cboCCer.Value 
qdf1.Parameters(3).Value = Me.cboUnit.Value 
qdf1.Parameters(4).Value = Me.txtNotes.Value 
qdf1.Parameters(5).Value = Me.chkZ3.Value 
qdf1.Parameters(6).Value = Me.chkz5.Value 
qdf1.Parameters(7).Value = Me.txtFollowup.Value 

qdf1.Execute 

Set qdf1 = Nothing 
Call resetForm 

End Sub 

「resetFormは」単に返すルーチンですフォームコントロールをデフォルト値に戻します。

保存ボタンを押したときに、レコードが追加されることがありますが、Me.chkZ3.ValueとMe.chkZ5.Valueの値が正しく設定されていない場合があります(これをチェックしても、偽として)。

Run-time error '3000': 

Reserved error (-3033); there is no message for this error. 

これについての最も興味深い部分は、しかし、唯一の1はい/いいえフィールドを含めるために、私は私のクエリを変更するとき、私は得ることです:保存ボタンを数回押した後、私は次のエラーを取得開始しますエラーやレコードは正しく更新されません。

ここで何が起こっているのですか?

編集:アクセスオブジェクトウィンドウ(VBAではなく)からクエリを実行すると、それは正確に動作するはずです。

+0

少なくとも1つの情報源によれば、-3033は権限エラーです。 (https://groups.google.com/forum/#!topic/microsoft.public.sqlserver.replication/ZE-SNQsJ0Qs)2つのチェックボックスを使用している場合にのみ発生する理由は...考えられません。 – Mikegrann

+0

あなたがあなたの 'PARAMETERS'宣言の' Bit'を 'Short'(あるいは' Long')に変更すれば? – Andre

+0

パラメータのデータ型宣言を変更しても全く動作しません。 –

答えて

1

問題はLongTextパラメータです。このコード長いテキストのパラメータ(2、10、3)用

Set db = CurrentDb 
Set qdf1 = db.QueryDefs("qAppForInsert") 

qdf1.Parameters(0).Value = "asdf" 
qdf1.Parameters(1).Value = 77 
qdf1.Parameters(2).Value = String(3, "a") 
qdf1.Parameters(3).Value = True 
qdf1.Parameters(4).Value = False 

qdf1.Execute 

および種々の長さで

PARAMETERS pText1 Text (255), pInt1 Short, pMemo1 LongText, pYesno1 Bit, pYesno2 Bit; 
INSERT INTO ForInsert (text1, int1, Memo1, yesno1, yesno2) 
SELECT [pText1] AS A1, [pInt1] AS A2, [pMemo1] AS A3, [pYesno1] AS A4, [pYesno2] AS A5; 

:私は、同様のクエリを試みました。

このクレイジーデータが表示されます(Yes/Noフィールドは常にyesno1 = Trueyesno2 = False!):

+----+-------+------+------------+--------+--------+ 
| ID | text1 | int1 | Memo1 | yesno1 | yesno2 | 
+----+-------+------+------------+--------+--------+ 
| 8 | asdf | 77 | aa   | True | False | 
| 9 | asdf | 77 | aaaaaaaaaa | False | False | 
| 10 | asdf | 77 | aaa  | False | True | 
+----+-------+------+------------+--------+--------+ 

だから、明らかに長いテキストのパラメータを持つ、あなたの代わりにパラメータ化クエリのRecordSet.AddNewを使用したほうが良いです。

パラメータは、とにかくlimited to 255 charactersです。

補遺

私はシステムを見つけるために、ループ内のコードを実行した場合、私はまたReserved error (-3033)を取得します。

+0

RecordSet.AddNewを使用するとうまくいきます。助けてくれてありがとう! –

0

フォームフィールドにNull値を追加してエラーを追跡してチェックすることをお勧めします。それを言って、この1つの修正はあなたの直面する問題を解決するかもしれません。

私はあなたのZ3とZ5フィールドがビットフィールドであると仮定します。これは、一致するパラメータタイプをどのように宣言したかでわかります。それがそうなら

、あなたはヌルチェックボックスのトラップおそらく必要があり、追記として真(-1)に1

' Set to 0 if checkbox is Null, Set to 1 if checked=true 
' Bit fields can't take -1 values 
qdf1.Parameters(5).Value = IIf(Nz(Me.chkZ3.Value, 0), 1, 0) 
qdf1.Parameters(6).Value = IIf(Nz(Me.chkz5.Value, 0), 1, 0) 

を変換し、私はまた、ケース順に数値インデックスの代わりに名前付きパラメータを使用して示唆うこれらのこれまでの変更を取得 - とも読みやすさと将来のメンテナンスのために利用

代わりの

qdf1.Parameters(0).Value = Me.cboUser.Value 

関連する問題