3つのテーブルを使用してプログラムを作っています。
1テーブル目(Table1、実体:Table1.DB)は、ID1をキーにID1ATTR1といった属性が登録されています。
2テーブル目(Table2、実体:Table2.DB)は、ID2をキーにID2ATTR1といった属性が登録されています。
3テーブル目(Table3、実体:Table3.DB)に、ID1とID2を登録し関連付けのテーブルとしています。
4テーブル目(Table4、実体なし)は表示および変更のため、3テーブル目と同様にID1とID2を登録し、
さらに、ID1ATTR1、ID2ATTR1を参照フィールドとして定義しています。
画面上には、グリッドとして、ID1,ID2,ATTR1,ATTR2,をカラムに持つものがひとつと、変更可能なID1,ID2と表示のみのATTR1,ATTR2のそれぞれのDBFieldを定義していて、すべてのデータソースは、Table4を参照しています。
現在、グリッドをID1,ID2(またはテーブルの実体として定義されているフィールド)でソートすることは可能なのですが、ID1ATTR1、ID2ATTR2などの参照フィールドを使用してグリッドのデータをソートする方法が分かりません。
それは可能でしょうか?また、どのようにおこなえばできるのでしょうか?
ご教示、よろしくお願いいたします。
追記です。
環境は、delphi 6 professional DB はPARADOX を使用しています。
質問の内容で見る限り、Table4は何のためにあるのかわかりません。実体なしとは何のことなのか。
ID1ATTR1、ID2ATTR1を参照フィールドとして定義しているだけなら、Table3にすれば良いのではという疑問が残ります。
ID1ATTR1、ID2ATTR1でソートする?何のためにID1,ID2があるのか?キー項目でキー順に表示させるためにIDがあるのでは?
「画面上には、グリッドとして、ID1,ID2,ATTR1,ATTR2,をカラムに持つものがひとつと、変更可能なID1,ID2と表示のみのATTR1,ATTR2のそれぞれのDBFieldを定義していて、すべてのデータソースは、Table4を参照しています。」
ここも理解できません。DBGridのDataSourceが実体のないTable4?、項目もID1,ID2,ATTR1,ATTR2
と2重に持つのか?
Table3にID1のキー、ID2のキーを持たせ、キーを切り替えるだけで良いのでは。
かずさま、ありがとうございます。
わけのわからない質問をして申し訳ありませんでした。
もう少し具体的に説明させていただきます。
行いたいことは、
DBGridでの表示時に参照項目でソートを行うということです。
Table1.DBには、社員ID(ID1)をキーに入社年(ID1ATTR1)が登録されています。
Table2.DBには、資格ID(ID2)をキーに資格取得年度(ID2ATTR1)が登録されています。
Table3.DBは、社員ID(ID1)と資格ID(ID2)が登録されています。
各DBをdelphiでのTable1,Table2,Table3のTableNameとして定義しています。
Table3に対して、社員IDと資格IDの入力をおこなうフォームで、
DBGridに社員IDと資格IDと入社年度と資格取得年度を表示し、
入社年度で第1ソート、資格取得年度で第2ソートして表示し、
そのDBGridについては、直接変更できなくし、同一フォーム上に、
社員IDと資格IDをDBlookupComboBoxで一覧から選択して、
新規登録、変更を行えるようにしています。
そのため、Table3.DBをTableNameとして持つTable4を新たに定義し、
参照項目として、入社年(ID1ATTR1)と資格取得年度(ID2ATTR1)を追加しています。
(Table3というのは実際には使用していません。
これがご指摘のTable4となるとおもいます)
Table3.DBのカラムである社員ID(ID1)と資格ID(ID2)については
インデックスを作成しておき、IndexDefsに登録しソートを行うことは出来るのですが、
参照項目である入社年度と資格取得年度でDBGrid上でソートして表示してほしいという
要望があり、それを実現しようにも
Table3.DBには入社年(ID1ATTR1)と資格取得年度(ID2ATTR1)を持っていないため
インデックスを作成しておくことが出来ません。
DBGrid上での並び順を入社年(ID1ATTR1)と資格取得年度(ID2ATTR1)で行うには
どうしたらよいのかがわかりません。
これを実現するのはどのようなことを行えばよいのでしょうか?
データーベースに何を使っているか判りませんので、
普通のRDBMSの場合でやってみます。
Queryを使いましょう。
SQLに
Select A.ID1,A.ID2,
B.ID1ATTR1,
C.ID2ATTR1
From Table3 A
Left outer join Table1 B
on (A.ID1=B.ID1)
Left outer join Table2 C
on (A.ID2=C.ID2)
Order by
B.ID1ATTR1,
C.ID2ATTR1
とすれば、ソートまでデーターベースがやってくれます。
これとTDBGridをつなげばどうでしょうか。
ちょっと説明が少ないですね。
わかりやすく説明すると、その課程で解決することも有ります。
HOtaさま、ありがとうございます。
Queryを使用したところ、思ったようなソートはできるようになりました。
新規レコードを追加したときのカーソル位置の取得など
新たな質問は出てきたのですが、あらためてもう少し詳しく
状況を説明できるようにし、
本件については解決とさせていただきます。
ほんとうにありがとうございました。
ツイート | ![]() |