Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


143 / 2272 ツリー ←次へ | 前へ→

【12860】3061または94のエラーについて さっちも 15/7/2(木) 18:15 質問[未読]
【12861】Re:3061または94のエラーについて かるびの 15/7/3(金) 0:07 回答[未読]
【12862】Re:3061または94のエラーについて さっちも 15/7/3(金) 15:38 お礼[未読]

【12860】3061または94のエラーについて
質問  さっちも  - 15/7/2(木) 18:15 -

引用なし
パスワード
   はじめまして。

現在、以下のような関数を作成しているのですが、Nullの入ったフィールド値をSQL文で読みだそうとすると、「Set R1 = DB.OpenRecordset(SQL_Txt)」のところで、エラー番号3061または94のエラーが発生します。

いろいろ調べてみたのですが、原因と修正方法がわかりません。

■関数の概要:
 指定したテーブル名、キーフィールド名とキー値から、指定したフィールドの値を取得する。

SQL文の例:
 SELECT 名前 AS A FROM テーブル1 WHERE テーブル1.ID=13


ご教授いただければと思います。

よろしくお願いします。


================================
Function getDataFromDB(ByVal Sql_table As String, ByVal Sql_keyid As String, ByVal Sql_keyidvalue As Variant, ByVal WantToGet_item As Variant)

  Dim SQL_Txt, A, B As String
  
If Sql_keyid = "ID" Or Sql_keyid = "管理番号" Then
    SQL_Txt = "SELECT " & WantToGet_item & " AS A FROM " & Sql_table & " WHERE " & Sql_table & "." & Sql_keyid & "=" & Mid(Str(Sql_keyidvalue), 2)
  Else
    SQL_Txt = "SELECT " & WantToGet_item & " AS A FROM " & Sql_table & " WHERE " & Sql_table & "." & Sql_keyid & "='" & Sql_keyidvalue & "'"
End If


On Error GoTo Err:

  Dim DB As DAO.Database
  Dim R1 As DAO.Recordset

  Set DB = CurrentDb()
  Set R1 = DB.OpenRecordset(SQL_Txt) ★ここでエラー発生★
  B = R1!A
  R1.Close
    Set R1 = Nothing
  DB.Close
    Set DB = Nothing

  getDataFromDB = B
  Exit Function

Err:

  Call goError("DBエラー(getDataFromDB)", SQL_Txt)
  
End Function

【12861】Re:3061または94のエラーについて
回答  かるびの  - 15/7/3(金) 0:07 -

引用なし
パスワード
   >エラー番号3061または94のエラーが発生します。
 両者は、全然違うタイプのエラーみたいなんですが、
それぞれエラーメッセージはどんなものですか。


 OpenRecordsetメソッドでエラーになったときは、SQL文を確認するのが常道です。
 ことに、SQL文を変数に格納しているときはなおさらです。

 OpenRecordsetメソッドを実行するコードの直前に
   Debug.Print SQL_Txt
というコードを臨時に挿入した上で、コードを実行し、
エラーになったあと、VBEのウィンドウでイミディエイトウィンドウを開いて、
SQL_Txt 変数に何が格納されているか確認してみてください。


 ところで、
getDataFromDB 関数の Sql_keyidvalue 引数と WantToGet_item 引数は、なぜ Variant 型にしているのでしょうか。
 いずれの引数もSQL文の一部になるわけですから、String 型とすべきではないでしょうか。

 また、SQL_Txt 変数をなぜ Variant 型にしているのでしょうか。

【12862】Re:3061または94のエラーについて
お礼  さっちも  - 15/7/3(金) 15:38 -

引用なし
パスワード
   さっちもです。

かるびのさん、ご返信ありがとうございました。

以下、インラインで回答致します。

▼かるびの さん:
>>エラー番号3061または94のエラーが発生します。
> 両者は、全然違うタイプのエラーみたいなんですが、
>それぞれエラーメッセージはどんなものですか。
>
>
> OpenRecordsetメソッドでエラーになったときは、SQL文を確認するのが常道です。
> ことに、SQL文を変数に格納しているときはなおさらです。
>
> OpenRecordsetメソッドを実行するコードの直前に
>   Debug.Print SQL_Txt
>というコードを臨時に挿入した上で、コードを実行し、
>エラーになったあと、VBEのウィンドウでイミディエイトウィンドウを開いて、
>SQL_Txt 変数に何が格納されているか確認してみてください。

やはりそれしか方法はないですかね・・。
とりあえず処理に問題がないと思うので、わかっている
エラーコードをキャッチした場合は、空のStringを返却するように
修正して当面はしのごうと思っています。

>
> ところで、
>getDataFromDB 関数の Sql_keyidvalue 引数と WantToGet_item 引数は、なぜ Variant 型にしているのでしょうか。
> いずれの引数もSQL文の一部になるわけですから、String 型とすべきではないでしょうか。
> また、SQL_Txt 変数をなぜ Variant 型にしているのでしょうか。

こちらは、呼び出す元から指定される変数(これは結局、Sql_keyidvalueだけでした)がIntegerの場合があるためです。

たしかに、WantToGet_item、Sql_keyid、SQL_Txt はString型にすべきですね。

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

143 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free