2

MyDACを使用したDelphi2009でのリレーショナルデータベースの概念の使用に関して、かなりの問題があります。

私はどういうわけか次のようなデータベース構造を持っています:


アイテム

  • id
  • 名前

ストレージ

  • id
  • 名前

StorageItem

  • id
  • item_id
  • storage_id
  • 場所

「アイテム」のアクティブなデータセットがある場合、関連するすべてのストレージをたとえばDBGridに表示するにはどうすればよいですか?

ちなみに、すべてのテーブルで「id」を使用するのではなく、「id_item」や「id_storage」などを変更して使用する方がよいでしょうか。

前もって感謝します :)

4

3 に答える 3

2
  • StorageItemを使用して、
    多対多の関係を作成しました。1対多だけが必要な場合
    (多くのストレージは1つのアイテムに関連しています
    が、その逆は必要ありません)、ストレージテーブル(item_id)に別のフィールドを追加するだけで、次の外部キーになります。アイテムテーブル。次に、ストレージテーブルのitem_idにインデックスを作成し、2つのテーブルを
    マスター/詳細関係で接続します。
  • 多対多が必要な場合は、SQLを使用してクエリコンポーネントを追加できます
    (select * from StorageItem where
    item_id:=:current_storage_id)。current_storage_idはクエリの
    パラメータです。
于 2009-05-24T16:33:30.167 に答える
1

私は個人的にMyDACに精通していませんが、ほとんどのデータセットコンポーネントには、マスターと詳細の関係を確立するための何らかの方法があります。データセットにMasterSourceプロパティがあるかどうか、または詳細データセットをマスターデータセットにリンクする同様の方法があるかどうかを確認します。そうでない場合は、TDatasetFieldを使用してリンクを確立し、ネストされたデータセットをフィルター処理して、適切なレコードのみを表示することができます。

ID列の名前については、各フィールドにわかりやすい名前を付けることをお勧めします。これにより、コードを確認することで、リンクが正しいことがわかります。id列を「id」と呼ぶ場合、それは任意のid列である可能性があり、データセットへの参照を渡し始めると混乱する可能性があります。しかし、それがitem_id毎回呼び出される場合(item_id時々ではなくid_item)、あなたは常にあなたが見ているものを正確に知っています。コードが正しいことも簡単にわかります。「」というフィルターはmaster.item_id = detail.item_id、「master.id=detail.item_id」の方が読みやすいです。masterたとえば、が間違ったデータセットに割り当てられている場合、それは間違っていて、黙って失敗する可能性があります。

于 2009-05-24T16:30:38.170 に答える
1
Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)

上記のクエリは、その名前でStorageItemテーブル内のすべてのアイテムを返します。これをフィルタリングして特定のアイテムのアイテムのみを返す場合は、次のようにwhere句を追加します。

Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)
where a.item_id = 1 -- place the item id here

次のようなパラメータでwhereを使用できます。

MyQuery.Sql.Text := ' Select a.ID, b.Name, a.Place from StorageItem a
+ ' inner join Storage b on (a.id = b.id) '
+ ' where a.item_id = :ItemNo ';
MyQuery.ParamByName('ItemNo').asInteger := 1;
MyQuery.Open;

上記のクエリをdbGridに割り当てます

また、MasterSourceプロパティを使用して、「where」部分を使用せずにリレーションを作成することもできます

于 2009-05-24T16:41:21.403 に答える