00 Stimmen

Delphi: Daten-Abgleich zwischen ListBox und Tabelle (D6)

Frage von Muschelknacker | 06.11.2021 um 18:45

Ich erstelle einen neuen Eintrag in einer ListBox und gleichzeitig in einer Tabelle, wie folgt :

procedure TForm1.neuBtnGClick(Sender: TObject); // neuen eintrag einfügen
begin
  if (Editobject.Text = '') then exit;

  if (Editobject.Text <> '') then begin
    LBobject.Items.Add(Editobject.Text);
  
    try
      objectTable.Open;
      objectTable.Insert;
      objectTable.FieldByName('Gegenstand').AsString := Editobject.Text;
      objectTable.Post;
      objectTable.Close;
    except
      objectTable.Cancel;
    end;

    Editobject.Text := '';
  end;

  neuBtnG.Enabled := False;
end;

Wenn ich nun in der ListBox einen Eintrag lösche, dann muss dieser Eintrag auch in der Tabelle gelöscht werden.

Mein Ansatz lautet :

procedure TForm1.delBtnGClick(Sender: TObject);
begin
  if LBobject.ItemIndex > -1 then begin // nur wenn ein Eintrag ausgewählt ist...
    LBobject.Items.Delete(LBobject.ItemIndex); // dann löschen
    try
      objectTable.Open;
      // ??? hier hab ich keine Lösung
      objectTable.Close;
    except
      objectTable.Cancel;
    end;
  end;
  delBtnG.Enabled := False; // löschen-Btn wieder false
end;

Kann jemand helfen ??

AntwortenPositivNegativDatumStimmen
0Beste Antwort0 Stimmen

Du machst leider keine Aussagen dazu, wie deine Tabelle aufgebaut ist. Hat sie einen Index? Enthält sie nur Strings?

Wenn du nicht über Indices arbeiten möchtest und die Tabelle nur Strings enthält, hol dir zunächst den selektierten Text aus der Listbox:

AText := Listbox1.Items[ListBox1.Itemindex];

Und dann löscht du diesen Text aus der Tabelle:

if ATable.FieldsByName('Gegenstand').AsString = AText then begin
   ATable.Delete;
end;

Du solltest deinen Code aber umstrukturieren und das Löschen des Items ans Ende stellen, also nur dann wenn das Löschen in der Tabelle erfolgreich war.
06.11.2021 um 23:58

AntwortenPositiv Negativ
00 Stimmen

Ja, die Lösung gefällt mir.

Besten Dank.

Und meine Tabelle hat keinen Index.

Sie besteht aus dem Feld ID als Autoinc und dem Feld Gegenstand als String.

Das erfolgreiche Löschen in der Tabelle könnte ich doch folgendermaßen überprüfen:

var 
  x: Integer;
  AText: String;
begin
  AText := Listbox1.Items[Listbox1.Itemindex];
  query1.close;
  query1.SQL.Add('SELECT count(Gegenstand) from object WHERE Gegenstand =''' + AText + ''' ');
  query1.open;
  x := query1.Fields(0).AsInteger;
  query1.close;
  if x>0 then
  begin
    // wenn x tatsächlich größer Null ist, dann ist das löschen fehlgeschlagen, 
    // wenn x=0 dann kann das Item gelöscht werden.
  end;

Kann das gehen? Ich teste mal.

Nochmal Danke..............
07.11.2021 um 16:47

AntwortenPositiv Negativ
00 Stimmen

Ich habe das obige getestet, damit geht garnix.

Aber hier die Lösung:

procedure TgForm.delBtnGClick(Sender: TObject); // Eintrag löschen
begin
  if gLB.ItemIndex > -1 then begin // wenn ein Eintrag gewählt in ListBox...
    Form1.GQuery.Open; // in DB suchen.....
    if not Form1.GQuery.Locate('Gegenstand', gEdit.Text, [loCaseInsensitive,loPartialKey]) then
    begin
      Label1.Caption := Format('< %s > wurde nicht gefunden', [gEdit.Text]);
    end else begin
      Label1.Caption := Format('< %s > wurde gefunden', [gEdit.Text]);
      Form1.GQuery.Delete; // dann in DB löschen...
      Form1.GQuery.Close;
    end;
  end;

  Form1.GQuery.Close;
  Form1.GQuery.SQL.Clear;
  Form1.GQuery.SQL.Text := ('SELECT * FROM object');
  Form1.GQuery.Open;
  gForm.gLB.Items.Clear; // aktuelle Einträge von DB...

  While not Form1.GQuery.Eof do begin
    gForm.gLB.Items.Add(Form1.GQuery.Fields[1].AsString);
    Form1.GQuery.Next; // in ListBox einlesen
  end;

  newBtnG.Enabled := False;
  gEdit.Text := '';
  goBtnG.Enabled := True;
  Form1.GQuery.Close;
end;
.....

Diese veränderlichen Einträge werden benötigt um dann ComboBoxen und Picklisten (DBGrid) zu füllen.

mfg...........
28.11.2021 um 17:35

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.