INSERT INTOで数値型にNull代入

このQ&Aのポイント
  • フォームのcmb性別を選択せず登録ボタンを押してINSERTするとエラーになる場合がある。
  • 性別フィールドは必須項目にせず選択しない時は空白でレコードに追加にしたい。
  • INSERT文の実行前に数値型フィールドにNullを代入することはできない。
回答を見る
  • ベストアンサー

INSERT INTOで数値型にNull代入

Win XP Access 2003 お世話になります。 下記のコードで、 フォームのcmb性別を選択せず登録ボタンを押してINSERTするとエラーになります。 調べた所、数値型フィールドにNullを代入出来ないとありました。 性別フィールドは必須項目にせず選択しない時は空白でレコードに追加にしたいです。 過去ログを調べてほぼ同じ質問を見つけましたが本人さんが自己解決したらしく具体的なコードが記されていません・・・ アドバイス宜しくお願いいたします。 Dim adoCN As ADODB.Connection Dim strSQL As Variant Set adoCN = Application.CurrentProject.Connection strSQL = "INSERT INTO T顧客情報" _ & " (顧客コード" _ & " ,顧客名" _ & " ,性別)" strSQL = strSQL _ & "VALUES (" & Me!txt顧客コード.Value & "" _ & " ,'" & Me!txt顧客名.Value & "'" _ & " ,'" & Me!cmb性別.Value & "')" adoCN.BeginTrans adoCN.Execute strSQL If Err.Number = 0 Then adoCN.CommitTrans MsgBox Format(txt顧客コード, "0000000") & Chr(13) & txt顧客名 & Chr(13) & "を登録しました。", 64, "確認! 登録" Else adoCN.RollbackTrans MsgBox Format(txt顧客コード, "0000000") & Chr(13) & txt顧客名 & Chr(13) & "の登録に失敗しました。", 64, "確認! 登録" End If adoCN.Close Set adoCN = Nothing

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

>& " ,'" & Nz(Me!cmb性別, Null ).Value & "'" _ & " ,'" & Nz(Me!cmb性別.Value, Null) & "'" _ では?

UMEGEN-0315
質問者

お礼

早急なレスありがとうございます! >& " ,'" & Nz(Me!cmb性別.Value, Null) & "'" _ 試させて頂いたのですが結果は同じでした・・・ & " ,'" & Null & "'" _ではエラー & " ,'" & 0 & "'" _では追加出来るので、やはり数値型にはNull代入は不可能なのでしょうか? そうなると、数値型で空白にしたい場合Nullに代用できるものはありますでしょうか? 面倒な質問で申し訳ありません!御教授お願いいたします。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。確認のために、IF文の前に、 If IsNull(Me!cmb性別) Then If MsgBox("性別が選択されていません。このまま登録しますか", vbYesNo) = vbNo Then Exit Sub End If End If を入れて誤登記を防ぐということも必要かも しれません。

UMEGEN-0315
質問者

お礼

説明が足りずに申し訳ありません! 顧客登録で個人の場合は性別を選択し登録を行うのですが、法人の場合はcmb性別を(フォーム上非表示)にして選択せずに登録を行いたいのです。 他にも 顧客コードを数値型で管理したく、フィールドに「紹介者」と言う項目がありまして、 ここに顧客コードを入れたいのですが、紹介者がいない場合は空白で登録したいのですが・・・ 過去ログで調べ、 & " ,'" & Nz(Me!cmb性別, Null ).Value & "'" _ などやってみましたが、うまく行きません。 Function などでNullをセットするなどの過去ログがありましたが、これはかなり難易度の高い作業なのでしょうか? アドバイス宜しくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

cmb性別で選択されている場合といない場合を振り分けて、 If Not IsNull(Me!cmb性別) Then strSQL = "INSERT INTO T顧客情報" _ & " (顧客コード" _ & " ,顧客名" _ & " ,性別)" strSQL = strSQL _ & "VALUES (" & Me!txt顧客コード.Value & "" _ & " ,'" & Me!txt顧客名.Value & "'" _ & " ,'" & Me!cmb性別.Value & "')" Else strSQL = "INSERT INTO T顧客情報" _ & " (顧客コード" _ & " ,顧客名)" strSQL = strSQL _ & "VALUES (" & Me!txt顧客コード.Value & "" _ & " ,'" & Me!txt顧客名.Value & "')" End If adoCN.BeginTrans adoCN.Execute strSQL のように、SQL文にcmb性別のデータを含めるか 含めないかにしてみては?

UMEGEN-0315
質問者

お礼

毎回お世話になります! 今回のフィールドは50行ほどありましてIf~Else~End Ifですとかなり長くなってしまいますので、 他の方法を考えたいと思います。 ありがとうございます。

回答No.1

テーブルのフィールドのプロパティを編集する。 「値要求」がNULLの禁止/許可を示します。

UMEGEN-0315
質問者

お礼

返答ありがとうございます! テーブルの値要求は「いいえ」になっています。 テキスト型か既定値を「0」にすればエラーは回避できるのですが・・・ 何とか数値型のままNullでもエラーを回避し追加する方法は無いでしょうか、 お力添えよろしくお願いいたします。

関連するQ&A

  • NULL文字のINSERT

    こんにちは。 SQLServer初心者です。 Access VBAで SQLServerから抽出したデータをDBにINSERT しようとしてるのですが、抽出した項目にNULLデータがあるので エラーになってしまいます。 どのように回避すればよろしいでしょうか? ISNULL関数を使えば回避できるのでしょうか? たとえば以下のようなINSERT分を実行したいのですが、 顧客名_漢字のフィールドにはNULL文字が入ってる場合があるとします。 よろしくお願い致します。 strSQL2 = "" strSQL2 = strSQL2 & " INSERT INTO NORSE_TMP_DATA ( " strSQL2 = strSQL2 & " ポート名" strSQL2 = strSQL2 & ", 顧客名_漢字" strSQL2 = strSQL2 & ", 顧客名_カナ" strSQL2 = strSQL2 & ", 契約状態" strSQL2 = strSQL2 & ", 契約番号" strSQL2 = strSQL2 & ", 契約枝番号" strSQL2 = strSQL2 & ", 顧客番号" strSQL2 = strSQL2 & " VALUES (" strSQL2 = strSQL2 & " '" & rs.Fields("ポート名").Value & "'" strSQL2 = strSQL2 & ", '" & rs.Fields("顧客名_漢字").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("顧客名_カナ").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("契約状態").Value & "'" strSQL2 = strSQL2 & "," & rs.Fields("契約番号").Value strSQL2 = strSQL2 & "," & rs.Fields("契約枝番号").Value strSQL2 = strSQL2 & "," & rs.Fields("顧客番号").Value strSQL2 = strSQL2 & " )"

  • 帳票フォームでカーソル移動

    帳票フォームでカーソル移動 お世話になります、帳票フォームでフォームヘッダーに非連結txtBoxを2つ置き(txt適用開始日、txt消費税率) 詳細にクエリのフィールドを表示させています。 下記コードでフォームのダブルクリック時にヘッダーのtxtBoxにレコードを表示させています、 その後カーソルをヘッダーの”txt消費税率”に移動させたく DoCmd.GoToControl "txt消費税率" Forms!フォーム名.txt消費税率.SetFocus Me!txt消費税率.SetFocus 色々試しては見たのですがカーソル移動してくれません! アドバイス宜しくお願いいたします。 Dim adoCN As ADODB.Connection   Dim adoRS As ADODB.Recordset Dim strSQL As String Set adoCN = Application.CurrentProject.Connection strSQL = " SELECT *" _ & " FROM ta02消費税" _ & " WHERE 摘要開始日= #" & Me!txt摘要開始日2 & "#" Set adoRS = adoCN.Execute(strSQL) If adoRS.EOF = False Then Me!txt摘要開始日.Value = adoRS("摘要開始日").Value Me!txt消費税率.Value = adoRS("消費税率").Value * 100 Else MsgBox "該当データがありません", vbOKOnly + vbExclamation, "消費税" Cancel = True Exit Sub adoRS.Close adoCN.Close Set adoRS = Nothing Set adoCN = Nothing End If DoCmd.GoToControl "txt消費税率" ←’タイミングも色々ずらして試したのですが・・・ Me!cmd登録.Visible = False Me!cmd削除.Visible = True End Sub

  • INSERT INTOステートメント構文エラーにつ

    初めましてご教授よろしくお願いします。 ■環境 office365(ExcelとAccess) INSERT INTOステートメント構文エラーについての質問です。 著:今村ゆうこさんの『Excel&Access連携 実践ガイド』を読みながら現在作業を しています。 やりたいことはExcelのデータをaccessに書き込むことです。 エラー内容は「INSERT INTO ステートメントの構文エラーです。」と表示されます。 しかし、何度も見直して見ましたが、どこがエラーの原因かわかりません。 VBAは基本的部分が分かる程度で、現在勉強中です。 正直手詰まりといった感じで何を修正すれば良いかわからないというのが現状でこちらに質問させていただきました。 皆様の知恵を貸してください。どうかよろしくお願い致します。 ▼Excelデータ Product Name / Merchant SKU / ASIN / Condition / qty ○○(商品名) / テキスト / テキスト / テキスト / 個数 strSQL = _ "INSERT INTO テーブル(" & _ "Product Name, " & _ "Merchant SKU, " & _ "ASIN, " & _ "Condition, " & _ "qty) " & _ "VALUES(" & _ "'" & Cells(n, 1) & "', " & _ "'" & Cells(n, 2) & "', " & _ "'" & Cells(n, 3) & "', " & _ "'" & Cells(n, 4) & "', " & _ Cells(n, 5) & ");" ▼書籍に記載のあった例(添付CDのデータを丸々コピペしています) strSQL = _ "INSERT INTO 販売管理(" & _ "商品コード, " & _ "商品名, " & _ "売上日, " & _ "数量, " & _ "売価, " & _ "製造場所, " & _ "定価, " & _ "原価, " & _ "取引先, " & _ "営業所, " & _ "社員名) " & _ "VALUES(" & _ "'" & Cells(n, 1) & "', " & _ "'" & Cells(n, 2) & "', " & _ "#" & CDate(Cells(n, 3)) & "#, " & _ Cells(n, 4) & ", " & _ Cells(n, 5) & ", " & _ "'" & Cells(n, 6) & "', " & _ Cells(n, 7) & ", " & _ Cells(n, 8) & ", " & _ "'" & Cells(n, 9) & "', " & _ "'" & Cells(n, 10) & "', " & _ "'" & Cells(n, 11) & "');" ▼全体の文 Option Explicit '変数の宣言を強制する '---ACCESS接続用 Private adoCn As Object 'ADOコネクションオブジェクト Private adoRs As Object 'ADOレコードセットオブジェクト Private strSQL As String 'SQL文 Sub DBconnect(flg As Boolean) 'DB接続プロシージャ Dim DBpath As String DBpath = ThisWorkbook.Path Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 If flg = True Then Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & DBpath & "\SampleData.accdb;" 'Accessファイルを開く End Sub Sub DBcut_off(flg As Boolean) 'DB切断プロシージャ If flg = True Then adoRs.Close 'レコードセットのクローズ adoCn.Close 'コネクションのクローズ Set adoRs = Nothing 'オブジェクトの破棄 Set adoCn = Nothing End Sub Sub DBinsert_all() 'DB一括書込 Dim start_i As Long, end_i As Long, n As Long If MsgBox("一括書込を実行しようとしています。続けますか?", vbOKCancel) <> 1 Then 'メッセージ Exit Sub 'OK以外なら終了 End If If MsgBox( _ "Accessの「販売管理」テーブルのデータを一度削除し、" & vbCrLf & _ "現在このシートにある情報のみが書き込まれます。" & vbCrLf & _ vbCrLf & _ "実行してよろしいですか?", vbOKCancel + vbExclamation, "一括書込み") <> 1 Then 'メッセージ Exit Sub 'OK以外なら終了 End If start_i = 2 'スタート行 end_i = Range("A1").End(xlDown).Row '最終行を取得 Call DBconnect(False) 'DB接続 On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ adoCn.BeginTrans 'トランザクション開始 strSQL = "DELETE FROM 販売管理;" 'テーブル内データを全削除 adoCn.Execute strSQL '削除実行 For n = start_i To end_i 'データのある行を繰り返す strSQL = _ adoCn.Execute strSQL '書込実行 Next n adoCn.CommitTrans 'トランザクション終了(確定処理) Call DBcut_off(False) 'DB切断 MsgBox "正常に完了しました" Exit Sub

    • ベストアンサー
    • MySQL
  • ACCESS2007 VBA 「INSERT INTO~」について

    ACCESS2007を使用しています。 VBAにて、下記の内容を記述しています。(前後は略しています) 特にエラーも出ていなくて、最後まできちんと実行されるのですが、顧客マスタにデータが追加されません。 strSQL = "INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) " & _ "VALUES(" & tID & ",'" & rs!顧客名 & "','" & rs!カナ & "','" & rs!郵便番号 & "','" & rs!住所 & "','" & rs!電話番号 & "','" & rs!FAX & "');" db.Execute strSQL イミディエイトウィンドウで、strSQLの内容を表示してみたら、下記のようになりました。 特におかしな所もなく、テーブル名も正しいです。 INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) VALUES(9265,'テスト顧客','テスト','5555555','テスト住所','111-111-1111','222-222-2222'); その他にも、「INSERT INTO~」を使ってテーブルにデータを追加していますが、それはちゃんと追加されていて、なぜか顧客マスタのみ追加されません。 エラーも出ないので解決できなくて困っています。 よろしくお願いします。

  • 非連結フォームにレコード表示したい!

    フォームにレコードを表示させたいのですが、 ”FROM 句の構文エラー”と出ます、ヘルプを参照すると何故か表示されません! 「strSQL~Me!年号コード」までの間が間違っているのでしょうか? アドバイス宜しくお願いいたします。 Dim adoCON As ADODB.Connectio Dim adoREC As ADODB.Recordset Dim strSQL As String Set adoCON = Application.CurrentProject.Connection strSQL = "SELECT *" _ & "FROM ta01年号" _ & "WHERE 年号コード =" & Me!txt年号コード Set adoREC = adoCON.Execute(strSQL) If adoREC.EOF = False Then Me!txt年号コード.Value = adoREC(年号コード).Value Me!txt年号.Value = adoREC("年号").Value Else MsgBox "該当データがありません", vbOKOnly + vbExclamation, "年号" Cancel = True Exit Sub adoREC.Close adoCON.Close Set adoREC = Nothing Set adoCON = Nothing End If

  • 1つのフォームから複数のテーブルにレコード追加をやってみました。

    1つのフォームから複数のテーブルにレコード追加をやってみました。 そこで疑問があるのですが、Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのですか? 一応下記のコードで2つのテーブルにレコードを追加出来たのですが、素人の推測でやってみたので間違っている所がないか見て頂きたいです。 返答よろしくお願いします。 Dim cn As ADODB.Connection Dim rs1 As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset Set rs2 = New ADODB.Recordset Beep If MsgBox(Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しますか?", 33, "確認! 登録") = vbOK Then rs1.Open "T車検証", cn, adOpenKeyset, adLockPessimistic rs2.Open "T所有者", cn, adOpenKeyset, adLockPessimistic rs1.AddNew rs1!車両コード = Me.txt車両コード rs1!登録番号 = Me.txt登録番号 rs1!交付年月日 = Me.txt交付年月日 rs1!初度年月 = Me.txt初度年月 rs1.Update rs2.AddNew rs2!車両コード = Me.txt車両コード rs2!所有者 = Me.txt所有者 rs2.Update rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn.Close: Set cn = Nothing MsgBox Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub

  • 複数の条件を満たすレコード検索教えてください!

    複数の条件を満たすレコード検索教えてください! 現在フォームのコマンドボタンでサブフォームの絞込みを下記のコードで行っています・・・が、 ”顧客コード”と”顧客名”を同時に入力して検索すると”顧客コード”を無視して”顧客名”だけを 検索してしまいます、複数の条件を全て満たすにはどうすれば良いか教えてください。 よろしくお願いいたします。 Private Sub cmd検索_Click() If Not IsNull(txt顧客コード) Then S顧客.Form.Filter = "顧客コード like '" & txt顧客コード.Value & "'" S顧客.Form.FilterOn = True End If If Not IsNull(cmb顧客区分) Then S顧客.Form.Filter = "顧客区分 like '" & cmb顧客区分.Value & "'" S顧客.Form.FilterOn = True End If If Not IsNull(txt顧客名) Then S顧客.Form.Filter = "顧客名カナ like '*" & txt顧客名.Value & "*'" S顧客.Form.FilterOn = True End If

  • 実行時エラー 3061 パラメータが少なすぎますのエラー

    Accessで在庫管理のようなものを作成しています。 在庫数のアップデート処理を行おうとすると、「実行時エラー 3061 パラメータが少なすぎます。1を指定してください」のエラーが表示さてしまいます。 Private Sub ZaikoUpdate() Dim strsql As String With Application.CurrentDb If Me.opt凍結使用区分 = cZaikoIn Then strSql = "Update Tストックマスタ" _ & " set 凍結数合計 = 凍結数合計 + "& Me.txt数量.value _ & " ,細胞No = '"& Me.cmb細胞No.value & "'" &" where レーンNo = '"& Me.cmb商品No.value & "'" ElseIf Me.opt凍結使用区分 = cZaikoOut Then      & " set 使用数合計 = 使用数合計 + "& Me.txt数量.value _ & " ,細胞No = '"& Me.cmb細胞No.value & "'" &" where レーンNo = '"& Me.cmb商品No.value & "'" 細胞Noをアップデートさせない場合はうまく行くのですが、& " ,細胞No = '"& Me.cmb細胞No.value & "'" を入れると上記エラーが出てしまいます。 どこかおかしいのでしょうか? どなたかアドバイスお願いいたします。

  • INSERT INTOステートメント構文エラー

    はじめまして。 急遽VB6.0、Accessで開発を行うことになりまして、小さなアプリを練習がてら作成したのですが、上記エラーが出てしまい、困っています。当方まったくの初心者で本を片手にコーディングしております。。 機能:CSVからデータを取り出して、DBにINSERTする コード Private cn As New ADODB.Connection Private Rs As New ADODB.Recordset Private Sub フォームフッター_Click() End Sub Private Sub トグル27_Click() Dim filPath As String ' [ファイルを開く]ダイアログ WizHook.Key = 51488399 damy = WizHook.GetFileName(0, "", "", "", filPath, "", "すべてのファイル (*.*)|*.*", 0, 0, 0, True) Me!fp = filPath WizHook.Key = 0 End Sub Private Sub トグル28_Click() Set cn = CurrentProject.Connection Open Me!fp For Input As #1 Dim varData As Variant Dim buf As String Dim a As String Dim b As String Dim c As String Do Until EOF(1) Line Input #1, buf varData = Split(buf, ",", , vbTextCompare) Dim mySql As String a = varData(0) b = varData(1) c = varData(2) MsgBox a MsgBox b MsgBox c mySql = "INSERT INTO COUNT(f,s,t) VALUES ('" & a & "','" & b & "','" & c & "')" Debug.Print mySql cn.Execute (mySql) MsgBox "更新されました。" Loop Close #1 cn.Close End Sub テーブル: フィールド名 f,s,t すべてテキスト型 イミディエイトウィンドウ表示内容:INSERT INTO COUNT(f,s,t) VALUES ('1','2','3') 恐れ入りますが、ご教授いただければ幸いです。 よろしくお願いします!

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

専門家に質問してみよう