プロが教えるわが家の防犯対策術!

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

A 回答 (6件)

INSERT INTO 顧客


SELECT 2008 AS お買い上げ年度, 顧客.顧客名 AS 顧客名
FROM 顧客
WHERE (((顧客.お買い上げ年度)=2007));

とんでもないミスをしていました。
    • good
    • 0

>しかしながら、テクニックとして、同テーブル内への


>追加クエリ的なことを習得すれば、いずれ役に立ちそ
>うな気もしますので、勉強してみたいと思います。

テーブルを分けてあれば新規レコードの追加も追加クエリで簡単にできます
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/21 08:45

#2です。

#2は質問者のご都合に合わなかったようですね。
その後この質問とは別に、自分自身のテーブルと基本的に同じで、一部違ったレコードを、同数終わりから追加するのはどうすればよいか考えて下記にいたりました。
質問者の考え(テーブル設計)そのものに、回答で批判が出ています。そう思いますが、それとは別に参考に。
例レコード・テーブル 社員5
ID社員番号氏名英語点数
11山田 三郎3
22大島 義男2
33下田 茂3
44小出 健二4
55中田 卓5
66植田 健3
77近藤 一郎2
88木下 花子5
99木村 重雄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社員番号氏名英語点数
11山田 三郎3
22大島 義男2
33下田 茂3
44小出 健二4
55中田 卓5
66植田 健3
77近藤 一郎2
88木下 花子5
99木村 重雄6
981山田 三郎13
992大島 義男12
1003下田 茂13
1014小出 健二14
1025中田 卓15
1036植田 健13
1047近藤 一郎12
1058木下 花子15
1069木村 重雄16
珍奇な問題と思うが、WEBにも似たコードは無い様でコード作成には相当苦労しました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/21 08:47

顧客テーブルに年度が含まれているようなテーブル設計だから


変なことをしなきゃいけなくなるのですよ

顧客テーブルには顧客情報だけを格納しておき
お買い上げ情報はテーブルを分けましょう
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/18 14:46

方法について色々質問には条件をつけているが


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

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

お礼日時:2008/01/17 12:22

顧客:



お買い上げ年度|顧客名____|
______________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です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/17 12:27

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