| Autor |
Beitrag |
delphiprogrammierer
      
Beiträge: 53
|
Verfasst: Sa 20.11.10 14:33
Hallo,
folgende Herausforderung stellt sich mir bei folgender Aufgabenstellung :
Ich habe eine tabelle tbl_catgegories, in dieser sind Objektkategorien aufgelistet :
tbl_categories
internalid int
parent int
bezeichnung varchar ( 50 )
Desweiteren habe ich eine tabelle tbl_objects in der meine Objekte und die dazugehörigen Unterobjekte aufgelistet sind. Ein Hauptobjekt kann maximal 2 Unterobjekte haben
tbl_objects
internalid int
parent int
bezeichnung varchar ( 50 )
Als letztes gibt es eine Tabelle tbl_anzahl, in dieser Tabelle wird die Anzahl der Objekte gespeichert
tbl_userobjects
internalid int
refObject int
anzahl int
Ich möchte nun alle Kategorien finden für Objekte, deren Anzahl grösser als 0 sind.
Jetzt einfach mal Datenbeispiele
tbl_categories
internalid|parent|bezeichnung
1|-1|A
2|-1|B
3|-1|C
4|1|A1
5|1|A2
6|1|A3
7|2|B1
8|2|B2
9|2|B3
10|3|C1
11|3|C2
12|3|C3
tbl_objects
internalid|parent|bezeichnung
1|10|O1
2|11|O2
3|12|O3
tbl_anzahl
internalid|refobject|anzahl
1|11|3
2|12|1
Die Kategorien sollen in einem Tree angezeigt werden, daher benötige ich nur einträge aus tbl_categories, bei denen es Objekte gibt, die eine Anzahl > 0 haben.
Als Ergebnis müsste ich anhand des obigen Datenbeispiels folgendes erhalten :
12, 11, 3
Ich hoffe ich habe mich einigermassen verständlich ausgedrückt.
Mir raucht der Kopf und ich hab momentan keine Idee mehr, wie ich das bewerkställigen soll.
Vielen DAnk
Michael
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Sa 20.11.10 18:16
tbl_objects scheint hier keine Rolle zu spielen (wenn ich die Verwendung der ParnetID richitg interpretiere).
in eine Temporärtabelle alle
tbl_categories selektieren deren ID in tbl_userobjects enthalten sin mit Anzahl>0
zu dieser Temporärtabelle in einem Loop solange die Parents hinzufügen die nicht schon vorhanden sind bis sich Count(*) von Temporärtabelle nicht mehr verändert.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
delphiprogrammierer 
      
Beiträge: 53
|
Verfasst: So 21.11.10 09:51
bummi hat folgendes geschrieben : | tbl_objects scheint hier keine Rolle zu spielen (wenn ich die Verwendung der ParnetID richitg interpretiere).
in eine Temporärtabelle alle
tbl_categories selektieren deren ID in tbl_userobjects enthalten sin mit Anzahl>0
zu dieser Temporärtabelle in einem Loop solange die Parents hinzufügen die nicht schon vorhanden sind bis sich Count(*) von Temporärtabelle nicht mehr verändert. |
Hallo,
die tabelle tbl_objects spielt schon eine Rolle, da ich alle Kategorien anzeigen möchte, in denen sich Objekte oder Unterobjekte befinden, deren Anzahl > 0 ist
Es geht um eine recursive SQL Anweisung. Im übrigen mache ich das mit einem MS SQL 2000 Server.
Danke
Michael
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 21.11.10 10:03
Mit dem MSSQL-Server hast Du ja optimale Voraussetzungen.
In Deinen Beispieldaten sieht es aus als ob tbl_anzahl.refobject direkt durchgreift bis auf
tbl_categories.ID, oder war das Beispiel nur ungünstig gewählt?
Lauten die Referenzen:
tbl_categories.parent > tbl_categories.ID
tbl_objects.Parent > tbl_categories.ID
tbl_anzahl.refobject > tbl_objects.ID (oder tbl_objects.Parent wie in Deinem Beispiel)
EDIT:
ich habe hier einen Fetzen SQL für Bäume, vielleicht kannst den für Dich passend erweitern(umbauen)
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Declare @Parent int Declare @count int Select @Parent=14
Select cast(ID as Int) as ID into #tmp from Tabelle where ParentID=@Parent
select @Count=0 While @Count<(Select Count(*) from #tmp) begin Select @Count=(Select Count(*) from #tmp) insert into #tmp Select Cast(ID as int) from Tabelle where ParentID in (Select ID from #tmp) and ID not in (Select ID from #tmp) end Select * from #tmp Drop table #tmp |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 21.11.10 10:34
die Joins mußt Du fertigbasteln....
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Declare @count int
Select DISTINCT tbl_categories.internalid into #tmp from tbl_categories JOIN tbl_objects on ...... JOIN tbl_userobjects on .... where tbl_userobjects.anzahl > 0
select @Count=0 While @Count<(Select Count(*) from #tmp) begin Select @Count=(Select Count(*) from #tmp) insert into #tmp Select DISTINCT Cast(ID as int) from tbl_categories where Parent in (Select ID from #tmp) and ID not in (Select ID from #tmp) end Select * from #tmp Drop table #tmp |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
delphiprogrammierer 
      
Beiträge: 53
|
Verfasst: So 21.11.10 11:15
Hi Bummi,
ich versuchs mal, es deutlich zu machen, ist offensichtlich nicht ganz so meine Stärke. Es handelt sich hier um zwei Bäume ( kategorien und objekte )
1. tbl_categories.
In dieser Tabelle werden Kategorien hirarchisch gespeichert. Im feld refParent ist die ID der Elternkategorie
2. tbl_objects
In dieser Tabelle werden Objekte hirarchisch gespeichert. Im feld refParent ist die ID des ElternObjektes. im Feld refCategory steht immer die letzte Kategorie, zu der dieses Objekt zugeordnet ist.
Kategorien
A
--A1
----A2
------A3
Objekte
O
--O1
----O2
------O3
3. tbl_anzahl
In dieser Tabelle steht, wieviele Objekte vorhanden sind. Im feld refObject steht die Referenz zu tbl_objects, im Feld anzahl die Anzahl der Objekte.
Die Kategorien weren in einem Treeview angezeigt. Der Benutzer hat nun die Möglichkeit, alle Objekt mit einer Anzahl von z.B. 5 anzeigen zu lassen. Natürlich sollen jetzt auch nur die Kategorien angezeigt werden, die Objekte in der Hirarchie haben, deren Anzahl auch der ausgewählten z.B. 5 entspricht.
Michael
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 21.11.10 11:32
refCategory hattest Du vorhin nicht erwähnt, aber das Prinzip bleibt das gleiche.
Erst den Baum auf Objektbaum in #tmp1 auflösen
Hieraus die Categories in #tmp2 sammeln und dann im Loop deren Parents.
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
delphiprogrammierer 
      
Beiträge: 53
|
Verfasst: So 21.11.10 17:35
bummi hat folgendes geschrieben : | refCategory hattest Du vorhin nicht erwähnt, aber das Prinzip bleibt das gleiche.
Erst den Baum auf Objektbaum in #tmp1 auflösen
Hieraus die Categories in #tmp2 sammeln und dann im Loop deren Parents. |
Hmm, irgendwie klappt das bei mir nicht. Vielleicht denke ich auch nur zu kompliziert.
Michael
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: So 21.11.10 18:10
Schick mir doch mal die Scripte für die 3 Tabellen incl. ForeignKeys, ich schau mal ob ich heute Abend dazu komme die Prozedur zu schreiben....
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
delphiprogrammierer 
      
Beiträge: 53
|
Verfasst: So 21.11.10 20:05
Vielleicht ist ja auch mein DB Modell nicht so wirklich toll.
Wenn ich überlege, daß ich pro modul so ca. 300000 Objekte zu verwalten habe.
Vielleicht sollte ich den Pfad bei jedem Objekt mit abspeichern.
Danke
Michael
|
|