Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie bildet man n zu m Relationen ab

  Alt 10. Feb 2022, 10: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 18:42 Uhr)
  Mit Zitat antworten Zitat