AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie geht man mit zusammengesetzten Primärschlüsseln um?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie geht man mit zusammengesetzten Primärschlüsseln um?

Ein Thema von Der schöne Günther · begonnen am 11. Mär 2014 · letzter Beitrag vom 12. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 12:55
Datenbank: SQLite • Version: 3 • Zugriff über: FireDAC
Nehmen wir (vereinfacht) an, es gäbe diese zwei Tabellen:

Code:
Artikel
---------
artikel_id1: Int
artikel_id2: Int
artikelName: Str
[PKEY: artikel_id1, artikel_id2]

Beschreibung
------------
artikel_id1: Int
artikel_id2: Int
sprache: Str
beschreibungstext: Str
[PKEY: artikel_id1, artikel_id2, sprache]
[FKEY: artikel_id1, artikel_id1 -> Tabelle Artikel]
Ja, das ist beim besten Willen keine professionelle E/R-Notation.

Ich möchte nun in einer TDBLookupComboBox die für einen Artikel zur Verfügung stehenden Beschreibungs-Sprachen anzeigen. Ich kann der Box bei KeyField aber natürlich nur ein einziges Feld mitgeben.

Meine Idee wäre, dass man sicher aus den beiden PKEY-Feldern zusätzliches, einzelnes Pseudo-Feld erstellen könnte und darauf verweisen. Ich wüsste aber nicht, wie. Müsste man da an der entsprechenden Tabellen-Komponente ansetzen und dort manuell ein Feld hinzufügen?

Oder gibt es eine ganz andere Möglichkeit?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 12:57
Hallo,

Was wäre mit einem künstlichen Primärschlüssel?
Damit umgeht man so einen Ärger.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 12:59
Entweder du baust deine Tabelle so um, daß es nur noch einenen Primärschlüssel gibt.

Oder du nimmst in das Select, oder die Tabelle (könnte man via Trigger füllen und synchron halten), oder als CalcField, ein Neues Feld auf, welches eine zusammengesetzte ID enthält.



Müsste der Foreign-Key nicht eigentlich auch aus den beiden Feldern bestehen?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Mär 2014 um 13:02 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 13:25
Ja, der Fremdschlüssel soll auch aus beiden Feldern bestehen. Wird aus der unbeholfenen Textdarstellung wohl nicht wirklich deutlich.

Ich habe beiden Tabellen mal ein künstliches Feld (Typ: String) hinzugefügt. Ist
artikel_id1 = 5
artikel_id2 = 536
dann ist
Artikel_idCOMBINED = 5.536

Das war einfacher als gedacht und klappt auch. Nur leider kommt die Lookup-Combobox, oder eher: Das DataSource damit nicht zurecht. Bei Anwendungsstart fliege ich mit einer Exception, dass er ein Feld mit diesem Namen nicht finden kann, raus.

Wen es interessiert, hier der Callstack:


Code:
:7672c41f KERNELBASE.RaiseException + 0x58
FireDAC.Stan.Error.FDException(???,???,???)
FireDAC.Stan.Error.FDException($2F5C180,???,2,???)
FireDAC.DatS.TFDDatSNamedList.ErrorNameNotFound('meineTabelle_idCOMBINED')
FireDAC.DatS.TFDDatSNamedList.ItemByName('meineTabelle_idCOMBINED')
FireDAC.DatS.TFDDatSBindedList.ItemByName('meineTabelle_idCOMBINED')
FireDAC.DatS.TFDDatSColumnList.ColumnByName('meineTabelle_idCOMBINED')
FireDAC.DatS.TFDDatSColumnSublist.Fill(???,'meineTabelle_idCOMBINED',nil,nil)
FireDAC.Comp.DataSet.TFDDataSet.InitLocateRow('meineTabelle_idCOMBINED','1.43')
FireDAC.Comp.DataSet.TFDDataSet.LocateRecord('meineTabelle_idCOMBINED','1.43',[],-1)
FireDAC.Comp.Client.TFDTable.InternalLocateEx('meineTabelle_idCOMBINED','1.43','',[],nil)
FireDAC.Comp.Client.TFDTable.LocateEx(???,'1.43',???,nil)
FireDAC.Comp.DataSet.TFDDataSet.Locate('meineTabelle_idCOMBINED','1.43',???)
Vcl.DBCtrls.TDBLookupControl.LocateKey
Vcl.DBCtrls.TCustomDBLookupComboBox.KeyValueChanged
Vcl.DBCtrls.TCustomDBLookupComboBox.UpdateListFields
Vcl.DBCtrls.TListSourceLink.ActiveChanged
Data.DB.TDataLink.SetActive(???)
Data.DB.TDataLink.UpdateState
Data.DB.TDataLink.DataEvent(???,0)
Data.DB.TDataSource.NotifyLinkTypes(deUpdateState,0,True)
Data.DB.TDataSource.NotifyDataLinks(deUpdateState,0)
Data.DB.TDataSource.SetState(???)
Data.DB.TDataSource.UpdateState
Data.DB.TDataSet.AddDataSource($2FC89B0)
Data.DB.TDataSource.SetDataSet($2F87910)
System.TypInfo.SetOrdProp(???,???,???)
System.Classes.TPropFixup.ResolveReference(???)
System.Classes.GlobalFixupReferences
System.Classes.TReader.ReadRootComponent($2F222C0)
System.Classes.TStream.ReadComponent($2F222C0)
System.Classes.InternalReadComponentRes(???,???,$2F222C0)
System.Classes.InitComponent(TMainForm)
System.Classes.InitInheritedComponent($2F222C0,TForm)
Vcl.Forms.TCustomForm.Create(???)



Ich glaube, ich bin alle hieraus resultierenden Übel selbst schuld. Einfach einen künstlichen Primärschüssel nehmen und das ganze Artikelnummer-Geraffel in eine neue Tabelle auslagern. Das wäre wohl in jeder Hinsicht besser.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 13:39
Du musst ja nicht unbedingt auslagern, sofern Deine DB ansonsten normalisiert ist. Füge doch einfach den künstlichen PK hinzu und definiere die Kombination des jetzigen zusammengesetzten PK als UNIQUE, das sollte schon helfen. Den FK setzt Du dann auf den neuen PK.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 13:55
Das Problem war aber ein ganz anderes: Ich hatte das neue Feld in meiner Tabellen-Komponente eingefügt. Ein Feld mit FieldKind = fkCalculated . Ein DBGrid browst auch ganz lässig dadurch. Aber die Lookup-Combobox scheint damit nicht zurechtzukommen.

Zumindest würde ich das jetzt so interpretieren.

Oder ist ein "calculated Field" sowieso der falsche Ansatz und ich muss irgendwas mit den "Lookup-"-Eigenschaften drehen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 14:33
Wenn du bei den kombinierten PKs bleiben willst, dann musst du dir entweder Views basteln, die diesen virtuellen PK erstellen oder du musst dich von den DataAware-Controls verabschieden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 15:28
Ich kann der Box bei KeyField aber natürlich nur ein einziges Feld mitgeben
Beide PK-Felder getrennt durch einen Strichpunkt - schon getestet?
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 20:43
Warum machst Du solche Klimmzüge?

Code:
Artikel:
Artikel_ID [PK]
Artikel

Beschreibung:
Beschreibung_ID [PK]
Artikel_ID [FK]
Sprache
sollte voll und ganz ausreichen.
(daß die PKs aus dem Generator kommen setz ich mal als selbstverständlich voraus)

Code:
select sprache from Beschreibung where Artikel_ID=:Artikel_id;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

AW: Wie geht man mit zusammengesetzten Primärschlüsseln um?

  Alt 11. Mär 2014, 23:37
..daß die PKs aus dem Generator kommen setz ich mal als selbstverständlich voraus..
Au mann. Ich setze jedenfalls mal voraus, dass die Generatoren dazu benutzt werden, wozu sie gedacht sind : als transaktions-unabhängige also quasi auch Datenbank-unabhängige Zähler. Am Besten interpretiert man da nicht noch eine Pseudo-Logik hinein.

Zusammengesetzte Primary Keys sind wohl auch nicht besinderss gute Idee. Wozu gibts denn Unique Keys ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:53 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