ACCESSを使った部品構成表のDBテーブルの紐付け方法

このQ&Aのポイント
  • ACCESSを使用して部品構成表のDBテーブルを紐付ける方法について知りたいです。
  • 部品構成表のDBテーブルを参照し、Bという部品の構成を全て表示させる方法について教えてください。
  • VBAやSQLを使用してレベルごとに部品構成を出力させる方法について教えてください。
回答を見る
  • ベストアンサー

ACCESSについて教えてください。

いつも大変お世話になっております。 すみませんが、今回も力をお貸しください。よろしくお願いいたします。 社内部品構成管理システムには下表のように部品構成表として登録して管理してあります。(レベル1まで) AはB,G,Xという部品で構成されているとします。 BはA,R,Xという部品で構成されているとします。 親  子 A   C A   G A   X B   A B   R B   X Bという部品の構成を全部見たいと思い、以下のようにACCESS等(部品構成表DB)で紐付けします。 親   子 ― 親      子 ― 親           子 結果、BはAが含まれるので、以下のような結果が出力されます。 (現状、どこまで子があるか分からないので適当に部品構成表のDBテーブルを結んでいます。) B A C B A G B A X B R B X これを、(サマリー型というのでしょうか) レベル1 B レベル2 A レベル3 C レベル3 G レベル3 X レベル1 R レベル1 X のように出力させるにはどのようにやればいいのでしょうか? VBAやSQLで出力可能でしょうか? 長くなりましたが、よろしくお願いいたします。

  • AKI78
  • お礼率63% (70/110)

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

  • ベストアンサー
  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.7

#1です えっと・・・? > Bの部品を使用する"H"という部品が親に追加されたとして、同じレベルに > 同じ子品番が存在する場合もあります ならば、#5でお答えしたクエリで実行可能(作成可能)です で、とりあえずなのですが・・・DAOを使用しVBAでテーブル作成するルーチンを作成してみました(こっちだと、階層の深度が多になっても大丈夫だと思いますが、VBAがある程度判らないと辛いかな?、後、普通はADOなんだろうけど・・・そっちは、勉強してないのと、DAOを覚えているだけで、現在要としては足りるんで^^;) まず、VBAの画面で「ツール」-「参照設定」で、「Microsoft DAO X.X Object Library」にチェックが入っているか確認してください で、モジュールを新規作成で、 Option Compare Database Option Explicit Dim DAOrsOut As DAO.Recordset Sub usTreeMade(RefTbl As String, PerFld As String, ChrFld As String, StrChr As String) If IsNull(DLookup("Name", "MSysObjects", "Name = 'Tbl_Tree'")) Then CurrentDb.Execute "Create Table Tbl_Tree ([Level] Long, [Parts] Char(50), [Tree_String] Char(50));" Else CurrentDb.Execute "DELETE * FROM Tbl_Tree;" End If ' 木構造作成 Set DAOrsOut = CurrentDb.OpenRecordset("Tbl_Tree") Call usTreeSub(RefTbl, PerFld, ChrFld, StrChr, StrChr, 1) DAOrsOut.Close Set DAOrsOut = Nothing End Sub Sub usTreeSub(RefTbl As String, PerFld As String, ChrFld As String, StrChr As String, usTree As String, usLevel As Integer) Dim DAOrsRef As DAO.Recordset Dim NextStr As String Dim mySQL As String ' 親の登録処理 With DAOrsOut .AddNew .Fields("Level") = usLevel .Fields("Parts") = RTrim$(StrChr) .Fields("Tree_String") = RTrim$(usTree) .Update End With ' 子の検索 mySQL = "Select * From " & RefTbl & " Where " & PerFld & " = '" & StrChr & "' ;" Set DAOrsRef = CurrentDb.OpenRecordset(mySQL) With DAOrsRef While Not .EOF NextStr = .Fields(ChrFld).Value ' 子の登録処理(再帰) If InStr(usTree, NextStr) = 0 Then Call usTreeSub(RefTbl, PerFld, ChrFld, NextStr, usTree & " - " & NextStr, usLevel + 1) End If .MoveNext Wend .Close End With Set DAOrsRef = Nothing End Sub をコピー&ペーストして、フォーム上のコマンドボタンで・・・ call usTreeMade("部品構成表DB", "親", "子", "H") で、呼び出せば・・・テーブルの「Tbl_Tree」と言うものに結果出力します "H"の部分をフォーム上のコントロールで置き換えれば、他にも使えたり、汎用性が増えるかな?

AKI78
質問者

お礼

有難うございます。 仕事上、まだ教えてもらった事さえ実行まで追いついていない現状と勉強しないと追いつけてない現状もあるので、教えてもらったことを参考に勉強していきたいと思います。(DAOについて説明、有難うございます) 最後まで付き合ってくださって有難うございました。<(_ _)>

その他の回答 (6)

noname#140971
noname#140971
回答No.6

一介のアパレルのデザイナです。 ですから、無茶ややこしい SQL文なんて考える能力はありません。 ですから、私なら、目的に沿ったテーブル構造を採用するのみです。 <部品一覧>P=親、C=子 ID____区分____部品名 1_____P_________A 2_____P_________B 3_____C_________A 4_____C_________C 5_____C_________G 6_____C_________X このような<部品一覧>を用意します。 <部品構成表>には、それぞれ[ID]でリンクさせて管理します。 この場合、[孫部品名]の登録は、順序さえ間違えなければ自動登録できます。 [子部品名]を入力した段階で<子-孫>に対応する<親-子>の有無を検索するだけ。 <部品構成表> ID____親部品名__子部品名__孫部品名 1_____A_____________C 2_____A_____________G 3_____A_____________X 4_____B_____________A_____________C 5_____B_____________A_____________G 6_____B_____________A_____________X 7_____B_____________R 8_____B_____________X

AKI78
質問者

お礼

アドバイス、有難うございます。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.5

#1です 度々、補足要求で申し訳ありません m(_ _)m 単純に、書いてある例を元に考えれば・・・ SELECT "レベル1" AS レベル, とりあえず部品表.部品_1st AS 部品名, とりあえず部品表.部品_1st As Sort_Name FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_1st HAVING (((とりあえず部品表.部品_1st) Is Not Null)) union SELECT "レベル2" AS レベル, とりあえず部品表.部品_2nd AS 部品名, とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd As Sort_Name FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_2nd,とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd HAVING (((とりあえず部品表.部品_2nd) Is Not Null)) union SELECT "レベル3" AS レベル, とりあえず部品表.部品_3rd AS 部品名, とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd & とりあえず部品表.部品_3rd As Sort_Name FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_3rd,とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd & とりあえず部品表.部品_3rd HAVING (((とりあえず部品表.部品_3rd) Is Not Null)) UNION SELECT "レベル4" AS レベル, とりあえず部品表.部品_4th AS 部品名, とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd & とりあえず部品表.部品_3rd & とりあえず部品表.部品_4th As Sort_Name FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_4th,とりあえず部品表.部品_1st & とりあえず部品表.部品_2nd & とりあえず部品表.部品_3rd & とりあえず部品表.部品_4th HAVING (((とりあえず部品表.部品_4th) Is Not Null)) ORDER BY Sort_Name; で、ソートを加えるだけで、単純に出来上がりなのですが、色々、他に条件があるのでは無いかと疑ってるのですが・・・ 例えば、 > 親  子 > A   C > A   G > A   X > B   A B   A > B   R > B   X と、B下にAが2個発生する可能性があるのではないかとか、いろいろ考えると切が無いんだけど、わかる範疇で条件の追加してもらえますか? なんとなく、考えてるとVBAでDAO操作するなりテーブルへ書き込んで実施した方が早いような気がしてたりするんですが・・・

AKI78
質問者

補足

すみません、こちらこそ度々考えてくださって感謝しております。 (実際、Dxakさんには、毎回助けられて、文では表せない程、感謝しております。) >B下にAが2個発生する可能性があるのではないか ですが、1つの親(品番)に対して1つの子(品番)です。(常に1品番―1品番で部品構成表に登録状態) >わかる範疇で条件の追加 ですが、Bの部品を使用する"H"という部品が親に追加されたとして、同じレベルに同じ子品番が存在する場合もあります。(H部品はBとFの部品で作られるとします。) H B A C H B A G H B A X H B R H B X H F T H F X ↓ レベル1 H レベル2 B レベル3 A レベル4 C レベル4 G レベル4 X レベル3 R  レベル3 X ← 重複 レベル2 F レベル3 T レベル3 X ← 重複 など重複する場合があります。 >VBAでDAO操作するなりテーブルへ書き込んで実施 勉強不足でDAOについてあまり知らないのですが、テーブルへ書き込んで実施とはどのような考え(方法)で簡単になるのでしょうか? 簡単でいいので、教えてもらえると嬉しいです。 毎回、頼りっきりですみません。よろしくお願いします。

noname#79209
noname#79209
回答No.4

#2です。 > レベル1 レベル2 レベル3 > B――――A――――C > B――――A――――G > B――――A――――X > B――――R > B――――X だとすると、 > レベル1 B > レベル2 A > レベル3 C > レベル3 G > レベル3 X > レベル1 R > レベル1 X の下から2行文の > レベル1 R > レベル1 X は > レベル「2」 R > レベル「2」 X じゃないんですか? それとも、ここだけイレギュラーな付け方なんでしょうか。 それと、最初の質問文にある、 > AはB,G,Xという部品で構成されているとします。 > BはA,R,Xという部品で構成されているとします。 > 親  子 > A   C > A   G > A   X > B   A > B   R > B   X は 「Aは『C』,G,Xという部品で構成されているとします。」 のタイプミスですよね? 基本的な部分を『正しく』書いていただかないと 回答者は無駄な労力と時間を費やすことになります。 また、各部品絶対的レベルを出したいのか、相対的レベルなのか、 も必要です。

AKI78
質問者

補足

ご指摘有難うございます。 vizzarさんのご指摘どおりです。 > レベル「2」 R > レベル「2」 X で間違いでした。 また、Aは『B』→『C』,G,Xという部品で構成~の誤りでした。 >基本的な部分を『正しく』書いていただかないと >回答者は無駄な労力と時間を費やすことになります。 に対して、おっしゃるとおりだと思います。すみませんでした。 以後、注意をしていきたいと思います。 >各部品絶対的レベルを出したいのか、相対的レベルなのか との質問に対してですが、知識不足で誤解しているかもしれませんが、例えば、Bの親にHという部品が追加したとしたら、Bがレベル1からレベル2になるのが理想なので、相対的レベルだと思います。 よろしくお願いします。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.3

#1です > レベル1 R > レベル1 X は、 レベル2 R レベル2 X の誤植だと思って書いたけど・・・誤植じゃないの?

AKI78
質問者

補足

失礼しました。 レベル2 R レベル2 X の誤りでした。指摘有難うございます。 今後、質問するの当たってミスをなくす努力したいと思います。 よろしくお願いします。

noname#79209
noname#79209
回答No.2

部品Xが部品AとBの部品となっており、かつ部品AはBの部品ですが 部品Xのレベルはどう判定するのですか?

AKI78
質問者

補足

質問ありがとうございます。レベルのつけ方は、 レベル1 レベル2 レベル3 B――――A――――C B――――A――――G B――――A――――X B――――R B――――X を、 レベル1 B レベル2 A レベル3 C レベル3 G レベル3 X レベル1 R レベル1 X としたいです。引き続き宜しくお願いします。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

う~ん、ツリー型DBの話ですね 私の場合、SQLでトライしてアイディアが思い浮かばなくて、VBAで結果をテーブルに書き込む、若しくは文字列で結果作成する方法で逃げてるパターンです > B A C > B A G > B A X > B R > B X を、 SELECT 部品構成表DB.親 AS 部品_1st, 部品構成表DB.子 AS 部品_2nd, 部品構成表DB_1.子 AS 部品_3rd, 部品構成表DB_2.子 AS 部品_4th FROM (部品構成表DB LEFT JOIN 部品構成表DB AS 部品構成表DB_1 ON 部品構成表DB.子 = 部品構成表DB_1.親) LEFT JOIN 部品構成表DB AS 部品構成表DB_2 ON 部品構成表DB_1.子 = 部品構成表DB_2.親 WHERE 部品構成表DB.親 Not In (SELECT Tbl_In.子 FROM 部品構成表DB AS Tbl_In); と言うクエリで作成して、 (「とりあえず部品表」という名前でクエリを作成) > レベル1 B > レベル2 A > レベル3 C > レベル3 G > レベル3 X > レベル1 R > レベル1 X を、ユニオンクエリで SELECT "レベル1" AS レベル, とりあえず部品表.部品_1st AS 部品名 FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_1st HAVING (((とりあえず部品表.部品_1st) Is Not Null)) UNION SELECT "レベル2" AS レベル, とりあえず部品表.部品_2nd AS 部品名 FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_2nd HAVING (((とりあえず部品表.部品_2nd) Is Not Null)) UNION SELECT "レベル3" AS レベル, とりあえず部品表.部品_3rd AS 部品名 FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_3rd HAVING (((とりあえず部品表.部品_3rd) Is Not Null)) UNION SELECT "レベル4" AS レベル, とりあえず部品表.部品_4th AS 部品名 FROM とりあえず部品表 GROUP BY とりあえず部品表.部品_4th HAVING (((とりあえず部品表.部品_4th) Is Not Null)); で、順番は違いますが出ては来ます しかし、こう言うのは順番とか色々見た目が重要になるので、並び替えようのインデックスを作るか? もう一工夫は必要そうだけどね~^^;

AKI78
質問者

お礼

考えてくださってありがとうございます。参考にさせていただきます。 有難うございます☆

関連するQ&A

  • 部品表

    下のようなデータからストラクチャー部品表をつくるVBAプログラムを教えてもらいたいのですが。    A列      B   C 1行 データ番号 親品目 子品目 2  1       X    A  3  2       X    B  4  3       Y    A 5  4       Y    C  6  5       B    C  7  6       B    D  このデータ(実際は任意に入力)から下のような表を作成 X――A   |   ―B――C       |       ―D Y――A   |   ―C 

  • アクセスの質問なのですが・・・

    在庫管理のDBを作っているのですが、商品クロと商品シロがあり、 商品クロを作るには部品A・部品C・部品Dを使用 商品シロを作るには部品B・部品C・部品Eを使用 部品Cを部品Xに名前を変更する際、商品クロの部品Cは1/20にXに変更。商品シロの部品Cは2/1にXに変更することは可能ですか? その時、1/21~1/31の間、同じ部品にCとXの2つの名前が存在することになりますが、検索するときや在庫数の変更があった場合、正しく検索や数量の計算が反映されるでしょうか? 共通に使うことのない部品であれば、そのまま日付指定をして上書きで変更するつもりなのですが、このような場合、できるのであれば方法もぜひ教えてください。よろしくお願いします

  • アクセスでこのような処理はできますか?

    今アクセスで部品管理のDBを作成しているのですが、部品A・B・Cがあり、部品A・Bを使い組み立てて出来たのが前加工品Q。この時前加工品Qの在庫はプラス。 その後前加工品Qと部品Cを使い、製品を完成させる。 製品が出庫されたとき、前加工品Q、部品A・B・Cの在庫はマイナス。 というようにしたいのです。 説明が下手で申し訳ないのですが、アクセスでこのような処理は可能ですか? 可能であればぜひ方法も教えてください。 お願いします。

  • EXCEL

    A-B-C-D-E-F-G 1-A-W-A-1-B- 2-B-A-N-2-C- 3-C-K-A-3-B- 4-D-A-I-4-E- 5-E-R-X-5-A- 例えば,エクセルで表のようになっている場合に, 列AにF1の値(表の場合は文字B)で検索をかけ,検索に該当した行(表の場合では行2)の列Dの値をG1に表示する方法はあるでしょうか?? 簡単に言うと,列Gに自動的にFに対応するDの数値を入力したいのです.自動的に列Gを下の表のようにすることは可能でしょうか? A-B-C-D-E-F-G 1-A-W-A-1-B-2 2-B-A-N-2-C-3 3-C-K-A-3-B-2 4-D-A-I-4-E-5 5-E-R-X-5-A-4 投稿すると文字がずれてしまって表が見難くてすいません. どなたか,ご教授よろしくお願いします.

  • SQL 同テーブル、同フィールドの文字列連結

    以下の様にSQLで実現したいと思っております。 なお、DBはOracle10Gを利用しております。 親と子テーブルがあり以下の構成となっております。 ■親テーブル  ID,カラムA  1 ,AA  2 ,BB  3 ,CC ■子テーブル  ID,枝番,カラムB  1 ,1 ,あああ  1 ,2 ,いいい  2 ,1 ,ううう  2 ,2 ,えええ  2 ,3 ,おおお  3 ,2 ,かかか ※IDカラムは親テーブルと子テーブルは1:1です  子テーブルの枝番カラムはIDに対してN件です。 やりたい事としては、上記の2テーブルより、以下の結果を出力したいです。  ID,カラムA,カラムB  1 ,AA ,あああ いいい  2 ,BB ,ううう えええ おおお  3 ,CC ,かかか 親テーブルを元にして、 親テーブルに紐づく子テーブルのカラムBを連結して出力 するSQLをご教授いただけますでしょうか

  • アクセスの関数

    アクセスでこのような関数を使っています。 =IF(ISNA(VLOOKUP(C5,部品番号対照表!$A$2:$B$330,2,FALSE)),"! NO DATA !",VLOOKUP(C5,部品番号対照表!$A$2:$B$330,2,FALSE)) 一応機能するのですが、$B$330の中で空欄があると『0(ゼロ)』と表示されてしまいます。ここに何も表示されないようにするにはどうしたらいいですか? "!NO DATA!"の所を『""』にすればよいかと思いやってみましたが、やはり0(ゼロ)が表示されます。 ふー、困りました。

  • 部品表ごとに枠線を引く方法教えてください。。。

    知恵をおかし下さい。 以下の部品表があるとします。(初めは枠線は無いとします) 例えば、親品目AはX,Yによって製造されます。 ボタン一つで親品目ごと枠線を自動で引く方法を教えてください。    A列    B    1 親品目   子品目   _______   | A    X  |     3| A    Y  |   |_____ |   _______   4|  B   X  | 5|  B   Y  |  6|  B   Z   |   |______| VBAを使って作成したいと思っています。よろしくお願いします。

  • RST-FFの矛盾?

    AND, OR, NOT、そしてSRT-FFを用いた回路に、 時刻 1 2 3 A   1  1 1 B   1  1 0 C   0  1 0 D   0  1 0 S   *  * x R   *  * y Q   *  * z 時刻1,2,3の順に入力A,B,C,Dがそれぞれ真理値表に示すように加わったとき、この表のx, y, z(右下)を求めよ。 ただし、*は何らかの値をとることを示す。 ここで図は書けませんが、 AとBはANDゲートでSにつながっており Cは直接Tにつながっており BとDがORゲートで結ばれたのちNOTゲートが来てその出力がRにつながっています。 そして、QとQバーが最終的な出力です。 ここで、上の問題のおれの考えなのですが まず 時刻 1 2 3 A   1  1 1 B   1  1 0 C   0  1 0 D   0  1 0 S   1  1 x R   0  0 y T   0  1 0 Q   1  × z と表が埋まるのでx = 0, y = 1となります。 そして、なぞは2個あるのですが (i)SとTが同時に立つことってあるんですか?? (ⅱ)z って 0ですよね? 分かる方お願いします。 何か間違っている箇所、または足りない箇所ありましたら指摘お願いします。

  • 親と子の品番管理方法について

    excel2010 親と子で多対多の関係にある様なデータの管理をどの様にしたらよいかを 教えていただきたく。 親品番 A001 に対して 子品番 X001 Y001 親品番 B001に対して 子品番 X001 Z001 親品番 C001 に対して 子品番 X001 Y001 の様に多対多の関係にある様なデータ管理(マスタデータ)は、 どの様な表形式で管理したらよいでしょうか? accessで管理ということもあるでしょうが、 私にaccessのスキルがないのと、accessは、そのままデータが変更されてしまうので、 excelで親ー子の関係にあるデータを管理したいと思っています。 A001X001 A001Y001 B001X001 B001Z001 C001X001 C001Y001 の様に、親と子を連結したデータで管理がよいかと思っています。 子品番変更の場合、 X001→X002 A001X002 B001X002 C001X002 のデータを追加 みたいなイメージです。

  • 3つの表の外部結合

    3つの表があり、それぞれ次のデータが格納されているとします。 表A +-----+-----+-----+ |列A1 |列A2 | 列A3| +-----+-----+-----+ | A01 | B01 | A11 | | A02 | B02 | A12 | +-----+-----+-----+ 表B +-----+-----+-----+ |列B1 |列B2 |列B3 | +-----+-----+-----+ | B01 | X | B11 | | B01 | Y | B12 | | B02 | X | B13 | | B02 | Y | B14 | +-----+-----+-----+ 表C +-----+-----+ |列C1 |列C2 | +-----+-----+ | C01 | A11 | | C02 | A21 | | C03 | A12 | +-----+-----+ この場合、表Aと表BをA2とB1で等価結合し(但しB2='X') その結果導き出されたA3と表CのC2で外部結合し, B3の値を取得したいのです。 つまり、以下のような結果を得たいのです。 +-----+-----+ |列C1 |列B3 | +-----+-----+ | C01 | B11 | | C02 | null| | C03 | B13 | +-----+-----+ 表Aと表Bを結合した表を別名で定義し、 表Cと外部結合すれば可能だと思うのですが、 その様なやり方ではなく、 単純に3つの表を結合して行うことは出来ないのでしょうか。 尚、DBはORACLE9iです。

専門家に質問してみよう