フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

A 回答 (2件)

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません



Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
「'」を外したらできました。
ありがとうございました。

お礼日時:2008/01/21 17:38

開発環境や行った手順について具体的な投稿をしましょう



お使いの開発環境やOSのバージョンやどこコントロールを使ったのか
どういった手順でDBと接続しているのか

公開しても支障の無い範囲でコードを公開してみましょう
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
言葉足らずで申し訳ありません。
以下のようになります。

****1.html*****
<form method="POST" action="2.asp">
<SELECT name="bangou">
<OPTION value="1">1</OPTION>
<OPTION value="2">2</OPTION>
<OPTION value="3">3</OPTION>
</OPTION>
</SELECT>
</form>

****2.asp*****
Set db=Server.CreateObject("ADODB.Connection")
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.ConnectionString = Server.MapPath("3.mdb")
db.open
Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)='" & bangou& "'")

****3.mdb******
テーブル3の番号フィールドのデータ型が「数値型」にすると、
エラーメッセージになります。
「テキスト型」だと問題ありません。

OSはXPprofessional、ACCESSは2003になります。


宜しくお願い致します。

お礼日時:2008/01/21 14:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qクエリで「データ型が一致しません」と表示される

クエリ1とクエリ2をクエリ3で結合するとクエリ3で「データ型が一致しません」と表示されます。

クエリ1のSQL文
SELECT Trim(Replace([PC管理台帳.使用者氏名]," ","")) AS 式1, PC管理台帳.新PC名, PC管理台帳.部署名, PC管理台帳.マシンベンダ名, PC管理台帳.マシンモデル
FROM PC管理台帳;

クエリ1では[使用者氏名]の苗字と名前のスペースを置換しました。

クエリ2のSQL文
SELECT 職員アカウント.職員番号, Trim(Replace([職員アカウント.氏名]," ","")) AS 式1, 職員アカウント.パスワード, 職員アカウント.メールアドレス
FROM 職員アカウント;

クエリ2では[氏名]の苗字と名前のスペースを置換しました。

クエリ3で[使用者氏名]と[氏名]が一致しているものを抽出したいです。

ちなみにクエリ3のSQL文は
SELECT [クエリ2].[式1], [クエリ2].[職員番号]
FROM クエリ1 INNER JOIN クエリ2 ON [クエリ1].[式1]=[クエリ2].[式1];

これでクエリ3をひらくと
「データ型が一致しません」
と表示されます。

どなたかアドバイスお願いします

クエリ1とクエリ2をクエリ3で結合するとクエリ3で「データ型が一致しません」と表示されます。

クエリ1のSQL文
SELECT Trim(Replace([PC管理台帳.使用者氏名]," ","")) AS 式1, PC管理台帳.新PC名, PC管理台帳.部署名, PC管理台帳.マシンベンダ名, PC管理台帳.マシンモデル
FROM PC管理台帳;

クエリ1では[使用者氏名]の苗字と名前のスペースを置換しました。

クエリ2のSQL文
SELECT 職員アカウント.職員番号, Trim(Replace([職員アカウント.氏名]," ","")) AS 式1, 職員アカウント.パスワー...続きを読む

Aベストアンサー

「データ型が一致しません」のエラーが発生するパターンのひとつに、『結合に使用している演算
フィールド(ご質問の件では式1が該当)の結果がエラーとなるレコードが含まれている』というのが
あります。
クエリ1・クエリ2の式1にはReplace関数が使われていますが、Replace関数の第1引数にNullを
指定すると、エラーになります。
従って、恐らく「PC管理台帳」テーブルの「使用者名」か、「職員アカウント」テーブルの「氏名」の
どちらか(或いは双方)が、空欄(Null)になったままのレコードがある可能性があります。
(なお、Trim関数は、第1引数がNullであってもエラーになりません)

上記推測が当たっていれば、
 a)上記フィールドが空欄になっているレコードをなくす
  (その上で、今後のことを考えると値要求を「はい」に設定しておくことをお勧めします)
 b)式1の関数を下記のように変更する
のどちらかの対応をされれば、ご質問のエラーは解消されるものと思います。


式1の変更で対応する場合は、それぞれ以下のようにしてみてください:
(「[PC管理台帳.使用者名]」と「[職員アカウント.氏名]」は、それぞれ「[PC管理台帳].[使用者名]」と
 「[職員アカウント].[氏名]」の誤記と判断して記述しています)

クエリ1:
Select Replace(Nz([PC管理台帳].[使用者氏名], ""), " ", "", 1, -1, 1) As 式1, PC管理台帳.新PC名, PC管理台帳.部署名, PC管理台帳.マシンベンダ名, PC管理台帳.マシンモデル From PC管理台帳;

クエリ2:
Select 職員アカウント.職員番号, Replace(Nz([職員アカウント].[氏名], ""), " ", "", 1, -1, 1) As 式1, 職員アカウント.パスワード, 職員アカウント.メールアドレス, From 職員アカウント;


Nz関数は、第1引数がNull(=文字列扱い不可の空白)だった場合に、第2引数の値に置換する関数
です。第2引数に「""」(空文字=文字列扱い可の空白)を指定することで、Replace関数がエラーに
なるのを回避しています。
Replace関数の一番最後の引数「1」は、半角/全角を区別させないためのものです。これにより、
スペースは全て削除されるため、Trim関数は不要になります。
(その前の「1, -1」は、それぞれ開始位置と置換する文字数の指定です。この辺りは、詳しくは
 ヘルプを確認して下さい)

「データ型が一致しません」のエラーが発生するパターンのひとつに、『結合に使用している演算
フィールド(ご質問の件では式1が該当)の結果がエラーとなるレコードが含まれている』というのが
あります。
クエリ1・クエリ2の式1にはReplace関数が使われていますが、Replace関数の第1引数にNullを
指定すると、エラーになります。
従って、恐らく「PC管理台帳」テーブルの「使用者名」か、「職員アカウント」テーブルの「氏名」の
どちらか(或いは双方)が、空欄(Null)になったままのレコードがある可能性があ...続きを読む

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qアクセスで#エラーを表示させない方法は?

アクセス2000を使用しています。フォームにテキストボックスを貼り付けて、計算式を入れています。計算できない数値になると、#エラーと表示されます。目障りなので、#エラー という表示を消したいのですが、どうしたらよろしいでしょうか?宜しくお願い申し上げ候。

Aベストアンサー

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の左端にあるコンボボックスで「式」を選択
5)上記コンボボックスの隣が1つのテキストボックスになるので、そこに以下のような式を入力
 IsError([テキスト0])
 ※上記の式は当該テキストボックスの名前が「テキスト0」の場合です。
6)上記テキストボックスの下、右から2番目に「A」と表示された、文字色を指定するボタンがあるので、
 その左の小さな「▼」をクリックし、当該テキストボックスの背景と同じ色(既定では白のはず)を選択
7)『OK』ボタンをクリックしてダイアログを閉じる

・・・以上です。
これで、『テキスト0』の計算式がエラーになった場合は、文字色が背景と同じ色になるので、「#エラー」と
いう表示はされていないように見える、という状態にすることができると思います。

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の...続きを読む

Q「Nullの使い方が不正です」のエラー

AccsessとVB間でデータの参照・登録・削除を行うプログラムを作成中です。
テキストボックスにデータを入力せずに更新するとAccess側はNull値が入るので、参照をした際に
「Nullの使い方が不正です」のエラーが表示されます。

Null値が表示可能ならその方法を教えてください。

Aベストアンサー

読み込んだ際にIsNull()で判断してみては?
If IsNull(Fields) Then
Text1.Text = ""
Else
Text1.Text = Fields
End If

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QAccessのクエリで、Left関数を使用して、7桁の数値を抜き出す方

Accessのクエリで、Left関数を使用して、7桁の数値を抜き出す方法。
IDが8桁で入力されているのですが、左から7桁だけを抜き出して、全てのレコードを表示させたかったのですが、誤って入力されている7桁のIDしか表示されませんでした。
いつもExcelを使用している感覚だったので、文字の左から7桁の数値や文字列を抽出して表示してくれるものと思っていました。
元のテーブルに入力されているIDを変更することなく、
クエリで、7桁だけにして、その取り出した7桁で区別し、グループとして認識し合計を出したいと考えているのですが、どうすればよいのでしょうか。
宜しくお願い致します。

Aベストアンサー

>Left関数をする前は、5000行程なのですが、関数を加えたとたん4300程度に減ってしまいます。

関数を加えるのでは無く、関数だけ(演算フィールドのみ)のクエリを作成をして実行させます
単にleft関数で左から何文字取れという演算フィールドしか持たないクエリを実効させれば、指定した桁数に満たない場合には実際にある桁数まで、一文字も入っていない場合には0を返して、全データ分のクエリ結果を返します

全件分のデータが帰って来ないという事は作成しているクエリに問題ありの可能性高いです

先の書き込みに書きましたが、手順は演算フィールドのみのクエリを作成し実行させ全データが取得出来る事を確認してから、この演算フィールドのみのクエリに必用なフィールドを追加してゆくって事してください

QAccess2010 「演算子がありません」エラー

フォーム上に別フォームを開くボタンがあるのですが、クリックすると実行時エラーが表示されます。

実行時エラー 3075
クエリ式”コード IN(○○,××)の構文エラー 演算子がありません。

コードを数値型からテキスト型に変更したのが原因だと思います。
エラーが出ない方法を教えていただければ助かります。
よろしくお願いいたします。

Dim rst As Recordset
Dim strWhere As String

Set rst = Me.RecordsetClone
With rst
If .RecordCount = 0 Then
Beep
Exit Sub
End If
.MoveFirst
strWhere = ""
Do Until .EOF
strWhere = strWhere & IIf(Len(strWhere) > 0, ",", "") & !コード
.MoveNext
Loop
.Close
strWhere = "コード IN (" & strWhere & ")"
End With

DoCmd.OpenForm "フォーム", , , strWhere

フォーム上に別フォームを開くボタンがあるのですが、クリックすると実行時エラーが表示されます。

実行時エラー 3075
クエリ式”コード IN(○○,××)の構文エラー 演算子がありません。

コードを数値型からテキスト型に変更したのが原因だと思います。
エラーが出ない方法を教えていただければ助かります。
よろしくお願いいたします。

Dim rst As Recordset
Dim strWhere As String

Set rst = Me.RecordsetClone
With rst
If .RecordCount = 0 Then
Beep
Exit Sub
End If
...続きを読む

Aベストアンサー

補足をよんでいなかったので、In句の中身の使い道
がわかりませんでした。

コード IN(○○,××)

○○,××は、元フォームに表示されているレコードになりますので


ということならば、No3の方の回答の、

strWhere = ",'" & !コード & "'"



strWhere = strWhere & ",'" & !コード & "'"

にすればよろしいかと。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報