• ベストアンサー

アクセスで同一テーブル内へのデータの追加

こんにちは。Access2000を使用しています。 「顧客テーブル」には「お買上げ年度」と「顧客名」フィールド があります。 「お買上げ年度」= "2007"の顧客を、「お買上げ年度」 = "2008" として「顧客テーブル」内に追加したいのですが、一度仮テーブル やCSVファイルにデータを退避することなく、クエリやVBA(ADO)で 対応することは可能でしょうか?(=同一テーブル内への追加クエリ を実行したい。)よろしくお願いいたします。

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

  • ベストアンサー
noname#140971
noname#140971
回答No.4

INSERT INTO 顧客 SELECT 2008 AS お買い上げ年度, 顧客.顧客名 AS 顧客名 FROM 顧客 WHERE (((顧客.お買い上げ年度)=2007)); とんでもないミスをしていました。

その他の回答 (5)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.6

>しかしながら、テクニックとして、同テーブル内への >追加クエリ的なことを習得すれば、いずれ役に立ちそ >うな気もしますので、勉強してみたいと思います。 テーブルを分けてあれば新規レコードの追加も追加クエリで簡単にできます

enako
質問者

お礼

CHRONOS_Oさん、こんにちは。 確かに仰るとおりですね。余計な知識を身に付けるより データベースの基本に則ることを大事にしたほうが良い ようですね。どうもありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#2です。#2は質問者のご都合に合わなかったようですね。 その後この質問とは別に、自分自身のテーブルと基本的に同じで、一部違ったレコードを、同数終わりから追加するのはどうすればよいか考えて下記にいたりました。 質問者の考え(テーブル設計)そのものに、回答で批判が出ています。そう思いますが、それとは別に参考に。 例レコード・テーブル 社員5 ID 社員番号 氏名 英語点数 1 1 山田 三郎 3 2 2 大島 義男 2 3 3 下田 茂 3 4 4 小出 健二 4 5 5 中田 卓 5 6 6 植田 健 3 7 7 近藤 一郎 2 8 8 木下 花子 5 9 9 木村 重雄 6 ーー Sub ADO005() Dim cn As ADODB.Connection Set cn = CurrentProject.Connection Dim X(4) ' MsgBox cn.Version strPass = CurrentProject.Path strname = CurrentProject.Name ' MsgBox strPass & "\" & strname Set rs = New ADODB.Recordset rs.Open "社員5", cn, adOpenKeyset, adLockOptimistic fn = rs.Fields.Count ' MsgBox fn rn = rs.RecordCount MsgBox rn For k = 0 To rn - 1 rs.MoveFirst rs.Move k MsgBox rs!社員番号 & "-" & rs!氏名 & "-" & rs!英語点数 X(0) = rs!社員番号 X(1) = rs!氏名 X(2) = rs!英語点数 '----- rs.AddNew rs!社員番号 = X(0) rs!氏名 = X(1) rs!英語点数 = X(2) + 10 rs.Update '--- Next k '--- rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub 英語点数を+10したレコードを、テーブル内に1セット追加しました。質問なら全レコードに「2008」を入れるところです 結果 テーブル 社員5のまま。 ID 社員番号 氏名 英語点数 1 1 山田 三郎 3 2 2 大島 義男 2 3 3 下田 茂 3 4 4 小出 健二 4 5 5 中田 卓 5 6 6 植田 健 3 7 7 近藤 一郎 2 8 8 木下 花子 5 9 9 木村 重雄 6 98 1 山田 三郎 13 99 2 大島 義男 12 100 3 下田 茂 13 101 4 小出 健二 14 102 5 中田 卓 15 103 6 植田 健 13 104 7 近藤 一郎 12 105 8 木下 花子 15 106 9 木村 重雄 16 珍奇な問題と思うが、WEBにも似たコードは無い様でコード作成には相当苦労しました。

enako
質問者

お礼

imogasiさん、こんにちは。 なるほど、配列を使う手もあったわけですね。 一人で考えていても、なかなか考えもつかないことでした。 どうもありがとうございました。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

顧客テーブルに年度が含まれているようなテーブル設計だから 変なことをしなきゃいけなくなるのですよ 顧客テーブルには顧客情報だけを格納しておき お買い上げ情報はテーブルを分けましょう

enako
質問者

お礼

CHRONOS_0さん、こんにちは。 確かにテーブル構造がおかしいのはごもっともです。 しかしながら、テクニックとして、同テーブル内への 追加クエリ的なことを習得すれば、いずれ役に立ちそ うな気もしますので、勉強してみたいと思います。 ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

方法について色々質問には条件をつけているが 社員5というテーブルをコピー・貼り付けし、名前を社員Cにする。 社員Cのあるフィールドを変える(->2008) ーー (操作) クエリ デザイン クエリ SQL ユニオン SQL文として SELECT * FROM 社員5 UNION ALL SELECT * FROM 社員5C; 実行(!) これで合体したクエリができる。 これを使うなり、テーブル化してはどうですか。 社員、社員Cのテーブルは削除する。 ADOでやるのはレコードの追加ができて、テーブルそのものの削除など 無いが、プログラムというのは、仕事で単発のものの場合できるだけ避けた方が賢明と思う。

enako
質問者

お礼

imogasiさん、こんにちは。 説明不足だったようで、いわゆる「年度更新」的な用途となるので 毎年実行させるため、できるだけ単純な方法を模索しておりました。 一度他のテーブルに書き出すのがやはり賢明なアクセスの使い方か もしれませんね。どうもありがとうございました。

noname#140971
noname#140971
回答No.1

顧客: お買い上げ年度|顧客名____| ______________2006|鈴木_一郎| ______________2007|中村_主水| お買い上げ年度|顧客名____| ______________2006|鈴木_一郎| ______________2007|中村_主水| ______________2008|中村_主水| INSERT INTO 顧客 SELECT 顧客.お買い上げ年度 AS お買い上げ年度, 顧客.顧客名 AS 顧客名 FROM 顧客 WHERE (((顧客.お買い上げ年度)=2007)); クエリで実行できます。 [イミディエイト] ? CNNExecute("INSERT INTO 顧客 SELECT 顧客.お買い上げ年度 AS お買い上げ年度, 顧客.顧客名 AS 顧客名 FROM 顧客 WHERE (((顧客.お買い上げ年度)=2007));") True このように、ADOでSQL文を実行する関数を自作してもOKです。

enako
質問者

お礼

Husky2007さん、こんにちは。 AddNewメソッドで作成するものと思い込んでドツボにはまってました。 SQLは便利で簡単とは聞いてましたが、なかなか手をつけるまでいって ませんでした。これを機に勉強したいと思います。 どうもありがとうございました。

関連するQ&A