人に聞けない痔の悩み、これでスッキリ >>

Access、VB6、データグリッドを使用した処理を行った際に、
「更新に必要なキー列の情報が足りません。」というメッセージが表示
されてしまいました。

【使用環境】
 ・WindowsXP SP1
 ・VB6
 ・ACCSESS2002

【発生手順】
 (1)インプット用mdbのテーブルデータを
  中間mdbのテーブルデータにコピー。
 (2)中間mdbのテーブルデータをAccessクエリを使用し
  画面出力用のデータを作成。
 (3)クエリデータをデータグリッドに表示。
  ※1.[コード1、文字列1、コード2、文字列2、コード3]
    を表示しています。
  ※2.コード1、コード2、コード3でプライマリキーとなっています。
 (4)データグリッドで特定の文字列2のセルをクリック後、
  他のセルにカーソルが移動しなくなる。
  このときに、エラーメッセージが表示される。

【回避できる場合】
 ・エラーメッセージが表示される元となるインプット用mdbの
  テーブルデータの文字列2に対し、何か変更を加えたあと、
  もとに戻す。
  例)あいうえお→あいうえお1→あいうえお
   のように変更を加えたあと、1を削除して最初
   の状態に戻す。
  
  この状態で処理を実行すると、【発生手順】(4)でエラーが出ていた
  ものがカーソルも移動することができ、エラーが発生しなくなります。
  ですが、ユーザが使用する際にこのような回避はできないため、回避策と
  はいえないです。
  

なぜ、このようなことが起こるのかや、エラーメッセージを表示させないような
回避策があれば教えていただけないでしょうか。

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

A 回答 (5件)

データグリッドを ReadOnly にするとどうなるでしょうか?あるいはレコードソースを

    • good
    • 0

私じゃ力不足みたい


こちらでも質問してみてはどうでしょう?
http://www.moug.net/
    • good
    • 0

joinを行った結果に対して更新はアクセスの場合はできない仕様になっていたと思います。

(データグリッドの自動更新を使用しては)

クエリを変更できない場合はレコード移動などのイベントを拾って手動で更新クエリを発行するなどの対策が必要です
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
データグリッドは表示のみで、データグリッドに入力したデータをアクセスのテーブルに更新するというようなことはしていません。

データグリッドに表示し、あるレコードのセルにカーソルを当てた後、そのレコードの上や下にカーソルを移動したときに、エラーメッセージが出てしまうのです。
単なる表示だけなのに、何が原因なのでしょう。

お礼日時:2005/12/20 16:43

あとは中間テーブルへのクエリにjoinなどの連結を使用しているとか?

    • good
    • 0
この回答へのお礼

何度も回答していただき、ありがとうございます。
joinの件ですが、inner joinなら行っていましたが、このクエリは開発者共通で使用しているため、修正することはできなさそうです。
そのほかの方法があるのでしょうか。

お礼日時:2005/12/20 16:12

更新対象のテーブルに主キーが設定されていない可能性があります

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
クエリーデータをデータグリッドに表示しているのですが、クエリーの元となるテーブルには主キー設定をしているため、主キー設定はしていると思われます。
とすると、何が原因なのでしょう・・・。

お礼日時:2005/12/20 13:15

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

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

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

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

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

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Q日付型カラムへのデータINSERT

お世話になります。ひとつご教授ください。

オラクル10g, ojdbc14でjdk1.4.2から接続です。

INSERT命令を使ってテーブルにレコードを追加する際に、DATE型のカラムに対して

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27 12:00:00', ...);

を実行するとエラーORA-01861が出ます。そこで

INSERT TABLE_A (DATE1, ...) VALUES ('2006-4-27', ...);

このように記述して再度実行すると通ります。

このようなとき、時間の部分まで設定した値をカラムに格納したいときはどうしたらよろしいでしょうか?

よろしくお願いします。

Aベストアンサー

ごめんなさい。
説明と文例が違ってしまいました。
正しくはこちらです。

INSERT TABLE_A (DATE1, ...) VALUES (to_date('2006-4-27 12:00:00','yyyy/mm/dd hh24:mi:ss'), ...);
というように、to_date関数を使うのが一般的かと思います。

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

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

Aベストアンサー

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

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

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QSQLの速度をあげるには・・・

テキストファイルからキーワードを拾って
SQLをなげています
SQLの質問になってしまうかもしれません
いまはADO接続でやっています

Open ファイル as input......

SQL = select * from tbl where name like '%キーワード%'
execute(SQL)

レコードセットの値で処理をいろいろ・・・
Loop

もともとのDBの件数がものすごくおおくてselect文に結構な時間が
かかってしまいます。速度をあげるほうほうってあるのでしょうか
私にはおもいつかなくて・・・

こういったほうほうは どう? ってのがありましたら
おしえていただきたいのですが よろしくおねがいします。

Aベストアンサー

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

まぁ愚痴っても仕方ないか・・・


なのでぼくも(不本意ながら)Like演算子を使用しています。


長い前置きはさておき・・・

本題のSQLのスピードなのですが、
http://homepage2.nifty.com/inform/vbdb/addnew.htm
こちらに面白い記述がありました。

AddNewにかかるスピードの検証で
Access データベースの場合: AddNew のほうが INSERT INTO より5倍以上速い
SQL Server の場合: INSERT INTO のほうが AddNew より 1.4倍 くらい速い
とあります。


たぶんで物を言ってはいけないと思うけど、言っちゃいます。

(1)もしDBがアクセスで
 >レコードセットの値で処理をいろいろ・・・
 のところがUpdate用のSQL文で処理を行ってる場合

 Recordsetをして、処理を行う


(2)もしDBがアクセス以外で
 >レコードセットの値で処理をいろいろ・・・
 のところがRecordsetで処理を行ってる場合

 Recordsetをせずに、UPDATE用のSQLを実行する


未検証なのですが多分イメージとして、こういうパターンが各DBに適してるのかな?

すでにこのパターンなのであれば、意味ないですね(^^;)

参考URL:http://homepage2.nifty.com/inform/vbdb/addnew.htm

確かに・・・Like演算子・・・あまり使いたくないですね・・・
文字列比較は処理を遅くさせるし、増してや「=」ではなくLikeですから、膨大な時間がかかる恐れが・・・

ちなみにぼく自身、DB系を多くしています。今の仕事もDB系なのですが、元となるホストは他の会社が行っており、それにあわせて作らなければなりません。
で、そのホスト連携部分に文字列を比較しなければならない部分があるんですよ・・・・
自分の会社ならまだしも、他の会社がすでに設計済みのDBだから変えようがないのです。。。

...続きを読む

Qテーブルのレコード削除ができません

SQLserver2000を触る事になり思った通りにならず困っております。

テーブルに主キーを設定せずデータ型を「int」でフィールドに重複する数値を入れてしまいました。

後から重複入力のミスに気づき重複したレコードを
「テーブルを開く」-「全行を返す」から1レコードを
削除しようとしたのですが、
「キー列の情報が足りないか、正しくありません。更新の影響を受ける行が多すぎます。」と表示され削除できません。

このテーブルは、多くのビューで使用してすでに動いている再作成することは難しいです。

このレコードを削除する良い方法はあるのでしょうか。
ご存知の先生方ご指導よろしくお願いいたします。

Aベストアンサー

インポートする前にデータをすべて削除するか、
インポート時に「列マッピングと変換」で「変換先
テーブル内の行を削除」を行えば、重複しないと
思います。
オンラインで使用しているテーブルの場合は、
時間を決めて行ったほうが良いと思います。

ビューで使用しているとの事なので難しいかもしれま
せんが、データを削除した後キーを作成してデータを
インポートし、ビューを再度クリエイトしたほうが、
長期的に見て効率的かもしれません。

Qupdate文で改行を入れる

こんにちは。
いつもお世話になっています。

update文を使用して、データに改行を入れたいのですが、どうすればよいでしょうか。

対象列のデータ型はVARCHAR2です。

例えばSQLPLUSから、
SPL>update 「テーブル名」set 「対象列」='あ改行い改行う改行'
を投入し、そのあと
select 「対象列」 from 「テーブル名」
とすると
SQL>あ
SQL>い
SQL>う
と出てくればよいんですが、
SQL>update 「テーブル名」set 「対象列」='あ\nい\nう\n'
としても
SQL>あ\nい\nう\n
と、「\n」が文字列としてでてきてしまいます。

SPL>update 「テーブル名」set 「対象列」='あ
2い
3う'
と投入すると、期待通りになるのですが、
そうではなく一行にまとめたいのですがどうすれば良いでしょうか。

Oracle9iを使用しています。
宜しくお願いいたします。

Aベストアンサー

こんにちわyukio200263さん
以下のSQL文でどうでしょうか?

UPDATE 「テーブル名」
SET 「対象列」= 'あ' || CHR(13) || CHR(10) ||'い'

ちょっと長くなってしまいますが、一行で可能です。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qフォームウィンドウを最前面に表示したい(ACCESS)

ACCESS VBAを使っています。
あるタイミングで、あるフォームを表示させたいのです。
OpenFormを使ってみると、確かにフォームを開くことはできたのですが、実際は既に表示されているWindowの背面に開かれているので、目で確認することはできないのです。
新しいフォームを最前面に表示するにはどのようにしたらよいのでしょうか?

Aベストアンサー

docmd.OpenForm フォーム名,,,,,acDialog
とするか
表示させたいフォームの ポップアップのプロパティを
はい に すれば 出来ると思います。


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

人気Q&Aランキング