ACCESSのようなRDBで階層構造を管理する場合のテーブル構造の定石ってあるんでしょうか。
「部品表」のようなものをデーベース化したいのですが、イマイチしっくりきません。
例えばAという部品はBとCという部品で構成されています。BはDとEとF。
FはAとEで成り立っているというようなものです。
この階層がどれくらい続くかは、任意に決定されねばなりませんし、もちろん各部品の親子関係もどこからでもできるだけ解かり易い形で表示可能にしなければなりません。
Windowsのエクスプローラーのような表現が理想なのですが、各階層毎には表現できても、全体の繋がりがどうも・・・
こういう場合によく使われる基本的なテーブル構造というのがあれば教えて下さい。

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

A 回答 (3件)

>特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。



あんまり気にしなくても良いんですが(「ゴミ掃除」に関してはそのまま書き写すだけで動作しますんで)、ちょっとだけ解説します。

えと、まず、一つの部品に付きフォームが1枚ですんで、複数の部品を同時に表示するためには、それだけの枚数のフォームを用意しなければならない。

あらかじめフォームを10個も20個も作っておくのはあまりにも非現実的ですんで、最初に汎用的なフォームを1枚作っておいて、必要に応じてその複製を画面に表示するようにしよう、と。

で、フォームの複製を作る(*1)のは良いんですが、どこかにそれを保存しなくちゃならないんですよね。
そこで、BuhinWins って名前を付けたコレクションを作成(*2)し、新しくウインドウを作るごとにそこに登録(*3)するようにしたわけです。
*1 Set frmBuhin = New Form_F部品
*2 Public BuhinWins As New Collection
*3 BuhinWins.Add frmBuhin

ここまではいいんですが、そのウインドウを×して閉じた後でも BuhinWins 内のデータは勝手に消えてくれず、無効なウインドウのデータがゴミとして残ってしまうのです。

例えば、10枚のウインドウを開いたとすると、BuhinWinsには10枚分のデータが登録されます。
そのあと4枚のウインドウを閉じた場合、画面上に表示されているウインドウは6枚でも、BuhinWinsには有効なデータ6枚分に加えて無効なデータが4枚分が登録されています。

ってことで、「ゴミ掃除」の部分で無効なデータを見つけては、これを削除するってことをやってるわけです。



>ところでVBのツリービューコントロールというのは、手に入れさえすれば、初めてでも割と簡単に使えるものなのでしょうか?

んーと、VB(A)初級者には若干キツイ部分もあるかもしれません。
TreeViewの取り扱い自体が多少複雑なのに加えて、これに関するヘルプの項目もあんまり親切じゃないんですよね~。
ヘルプの読み方のコツが身についてないと、概要を理解するだけでも苦労するかもしれないです。
ただ、他の方法で同種のインターフェースを作るのに比べたら、遥かに楽な方法であることは断言できます。

VBについての市販本はたくさん出版されているので、まずは大型の本屋を物色して、TreeViewについて詳しく書かれている本を買ってきて、それを見ながら勉強するのがいいのではないかと思います。



>ある製品を指定することで、その製品の全部品を一括でレポートにすることは可能でしょうか?

可能ですが、こっちもVBAの世話になる必要があります。
印刷用の一時テーブルを作っておいて、そこに部品一覧をぶち込みます。
アルゴリズムの概要だけ書くと、

(テーブルの構成)
一時テーブル
 コード(テキスト型)
 親部品ID
 部品ID
  :


dim RS as Recordset '一時テーブル
Dim RSParts '構造テーブル

'一時テーブルの中身をクリア(略)
  :
SET RS=OpenRecordset("一時テーブル")'一時テーブルを開く

'カレーうどん自体を、RSに追加
 RS.AddNew
 RS![コード]="01"
 RS![親部品ID]=null
 RS![部品ID]="カレーうどん"
 RS.Update

RS.MoveFirst
Do Until RS.EOF'レコードの末尾に達するまで繰り返す
  BuhinID=RS![部品ID] '現在のレコードに書かれている部品IDを取得
  Code=RS![コード]

  'BuhinIDで指定された部品の構成部品を検索する
  Set RSParts=OpenRecordset("SELECT * FROM 構造テーブル WHERE 部品ID=" & BuhinID)
   counter=1
   do until RSParts.eof
    RS.AddNew
    RS![コード]=code & format$(counter,"00")
    RS![親部品ID]=BuhinID
    RS![部品ID]=RSParts![構成部品ID]
    RS.Update
    RSParts.MoveNext
    Counter=Counter+1
   loop

  RS.MoveNext'次のレコードに移動
Loop

こんな感じですね。
[コード]フィールドで並べ替えを行ったり、階層の深さを測ったりします。

うまく動いたとすると、以下のように[コード]が生成されているはずです。
コード 部品ID
01 カレーうどん
0101 うどん
0102 カレー
010101 水
010102 うどん玉
010201 カレー粉
 :
01020101 ターメリック
01020102 ガラムマサラ

相変わらず長文だ~
    • good
    • 0
この回答へのお礼

すっばらいしいです。
おかげさまでこのコードを基本に多少アレンジすれば、私の悩みはほぼ解決しそうです。
まあ、私の場合アレンジ力が問題ですが、なんとか試行錯誤でやってみます。

ツリービューコントロールについては、アドバイス頂いた通り、気長に基礎的なところからやってみます。
というかこの一括表示と前述いただいた無限階層川下りをうまく絡ませて併用すれば、ツリービューまで取り入れなくとも、十分階層表現できそうですし現状大きな問題はないと感じています。

試行錯誤の途中で挫折しました折にはまたよろしくお願いします。
ありがとうございました。

お礼日時:2001/07/09 22:55

>それから、困った点は、ドライカレーも部品になり得る(中略)部品の概念と完成品の概念はやはり区別しなければなりません。



これは、[完成品]フィールド(Yes/No型)と[部品]フィールド(Yes/No型)を作ってやればいいんじゃないでしょうか。
ドライカレーは完成品でもあり、部品でもあるってことで、両方にチェックを付けるとか。



>ところがこれが三層構造くらいですと問題はないのですが、いくつも連なってくると・・・

この辺がメンドクサイんですよねぇ。
とりあえずVBのツリービューコントロールを流用すると、手っ取り早くエクスプローラライクなインタ-フェースを作れると思います。

フォームで作る場合には、メインフォーム→サブフォーム→サブサブフォーム・・・ ってな作り方はダメですね。仰るように、階層が増えると行き詰まってしまいます。

この問題は、任意の部品及びその構成要素を表示する汎用的なフォームを作っておき、構成要素をクリックするたびに、このフォームのインスタンスを新しく作成、表示する、っていうふうにして解決します。

概略だけ書きますと、

1:フォームに[部品名]等のテキストボックスと、[構成部品]サブフォームを貼り付ける。(フォーム名は[F部品]とでもしておく)

2:同フォームに
public sub RefreshData(BuhinID as long)
  '指定された部品のデータをフォームに表示する
end sub
ってな感じのコードを書く。

3:標準モジュールを作成し、宣言セクションに
Public BuhinWins As New Collection
って書く。

4:F部品の構成要素クリック時に
Private Sub コマンド1_Click()
 Dim i As Long, dummy As Variant
 Dim frmBuhin As Form_F部品
 'コレクションのゴミ掃除
 On Error Resume Next
 For i = BuhinWins.Count To 1 Step -1
  dummy = ""
  dummy = BuhinWins(i).Name
  If dummy = "" Then
   BuhinWins.Remove i
  End If
 Next i
 'フォームのインスタンスを作成して、コレクションに追加
 Set frmBuhin = New Form_F部品
 frmBuhin.RefreshData Me.構成部品ID
 frmBuhin.Visible = True
 BuhinWins.Add frmBuhin
End Sub

ってな感じのコードを書く。
以上。

このようにすると、構成部品をクリックするたびに、その部品を表示するウインドウが新しく開きます。
新しく開いたウインドウに更に構成部品が含まれていたとしても、それをクリックすればまた別のウインドウが開きます。

この回答への補足

早速のご回答ありがとうございます。
残念ながら、私はコードを自在に駆使できるレベルにないので、このコードをそっくりそのままコピーして使うことはできても、応用がききません。
おおよその組立は理解できるのですが、特にコレクションのゴミ掃除の部分なんかはチンプンカンプンです。
でも、VBAを駆使すれば無限階層表示も可能ということがわかっただけでも大きな収穫です。
挫折中だったコードのお勉強を再開せねばと痛感しました。
ところでVBのツリービューコントロールというのは、手に入れさえすれば、初めてでも割と簡単に使えるものなのでしょうか?
それと甘えついでにもう一つ。
ある製品を指定することで、その製品の全部品を一括でレポートにすることは可能でしょうか?
レポートの表記としては、例えばカレーうどんを指定すると

階層   親部品ID   部品ID   重量   

 1   カレーうどん  うどん   200
 1   カレーうどん  カレー   100
 2   うどん      水    100
 2   うどん     うどん玉  100
 2   カレー     カレー粉   50
 2   カレー     肉      20
 2   カレー     水      30
 3   カレー粉    ターメリック 40
 3   カレー粉   ガラムマサラ  10
 
というような一括表形式が理想です。これができれば、部品の所用量計算が容易になりますし、ある部品から一直線に製品までさかのぼることもできると思うのですが。

補足日時:2001/07/05 23:19
    • good
    • 0

部品テーブル


 部品ID
 部品名
  :

構造テーブル
 部品ID
 構成部品ID
 数量
  :

のようなテーブルを作ればいいのでは?

例えば、ドライカレーのレシピなら
部品テーブル
部品ID 部品名 単位
1 ドライカレー 皿
2 ご飯 合
3 カレー粉 g
4 植物油 cc
5 米 cc 
6 水 cc
7 コリアンダー g
8 ターメリック g
9 チリパウダー g

構造テーブル
部品ID 構成部品ID 数量
1 2 1 
1 3 30
1 4 15
2 5 180
2 6 270
3 7 0.2
3 8 0.3
3 9 0.5

として表現可能です。
ドライカレー1皿は{ごはん1合, カレー粉30g, 植物油15g}で出来ていて、ごはん1合は{米180cc, 水270cc}、カレー粉1gは{コリアンダー0.2g, ターメリック0.3g, チリパウダー0.5g}で出来ていることが見て取れると思います。
ちなみに分量は滅茶苦茶です(^^;


部品にどれだけ階層が増えようと上記の二つのテーブルだけで表現できますし、任意の部品の構成部品を調べることも容易です。

この回答への補足

やっぱりこれっきゃないですよね。
実は、私も基本構造はこの考え方でやってはいるのですが、どうもですね。
何がどう悪いのかはっきり説明のつかない点が、一番問題ですね。
考えが整理できてなくて申し訳ないです。
えーとまず、この構造ですとおっしゃる通り何層構造になろうが、任意の部品の親子構成は簡単に表現できます。クエリー一つ作るだけです。
ところがこれが三層構造くらいですと問題はないのですが、いくつも連なってくると親子関係のそのまた親子関係そのまた親子関係というように系列で表現せなばならず、縦横無尽に系列をさかのぼる、下る、あるいは一度に頭から尻尾まで系列を表示するというような必要が出てきました。
これを表現するために、部品一覧フォームからある部品を選択すると、その子部品構成を表示するポップアップを作り、このポップアップのある部品を選択するとさらに孫部品を表示するポップアップが開くというような仕掛けを作って四苦八苦しているのですが、いくら作っても正直きりがありません。
さらに系列を一度に表示させようとすると、サブフォームやサブリポートを無理矢理駆使しまっくって余計混乱させている有り様です。
それから、困った点は、ドライカレーも部品になり得ることで、例えば「ハンバーグドライカレーうどん」になってしまうのです・・
にもかかわらず、部品の概念と完成品の概念はやはり区別しなければなりません。

というような問題が山積みしてまして、頭はパニック。うまく説明できなくてごめんなさい。
テーブル構造は問題ないとすると、やはり私のユーザーインターフェイス作成能力の部分が問題ですね。
このテーブル構造で系列を表現するのにいい仕掛けがありましたらぜひご教授下さい。

補足日時:2001/07/04 22:29
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

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

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

QACCESS ツリービューの作り方

お願いします。

ACCESS2003で、ツリービューを作りたいですが、なかなかうまくいきません。
「T部屋マスタ」というテーブルの「部屋名」フィールドを親、
「Q商品マスタ」というクエリの「プラン名」フィールドを子として設定し、
子をクリックすると、その詳細が表示される「F商品マスタ」フォームを起動させたいです。

「T部屋マスタ」には、「部屋名」「部屋コード」というフィールド、
「Q商品マスタ」には、フィールドがたくさんあるので、関係のありそうなものだと「商品コード」「プラン名」あたりかとおもいます。

初心者ですみません…。
この情報だけでわかるか心配ですが、
ご回答お願いします!

Aベストアンサー

No5の最初の部分について少し訂正です。

「T部屋マスタ」
部屋コード(数値型、あるいはオートナンバー)
部屋名

として、

「T商品マスタ」
商品コード(数値型、あるいはオートナンバー、主キーとしていない)
商品名
部屋コード(数値型)
部屋名

としています。
「T商品マスタ」は「T部屋マスタ」の部屋別に
同じ商品名が存在する可能性があるかもしれない、
という想定にしています。つまり

「T部屋マスタ」
部屋コード  部屋名 
1       部屋A
2       部屋B
3       部屋C


「T商品マスタ」
商品コード 商品名 部屋コード 部屋名
1     プランA  1     部屋A
2     プランB  1     部屋A
3     プランB  2     部屋B
4     プランC  2     部屋B
5     プランC  3     部屋C
6     プランD  3     部屋C

のようなデータではないか、ということです。

さらに、このTreeに他のテーブルのフィールドを
載せるのならば、他のテーブルと「T部屋マスタ」
の関係、あるいは「T商品マスタ」との関係が
明確であること、すなわち部屋コードや部屋名が
ある、あるいは商品コードがある、のどちらかならば
Treeにフィールドを追加できます。ただ、
「Q商品」はどのようなTreeeを形成するために
作成したのか、ただテーブルがこのようにありますと
示されても上記のような設計になっているのか
分からないので、そのまま「Q商品」のフィールドを
ノードに追加していっても意図したTreeになる
ということはまったく保証できません。

TreViewを設定するときはデータの設定、
つまりテーブルの設計と親子関係を
明確にするフィールドの設定が非常に
重要で、アバウトな設計ではTreeViewは
形成できません。

No5の最初の部分について少し訂正です。

「T部屋マスタ」
部屋コード(数値型、あるいはオートナンバー)
部屋名

として、

「T商品マスタ」
商品コード(数値型、あるいはオートナンバー、主キーとしていない)
商品名
部屋コード(数値型)
部屋名

としています。
「T商品マスタ」は「T部屋マスタ」の部屋別に
同じ商品名が存在する可能性があるかもしれない、
という想定にしています。つまり

「T部屋マスタ」
部屋コード  部屋名 
1       部屋A
2       部屋B
3       部屋C


「T商品...続きを読む

Qエクセルで階層図を作る方法

エクセルで階層図を作りたいと思っています。
イメージとしては下図のような感じです。
 
│   A   │   B   
_│_____________
1│  ID番号│ 紹介者ID
2│   01  │  --   
3│   02  │  01   
4│   03  │  01   
5│   04  │  02   
6│   05  │  02   
7│   06  │  03   
8│   07  │  03   

↓↓↓↓↓↓↓↓↓↓↓↓

■01
├■02
│├■04
│└■05
└■03
├■06
└■07


セルの中にID番号を入れるだけで勝手に階層図ができたら非常に
楽なんですが、エクセルでこのような階層図を勝手に作るシステムを
組むことはできないでしょうか?
少しでも手がかりがあれば教えていただきたいと思いますので
よろしくお願いいたします。

Aベストアンサー

> プログラムはそのままコピペして使えるのでしょうか?
はい、使えます。
ただし次の条件が必要です。
(1) ID表が入っているシートの名前を『ID表』とすること。
  (『』 は付けませんよ)
(2) 他に『作業用』、『階層図』という名のシートをあらかじめ作っておくこと。

> VBAの画面のどこにコピペすればよろしいのでしょうか?

(1) まず普通に ID表 の入ったブックを開きます。
   (仮に ABCD.XLS という名だとします)
(2) [Alt] + [F11] キーを押します。
   → VBAの編集画面が表示されます。(ここまではご存じですね)
(3) 画面左に プロジェクトエクスプローラー といタテ長の窓がありますから
  その中の VBAProject(ABCD.XLS) を探し、左クリックします。
(4) メニュー > 挿入 > 標準モジュール
  とすると画面右が真っ白になり、タイトルバーに
  Microsoft Visual Basic - ABCD.XLS - [Module1(コード)]
  などと表示されます。
  この真っ白なのが Module1 で、メモ帳と同じように編集できます。
(5) そこへプログラムを貼り付けます。

  ・・・私のPCはExcel2003なので、多少の違いがあるかもしれません。

実行のしかたはご存じでしょうが、念のため申しますと、次の二通り。どちらでもよろしい。
(A) Sub 紹介者ツリー図() のどこかをクリックして [F5] を押す。
(B) Excelの画面に戻って
  ツール > マクロ > マクロ  で マクロ ダイアログを表示し
  マクロ名 の中から 紹介者ツリー図 を探して選択し 実行 ボタンを押す。


余談ですが
VBAはとても便利な道具ですが、人により向き不向きがハッキリとあります。
もしあなたが実際に動かしてみて、『これは面白い』と思われたら
あなたには適正があります。  (^-^)

> プログラムはそのままコピペして使えるのでしょうか?
はい、使えます。
ただし次の条件が必要です。
(1) ID表が入っているシートの名前を『ID表』とすること。
  (『』 は付けませんよ)
(2) 他に『作業用』、『階層図』という名のシートをあらかじめ作っておくこと。

> VBAの画面のどこにコピペすればよろしいのでしょうか?

(1) まず普通に ID表 の入ったブックを開きます。
   (仮に ABCD.XLS という名だとします)
(2) [Alt] + [F11] キーを押します。
   → VBAの編集画面が表...続きを読む

QMS accessのクエリの作り方について

お世話になります。

画像のようなテーブル1があり、
クエリ結果(1)、クエリ結果(2)を出力しようとしています。
どのようにクエリを作ればよいか教えていただけないでしょうか。

access2000を使用しております。
VB・SQLの知識がないため、クエリで作ろうとしています。

よろしくお願いします。

Aベストアンサー

#3です

>   必要であれば、補足ください(準備済)

でしたが、せっかく用意していたものが日の目を見ないのもなんだかなぁ・・・ということで、
迷惑かもしれませんが、以下に続編を・・・



「▲▲」生成時のルールを設定すれば・・・
・前述した結果の様に、仮定した最終的なもので作る・・・
・いや、階層はやっぱり必要なので、辿った順に「数」を計算しつつ作成する

以下は後者の一例です
テーブル「▲▲」のフィールドは「親分」「親」「子」「数」「階層」の5つ
(事前に作っておきます:
 主キーにできそうなものはないので、オートナンバのフィールドを追加しておいても)

テーブル「★★」の内容
親 子 数
a  b  1
b  c  1
c  d  1
c  d'  1
d  e  2
d'  e'  2
b  d  1
aa  bb  1



出来上がるテーブル「▲▲」の内容
親分 親 子 数 階層
a  a  b  1  1
a  b  c  1  2
a  c  d  1  3
a  d  e  2  4
a  c  d'  1  3
a  d'  e'  2  4
a  b  d  1  2
a  d  e  2  3
aa  aa  bb  1  1


※ 親="d" 子="e" のレコードは2つありますね
 辿るルートによって、階層が違ってますね

では、「▲▲」を参照する時に

SELECT 親分, 子, Sum(▲▲.数) AS 数
FROM ▲▲
GROUP BY 親分, 子;

とすると

親分 子 数
a  b  1
a  c  1
a  d  2
a  d'  1
a  e  4
a  e'  2
aa  bb  1

となって、仮定した最終的なものが得られることになります
後は、何でグループ化するかですね

SELECT 親, 子, Sum(▲▲.数) AS 数, Min(▲▲.階層) AS 階層
FROM ▲▲
WHERE 親分='a'
GROUP BY 親, 子;

とすれば、結果は以下の様になります

親 子 数 階層
a  b  1  1
b  c  1  2
b  d  1  2
c  d  1  3
c  d'  1  3
d  e  4  3
d'  e'  2  4

チョッと横道)
以下のクエリを作成して、表示を確認してみてください

TRANSFORM Sum(数) AS 値
SELECT 親
FROM ▲▲
GROUP BY 親
PIVOT 子;

とか

TRANSFORM Sum(数) AS 値
SELECT 親分
FROM ▲▲
GROUP BY 親分
PIVOT 子;


標準モジュールに以下を記述します

関数 fncMkTbl の実行で「▲▲」に全部展開します
また、関数 fncMkTblOne の実行では、引数に指定した「親」だけを作り直します

Private Sub ReMk(rsP As ADODB.Recordset, iNst As Long, iFct As Long _
            , sFix As String, sSrc As String)
  Dim rs As ADODB.Recordset
  Dim sSql As String
  Const CSQL As String = "INSERT INTO ▲▲(親分,親,子,数,階層) VALUES " _
            & "('{%1}','{%2}','{%3}',{%4},{%5});"
  Set rs = rsP.Clone
  rs.Filter = "親='" & Replace(sSrc, "'", "''") & "'"
  Do While (Not rs.EOF)
    sSql = CSQL
    sSql = Replace(sSql, "{%1}", Replace(sFix, "'", "''"))
    sSql = Replace(sSql, "{%2}", Replace(rs("親"), "'", "''"))
    sSql = Replace(sSql, "{%3}", Replace(rs("子"), "'", "''"))
    sSql = Replace(sSql, "{%4}", iFct * rs("数"))
    sSql = Replace(sSql, "{%5}", iNst)
    CurrentProject.Connection.Execute sSql
    Call ReMk(rs, iNst + 1, iFct * rs("数"), sFix, rs("子"))
    rs.MoveNext
  Loop
  rs.Close
  Set rs = Nothing
End Sub

Public Sub fncMkTbl()
  Dim rsP As New ADODB.Recordset
  Dim rs As New ADODB.Recordset

  CurrentProject.Connection.Execute "DELETE * FROM ▲▲;"
  rs.Source = "SELECT * FROM ★★ ORDER BY 親, 子;"
  rs.Open , CurrentProject.Connection, adOpenStatic, adLockReadOnly
  rsP.Source = "SELECT DISTINCT 親 FROM ★★ WHERE 親 NOT IN (SELECT 子 FROM ★★);"
  rsP.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  While (Not rsP.EOF)
    Call ReMk(rs, 1, 1, rsP("親"), rsP("親"))
    rsP.MoveNext
  Wend
  rsP.Close
  rs.Close
End Sub

Public Sub fncMkTblOne(sFix As String)
  Dim sSql As String
  Dim rs As New ADODB.Recordset
  Const CSQL As String = "DELETE * FROM ▲▲ WHERE 親分='{%1}';"

  sSql = Replace(CSQL, "{%1}", Replace(sFix, "'", "''"))
  CurrentProject.Connection.Execute sSql
  rs.Source = "SELECT * FROM ★★ ORDER BY 親, 子;"
  rs.Open , CurrentProject.Connection, adOpenStatic, adLockReadOnly
  Call ReMk(rs, 1, 1, sFix, sFix)
  rs.Close
End Sub



※※ 最大階層が 5 だった場合

以下のクエリ「Q★★」を作っておきます

SELECT Q1.親, Q1.子 AS F1, Q2.子 AS F2, Q3.子 AS F3, Q4.子 AS F4, Q5.子 AS F5 FROM
(((((SELECT DISTINCT 親 FROM ★★ WHERE 親 NOT IN (SELECT 子 FROM ★★)) AS Q0
LEFT JOIN ★★ AS Q1 ON Q0.親=Q1.親)
LEFT JOIN ★★ AS Q2 ON Q1.子=Q2.親)
LEFT JOIN ★★ AS Q3 ON Q2.子=Q3.親)
LEFT JOIN ★★ AS Q4 ON Q3.子=Q4.親)
LEFT JOIN ★★ AS Q5 ON Q4.子=Q5.親;

このクエリを元に、以下クエリを作ります
(一度上記のクエリ表示を確認してみてください)

SELECT 親, 子, fncSearchSum(親,子) AS 数 FROM (
SELECT 親, F1 AS 子 FROM Q★★ WHERE F1 Is Not Null
UNION
SELECT 親, F2 FROM Q★★ WHERE F2 Is Not Null
UNION
SELECT 親, F3 FROM Q★★ WHERE F3 Is Not Null
UNION
SELECT 親, F4 FROM Q★★ WHERE F4 Is Not Null
UNION
SELECT 親, F5 FROM Q★★ WHERE F5 Is Not Null
) AS Q1;

結果は以下の様になります

親 子 数
a  b  1
a  c  1
a  d  2
a  d'  1
a  e  4
a  e'  2
aa  bb  1


※※ どの方法なら使いものになるか・・・いろいろやってみて
テーブル「▲▲」に展開しておいた方が良さそうな気はします

※ テーブル「▲▲」に展開する時には、時間はかかっても良いんですよね??


※※ なお、途中の数量を変更してみて、最終的な「数」はどうなるか・・・
 確認は必須ですよね

#3です

>   必要であれば、補足ください(準備済)

でしたが、せっかく用意していたものが日の目を見ないのもなんだかなぁ・・・ということで、
迷惑かもしれませんが、以下に続編を・・・



「▲▲」生成時のルールを設定すれば・・・
・前述した結果の様に、仮定した最終的なもので作る・・・
・いや、階層はやっぱり必要なので、辿った順に「数」を計算しつつ作成する

以下は後者の一例です
テーブル「▲▲」のフィールドは「親分」「親」「子」「数」「階層」の5つ
(事前に作っておきます:
 主キーに...続きを読む

Qエクセル表内で、ツリー表示させたい

エクセルの表の中で、+を押すとツリー表示がでて、-を押すと格納できる・・・というような事はできるのでしょうか?
イメージとしてはこんな感じです。
+会社名 
 ⇒ +の部分をクリック⇒ -会社名
                    使途1 金額
                    使途2 金額
                    使途3 金額
ツリー表示が必要な相手先と、そうでないところがあるので「ツリー表示ができて格納もできる」というのがポイントなんです。うまく文章にできなくてすみません。なお、マクロはしたことがないのでわかりません。宜しくお願いしますm(__)m

Aベストアンサー

質問のイメージに近いものは、エクセルでアウトライン機能しかないようです。
しかし質問の意向があいまいなので、下記をチェックして、「どこが、意に満たないか?」、教えてください(補足してください)。
下記は、「集計」機能を利用した、アウトラインです。
例データ A1:C12
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
う会社経理部12
う会社職員部33
う会社案全部333
A1:C12のどこかのセルをポイントしておいて、メニューで
データ
集計
グループの基準  会社
集計の方法 データの個数
集計するフィールド 部名をチェックを入れる
OK
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
あ会社 データの個数4
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
い会社 データの個数4
う会社経理部12
う会社職員部33
う会社案全部333
う会社 データの個数3
総合計11
マイナス(-)を全て(この場合3箇所)クリック
会社名部名人数
あ会社 データの個数4
い会社 データの個数4
う会社 データの個数3
総合計11
プラス(+)をクリック
あ会社、い会社、う会社のそれぞれを1社単位で、明細を出したり出さなかったりできる。
参考 http://www.eurus.dti.ne.jp/~yoneyama/Excel/mous_jyo/jyo-7/など 「エクセル アウトライン」でWEB照会してください。

質問のイメージに近いものは、エクセルでアウトライン機能しかないようです。
しかし質問の意向があいまいなので、下記をチェックして、「どこが、意に満たないか?」、教えてください(補足してください)。
下記は、「集計」機能を利用した、アウトラインです。
例データ A1:C12
会社名部名人数
あ会社人事部12
あ会社労務部23
あ会社厚生部24
あ会社工務部54
い会社労務部1
い会社勤労部2
い会社検査部3
い会社保安部4
う会社経理部12
う会社職員部33
う会社案全部333
A1:C12のど...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Qツリー情報のデータをSQLで取得したい

SQLServer 2008 です。

以下のツリーデータの場合に

A ┬C
│├D ┬H
││ ├I
││ └J
│└E
B ┬F ┬I
 │ └L
 └G

次のようなデータを登録しています。
┌──┬──┬──┐
│OYA │KO │Data│
├──┼──┼──┤
│A │C  │"C" │
├──┼──┼──┤
│A  │D  │"D" │
├──┼──┼──┤
│A  │E  │"E" │
├──┼──┼──┤
│B  │F  │"F" │
├──┼──┼──┤
│B  │G  │"G" │
├──┼──┼──┤
│D  │H  │"H" │
├──┼──┼──┤
│D  │I  │"I" │
├──┼──┼──┤
│D  │J  │"J" │
├──┼──┼──┤
│F  │I  │"I" │
├──┼──┼──┤
│F  │L  │"L" │
└──┴──┴──┘

引数OYA="A"でSQLを実行した場合に
以下のような
この引数を含むそれ以下のツリーに関する
データを取得する方法を教えてください。

┌──┬──┬──┐
│OYA │KO │Data│
├──┼──┼──┤
│A │C  │"C" │
├──┼──┼──┤
│A  │D  │"D" │
├──┼──┼──┤
│A  │E  │"E" │
├──┼──┼──┤
│D  │H  │"H" │
├──┼──┼──┤
│D  │I  │"I" │
├──┼──┼──┤
│D  │J  │"J" │
└──┴──┴──┘

SQLServer 2008 です。

以下のツリーデータの場合に

A ┬C
│├D ┬H
││ ├I
││ └J
│└E
B ┬F ┬I
 │ └L
 └G

次のようなデータを登録しています。
┌──┬──┬──┐
│OYA │KO │Data│
├──┼──┼──┤
│A │C  │"C" │
├──┼──┼──┤
│A  │D  │"D" │
├──┼──┼──┤
│A  │E  │"E" │
├──┼──┼──┤
│B  │F  │"F" │
├──┼──┼──┤
│B  │G  │"G" │
├──┼──┼──┤
│D  │H  │"H" │
├──┼──┼──┤
│D  │I  │"I" │
├──┼──┼──┤
│D  │J  │"J" │
├──┼──┼──┤
│F  │I  │"I" │
├──┼──┼──┤
│F  │L  │"L" │
└──┴──┴──┘

引数OYA="A"でSQL...続きを読む

Aベストアンサー

再帰SQL(クエリ)の出番だと思いますが、持ち合わせていないので
リンクだけです。ご勘弁。
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sql99/sql99_1b.html

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QExcelのVBAでデータをツリー構造にしたい

Excelのあるシート「シート1」に親子関係が記されたデータがあります。
列の親には親の名前が、子にはカンマ区切りで所属する子の名前が記されています。
<シート1>
親 子
A1 A2,B1,B2,B3
B1 C5
A2 C1,C2,C4
B2 
C1
C2 C3
C4
B3 D1,D3
D1
D2
D3 D2

これを下のシート2のようなツリー構造で親子関係を表現したいです。
1、2、3、4はそれぞれ列で、セルの行と列を変更することで、
ツリーの親子構造を表現します。
<シート2>
1 2 3 4
A1
  A2
    C1
    C2
      C3
    C4
  B1
    C5
  B2
  B3
    D1
    D3
      D2

条件は以下のようになります。
a.シート1の記述順は順不同だが、一番上の行は必ず、一番上の親が来る。
b.一番上の行の親以外は、必ず親を持ちます。逆を言えば、「A1」以外には必ず親が存在し、親をたどると必ず「A1」になります。


そんなに難しくないかとは思うんですが、循環関数を作って考えるのが、今の眠い頭でできなくて…。

Excelのあるシート「シート1」に親子関係が記されたデータがあります。
列の親には親の名前が、子にはカンマ区切りで所属する子の名前が記されています。
<シート1>
親 子
A1 A2,B1,B2,B3
B1 C5
A2 C1,C2,C4
B2 
C1
C2 C3
C4
B3 D1,D3
D1
D2
D3 D2

これを下のシート2のようなツリー構造で親子関係を表現したいです。
1、2、3、4はそれぞれ列で、セルの行と列を変更することで、
ツリーの親子構造を表現します。
<シート2>
1 2 3 4
A1
  A2
    C1
  ...続きを読む

Aベストアンサー

#3です。

私がやるとした場合の方法。
・”A1”しか親がないのですから、”親があって子のない”データは無視する。
・親をキーに、子を項目としてDictionaryオブジェクトに放り込む。

⇒データ書き出しをH列~とする。
・まず最初”A1”をセルH1に代入する。
・キー”A1”の項目をセルI2以下に書き出す。
・次にI列を上から取得し、その値のキーがDictionaryにあるかチェックし、
 値があればその項目をJ列に書き出す。
 (この場合I列は上詰めされているので、項目分の行を挿入する。)
・以下J列に対して同じ作業でK列・・・と行挿入~書き出しを行なう。

と言った感じになるのかなと思いましたが、コーティングはしてません。

あくまで私見で可能かどうかはわかりません。

Qaccessのルックアップを階層表示できないか

ACCESSの勉強をはじめています。データ入力の便利な機能としてルックアップを使っています。ルックアップする商品が数十件以上になると、一覧の中から該当品を探すことが大変になります。商品をカテゴリー別に分類して、メニューコマンドのように階層化表示ができると便利だと思います。そんなことがACCESSでできるのかどうか、ご存知の方がいらしたらどうぞお教えください。いつも的確で、しかも迅速に答えていただけるので感謝しています。今回もどうぞよろしくお願いします。

Aベストアンサー

ありゃあ、せっかく書いた回答が消えてもうたぁ(;o;)

ってことで、もっかい書きます。

とりあえず、商品分類のコンボボックスから選択すれば、その分類で絞り込まれた商品を表示する小ウインドウが開き、そっから選択すれば商品が入力できる、って感じのインターフェースなら作成可能です。

F伝票 :入力フォーム
  cb商品分類 :商品分類を表示するコンボボックス。非連結
  cb商品ID :商品の一覧を表示するコンボボックス。商品IDと連結

F商品一覧 :フォーム。商品分類で絞り込んだ商品を表示/選択する。作業ウインドウ固定。ポップアップ。
  lst商品一覧 :リストボックス。非連結。商品ID,商品名を表示
  OKボタン
  キャンセルボタン

とします。

んで、[cb商品分類]のAfterUpdateイベントに、[F商品一覧]を開くコードを書き、
[F商品一覧]のLoadイベントに、絞り込んだ内容を[lst商品一覧]に表示するコードを書き、
[OKボタン]のClickイベントに、[lst商品一覧]選択内容を[cb商品ID]に設定するようなコードを書けば完成です。

詳しいコード内容が知りたいとか、その他、なにかありましたら、お気軽に補足にて質問してください。(すぐには返事できないですが、必ず返事は書きます。)
その際、テーブルの名前、主要なフィールドの名前、作成中のフォームの名前とかを書いてもらえれば、それに添った形で回答できると思います。

ありゃあ、せっかく書いた回答が消えてもうたぁ(;o;)

ってことで、もっかい書きます。

とりあえず、商品分類のコンボボックスから選択すれば、その分類で絞り込まれた商品を表示する小ウインドウが開き、そっから選択すれば商品が入力できる、って感じのインターフェースなら作成可能です。

F伝票 :入力フォーム
  cb商品分類 :商品分類を表示するコンボボックス。非連結
  cb商品ID :商品の一覧を表示するコンボボックス。商品IDと連結

F商品一覧 :フォーム。商品分類で絞り込んだ商品を表...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング