AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie bildet man n zu m Relationen ab

Ein Thema von Cogito · begonnen am 9. Feb 2022 · letzter Beitrag vom 10. Feb 2022
Antwort Antwort
Cogito

Registriert seit: 12. Jun 2008
280 Beiträge
 
#1

Wie bildet man n zu m Relationen ab

  Alt 9. Feb 2022, 07:19
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?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Wie bildet man n zu m Relationen ab

  Alt 10. Feb 2022, 09:13
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;

Geändert von Blup (10. Feb 2022 um 17:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz