![]() |
Wie bildet man n zu m Relationen ab
Hallo zusammen,
Ich habe eine Bildertabelle und jetzt sollen diese Bilder darin kategorisiert werden. Dazu wollte ich eine neue Tabelle Kategorien erstellen und eine Zwischentabelle um eben n:m abzubilden, wie das so üblich ist. Wenn ich nun in meinem Grid mit den Bildern einen Doppelklick auf einen Datensatz mache, öffnet sich dieser eine Bilddatensatz in einem Formular zur Bearbeitung. Meine Idee wäre nun, in diesem Formular eine CheckListBox gefüllt mit den Kategorien zu nutzen, damit ein oder mehrere Kategorien ausgewählt werden können. Ist das der richtige Weg oder könnte man auch datensensitive Komponenten wie z.B. DBCheckListBox benutzt werden oder wie könnte man sowas abbilden? |
AW: Wie bildet man n zu m Relationen ab
Nur mal so als Vorschlag:
Delphi-Quellcode:
procedure TForm1.ReadList;
begin FKategorieBildList.Params.ID_Bild := Params.ID_Bild; FDataRepository.ReadKategorieBildList(FKategorieBildList); FCheckListBox.Items.BeginUpdate; try FCheckListBox.Items.Clear; for var Item in FKategorieBildList do begin FCheckListBox.Items.AddObject(Item.Name, Item); end; finally FCheckListBox.Items.EndUpdate; end; end; procedure TForm1.SaveList; begin FDataRepository.SaveKategorieBildList(FKategorieBildList); end; procedure TForm1.CheckListBoxItemClick(Sender: TObject); var Item: TKategorieBild; begin Item := FCheckListBox.Items.Objects[FCheckListBox.ItemIndex]; Item.ID_Bild := IfThen(FCheckListBox.Checked[FCheckListBox.ItemIndex], FCheckListBox.Params.ID_Bild, 0); end;
Delphi-Quellcode:
unit KategorieBild;
type { ID_Bild = 0 entspricht dem Nullzustand = Verknüpfung nicht vorhanden } TKategorieBild = class(TObject) private FID: Integer; FName string; FID_Bild: Integer; public property ID: Integer read FID write FID; property Name; string read FName write FName; property ID_Bild: Integer read FID_Bild; end; TKategorieBildList = class(TObjectList<TKategorieBild>) type TParams = record ID_Bild; end; public { Parameter zum Laden und Speichern der Liste } Params: TParams; end; TDataRepository = class() public procedure ReadKategorieBildList(AList: TKategorieBildList); procedure SaveKategorieBildList(Alist: TKategorieBildList); end; implementation const CRLF = #13#10; CSQL_KategorieBild_Read = 'select a.id, a.name, b.id_bild' + CRLF + 'from T_Kategorien a' + CRLF + 'left join T_Zwischentabelle b on (b.id_bild = :id_bild) and (b.id_Kategorie = a.id)' + CRLF + 'order by a.name'; CSQL_KategorieBild_Insert = 'insert or update into T_Zwischentabelle (id_bild, id_kategorie) values (:id_bild, :id)'; CSQL_KategorieBild_Delete = 'delete from T_Zwischentabelle where (id_bild = :id_bild) and (id_kategorie = :id)'; procedure TDataRepository.ReadKategorieBildList(AList: TKategorieBildList); var Query: TQuery; {konkreten Typ angeben} Item: TKategorieBild; begin AList.Clear; Query := TQuery.Create; {konkreten Typ angeben, bzw. Erzeugen und Initialisieren} try Query.SQLText := CSQL_KategorieBild_Read; Query.Prepare; Query.ParamByName('ID_BILD').AsInteger := AList.Params.ID_Bild; Query.First; while not Query.EOF do begin Item := AList.Insert; Item.ID := FieldByName('ID').AsInteger; Item.Name := FieldByName('Name').AsString; Item.ID_Bild := FieldByName('ID_Bild').AsInteger; Query.Next; end; Query.Close; finally Query.Free; end; end; procedure TDataRepository.SaveKategorieBildList(AList: TKategorieBildList); var DSql: TDSql; {konkreten Typ angeben} Item: TKategorieBild; begin DSql := TDSql.Create; {konkreten Typ angeben, bzw. Erzeugen und Initialisieren} try DSql.SQLText := CSQL_KategorieBild_Delete; DSql.Prepare; DSql.ParamByName('ID_BILD').AsInteger := AList.Params.ID_Bild; for Item in AList do begin if Item.ID_Bild = 0 then begin DSql.ParamByName('ID_BILD').AsInteger := Item.ID; DSql.Execute; end; end; DSql.SQLText := CSQL_KategorieBild_Insert; DSql.Prepare; DSql.ParamByName('ID_BILD').AsInteger := AList.Params.ID_Bild; for Item in AList do begin if Item.ID_Bild <> 0 then begin DSql.ParamByName('ID_BILD').AsInteger := Item.ID; DSql.Execute; end; end; finally DSql.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz