Access2000の重複データの処理について質問です。
あるフィールドの重複レコードを検索し、該当するレコードの別フィールドに「●」をつけようとしています。ただ、重複する最初のレコードには「●」をつけたくないのです。
例えば
 aaa ・・・ (1)
 bbb
 aaa ・・・ (2)
 ccc
 aaa ・・・ (3)
 eee
というフィールドだった場合、(1)には「●」をつけずに(2)以降にのみつけたいのです。
重複クエリで重複レコードを抽出して重複テーブル作成→重複テーブルと元テーブルを組み合わせて更新クエリ作成という方法でやったのですが、そうすると(1)にも「●」がついてきます。(当然ですが・・・)

何か名案があれば教えてください。
やはり、VBAを使わないと無理でしょうか・・・?

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

A 回答 (11件中1~10件)

>頭の中で理屈は理解しているつもりなのですが、


>クエリの組み方が悪いのか、うまく抽出できません。
>すでにDateAddでつまづいてます・・・。

理解しやすさを狙って処理を追加していったので
逆にぐしゃぐしゃになっちゃいましたかね。

じゃ、すっきりさせましょか。


いままでの抽出条件を別の文章で言い換えると、

「一番古い日付のレコードの次から3ヶ月未満のレコードを更新対象とする」
ということになります。


なんで、こんなフィールドを持つ集計クエリを作ってみましょう。

・重複項目
・一番古い日付
・一番古い日付から3ヵ月後

上の2つはもう作っているのでOKだと思いますが、一番下は、次のように記述する必要があります

新しいフィールドの名前:DateAdd('m', 3, min(日付のフィールド名))
で、種類を演算にしておきます。

これでクエリを実行すると、3ヵ月後の日付が追加されたレコード内容が表示されるはずです。


あとは、次の条件で元のテーブルと組み合わせたクエリを作ります。

・テーブルの重複項目とクエリーの重複項目を線で結ぶ
・テーブルの日付項目の抽出条件は一番古い日付のレコードの次から3ヶ月未満

上の条件は問題ないと思います。
ちなみに下の抽出条件にはこんな感じに書きます。

>[テーブル名].[一番古い日付] And <[クエリ名].[3ヵ月後の日付]

これで、対象データが絞り込めるはずです。

あとはこれを更新クエリにすればOKでしょう。

興味がありましたら、SQLビューでSQL文も見てみてください。
おそらく、ghepardo25さんなら、書いてある意味がなんとなくでもわかるはずですよ。
SQLがわかるようになると、ちょっと条件が複雑なクエリは
自分でSQLを書いた方が速く出来ますよ。

この回答への補足

ごめんなさい。私の勘違いで、条件がまだありました。
上のoshiete_kunさんの補足にある例を見て頂きたいのですが、---の下の部分の条件も必要なのです。taka_tetsuの教えてくれたクエリも、今までの私の解釈も、----の下の部分はすべて●なしになるんですよね。だけどそれではダメだということにさっき気づきました。
すみません。何度も何度も追加・変更で・・・。

補足日時:2003/10/26 15:01
    • good
    • 0
この回答へのお礼

まさに思い通りのデータ処理ができました!丁寧な説明に感謝感激です。
最後まで見捨てずアドバイスくださってありがとうございます m(__)m
SQLも徐々に勉強していくつもりです。また何か困ったことができたときは、よろしくお願いします。
ありがとうございました。

お礼日時:2003/10/25 00:18

> 今日を基準に3ヶ月ではなく、最初のレコードが登場した日から3ヶ月



この条件に下のは当てはまらない気がするのですが、、下のはどういう条件で抽出されるのでしょうか?

3ヶ月以降でも一定期間をおくと抽出するのでしょうか?

----------------
2003/08/02 AAAA ●
2003/09/22 AAAA ●
2003/10/12 AAAA ●
2003/11/25 AAAA 
2003/12/14 AAAA ●

この回答への補足

>3ヶ月以降でも一定期間をおくと抽出するのでしょうか?

そうなのです。
3ヶ月以降の重複はいったん「●」をはずすのですが、次はそのはずしたレコードを起点に3ヶ月以内の重複に「●」をつけ、また3ヶ月以上後のレコードではずし・・・というのを繰り返したいのです。

最初の質問とずい分条件が違ってきましたので、ここは一応締め切りとし、新しく質問し直させて頂きました。
新しい質問先は以下URLです。

色々とお手数をおかけしました。以下の質問先で、引き続きご回答いただければうれしいです。

よろしくお願いします。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=689629

補足日時:2003/10/26 20:04
    • good
    • 0

' まったく、勘違いしていました。

修正します。
' 他にもスマートな書き方があるかもしれませんが、とりあえず・・・

' test1() の変更点(If ~ End If を上書き)

   If myRS.RecordCount > 0 Then
      Do While Not myRS.EOF
        test2 myRS!fld氏名, DMin("fld日付", "tbl社員", "fld氏名 ='" & myRS!fld氏名 & "'")
        myRS.MoveNext
      Loop
   End If


' test2 の変更点(Sub test2 ~ SQL 全体までを上書き)

Sub test2(pfld氏名 As String, pfld日付 As Date)
  Dim myCN As ADODB.Connection
  Dim myRS As ADODB.Recordset
  Dim SQL As String

    SQL = "SELECT * FROM tbl社員 WHERE (fld氏名='" & pfld氏名 & "') "
    SQL = SQL & "AND (fld日付 Between #" & pfld日付 & "# "
    SQL = SQL & "AND #" & DateAdd("m", 3, pfld日付) & "#) ORDER BY fld日付 ASC"
    • good
    • 0
この回答へのお礼

更新されました。ありがとうございます。

お礼日時:2003/10/26 20:04

10/26日より前3ヶ月を処理してみたんですが。

。。

こういうことではなかったんでしょうか?

もし、 taka_tetsu さんので、解決しているようなので、、うちのはとりあえず、こういう考え方もできるというサンプルで、、、taka_tetsuさんのを採用してください。

それで、うちのコードでもし質問があるようでしたら、続けてお願いします。


>プログラムを実行して砂時計になったマウスポイントが矢印に戻るまで待って

レコード数が多くて、VBAでループさせるとそうなりますね。こういう場合、クエリの方が処理は速いですね。


AAAA2003/07/26
AAAA2003/07/26●
AAAA2003/08/16●
AAAA2003/08/17●
AAAA2003/08/25●
AAAA2003/08/29●
AAAA2003/09/07●
AAAA2003/09/13●
AAAA2003/09/18●
AAAA2003/09/25●
AAAA2003/09/29●
AAAA2003/09/30●
AAAA2003/10/05●

BBBB2003/08/25
BBBB2003/09/02●
BBBB2003/09/08●

CCCC2003/08/11
CCCC2003/08/11●
CCCC2003/08/22●
CCCC2003/08/25●
CCCC2003/08/28●
CCCC2003/08/30●
CCCC2003/09/01●
CCCC2003/09/11●
CCCC2003/09/14●
CCCC2003/09/18●
CCCC2003/09/19●
CCCC2003/09/29●

DDDD2003/08/11
DDDD2003/08/11●

EEEE2003/08/02
EEEE2003/08/02●
EEEE2003/08/17●
EEEE2003/10/02●

FFFF2003/08/22
FFFF2003/08/22●
FFFF2003/09/23●

GGGG2003/08/17
GGGG2003/08/17●
GGGG2003/08/19●
GGGG2003/09/22●

HHHH2003/08/02
HHHH2003/08/02●

FFFF2003/08/09
FFFF2003/08/09●
FFFF2003/08/25●
FFFF2003/09/21●
FFFF2003/09/30●

GGGG2003/08/17

HHHH 2003/08/02

IIII 2003/08/02●
IIII2003/08/16●
IIII2003/09/18●
IIII2003/09/20●
IIII2003/10/04●

この回答への補足

レコード数は3000件ぐらいです。(毎月400件ずつぐらい増えていく見込みです)
最初の質問の仕方が悪かったのですが、今日を基準に3ヶ月ではなく、最初のレコードが登場した日から3ヶ月という意識です。(下のような感じです)

2003/04/30 AAAA 
2003/04/31 AAAA ●
2003/05/22 AAAA ●
2003/06/01 AAAA ●
2003/07/28 AAAA ●
2003/08/02 AAAA 
2003/05/05 BBBB 
2003/08/06 BBBB 
2003/11/10 BBBB
2003/07/04 CCCC
----------------
2003/08/02 AAAA ●
2003/09/22 AAAA ●
2003/10/12 AAAA ●
2003/11/25 AAAA 
2003/12/14 AAAA ●

と、これを書いていて重大なことに気がつきました!
私の課題の解釈が間違っていて、taka_tetsuさんのやり方では解決しない部分がでてきました。taka_tetsuさんのやり方だと、----の上の部分までで、―私もそれでいいと思っていたのですが―、よく考えると---の下の部分も必要なのです。taka_tetsuの教えてくれたクエリだと、----の下の部分はすべて●なしになるんですよね。しまったぁ!!
すみません。自分でも作業の全貌を読み取れてませんでした。ご迷惑をおかけしました。

補足日時:2003/10/26 14:21
    • good
    • 0

>正常に更新されているデータとそうでないデータが出てきました。



テーブルのデータってすぐには更新されなくて、、だらだらーと更新されるんですよね。まあ、内部的には更新されていると思うのですけど、表示が遅れるのです。

それのせいではないでしょうか?一度、テーブルを閉じて開いたりするとそのときは確実に更新されていると思います。

それと

SQL = "SELECT * FROM tbl社員 WHERE fld氏名='" & pfld氏名 & "' AND fld日付>=#" & DateAdd("m", -3, Date) & "# ORDER BY fld日付"

の 最後に ASC をつけて、、

SQL = "SELECT * FROM tbl社員 WHERE fld氏名='" & pfld氏名 & "' AND fld日付>=#" & DateAdd("m", -3, Date) & "# ORDER BY fld日付 ASC"

ってしてもらえませんでしょうか?

それでダメだったら、また、言ってください。テスト環境のサンプル数が少ないもので見落としている部分があるのかもしれません。

この回答への補足

プログラムを実行して砂時計になったマウスポイントが矢印に戻るまで待って、それからしばらくしてテーブルを開いても、一旦閉じてしばらく待って再度開いても、やはり更新されていないデータがあります。
ASCをつけて実行してもダメでした。何度も何度もお手間かけてすみません。

補足日時:2003/10/25 23:27
    • good
    • 0

>「1つ以上の必要なパラメータの値が設定されていません」



うちでは動いているんですが、、そのエラーはSQLのなかで指定しているオブジェクト名と実際のオブジェクト名が一致していない場合に出ると思います。

推測としては、テーブル名もしくはフィールド名が一致していないのではないかと。。

test1b()はすでに設定してある過去の"●"を初期化している部分なので、その部分全体とtest1()の 5行目の test1bをコメントアウトして、他でエラーがでないか見てもらえませんでしょうか?

この回答への補足

ご指摘通り、1箇所だけフィールド名を修正するのを忘れていたところがありました。修正して実行すると、プログラムは最後まで行ったようですが、なぜか、正常に更新されているデータとそうでないデータが出てきました。3ヶ月以内のダブリであるにもかかわらず、●がついていないデータが一部あるのです。希望通りの結果になっているデータもあって、その差が何なのか、更新されなかったデータの共通点を色々と探したのですが、見当がつきませんでした。こういうことってあるんでしょうか・・・?

補足日時:2003/10/24 23:59
    • good
    • 0

'一つまるまる抜けていた処理があったので追加しました。



'テーブル名はtbl社員
'フィールド名は fld氏名(Text)、 fldチェック(Text)、fld日付(Date)

'これで、お望みの通りいかないでしょうか?

'モジュールにしたのコードを貼り付けて、、test1を実行してみてください。


'---------------------------------------------------------------
Sub test1()
Dim myCN As ADODB.Connection
Dim myRS As ADODB.Recordset
Dim SQL As String

test1b

SQL = "SELECT DISTINCT fld氏名 FROM tbl社員"

Set myCN = CurrentProject.Connection
Set myRS = New ADODB.Recordset

myRS.Open SQL, myCN, adOpenKeyset, adLockOptimistic

If myRS.RecordCount > 0 Then
Do While Not myRS.EOF
test2 myRS!fld氏名
myRS.MoveNext
Loop
End If

myRS.Close: Set myRS = Nothing
myCN.Close: Set myCN = Nothing
End Sub
'---------------------------------------------------------------
Sub test1b()
Dim myCN As ADODB.Connection
Dim myCOM As New ADODB.Command
Dim SQL As String

SQL = "UPDATE tbl社員 SET fldチェック=' '"

Set myCN = CurrentProject.Connection

myCOM.ActiveConnection = myCN
myCOM.CommandText = SQL
myCOM.Execute

Set myCOM = Nothing
End Sub
'---------------------------------------------------------------
Sub test2(pfld氏名 As String)
Dim myCN As ADODB.Connection
Dim myRS As ADODB.Recordset
Dim SQL As String

SQL = "SELECT * FROM tbl社員 WHERE fld氏名='" & pfld氏名 & "' AND fld日付>=#" & DateAdd("m", -3, Date) & "# ORDER BY fld日付"

Set myCN = CurrentProject.Connection
Set myRS = New ADODB.Recordset

myRS.Open SQL, myCN, adOpenKeyset, adLockOptimistic

If myRS.RecordCount > 0 Then
myRS.MoveFirst
i = 1
Do While Not myRS.EOF
If i > 1 Then
myRS!fldチェック = "●"
myRS.Update
End If
myRS.MoveNext
i = i + 1
Loop
End If

myRS.Close: Set myRS = Nothing
myCN.Close: Set myCN = Nothing
End Sub
'---------------------------------------------------------------

この回答への補足

コードを拝借して試してみたところ、test1bの"myCOM.Execute"の部分で「1つ以上の必要なパラメータの値が設定されていません」と表示され、止まってしまいました。
これは一体・・・?

補足日時:2003/10/23 22:22
    • good
    • 0

Option Compare Database




'テーブル名はtbl社員
'フィールド名は fld氏名(Text)、 fldチェック(Text)、fld日付(Date)

'これで、お望みの通りいかないでしょうか?

'モジュールにしたのコードを貼り付けて、、test1を実行してみてください。



Sub test1()
Dim myCN As ADODB.Connection
Dim myRS As ADODB.Recordset
Dim SQL As String

SQL = "SELECT DISTINCT fld氏名 FROM tbl社員"

Set myCN = CurrentProject.Connection
Set myRS = New ADODB.Recordset

myRS.Open SQL, myCN, adOpenKeyset, adLockOptimistic

If myRS.RecordCount > 0 Then
Do While Not myRS.EOF
test2 myRS!fld氏名
myRS.MoveNext
Loop
End If

myRS.Close: Set myRS = Nothing
myCN.Close: Set myCN = Nothing
End Sub


Sub test2(pfld氏名 As String)
Dim myCN As ADODB.Connection
Dim myRS As ADODB.Recordset
Dim SQL As String

SQL = "SELECT * FROM tbl社員 WHERE fld氏名='" & pfld氏名 & "' AND fld日付>=#" & DateAdd("m", -3, Date) & "# ORDER BY fld日付"

Set myCN = CurrentProject.Connection
Set myRS = New ADODB.Recordset

myRS.Open SQL, myCN, adOpenKeyset, adLockOptimistic

If myRS.RecordCount > 0 Then
myRS.MoveFirst
i = 1
Do While Not myRS.EOF
If i > 1 Then
myRS!fldチェック = "●"
myRS.Update
End If
i = i + 1
Loop
End If

myRS.Close: Set myRS = Nothing
myCN.Close: Set myCN = Nothing
End Su
    • good
    • 0

これまでに作成したクエリは、


・重複クエリ・・・重複レコードの抽出
・集計クエリ・・・更新対象外レコードの抽出
・不一致クエリ・・・対象外のレコードを除いた更新レコードの抽出
・更新クエリ(不一致クエリから変えたかな?)

ですよね。

で、今回は、さらに対象外のレコードを増やしたいということなので、
不一致クエリから、さらに3ヶ月以上後のレコードを新しい不一致クエリーで
対象外にしてあげればいいでしょう。


で、3ヶ月以上のレコードはどうやって抽出するかは、ということで次のようになります
1.一番古いレコードを集計クエリで抽出(既に作成済みですよね)

2. 対象テーブルと1.のクエリから選択クエリを作成し、対象テーブルの日付フィールドの抽出条件には、1.のクエリの一番古い日付+3ヶ月以上を指定します。(3ヵ月後はDateAddで求まります)

3. あとは、1番古い日付のレコードを更新対象から外したクエリと2.のクエリを元に、もう一度不一致クエリを作ってあげれば更新対象のレコードのみ残ります。


こんなかんじでいかがでしょうか?


#SQLを直接記述するともう少しシンプルになりますが、あえて使っていませんので
ちょっとまどろっこしくなっていますが。

この回答への補足

頭の中で理屈は理解しているつもりなのですが、クエリの組み方が悪いのか、うまく抽出できません。すでにDateAddでつまづいてます・・・。
ここまで助言してもらって情けない話ですが・・・。もう少し格闘してみます。

補足日時:2003/10/23 22:15
    • good
    • 0

>1番古いものには●をつけずに2番目以降につけたいということです。



これがあるのでしたら、集計クエリーで日付の最小値がもとまりますので、これと重複クエリーとの不一致クエリーから更新対象が求まりますよね。

この回答への補足

思い通りの結果となりました。ありがとうございます。
追加ですが、例えばこれをもとに、
1番古いものには●をつけないで2番目以降の重複にはつける、日付を基準に1番古いものから3ヶ月以上後の重複には●をつけるといった条件になった場合は、どの段階でどういう抽出条件を設定すればいいのでしょう・・・?

補足日時:2003/10/22 16:56
    • good
    • 0
この回答へのお礼

補足の訂正です。
>3ヶ月以上後の重複には●をつける
ではなく、
3ヶ月以上後の重複は●をはずす
です。
欄が違いますが、「補足する」を押してから気づいたもので・・・。

お礼日時:2003/10/22 17:06

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

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

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

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

QphpMyAdminでのフィールド削除(クエリ実行)

本当にMySQL初心者なので基本的にコマンドが理解できないのですが、phpMyAdminにてデータベースを管理していますが、一つのテーブルに数千のデータが入っており、例えばID番号1から500までを一気に削除したいと言うときに、最初はローカルにCSVデータをエキスポートして編集した後インポートさせようとしたのですが、文字コードの関係でエラーになってしまい、解決策はクエリでデータを削除するしかないとの結論になりました。
例えばテーブルを指定してからクエリのウィンドウを開くとSELECT * FROM `テーブル名` WHERE 1
とすでに入力されているのですが、これをどのように書き換えれば複数のフィールドをいっぺんに削除できるのでしょうか?
非常に困ってます、アドバイスよろしくお願いします

Aベストアンサー

普通にクエリを書いて実行してください

DELETE FROM `テーブル名` WHERE `ID` BETWEEN 1 AND 500;

QAccess 重複クエリにて、あるフィールドの値をキーに比較対象レコードを限定したい

いつもお世話になっております。よろしくお願い致します。

Access 2002 SP3。
重複クエリを使って、1つのテーブル内で、「重量」と「入庫日」が一致するレコードを抽出しています。

(重複クエリ実行結果サンプル)
ID    重量    入庫日    管理番号    取引先
M001   5140   2005/09/27   P5916000     M社
S018   5140   2005/09/27   P5916000PP    S社
M169   8100   2005/04/22   522A3014     M社
S6    9000   2005/04/22   522A3014GA    S社
S171   1050   2005/01/31   Z3988722     S社
S4    1050   2005/01/31   Z165785SP2    S社


「管理番号」の入力ミスや桁数違いを発見するために、「重量」と「入庫日」が同じものを抽出するのですが、
取引先が、M社 vs S社で比較したいのです。

重複クエリウィザードを用いて作成すると、S社 vs S社においても、「重量」「入庫日」が同じレコードを
表示してしまうので、それらは省きたいのです。
※上記サンプルでは、IDフィールドの値が「S141」と「S4」が該当。
(可能ならば、逆に、それらだけを表示するクエリも欲しい)


Accessには慣れておらず、またSQLもシスアド取得のために少ししたぐらいなもので・・・・。
どなたかお知恵をお貸しください。

情報が不足していれば、補足しますので、よろしくお願い致します。

いつもお世話になっております。よろしくお願い致します。

Access 2002 SP3。
重複クエリを使って、1つのテーブル内で、「重量」と「入庫日」が一致するレコードを抽出しています。

(重複クエリ実行結果サンプル)
ID    重量    入庫日    管理番号    取引先
M001   5140   2005/09/27   P5916000     M社
S018   5140   2005/09/27   P5916000PP    S社
M169   8100   2005/04/22   522A3014     M社
S6    9000   2005/04/22 ...続きを読む

Aベストアンサー

 以下を、クエリのSQLビューで貼り付けてください(「テーブル名」はお使いのテーブルの名称に変更してください)。「入庫日」のデータ型は「日付/時刻型」であることを前提としています。

SELECT テーブル名.ID, テーブル名.重量, テーブル名.入庫日, テーブル名.管理番号, テーブル名.取引先
FROM テーブル名
WHERE (((DCount("*","テーブル名","[重量] =" & [重量] & " AND [入庫日] = #" & [入庫日] & "# AND [取引先] " & IIf([1:取引先が相違、2:同一]=1,"<> '","= '") & [取引先] & "'"))>=[1:取引先が相違、2:同一]))
ORDER BY テーブル名.重量, テーブル名.入庫日, テーブル名.取引先;

 このクエリを開くと、「1:取引先が相違、2:同一」と表示され、入力待ちになりますので、取引先が異なるものを比較したい場合は数字の「1」、同じものを比較したい場合は数字の「2」を入力してください。
 これで水曜どうでしょう。

 以下を、クエリのSQLビューで貼り付けてください(「テーブル名」はお使いのテーブルの名称に変更してください)。「入庫日」のデータ型は「日付/時刻型」であることを前提としています。

SELECT テーブル名.ID, テーブル名.重量, テーブル名.入庫日, テーブル名.管理番号, テーブル名.取引先
FROM テーブル名
WHERE (((DCount("*","テーブル名","[重量] =" & [重量] & " AND [入庫日] = #" & [入庫日] & "# AND [取引先] " & IIf([1:取引先が相違、2:同一]=1,"<> '","= '") & [取引先] & "'"))>=[1:取...続きを読む

Qアクセスの削除クエリでいいのでしょうか?

 データベースで検索できるようにしたいのですが・・・・。クエリの検索結果をフォームに反映させています。
 検索結果表示後、もう一度検索フォームに戻り、検索をかけたときヒットするデータがないにも関わらず前回の検索結果が表示されたままになってしまいます。
削除クエリを使用すればいいのでしょうか?
 また削除クエリをどのように設定したらいいのでしょうか?(たとえば抽出条件が必要なのでしょうか?)
 この場合、マクロはいったん削除クエリを開き、もう一度クエリを開く設定でいいのでしょうか?分かりにくい質問ですいませんが教えてください

Aベストアンサー

はい、フォームのもとになっているクエリのデータが変わっても、更新行為をしないと反映されません。
具体的には、更新したいフォームに、コマンドボタンウイザードでフォーム→再表示を選択し、「再表示」ボタンを作ってみてください。押すとほら、更新されました。ボタン押し下げ動作を省略したい場合は、たとえば検索画面に戻るボタンがあるとしたら、そのボタンのクリック時イベントに、再表示ボタン内の主要ソースを貼り付ければ用を成すはずです。
但し、サブフォームをご利用の場合など、この方法がふさわしくない場合もあります。
確実に更新するには該当のフォームを閉じて開きなおすことです。マクロを作ってボタン化すれば少々画面がちらつくだけでそう不自然ではありません。
お試し下さい。

Qaccess前月差分クエリ書き換えたくない フィールド1 年月日 フィールド2 商品名 レコードは月

access前月差分クエリ書き換えたくない

フィールド1 年月日
フィールド2 商品名

レコードは月次で年度単位で持ち、毎月、先月分が今月に追加されます。

毎月、前月と前々月分の商品の個数の差を計算します。

フィールド1をformat関数で年月にし、グループ化したものを、201701-201612みたいにクエリを書いて
計算させています。

まずformatが良いのかmonthが良いかも分からないのですが、毎月の差分を取るクエリを書き換えたくなく、元テーブルから計算しやすいように加工するクエリをどう持てば良いか教えて下さい。

Aベストアンサー

以前回答させていただいた
https://oshiete.goo.ne.jp/qa/9605499.html

年月から1ヵ月の期間を求めるなら
DateSerial(Year([年月]),Month([年月]),1)
DateSerial(Year([年月]),Month([年月])+1,1)-1

上は年月の1日を求める
下は年月の翌月1日を出し、その前日(-1)を求めることで末日を求めている

先月を求めるなら
DateSerial(Year([年月]),Month([年月])-1,1)
yyyymmの形にするなら
Format(DateSerial(Year([年月]),Month([年月])-1,1),"yyyymm")

先々月を求めるなら
DateSerial(Year([年月]),Month([年月])-2,1)
yyyymmの形にするなら
Format(DateSerial(Year([年月]),Month([年月])-2,1),"yyyymm")

Qテーブル削除クエリ

テーブル作成クエリはあるけどテーブル削除クエリはないのでしょうか?
ADOXで削除するしかないですか?

Aベストアンサー

クエリーのSQLビューで、下記の様なSQLを入力して保存すると、一種のテーブル削除クエリができますね。
DROP TABLE Table1;
データベースウィンドウで右クリックする方が早そうな...
VBAからなら、下記で実行できました。ご参考まで。
Sub Sample()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Q_Table1削除"
DoCmd.SetWarnings True
End Sub

Qアクセス フィールド名変更と別テーブル作成 access2010です。 既存テーブル名:AAA 既存

アクセス フィールド名変更と別テーブル作成



access2010です。

既存テーブル名:AAA
既存フィールド名:あああ

これをレコード内容、型式を変えずに別の新テーブルに新フィールド名で作りたいです。

新テーブル名:BBB
新フィールド名:かかか

よろしくお願いします。

Aベストアンサー

テーブルを構造とデータを含めてコピーして、フィールド名を変えればよいのでは?

QAccessの削除クエリについて

『先月分のデータを全て削除』という削除クエリを作りたいのです。
本を見ても、
『指定した日の○日前の分までのデータを削除する』はあるのですが・・・・。

例えば、
5月5日にクエリを実行しても、5月10日にクエリを実行しても、4月30日以前のデータが削除されて欲しいのですが。
よろしくお願いいたします。

Aベストアンサー

>『先月分のデータを全て削除』
ということであれば下記条件で削除クエリを作成
すればできます。
---
フィールド:式:Month([対象日付フィールド])
抽出条件:Month(DateAdd("m",-1,Now()))

Qaccess2010 フィールド名変更し別テーブル作成 教えてください。 既存テーブル:AAA 既存

access2010 フィールド名変更し別テーブル作成








教えてください。
既存テーブル:AAA
既存フィールド:あああ

新規テーブル:BBB
新規フィールド名:かかか

AAAのレコードを変えずにテーブル名、フィールド名を変え、別テーブルとし作成するクエリが作りたいです。

SQLの文をベタに教えて頂けるとありがたいです。よろしくお願いします。

Aベストアンサー

こちらの続きということで。
https://oshiete.goo.ne.jp/qa/9534989.html

テーブル作成クエリができているなら

フィールド名「あああ」のところを
「かかか: あああ」に変えれば OK。
フィールドを「*」にしていたらできない(と思う)。

Qアクセスのクエリでレコード削除ができません。

アクセス超初心者です。

テーブルを商品コードでくっつけて、クエリのデザインビューで表示しました。

いらないレコードを削除しようとしたところ、できません。

くっつける前の、テーブルではできますが、クエリで実行させ、レコードを削除しようとしたところできません。

どうしたらよいのか教えてください。

あと、もうひとつ、クエリで、出力したいフィールド名をドラッグしたあと、削除したいときには、どうすればよいでしょうか?

表示しないなら、できるのですが・・・。削除がわかりません。

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

Aベストアンサー

二つのテーブル構造が不明
クエリのSQL文も不明
サンプルデータ

以上三点が分からないと回答のしようもありません。
SQL文はクエリをデザインビューで開いて
その上で右クリックすると現れるコンテキストメニューに
SQLビュー が有りますので切り替えると
SELECT ・・・・ てのが有りますのでコピーして此処に貼り付けできます。

クエリはSQL文を分かりやすいように作られたモノで実体はSQL文です。
掲示板ではこのSQL文でやり取りをします。
さて、なぜ削除できないかというと、そのように作ってしまっているからです。
このリンク先の説明を理解すれば原因が突き止められます。
クエリのデータを編集できない状況
http://office.microsoft.com/ja-jp/access-help/HA010097876.aspx

フィールドの削除は、Access2010の場合なら
リボンの中に「列の削除」が有ります。
または、フィールド名の少し上にマウスカーソルを持って行くと
下向きの太い矢印になるのでクリック、列全体が反転しますので Deleteキーで削除
なお、次回からはAccessのバージョンも明記しましょう。

二つのテーブル構造が不明
クエリのSQL文も不明
サンプルデータ

以上三点が分からないと回答のしようもありません。
SQL文はクエリをデザインビューで開いて
その上で右クリックすると現れるコンテキストメニューに
SQLビュー が有りますので切り替えると
SELECT ・・・・ てのが有りますのでコピーして此処に貼り付けできます。

クエリはSQL文を分かりやすいように作られたモノで実体はSQL文です。
掲示板ではこのSQL文でやり取りをします。
さて、なぜ削除できないかというと、そのように作ってしまっているか...続きを読む

QAccess2003の更新クエリ、レコードの更新欄のフィールド名を自動的に入力するには?

AとBという2つのテーブルが、全く同じフィールドを30個持っています。
AとBでIDが同一のモノのみ、AにBのデータを丸々更新したいのですが
[B].[フィールド名1]というように、IDを除いた残り29個のレコードの更新の欄に
手入力する方法で現在行っています。

追加クエリなどだとフィールドが同じ場合は自動的にレコードの追加欄にフィールド名が現れるのですが
同様に更新クエリでもフィールド名を自動的に出す方法はありますか?
現在上記のような更新クエリを10件以上新規で作成しなければならないのですが
各件に29個も手入力で行うのが非常に面倒でなりません。
やはりSQL等で仕組んでいくようにするのでしょうか?

Aベストアンサー

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
UPDATE実行部分はコメントにしています。

ADO/ADOX での例です。
VBEのメニュー「ツール」->「参照設定」で、
 Microsoft ActiveX Data Objects 2.1 Library
 Microsoft ADO Ext. 2.8 for DDL and Security
が、参照可能となっていることを確認します。


---- 標準モジュールに以下を記述

Private Function FieldSet(TbTo As String, TbFrom As String, sFld As String) As String
  FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
End Function

Public Function CopyFieldValue(TbTo As String, TbFrom As String, TbKey As String)
  Dim catdb As New ADOX.Catalog
  Dim clm As Column
  Dim sSql As String
  Dim sTmp As String

  catdb.ActiveConnection = CurrentProject.Connection

  sTmp = ""
  For Each clm In catdb.Tables(TbTo).Columns
    If (clm.Name <> TbKey) Then
      sTmp = sTmp & ", " & FieldSet(TbTo, TbFrom, clm.Name)
    End If
  Next
  If (Len(sTmp) = 0) Then Exit Function
  sTmp = Mid(sTmp, 3)
  MsgBox "sTmp : " & sTmp

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
  MsgBox "sSql : " & sSql

'  CurrentProject.Connection.Execute sSql

End Function

---- ここまで

※ マクロから CopyFieldValue を呼び出したい(使いたい)場合には、
  マクロのアクション「プロシージャの実行」で指定します。

※ テーブル名/フィールド名を [ ] で囲みたい時には、
FieldSet = TbTo & "." & sFld & " = " & TbFrom & "." & sFld
 ↓
FieldSet = "[" & TbTo & "].[" & sFld & "] = [" & TbFrom & "].[" & sFld & "]"

※ テーブルBを基準とする時には、
For Each clm In catdb.Tables(TbTo).Columns
 ↓
For Each clm In catdb.Tables(TbFrom).Columns

テーブルAのフィールドを部分的に抜き出して作ったテーブルBの場合など
(テーブルBに無いテーブルAのフィールドは更新対象外に)


※ 関数名は適宜変更してください。

※ Function で作っていますが、戻り値は設定していません。

※ エラー処理は入れてません。


※※ UPDATE のSQL作成部分、以下でも動くようです。

  sSql = "UPDATE " & TbTo & " INNER JOIN " & TbFrom & " ON " & _
        FieldSet(TbTo, TbFrom, TbKey) & " SET "
  sSql = sSql & sTmp & ";"
 ↓
  sSql = "UPDATE " & TbTo & ", " & TbFrom & " SET "
  sSql = sSql & sTmp
  sSql = sSql & " WHERE (" & FieldSet(TbTo, TbFrom, TbKey) & ");"

作ったクエリの管理だけでも大変なものになりますね。
テーブルのフィールドが増減したら、また修正がたいへんですね。

参考までに(VBAでの処理になります:クエリは作りません)

使い方)
ボタンをクリックしたイベントなどで、以下を記述します。

  Call CopyFieldValue("A", "B", "ID")

テーブルAのフィールドを基準に、
テーブルAとテーブルBのIDが一致するものをテーブルAにコピーします。
(テーブルA/Bのフィールド名が同じだとして)

キーとなる部分に MsgBox 入れておきました。
...続きを読む


人気Q&Aランキング

おすすめ情報