AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Eindeutiger Bezeichner bei Livebindings zuordnen
Thema durchsuchen
Ansicht
Themen-Optionen

Eindeutiger Bezeichner bei Livebindings zuordnen

Ein Thema von Catbytes · begonnen am 23. Okt 2014 · letzter Beitrag vom 24. Okt 2014
Antwort Antwort
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#1

Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 23. Okt 2014, 22:37
Datenbank: SQLite • Version: 3 • Zugriff über: FireDAC
Hallo,

ich beschäftige mich gerade etwas mit den Livebindings unter XE5.

Soweit klappt auch alles ganz gut. Nur ein Problem habe ich: wenn ich ein Binding mit BindSource zu ListView mache, sehe ich zwar die Daten, doch möchte ich die Daten z.B. löschen und benötige dafür die eindeutige ID der Tabelle, kann die irgendwie bei den Bindbaren Membern aber nicht unterkriegen.

Sowas wie Items.Tag oder Items.ID fehlt.

Im Anhang zwei Bilder - einmal das Mapping und einmal die Ansicht der Daten (soll eine App geben, ähnlich wie Evernote).

Bindsource ist eine TFDQuery, die sich aus zwei verschiedenen Tabellen zusammensetzt:

Code:
SELECT notes.note_id, notes.description, notes.group_id, notes.note, groups.groupname
FROM groups INNER JOIN notes ON groups.group_id = notes.group_id
ORDER BY groups.groupname;
Es existieren derzeitig zwei Tabellen: notes und groups. In beiden Tabellen ist eine eindeutige ID vorhanden (AutoInc).

Wie schaffe ich also, bei einem OnClick auf TListView die note_id herauszufinden, um z.B. Daten per SQL zu ändern oder zu löschen? Oder: kann man Bindbare Memeber auch selbst definieren? Wenn ja: wie?

Grüße
Miniaturansicht angehängter Grafiken
diagramimage.jpg   app.jpg  
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.014 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 23. Okt 2014, 23:11
Was macht denn dieses Synch oder LookupData?
Von denen nirgendwo in der Hilfe was zu finden ist.

Aber müsste es nicht in deiner Datenbank-Query-Komponente irgendwo das ID-Feld angegeben werden können?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Okt 2014 um 14:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 14:27
Was macht denn dieses Synch oder LockupData?
Von denen nirgendwo in der Hilfe was zu finden ist.
War das jetzt ironisch gemeint, um mich auf die richtige Fährte zu bringen? Ich checks echt grad nicht.^^

Aber müsste es nicht in deiner Datenbank-Query-Komponente irgendwo das ID-Feld angegeben werden können?
In der Datenbank-Query ist das Feld drin. Nur bringt mir das nix, wenn ich auf einem Eintrag in der ListView markiere und auf löschen klicke. Was soll dann gelöscht werden? Bzw. welche ID ist gemeint, da die ja nirgends in der ListView gespeichert ist - das ist ja mein Problem^^
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 14:38
War das jetzt ironisch gemeint, um mich auf die richtige Fährte zu bringen? Ich checks echt grad nicht.^^
Beides?

Die Klingen doch irgendwie danach, als wenn das Werte für die "Synchronisierung" der Livebinding-Verbindung seinen könnten?
Nachlesen konnte ich das aber nicht, da ich nirgendwo eine Info dazu fand.

In der Datenbank-Query ist das Feld drin. Nur bringt mir das nix, wenn ich auf einem Eintrag in der ListView markiere und auf löschen klicke. Was soll dann gelöscht werden?
Ich "hoffe" mal das LiveBinding ist intelligent genug die Verbindung zwischen ListView-Item und DatenSatz herzustellen. (vielleicht auch mit Hilfe der oben genannten Property)

Und dann sollte das Ding einfach nur das "Delete" deiner QueryKomponente aufrufen, welche nun mit dem ihr bekannten ID-Feld das Löschen in der DB vornimmt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#5

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 15:06

Und dann sollte das Ding einfach nur das "Delete" deiner QueryKomponente aufrufen, welche nun mit dem ihr bekannten ID-Feld das Löschen in der DB vornimmt.
Leider erkennt er das nicht. Wie im Bild oben sieht man ja, dass die Verbindung nur unidirektional ist und nicht bidirektional.

Vermutlich, weil ich zwei verschiedene Tabellen in der Query habe. Aber ich will mich einfach an die Datenbankgrundsätze halten und den Gruppenname schön mit einer ID in einer anderen Tabelle speichern.

Das löschen würde ich dann "von Hand" (also wie früher) vornehmen.

Aber irgendwie läßt mich XE5 da hängen bzw. die Livebindings...
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 15:12
Könnte es sein, daß Item.LookupData dafür da ist, intern z.B. die ID deines Datensatzs zu erhalten?
note_id -> Item.LookupData
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#7

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 15:22
Könnte es sein, daß Item.LookupData dafür da ist, intern z.B. die ID deines Datensatzs zu erhalten?
note_id -> Item.LookupData
Ich glaube, ich stehe grad mächtig auf dem Schlauch und werde mal Back to Basic meine Nase in die Hilfe/Bücher stecken -.-

Trotzdem Danke!

Die Frage nach "Oder: kann man Bindbare Memeber auch selbst definieren?" steht noch. Da habe ich bisher noch nichts gefunden.
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.014 Beiträge
 
Delphi 12 Athens
 
#8

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 15:36
Eigentlich sollen die LiveBindings auch unidirektional sein können.
Hier http://www.delphipraxis.net/181829-l...bjectlist.html werden die Daten ja auch wieder zurück in ie Objekte geschrieben, wenn man sie im Grid ändert.

Ich glaube, ich stehe grad mächtig
Wie bei einer LookupComboBox.

Es gibt den das Lookupfeld, welches den internen Wert (z.B. die ID) enthält
und es gibt ein Textfeld, welches den Anzeigewert (deinen Text) enthält.

Die Frage nach "Oder: kann man Bindbare Memeber auch selbst definieren?" steht noch. Da habe ich bisher noch nichts gefunden.
Theoretisch ja, aber hab dazu auch noch keine verständlichen Informationen entdeckt. (hatte gerstern mal nachgesehn, ob es möglich wäre das fehlende LiveBinding für den TreeView nachzurüsten)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Okt 2014 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#9

AW: Eindeutiger Bezeichner bei Livebindings zuordnen

  Alt 24. Okt 2014, 18:44
Hallo,

habe es jetzt so gelöst, wie im Link unten:

Meine note_id mit ListView1.ItemLookupData per Livebindings verbunden.

Beim OnClick-Event dann zum aufrufen und prüfen z.B.

Delphi-Quellcode:
procedure TForm1.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
  N_ID_Str: string;
begin
  N_ID_Str := LinkFillControlToField1.BindList.GetSelectedValue.AsString;
  showmessage(N_ID_Str);
end;
Mit AsInteger kommt eine Exception, obwohl note_id ein Integer ist.

Die Tabelle wurde so aufgebaut:

Code:
CREATE TABLE `notes` (
   `note_id`   INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
   `description`   VARCHAR,
   `group_id`   INTEGER,
   `note`   TEXT
);
Falls jemand eine elegantere Lösung findet, bitte hier posten. Ansonsten ist das 'ne schnelle Lösung für das Problem. Nicht schön, aber selten^^

Original-Lösung/Post: https://forums.codegear.com/thread.j...4999&tstart=-1

Interessant ist, daß im Original-Post der Benutzer "Eli M" vorschlägt, daß ganze per "Tag" zu erledigen. Das Problem ist eben, daß das angebotene Tag beim Livebinding das von der ListView an sich ist und eben nicht von Item.Tag -> genau das fehlt. Warum, weiß wohl nur Embarcadero...
Catbytes
  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 20:24 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