条件

Office97のアクセスを利用しています。
(会社のPCなので古いものしかありません)
すでに作成されたデータベースがあります。
この中に、複数のテーブル・クエリ・他(フォームやマクロなど)があります。
分かる範囲でこのデータベースを触る許可はいただいています。
ただし、テーブルや保存の方法、データ型などの基本しかわからない初心者です。

状況

今回は、あるテーブルにデータを大量に追加したいと思っています。
その際、重複する(複数条件)データは追加しないようにしたいのです。
例えば、

【テーブルA】
オートナンバー   コード   場所   納場
       001   AA001   東京    A   
       002   AA001   東京    B   
       003   AA001   東京    C   
       004   BB001   大阪    A   
       005   BB001   大阪    B   

【テーブルB】
            コード   場所   納場   
            AA001   東京    B   
            AA001   東京    C
          → AA001   東京    D     
            BB001   大阪    B

上記のテーブルが2つあり、テーブルAを元に、テーブルBのデータを追加する場合、
【テーブルA】
オートナンバー   コード   場所   納場
       001   AA001   東京    A   
       002   AA001   東京    B   
       003   AA001   東京    C
            AA001   東京    D   
       004   BB001   大阪    A   
       005   BB001   大阪    B

というように表を更新したいと思っています。

上記の表のように「コード」が一致しても「納場」が一致しなければ追加を行いたいのです。

方法をご教授ください。

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

A 回答 (3件)

> 「一つの条件が一致した場合」しか利用できないのでは?


ウィザードが作成したクエリは雛形なので、さらなる編集は可能です。
できあがったクエリをデザインビューで開いて見てください。

結合される列同士を結ぶ線があるので、もうひとつの条件となる列を同じように結びます。
(テーブルAの「列」をドラッグして、テーブルBの「列」にドロップ)

そのあと、「不一致クエリウィザード」が作成した線を右クリックして内容を確認。
ご自身で追加した線を右クリックして、上記内容と合わせればOK。

なお、#1の方法では、テーブルBのレコードが減ります。
テーブルBを現状のまま残したいなら、テーブルBをコピーしておいてくださいね。

この回答への補足

なるほど。

あとはこのデータを一括で追加するだけですね。
方法はどうしたらいいんでしょうか。
オートナンバーだと無理でしょうか?

補足日時:2011/04/21 23:13
    • good
    • 0

テーブルAの仕様によりますね。

何でも良いならそのままでもかまいません。

例示の【テーブルA】が5レコードの状態なら、以下のようになるだけです。
オートナンバー   コード   場所   納場
       001   AA001   東京    A   
       002   AA001   東京    B   
       003   AA001   東京    C
       006   AA001   東京    D   
       004   BB001   大阪    A   
       005   BB001   大阪    B


仕様がわからないままの「オートナンバー振りなおし」はリスクが大きいことに注意してください。

この回答への補足

リスクは避けたいですが・・・

不一致クエリを利用するだけでも、未登録(追加すべきレコード)が
判明するメリットはありますよね。
(500件が100件くらいには減るかも)

そのデータを正規の入力方法で入力したほうがいいかも。

補足日時:2011/04/21 23:21
    • good
    • 0

必ず「作業前にMDBファイルをバックアップしてから」ですよ。



クエリ作成ウィザードに「不一致クエリ」がありませんかね?
「不一致クエリ」で【テーブルB】から抽出作成されたレコードが追加してはいけないレコードになります。
このクエリを開き、表示されたレコードを削除すれば、テーブルBには「追加するものだけ」が残ります。

ところで【テーブルA】にはオートナンバー列がありますが、どうなさるおつもり?

この回答への補足

>不一致クエリ

なるほど。
ですが、これは「一つの条件が一致した場合」しか利用できないのでは?

>オートナンバー

どうしましょうか。
一括追加を行ったら、ナンバリングされないですよね。

補足日時:2011/04/21 22:38
    • good
    • 0

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

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

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

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

QエクセルのWEBクエリとアクセスのクエリは意味が違

エクセルのWEBクエリとアクセスのクエリは意味が違うのでしょうか?
そもそもクエリとはどういう意味ですか?

ずっとエクセルのWEBクエリを使ってきて、最近アクセスを使うようになったのですが
アクセスのクエリに戸惑っています。

Aベストアンサー

>エクセルのWEBクエリとアクセスのクエリは意味が違うのでしょうか?

全く別物です。

>そもそもクエリとはどういう意味ですか?

単語としては「質問」「問い合わせ」。

Webクエリは、お使いになっているのでおわかりかと思いますが、Webの内容を定型的にシートに貼り付ける機能です。

一方、Access はデータベースソフトですから、ここで言うところのクエリとは、データベース内のデータに対し、抽出・閲覧・更新などを行う機能を指します。
内部的にはSQLと言う言語が使われます。

Q97以前のOffice

2007以降のWord・Excel等で旧バージョン保存をする場合、旧バージョンは「97-2003形式」と表示されるのですが、ということはOffice97よりも前のバージョンでは、97-2003形式で保存しても読みだせないことがあるのでしょうか?

つまりOffice95以前の形式と、Office97から2003までの形式は、どういう違いがあるのですか?

Aベストアンサー

●Excel
ファイルを旧バージョンのExcelで利用できるように保存する | エクセル動画 | 動画を見る | エクセル・ワードの使い方ならaoten(アオテン)
http://www.aoten.jp/snack/excel/m6_11.html


●Word
http://office.microsoft.com/ja-jp/word-help/HP005190282.aspx
したの方の
>他のユーザーが開きやすい文書を作成する
を参照

Qエクセルからアクセスの全てのクエリ名を取得すること

エクセルからアクセスの全てのクエリ名を取得することはできますか?

アクセスからなら
http://www.accessclub.jp/vbakaisetu/58.html
これでできたのですが、
エクセルからアクセスの全てのクエリ名をシートに書き出したいのですが
どうすればいいでしょうか?

エクセルからアクセスのクエリ名を取得するプロシージャーを実行して
変数に格納し、エクセルに戻すしかないのでしょうか?

Aベストアンサー

Excelのコード表の参照設定で、
Microsoft DAO xx Object Library
にチェックを入れて置いてください。
なお、xxは3.6のような数字です。

Sub test()
  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef
  Dim myQdfName As Variant
  Dim i As Long
  Dim j As Long

  Set db = OpenDatabase("C:\Temp\sample.mdb")
  'クエリ名の取り出し
  ReDim myQdfName(i)
  For Each qdf In db.QueryDefs
    If Left(qdf.Name, 1) <> "~" Then
      ReDim Preserve myQdfName(i)
      myQdfName(i) = qdf.Name
      i = i + 1
    End If
  Next qdf

  'シートへの書き込み
  For j = LBound(myQdfName) To UBound(myQdfName)
    With Worksheets("Sheet1")
      .Cells(j + 1, 1).Value = myQdfName(j)
    End With
  Next j

  Set qdf = Nothing
  db.Close: Set db = Nothing
End Sub


クエリの数は不明なので、一旦配列に取り込み、
それをシートに書き込む仕様にしています。

なお、No1さんのおっしゃるMsQueryからは、肝心なMSysObjectsや
MSysQueriesの列は参照できないようです。Accessのバージョンに
よってことなるかもしれませんが。

Excelのコード表の参照設定で、
Microsoft DAO xx Object Library
にチェックを入れて置いてください。
なお、xxは3.6のような数字です。

Sub test()
  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef
  Dim myQdfName As Variant
  Dim i As Long
  Dim j As Long

  Set db = OpenDatabase("C:\Temp\sample.mdb")
  'クエリ名の取り出し
  ReDim myQdfName(i)
  For Each qdf In db.QueryDefs
    If Left(qdf.Name, 1) <> "~" Then
      ReDim Preserve myQdfName(i)
   ...続きを読む

QAccessのクエリでレコード追加

Access初心者です。
バージョンは2010をつかっています。

テーブルを14テーブル含み、フィールド数が100ほどある選択クエリを作りました。
抽出条件などは設定していません。

このクエリで新しくデータを入力、レコードを追加し、上書き保存した後クエリを閉じます。
それからまた、そのクエリを開くとレコードが追加されていません。
テーブルにはその入力したデータは追加されています。

このクエリにもそのデータを追加表示させるためにはどうすればいいですか?
表示されない原因はなんなのかお教えお願いします。

Aベストアンサー

まずはレコードを追加した後に「↓」キーを押してみてください。
それで駄目ならそのクエリに主キーやNOT NULLの項目が、
含まれていないのが原因かも知れません。
クエリを作る際は主キーやNOT NULLの項目が必須です。
間違っていたら申し訳ないです。

Qアクセス テーブル容量とクエリ速度 ローカルでアクセス2010を使用しています。 一般的に2Gまでと

アクセス テーブル容量とクエリ速度



ローカルでアクセス2010を使用しています。
一般的に2Gまでとプログラム容量が言われていますがクエリをサクサク動かしたいのでクエリ結果を小刻みにテーブル作成クエリで作っています。その度に容量が増え、最適化などを行います。教えて頂きたいのは、多少重くてもクエリにクエリを重ねたりしてでも、テーブルを作るより良いものなのでしょうか?
さじ加減がわからないので教えてください。

Aベストアンサー

別に、容量許す限りテーブル作成してもいいですよ。
例えば月次の集計なんかは、月締めしたらテーブルに切り分けて、それを元に集計しますし。
ケースバイケースですね。

あまり重くなるなら、データとクエリとをファイルごと分けたらいいんです。
いわゆる分散化です。
それだと最適化も早いし。

QAccessでチェックボックス選択でレコード追加

AccessDBで、下記のようなことをやりたいのですが、ご教授いただけないでしょ
うか?

例)(実際の内容は違うのですが、例としてお伝えしやすい内容に変更していま
す。)

野球のデータベースを作るとします。
野球の試合日のデータ(試合テーブル)

試合ID  0001
試合日  5月1日
天候   晴れ
試合相手 タイガース
試合場所 東京グランド

こういった試合データが複数レコードある。

ここにチームのメンバ(メンバテーブル)
A選手
B選手
・・・・
Z選手


各選手の試合履歴を見るために各選手と試合データを結合させたいです。
5月1日の試合(試合ID0001)に、A,B,C選手が出場していたとしたら、

A 0001
B 0001
C 0001

を結びつけるようなテーブルを作ればよいと思うのですが、A,B,Cを入力して上
記レコードを作るのではなく、
A選手~Z選手のチェックボックスがあって、選択した選手の分だけ
(今回でいうとA,B,C)が、
A 0001
B 0001
C 0001

というように0001と結合でするレコードを作りたいのです。
プルダウンでA,B,Cを選択する方法はわかるのですが、実際にやりたいのは、100
ぐらいの選択となるので、チェックボックスで選択したいのです。

AccessDBで、下記のようなことをやりたいのですが、ご教授いただけないでしょ
うか?

例)(実際の内容は違うのですが、例としてお伝えしやすい内容に変更していま
す。)

野球のデータベースを作るとします。
野球の試合日のデータ(試合テーブル)

試合ID  0001
試合日  5月1日
天候   晴れ
試合相手 タイガース
試合場所 東京グランド

こういった試合データが複数レコードある。

ここにチームのメンバ(メンバテーブル)
A選手
B選手
・・・・
Z選手


各選手の試合履歴を見るために各選手と試合...続きを読む

Aベストアンサー

#5です

基本的に、複数のレコードを1つのフォームで表示したい場合、
帳票フォームになると思います。
ただ、帳票フォームにしてしまうと、好き勝手な配置はできなくなります。

複数のレコードを好き勝手に配置したい・・・VBAの登場と思います。

とは言っても、使い方/処理限定で 少ない VBA 記述での実現になりますが、
・「T試合」新規登録時のみ
・選手を追加したらフォームの手直しが必要
・この用途以外にチェックボックスがない事
という条件を設けます。

フォームの作成)

・「T試合」を元に、フォームウィザードで単票フォームとして作成します。
 プロパティで、「データ入力用」を「はい」とします。
・「登録」ボタンを配置します。(以下 VBA 記述では「btn1」の名前にしていました)
・必要な分、チェックボックスを自由に配置します。
チェックボックスの「タグ」に、選手ID を設定し、ラベルに選手名を設定します。
処理として、「タグ」が設定してあるものを対象にしているので、
非表示/タグ設定なしのチェックボックスを配置しておけば、後の修正は楽かも。
また、チェックボックスの名前は何でもいいです。(名前はみていません)

フォームの画面は以上です。
VBA の記述は以下になります。

Private Sub Form_Current()
  Dim ctl As Control

  For Each ctl In Me.Controls
    With ctl
      If (.ControlType = acCheckBox) Then
        .Value = False
      End If
    End With
  Next
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  Cancel = True
  MsgBox "登録ボタンで確定", vbCritical
End Sub

Private Sub btn1_Click()
  Dim sSql As String
  Dim sS As String
  Dim ctl As Control

  If (Not Me.Dirty) Then Exit Sub

' 試合日など入力チェックをするのなら、この場所で

'
  sS = Me.BeforeUpdate
  Me.BeforeUpdate = ""
  Me.Dirty = False
  Me.BeforeUpdate = sS

  For Each ctl In Me.Controls
    With ctl
      If (.ControlType = acCheckBox And Len(.Tag) > 0) Then
        If (.Value) Then
          sSql = "INSERT INTO T出場(試合ID, 選手ID) VALUES (" _
              & Me.試合ID & "," & .Tag & ");"
          CurrentDb.Execute sSql
        End If
      End If
    End With
  Next
  Me.Requery
End Sub

新規登録時に、まずチェックボックスのチェックを外しておきます。
「登録」ボタンがクリックされた時に、チェックがあるものを探し出し、
レコードを追加します。

これで VBA の記述量は減りましたが、書きたくない・・・
ってなことなら、テーブルを見直します。

> <3>試合選手連結テーブル
> に
> 試合ID 0001 選手ID A
> 試合ID 0001 選手ID B
> 試合ID 0001 選手ID C
> の3レコードができる。

この考え方はデータベースとして合っていると思います。

私の認識不足かもしれませんが、
VBAを使わずに好き勝手に配置するには、1レコード内に全ての情報が必要だと思います。

> 4)「T出場」
> an: オートナンバ 主キー
> 試合ID: 数値型 「T試合」の試合IDと
> 選手ID: 数値型 「T選手」の選手IDと

が、

an: オートナンバ 主キー
試合ID: 数値型 「T試合」の試合IDと
ck1: Yes/No型  ルックアップはチェックボックス
ck2: Yes/No型
ck3: Yes/No型
ck4: Yes/No型
・・・
ck120: Yes/No型

フィールドは250個位作れたと思います。
ck1 は A さん用、ck2 は B さん用
等、取り決めが必要になります。(データベースとして外れていく?)
※ 一意に特定できるフィールドが欲しかったので、オートナンバを入れてましたが、
  上記では不要かも

ただ、この後でやろうとしている事(処理)が、複雑になっていくような・・・
お勧めできるものではありません。

もし、この構成にしたとして、このテーブルを元に単票フォームを作ります。
(チェックボックスを自由に配置して、ラベル部分を割り当てる選手名に変更)
(割り当てていないものは、不可視にでもしておきます)
このフォームを、「T試合」を元にしたフォームのサブフォームとして組み込みます。
「試合ID」を、リンク親/子フィールドに設定することで
メイン(親)フォームのレコード移動に連動して表示は切り替わってくれます。
選手を追加した場合は、ラベル部分を選手名に変更/可視化する修正が必要です。

ここまで、VBA 記述はありません。

細かい動きを処理しようとすると VBA がチョッと必要になります。

以下一例で、(サブフォーム内の処理として)
親の「試合ID」が設定されていなければ先行して編集状態にしない
「試合ID」が設定されていない・・・新規でしょ
新規でチェック出来たらおかしいよねって

Private Sub Form_BeforeInsert(Cancel As Integer)
  If (IsNull(Me.Parent.試合ID)) Then Cancel = True
End Sub

メイン/サブフォームの構成にすると、
メイン側を編集して、サブフォーム側をいじろうとすると
メイン側のレコードは確定されたと思います。
逆に、サブ側を編集してメイン側をいじろうとすると
サブ側のレコードは確定されたと思います。

登録ボタンは、無くても良さそうです。
フォームの構成はこんな感じになると思います。


ワーク用テーブルを使う手もありますが
サブフォームで参照するのは「ワーク用テーブル」の方
フォーム起動時に、「T出場」から「ワーク用テーブル」に展開
フォームを閉じる時に、「ワーク用テーブル」から「T出場」に戻す
ただ、この処理に #5 と同じ位 VBA 記述が必要になってきます。

なお、#5では、選手が120人以上にならない限り修正は不要です。
"ck1" ~ 選手を「よみ」順で割り当てていきますが、
チェックボックス自体の配置は自由にして構いません。
(#4で120個作成する時に、きれいに並べたかっただけなので)


いろいろと裏を取ってください。
私の中での認識なので、嘘が混じってるかも。

#5です

基本的に、複数のレコードを1つのフォームで表示したい場合、
帳票フォームになると思います。
ただ、帳票フォームにしてしまうと、好き勝手な配置はできなくなります。

複数のレコードを好き勝手に配置したい・・・VBAの登場と思います。

とは言っても、使い方/処理限定で 少ない VBA 記述での実現になりますが、
・「T試合」新規登録時のみ
・選手を追加したらフォームの手直しが必要
・この用途以外にチェックボックスがない事
という条件を設けます。

フォームの作成)

・「T試合」を元に、フ...続きを読む

Qユニオンクエリで繋げられるテーブル(クエリ)の上限の個数は?

access2003です。
ユニオンクエリで繋げられるテーブル(クエリ)の上限の個数はいくつなんでしょうか?
またSQL文は1024文字越すとエラーになるのでしょうか?
よろしくお願い致します。

Aベストアンサー

Accessのヘルプで、仕様制限と検索してください

「Access の定義」と出てきます

そこで、クエリでの使用テーブル数32(Access2000/2002)の場合、出てきます
2003は、判りませんが、ヘルプを読んでみて下さい

> またSQL文は1024文字越すとエラーになるのでしょうか?

それも、ヘルプで、
> SQL ステートメント内の文字数 約 64,000
となってません?

Q2つの条件で重複しないデータを抽出

シート1
1|品名 種類 名前 データ
2|A 1 あ 21
3|B 2 い 11
4|F 2 あ 51
5|A 1 い 21 
6|B 2 あ 64
7|A 1 あ 84


シート2
1|品名 A
2|種類 1
3|
4|名前
5|あ
6|い


シート1のデータから、シート2の2つの条件(A1:B2)で、重複しない名前を表示する方法を教えて下さい。
上記のデータでいうと、品名Aであり種類が1の名前を重複なしで特定の位置(A5)から詰めて縦に表示するようにして、
シート1のデータ、シート2の条件を変更したらA5からの名前が自動更新されるようにしたいです。

以下できたら追加したいこと
1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順
2.シート2のB2の種類に0を入れると種類の条件無しで表示


実際はA5からの名前の行は数行を結合したもので右側には複数の行でデータ項目別になって、名前が入力された時に日毎のデータを自動表示しています。
全部で名前の種類は30以上ありますが、品名の条件をつければ名前は10種類以下になります。
グラフは名前別で表示しており、不要な名前が増えると表示しずらいので、必要な名前だけのデータを表示するようにしたいです。

どうかよろしくお願いします。

シート1
1|品名 種類 名前 データ
2|A 1 あ 21
3|B 2 い 11
4|F 2 あ 51
5|A 1 い 21 
6|B 2 あ 64
7|A 1 あ 84


シート2
1|品名 A
2|種類 1
3|
4|名前
5|あ
6|い


シート1のデータから、シート2の2つの条件(A1:B2)で、重複しない名前を表示する方法を教えて下さい。
上記のデータでいうと、品名Aであり種類が1の名前を重複なしで特定の位置(A5)から詰めて縦に表示するようにして、
シート1のデータ、シート2の条件を変更したらA5からの...続きを読む

Aベストアンサー

No.1です!
補足を読ませていただきました。
データは10000行位あり、今後も増える予定だというコトですので、
VBAでの方法はどうでしょうか?

※ 実は前回、
>1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順
>2.シート2のB2の種類に0を入れると種類の条件無しで表示
の件を無視していましたので、

Sheet1・Sheet2の配置はお示し通りになっていて、Sheet3を作業用に使用しています。
(Sheet3は現在なにも使用していないという前提です。)

画面左下にあるSheet2のSheet見出し上で右クリック → コードの表示 → VBE画面が出ますので
↓のコードをコピー&ペーストしてSheet2のB1・B2セルのデータを変更してみてください。


Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
Dim i, j As Long
Dim ws1, ws3 As Worksheet
Set ws1 = Worksheets(1)
Set ws3 = Worksheets(3)
Application.ScreenUpdating = False
If Target.Row <= 2 And Target.Column = 2 Then
If WorksheetFunction.CountBlank(Range("B1:B2")) Then Exit Sub
i = Cells(Rows.Count, 1).End(xlUp).Row
If i > 4 Then
Range(Cells(5, 1), Cells(i, 1)).ClearContents
End If
ws1.Columns("A:D").Copy Destination:=ws3.Cells(1, 1)
ws3.Columns("A:D").Sort key1:=ws3.Cells(1, 4), order1:=xlDescending
ws3.Columns(1).Insert
If Cells(2, 2) = 0 Then
For i = 2 To ws3.Cells(Rows.Count, 2).End(xlUp).Row
If ws3.Cells(i, 2) = Cells(1, 2) And _
WorksheetFunction.CountIf(ws3.Columns(1), ws3.Cells(i, 4)) = 0 Then
ws3.Cells(i, 1) = ws3.Cells(i, 4)
End If
Next i
For j = 2 To ws3.Cells(Rows.Count, 1).End(xlUp).Row
If ws3.Cells(j, 1) <> "" Then
Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws3.Cells(j, 1)
End If
Next j
Else
For i = 2 To ws3.Cells(Rows.Count, 3).End(xlUp).Row
If ws3.Cells(i, 2) = Cells(1, 2) And ws3.Cells(i, 3) = Cells(2, 2) And _
WorksheetFunction.CountIf(ws3.Columns(1), ws3.Cells(i, 4)) = 0 Then
ws3.Cells(i, 1) = ws3.Cells(i, 4)
End If
Next i
For j = 2 To ws3.Cells(Rows.Count, 1).End(xlUp).Row
If ws3.Cells(j, 1) <> "" Then
Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws3.Cells(j, 1)
End If
Next j
End If
ws3.Cells.ClearContents
Application.ScreenUpdating = True
End If
End Sub 'この行まで

※ B2セルが「0」の場合は「種類」は無視して、「品名」ごとの最大データの人を表示!
※ B2セルが「0」以外の場合は「品名」・「種類」が一致する最大データの人を表示!
という考え方にしています。

お役に立てば良いのですが・・・m(_ _)m

No.1です!
補足を読ませていただきました。
データは10000行位あり、今後も増える予定だというコトですので、
VBAでの方法はどうでしょうか?

※ 実は前回、
>1.表示する名前の順番が、シート2の条件で集計したデータ値が多い名前順
>2.シート2のB2の種類に0を入れると種類の条件無しで表示
の件を無視していましたので、

Sheet1・Sheet2の配置はお示し通りになっていて、Sheet3を作業用に使用しています。
(Sheet3は現在なにも使用していないという前提です。)

画面左下にあるSheet2のSheet見出し上で...続きを読む

QSQLサーバーに保存してあるクエリをアクセスで開くには?

SQLサーバーに保存してある「クエリ1.sql」をアクセスで開くにはどうすればいいでしょう?
アクセスで「リンクテーブル」→「ODBC接続」
でテーブルのリンクはできているのですが
クエリをリンクするにはどうすればいいでしょうか?

宜しくお願い致します。

Aベストアンサー

多分、この質問と同じですよね。

http://oshiete1.goo.ne.jp/qa4966123.html

クエリ1.sqlは、データベースのオブジェクトとしてではなく、単にテキストファイルとして保存されているので、Access からはリンクできません。

多分、やりたい事は、そのクエリをそのまま Access から実行、と言う事でしょうから、解としては、そのファイルを開いてクエリをコピーして、Access のパススルークエリを作成して、ペーストです。

Qアクセスで重複しない商品コードの作成

AccessでDBを作成中です。まだ初心者で勉強中ですが、お知恵を貸して頂けますでしょうか。
服の形、生地の種類、色をフォームでそれぞれを組み合わせて、重複しない商品コードを作成したいと考えています。
01(形)-05(生地)-03(色)-001(オート番号)=010503001等

フォームでコンボックスリストから形・生地・色を選べるようにして、オートナンバーは自動、最後に自動的にこれら4つを組み合わせた商品コードが表示されればと思っていますが、フォームでこれが出来るためにはどうしたらよいでしょうか?
最後にオート番号を入れたのは、同じ組み合わせでも違う商品となる場合があるため、重複しないようにするためです。

3つのテーブルから出来なさそうだったので、考えたのは4つ目のテーブルを商品数テーブルとしてオート番号を振り、4つのテーブルからクエリをつくる。ここでづまずいてしまいました。

服のスタイル_テーブル
・スタイルID
・スタイル名

生地種類_テーブル
・生地ID
・生地名

色_テーブル
・カラーID
・カラー名

商品数_テーブル
・商品ID(00001~オートで)

また、4つもテーブルを作る必要がない、他の方法がある場合はご教授頂けますようお願いいたします。長文失礼致しました。

AccessでDBを作成中です。まだ初心者で勉強中ですが、お知恵を貸して頂けますでしょうか。
服の形、生地の種類、色をフォームでそれぞれを組み合わせて、重複しない商品コードを作成したいと考えています。
01(形)-05(生地)-03(色)-001(オート番号)=010503001等

フォームでコンボックスリストから形・生地・色を選べるようにして、オートナンバーは自動、最後に自動的にこれら4つを組み合わせた商品コードが表示されればと思っていますが、フォームでこれが出来るためにはどうしたらよいでしょうか?
最...続きを読む

Aベストアンサー

大変遅くなりました。

[補足その1]について

>SQL文を訂正いただきましたが、SELECT 商品数_テーブル2.となっておりましたが、
>この2.はどこからきたものでしょうか?

すみません。これは私のほうでの確認したときのテーブル名で
SELECT 商品数_テーブル が正しいです。失礼しました。

>2を除いて取り急ぎ、SQL文を貼り付けましたところ、問題なく実行されたようです

その通りです。



[補足その2]について

コード中の、
>strSQL = "UPDATE T-Number SET T-Number.Number = [Number]+1;"
のところで、テーブル名を
T-Number
としていますが、「-」はOfficeあるいは他のプログラミング言語
などにおいても特別な記号とされています。したがって、テーブルなどの
名称においても、
生地種類_テーブル
のように、「_]を用いることをお勧めします。
T_Number
なお、
>T-Number

[T-Number]
のように[]で囲むと認識されるかもしれません。確認はしていません。
>strSQL = "UPDATE T-Number SET T-Number.Number = [Number]+1;"
strSQL = "UPDATE [T-Number] SET [T-Number].Number = [Number]+1;"



[補足その4]について(たぶん3かもしれませんが)

>テーブル等にも書式で00にはしているのですが、表示は一桁になって
>しまっております。

テーブルでの書式は見かけの書式ですので、これを解決するためには、
フィールドの型をテキスト型にし、テーブルに入力するときに、

01
02
03

のように入力するか、あるいはコード中でFormat関数を用いて
変換する必要があります。
No6の中で、

'商品IDは5桁に設定
Me!商品ID = Format(DMax("番号", "番号_テーブル") + 1, "00000")
'商品コードの設定
Me!商品コード = Me!スタイルID.Column(0) & Me!生地ID.Column(0) & Me!カラーID.Column(0) & Me!商品ID

のようにしているところです。ここのところで、

Me!商品コード = Me!スタイルID.Column(0) & Me!生地ID.Column(0) & Me!カラーID.Column(0) & Me!商品ID



Me!商品コード = Format(Me!スタイルID.Column(0),"00") & Format(Me!生地ID.Column(0),"00") & Format(Me!カラーID.Column(0),"00")

& Me!商品ID

のようにするかです。この場合は対象の数値が一桁ならば数値の先頭に「0」が
付加されます。しかし二桁になると「0」は付加されません。二桁になる可能性が
あるならば、
"00"

"000"
にする必要があります。



以上が、補足への回答ですが、どのような人がどのように入力しても
所定の結果が得られるように徹底的にエラー処理をしたものもあります。
上記の補足への回答を確認され、テーブルの設定や入力方法を
確定されたら、また補足してください。よければエラー処理を
施したコードを表示します。

大変遅くなりました。

[補足その1]について

>SQL文を訂正いただきましたが、SELECT 商品数_テーブル2.となっておりましたが、
>この2.はどこからきたものでしょうか?

すみません。これは私のほうでの確認したときのテーブル名で
SELECT 商品数_テーブル が正しいです。失礼しました。

>2を除いて取り急ぎ、SQL文を貼り付けましたところ、問題なく実行されたようです

その通りです。



[補足その2]について

コード中の、
>strSQL = "UPDATE T-Number SET T-Number.Number = [Number]+1;"
のところ...続きを読む


人気Q&Aランキング

おすすめ情報