Autor Beitrag
delphiprogrammierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: So 21.11.10 09:51 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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)

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 21.11.10 10:34 
die Joins mußt Du fertigbasteln....
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: So 21.11.10 17:35 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



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