製品情報を管理するデータベースを作成する中での質問です。お願いします。

・製品ID
・製品名
・製品型番
・製品色
等、製品に関する情報をデータベースに登録しています。
登録したデータ一覧から、1つの製品IDを選択すると、その製品IDの情報すべてがフォームに表示され、編集と削除ができます。
そのフォーム上にもう一つボタンを追加し、表示された製品情報の一部を編集して、上書き(更新)ではなく、新規製品として新しいIDで登録する機能をつけました。(似たような製品を登録する時に、すべて一から入力するのは手間なので、似たような製品の情報を利用して新規登録する、といった具体)
追加クエリを使用します。
その追加クエリは、問題なく動作しています。
ただ、追加クエリでデータを追加後、そのフォームを閉じようとすると、元の製品IDのデータが編集途中なのにフォームを閉じるの?とみなされてしまうようで、毎回「このレコードは保存できません」とエラーメッセージが出ます。
このエラーメッセージを出したくないのですが、どこを直せばよいでしょうか?

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

質問者からの補足コメント

  • うーん・・・

    わかりづらい説明で申し訳ありません。
    ちょっと質問の方向を変えます。
    フォームを開いた時に、更新前処理 Cancel = Trueの設定をしています。
    そして、いくつかの項目を編集後に、OKボタンを押すとレコードが更新されます。
    こういうフォームの場合、途中まで編集してOKボタンを押さずにフォームを閉じようとすると、
    「このレコードは保存できません」とメッセージが出てしまいます。
    このメッセージを出さないようにしたいのです。

    お願いいたします。

      補足日時:2016/03/03 08:54

このQ&Aに関連する最新のQ&A

A 回答 (3件)

Cancel=trueと言う事は、データのチェックをしようとしている訳です


よね。普通は、データの整合性の観点からエラーチェックを主体にして
この文脈が有ります。だから、不用意にこれを使うとデータ更新が出来
ない事になります。

Cancel=trueの条件に合致すると当然にレコードは保存されません。こ
の場合に保存をする方法と言うのは、エスケープキーを打鍵してこのレ
コードの保存を断念するだけです。

だって、プログラムの方で有る条件を満たしていると言う事で
Cancel=trueになっているのですから。具体的にこのCancel=Trueを指定
しての文脈と言うのは。

例えば、コードとして性別と言うのが有って男性を1に、女性を2に設定
をしている場合に有るユーザーが誤って3を打鍵をした時にここで
Cancel=trueにして誤ったレコードが保存されない様にガードを掛けま
す。

ですから、きちんとAccessの方は動作をしているのです。だから、それ
が期待をした動作で無いと言うので有れば。そもそものCancel=trueに
した時の条件文に問題が有ると言う事です。

これ以上は回答は出来ません。と言うのは、何も明らかにはなっていな
いからです。具体的なデータが有れば一歩踏み込んだ回答は出来ます
が。

頑張って下さい。
    • good
    • 0

質問している内容がイメージとして湧きませんが。

考えられる事は、追
加をしようとしているオブジェクトが、他のオブジェクトが掴んで離さ
ないのでオブジェクトの解放を待っている。然し、肝心のAccessは待っ
て来れない。と言った状況が考えられます。

だから、この場合は問題が発覚する前にオブジェクトを誰が掴んでいた
のかと言う所です。この最後にオブジェクトを掴んだ人が犯人です。

今の説明では誰も的確な回答は出来ないと思います。あるいは、追加を
しようとする時にキー違反などが影響をしているのかも知れません。

データベースの処理と言うのは、設計は正しい様に見えても実際に動く
動かないと言うのはそれとは別のデータに依り多く影響されます。

ですから、この場合と言うのは事前にありとあらゆるデータのキー違反
に関しても十分なチェックと言うのは必要になります。その辺の処理に
抜けは無いのでしょうか。

また、これらの問題に関してはより具体的に問題となっている状況を詳
細に公開をされる事が問題が早期に解決をされるのではないでしょう
か。

つたない回答で申し訳ありません。
    • good
    • 1

プログラミングの話ですか?


月明日コードを動かすことでそういったエラーが出るなら
その追加した部分が何かしらの影響を与えているのは間違いないでしょうが
元々のプログラムの構成がどうなっているのかわからない以上誰にも回答できませんよ

思い付きでいえばトランザクション処理内で処理するように作ってて
新たなコード部分を動かして終了すると
トランザクション終了しないままアプリ落とそうとしてるとか

以下の情報探してみたら?
https://www.google.co.jp/search?q=%E3%81%93%E3%8 …
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

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

Qアクセスのフォームでデータ元をテーブルからクエリにかえたい

上手く表現できるかどうかわからないのですが、頑張って書きます。少々長いです。
アクセスでフォームを使ってデータ入力しています。これは単純で、あるテーブルへのデータ入力をフォームを使ってやるだけのことです。このテーブルの中に「都道府県」というフィールドがあります。ある事情からこのフォームを使ってデータ入力(または修正)をするレコードは、「都道府県」のフィールドが「福岡県」のものだけでよくなりました。
そこで、「都道府県」に「福岡県」を持っているレコードだけを取り出すクエリを作ります。このクエリを元にして、同じフォームでデータ入力したいのです。入力項目は全く同じです。「福岡県」をもっているレコードだけが全く同じフォームで表示されるようにしたいのです。
もとのテーブル名を「全データ」とし、クエリを「福岡県抽出クエリ」と呼ぶとすると、どこかで「全データ」を「福岡県抽出クエリ」に書き換えればすべてのテキストボックスのデータ元が入れ替わってくれると思うのですが、それでいいのでしょうか。その場合、どうやったらいいのでしょう。
なぜ一からファームを作り直さないかというと、テキストボックスの大きさや配置を決めるのに膨大な労力を費やしていて、全部をやり直したくないからです。
どうかお願いします。ご指導ください。

上手く表現できるかどうかわからないのですが、頑張って書きます。少々長いです。
アクセスでフォームを使ってデータ入力しています。これは単純で、あるテーブルへのデータ入力をフォームを使ってやるだけのことです。このテーブルの中に「都道府県」というフィールドがあります。ある事情からこのフォームを使ってデータ入力(または修正)をするレコードは、「都道府県」のフィールドが「福岡県」のものだけでよくなりました。
そこで、「都道府県」に「福岡県」を持っているレコードだけを取り出すクエリを作...続きを読む

Aベストアンサー

フォームをデザインビューで開き、
プロパティの[データ]タブの[レコードソース]にカーソルを置き、
右の▼をクリックして「福岡県抽出クエリ」を選択してください。

Qテーブルにデータがインポートされたら追加クエリを自動実行出来ますでしょうか?

初めて質問させて頂きます。 ACCESS2000でA.mdb(ADBとします)とB.mdb(BDBとします)の2つのDBが有るとします。A.mdbに1日に何度かデータがインポートされます。インポートされる際に以前のデータは削除されています。この時、ADBのテーブルにデータがインポートされた時に BDBで追加クエリにて自動実行する事は可能でしょうか? VB関係はまだ知識が乏しい身なので是非可能かどうかお教えを請いたいと思います。又、可能であればその方法もヒント的にでも良いのでお教え頂きたいと思います。何卒宜しお願い致します。

Aベストアンサー

ADBにイベントを起きたとき、BDB単体でそれを知るのは難しいでしょうが、
ADBにイベントが起こったときに、ADB側からBDBを起動して、BDBの処理をさせる余地はあると思います。
そのときにBDBにやらせたい処理をもう少し具体的に書いてみては?

QAccessのクロス集計クエリから、追加クエリをvbaで記述したいが記述が分からない。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナンバーの型
2. サイズと言う名前で数値の型

サイズテーブルは下記の構造とします。
1. idと言う名前でオートナンバーの型
2. 名前と言うフィールドの名前でテキストの型

収穫のテーブルは下記のデータが入っています。
ID サイズ
1 1
2 2
3 2
4 2
5 1
6 2
7 3

サイズのテーブルは下記のデータが入っています。
ID 名前
1 大
2 中
3 小

リレーションシップは、一側のテーブルがサイズのテーブルで、idを主
キーとします。多側のテーブルは、収穫のテーブルで多側のキーはサイ
ズです。

ここで、クエリ1の名前で
TRANSFORM Count(収穫.ID) AS IDのカウント
SELECT 収穫.ID
FROM サイズ INNER JOIN 収穫 ON サイズ.ID = 収穫.サイズ
GROUP BY 収穫.ID
PIVOT サイズ.名前;

を実行すると、下記が得られます。
ID 小 大 中
1 1
2 1
3 1
4 1
5 1
6 1
7 1

ここで、クエリ1を使って下記のクエリ2を作ります。
INSERT INTO table1
SELECT クエリ1.*
FROM クエリ1;

上記の操作でクエリ1のクロス集計クエリを使って
クエリ2の追加クエリと言う二つの手段で
クロス集計からデータを作る事が出来ます。

この操作をvbaの手法で作る方法は無いのでしょうか。
この例でのコードの記述を宜しくお願いします。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナ...続きを読む

Aベストアンサー

こちらが参考になるでしょう。
http://www.accessclub.jp/bbs6/0008/das1904.html


おまけ、上記を参考にした
一応動作するコード。

Dim strSQL As String
strSQL = "INSERT INTO table1 " & _
   "SELECT Q.* " & _
   "FROM [" & _
   "TRANSFORM Count(収穫.ID) AS IDのカウント " & _
   "SELECT 収穫.ID " & _
   "FROM サイズ INNER JOIN 収穫 ON サイズ.ID=収穫.サイズ " & _
   "GROUP BY 収穫.ID " & _
   "PIVOT サイズ.名前 " & _
   "IN ('大','中','小')" & _
   "]. As Q"
Debug.Print strSQL
CurrentDb.Execute strSQL

QACCESSのフォームからデータの追加ができない

現在Accessの基本を勉強中です。
テーブルを元にフォームを作成し、フォームから新しく名前や会社名などを直接入力し、追加できるようにしたいです。
ところがフォームから入力を行うと、内容が追加されず一番最初に登録した人の名前が書き換わるだけになります。
どのように新しくデータを追加できるようになるのでしょうか?
まったくの初心者なので、どの機能を使えばよいか戸惑ってます。
どうかよいご意見をお願い致しますm(__)m

Aベストアンサー

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォーム自体を入力専用にする
 (フォームのプロパティシートの『データ』タブで『データ入力用』を「はい」に設定:
  既存のレコードは表示されなくなります)
 ・レコード移動用のコマンドボタンを設置する
 (フォームをデザインビューで開き、ツールボックス(矢印や、新規のテキストボックス等を
  設置する際に使用するツールバー)の左から二番目にあるウィザードボタンが押された
  状態にして、新規コマンドボタンを設置すると、簡単に作れると思います)
といった方法があります。

データを追加する場合は、新規レコードに移動(=新規レコードを選択)する必要があります。

最も簡単なのは・・・
そのフォームの最下方に、レコードセレクタ(『レコード: [|<][<][   1][>][>|][*]/1』といった
感じの部分)が表示されていたら、そこで『[*]』のボタンを押すと、新規レコードに移動できます。
(もしレコードセレクタが表示されていないようなら、フォームのプロパティシートを開いて、
 『書式』タブの『レコードセレクタ』の設定値を「はい」にして下さい)

他には、
 ・フォー...続きを読む

QACCESS 入力フォームでテーブルへデータを複数追加したい

ACCESS 入力フォームでテーブルへデータを複数追加したいと考えているのですが、
自力で解決出来ないので、アドバイスお願いします。

現在、工数取得の為の入力フォームを作成しています。

工数の取得はまとめて取得し、かかった工数を台数で割ってクエリで抽出したいと考えています。
最大5台分までで、作業によっては1台や2台でもデータを保存できるように1つのテーブルに入れたいのですが、1台入力すると4台分が空白で保存されてしまいます。
また、保存した後に、次のレコードに進んで新規で入力したいのですが、保存したレコードが表示されたままで、次のレコードに進む事が出来ません。

当方、アクセス勉強して間もないので知識や定義を理解していない部分があるのですが、アドバイスお願いします。

例)
☆ 入力フォーム
________________________________________________________
本体シリアル [0001] [0002] [0003] [0004] [0005]
作業者 [山田太郎]
開始時間 [9:00]
終了時間 [9:30]
台数 [5]

[ 保存 ]
_______________________________________________________________


☆ テーブルデータ
_______________________________________________________________
山田太郎 0001 9:00 9:30
山田太郎 0002 9:00 9:30
山田太郎 0003 9:00 9:30
山田太郎 0004 9:00 9:30
山田太郎 0005 9:00 9:30
_______________________________________________________________

コード

Dim rs As DAO.RecordSet
Set rs = CurrentDB.OpenRecordset("テーブル名")
For i = 1 to 5
rs.AddNew
rs!シリアル = Me("シリアル" & i).Value
rs!開始時間 = Me("開始時間").Value
rs!終了時間 = Me("終了時間").Value
rs!台数 = Me("台数").Value

If Me("シリアル" & i).Value = "" Then Exit For

rs.Update
Next
rs.Close
Set rs = Nothing
Me.Refresh

DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord acDataForm, "工数フォーム", acNext

ACCESS 入力フォームでテーブルへデータを複数追加したいと考えているのですが、
自力で解決出来ないので、アドバイスお願いします。

現在、工数取得の為の入力フォームを作成しています。

工数の取得はまとめて取得し、かかった工数を台数で割ってクエリで抽出したいと考えています。
最大5台分までで、作業によっては1台や2台でもデータを保存できるように1つのテーブルに入れたいのですが、1台入力すると4台分が空白で保存されてしまいます。
また、保存した後に、次のレコードに進んで新規で入力...続きを読む

Aベストアンサー

シリアル欄が空白かどうかを判断する方法が間違っています。
Access のテキストボックスの場合、未入力だと値は Null になります。
場合によっては "" (空の文字列) の場合もあります。
従いまして以下のように Nz 関数を使って Null を空の文字列に変換してから判断してみてください。
If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For

そして、この判断を行う場所は For の直後 (AddNew する前) でいいと思います。
For i = 1 To 5
 If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For
 rs.AddNew
 ・・・
 rs.Update
Next

ただし質問文のコードでは
[シリアル001] ← 入力した
[シリアル002] ← 空欄
[シリアル003] ← 入力した
という入力パターンがあった場合 [シリアル002] 以降は保存されません。
もしこのように歯抜け入力もあるのであれば、

For i = 1 To 5
 If Not(Nz(Me("シリアル" & i).Value, "") = "") Then
  rs.AddNew
  ・・・
  rs.Update
 End If
Next

というようにすると良いかと。

シリアル欄が空白かどうかを判断する方法が間違っています。
Access のテキストボックスの場合、未入力だと値は Null になります。
場合によっては "" (空の文字列) の場合もあります。
従いまして以下のように Nz 関数を使って Null を空の文字列に変換してから判断してみてください。
If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For

そして、この判断を行う場所は For の直後 (AddNew する前) でいいと思います。
For i = 1 To 5
 If Nz(Me("シリアル" & i).Value, "") = "" Then Exit For
 rs.Add...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報