![]() |
SQL Schleifen Problem
Hallo Dpler,
die Nacht war mal wieder viel zu kurz und aufgrund dessen steh ich auf dem Schlauch. Vorweg ich bin dabei eine ArikelKategorisierung zu schreiben und habe mir alles für das Prinzip Kat_id mit Parent_id zurechtgelegt. Ich habe also eine Tabelle mit Kategorien Kat_id,Parent_id,bezeichung,posi(position der Kategorie) dann noch ne andere Tabelle in der ich Arikel Kat_ids zuordne. Ihr müsst euch das so vorstellen, dass die Kategorien in einem Treeview aufgelistet werden. Bei Klick auf die oberste Kategorie sollen in einer Listbox alle Artikel, auch von dessen Unterkategorien angezeigt werden. Jetzt haperts an dem auslesen der unterkategorien. ich les nämlich alle parent_ids der geklickten Node aus und bekomm dann beispielsweise 2 zurück aber nicht die unterunterkategorien. ich hoffe ich versteht was ich meine. ich müsste also eine dynamische schleife haben, die alle unterkategorien und dessen unterkategorien und soweiter durchläuft. Warscheinlich sieht morgen die Welt wieder ganz anders aus, aber mich reizt das Problem gerade ein wenig :D |
AW: SQL Schleifen Problem
Welches RDBMS?
Einige RDBMS können rekursive Queries ausführen, bei anderen müsste eine UDF oder eine SP geschrieben werden. |
AW: SQL Schleifen Problem
Zitat:
Zitat:
Warscheinlich war mein Arbeitstag zu lang, ich versteh das Problem nicht. Gruß K-H |
AW: SQL Schleifen Problem
Also das ganze sollte eine Funktion in Delphi2010 werden und verwendet wird ein Data-dictionary das im Advantage Data Architect angelegt wurde.
@p80286 ich habe nicht erwähnt dass ich mit Delphi2010 entwickel und es dient nur zum besseren verständiss. Problem nochmal genauer: - ich habe 1 Kat_id - diese besitzt 2 unterkategorien, die wiederum auch unterkategorien haben können. - es können dynamisch viele kategorien und Tiefen sein - meine Funktion müsste mir alle Kat_id, auch die von allen Unterkategorien zurückliefern, damit ich diese später in einem SQL befehlen berücksichtigen kann ich dachte eigentlich, dass ich eine Abfrage mache und das dann nochmal rekursiv weitergeht so mit Tadsquery. Aber iwie hakts. |
AW: SQL Schleifen Problem
Zitat:
Du hast drei Tabellen: Tab1 : Kat_ID,Parent_ID (verweist auf Kat_ID oder ist null) Tab2 : Kat_ID,ArtikelId Tab3 : ArtikelId,ArtikelText in Oracle bietet sich für so etwas "Connect by" an. Ob Dein DBMS das so kann? Ansonsten mit der "Mutter" hineingehen, die "Kinder" auslesen und als "Mutter" 2.,3,..n. Ordnung speichern(Tlist notfalls TStringlist). Und diese Liste bis zum Ende durchgehen. Das sollte man auch rekursiv lösen können, aber das behagt mir nicht so. Gruß K-H |
AW: SQL Schleifen Problem
Na denn: Eine Prozedur, um alle Artikel einer Kategorie und Unterkategorien auszulesen.
Delphi-Quellcode:
Na ja, und Resourcenschutzblöcke noch, und die Feldnamen und Tabellennamen richtig machen und so.
Procedure ListArticles (aParentID : Integer; aArticles : TStrings);
Begin myQuery := TADSQuery.Create(...); ... myQuery.SQL.Text := 'Select * from Artikel a join categories c on a.catID = c.catID where c.ParentID = '+IntTostr (aParentID); myQuery.Active := True; while not myQuery.eof do begin if aArtikles.IndexOf(myQuery['ARTIKELNAME'])=-1 then begin aArticles.add(myQuery['ARTIKELNAME']); ListArticles (myQuery['CATID'], aArticles); end; myQuery.next; end; myQuery.Close; myQuery.Free; End; |
AW: SQL Schleifen Problem
Guten morgen =)
@p80286 Richtig sind solche 3 Tabellen. @FredFesl Danke das kommt schon nah ran aber hat leider den effekt dass einige Kat_ids ausgelassen werden. hier nochmal ein Beispiel von meinen Kategorien: Tabelle DynKat kat_id parent_id bezeichnung posi 2 0 Hauptkat 1 4 2 Unterkat1 1 5 2 Unterkat2 2 6 5 UnterUnterkat 1 PROBLEM: Prozedur sollte mir 4,5,6 ausgeben, gibt mir aber nur 5,6 aus! Weil bevor die Query EOF ist erneut rekursiv aufgerufen wird. Sie sollte aber natürlich nachdem sie 4,5 notiert hat nochmal rekursiv mit 4 aufgerufen werden und falls dort Unterkategorien vorhanden sind, diese auch wieder in while not EOF aufrufen. Danach quasi zurückkehren und mit 5 das gleiche Spiel! Ist das überhaupt so möglich ? hier mein Code:
Delphi-Quellcode:
procedure TfrmArtikelkategorien.selectArtikel(kat_id:string; myKats: Tstringlist);
var subquery : string; query : Tadsquery; i: Integer; begin query := Tadsquery.Create(self); try query.AdsConnection := con_dynkat; query.DatabaseName := 'con_dynkat'; query.Close; query.SQL.Clear; query.SQL.Add('select kat_id from dyn_kat where parent_id ='+kat_id+' '); query.Open; if query.RecordCount > 0 then begin while not Query.eof do begin if myKats.IndexOf(Query['kat_id'])=-1 then begin myKats.add(Query['kat_id']); selectArtikel(Query['kat_id'], myKats); end; query.next; end; end; finally query.Free; end; for i := 0 to mykats.Count - 1 do begin showmessage(myKats[i]); end; end; |
AW: SQL Schleifen Problem
hiermit Zeigt er mir nun das ergebnis richtig an also listet alle auf, jedoch springt er gar nicht mehr aus der Funktion raus.
Delphi-Quellcode:
procedure TfrmArtikelkategorien.selectArtikel(kat_id:string; myKats: Tstringlist;zaehler:integer);
var subquery : string; query : Tadsquery; i: Integer; begin query := Tadsquery.Create(self); try query.AdsConnection := con_dynkat; query.DatabaseName := 'con_dynkat'; query.Close; query.SQL.Clear; query.SQL.Add('select kat_id from dyn_kat where parent_id ='+kat_id+' '); query.Open; if query.RecordCount > 0 then begin while not Query.eof do begin if myKats.IndexOf(Query['kat_id'])=-1 then begin myKats.add(Query['kat_id']); //selectArtikel(Query['kat_id'], myKats); end; query.next; end; for i := zaehler to mykats.Count - 1 do begin selectArtikel(mykats[i], myKats,zaehler+1); end; end; finally query.Free; end; for i := 0 to mykats.Count - 1 do begin showmessage(myKats[i]); end; //wieso hört er nicht hier auf wenn er fertig ist ? //Exit; führt auch nich zum erfolg ? end; |
AW: SQL Schleifen Problem
Tabelle erzeugen:
SQL-Code:
Rekursive Prozedur, um alle Unter-Kategorien zu bekommen:
CREATE TABLE cat(id AutoInc, parent_cat Integer, text Char(10 )) IN DATABASE;
SQL-Code:
Verwendung (gib alle Unter-Kategorien von Eintrag 1):
CREATE PROCEDURE subcat(parent_cat Integer, id Integer OUTPUT)
BEGIN declare @c cursor; declare @parent_cat integer; @parent_cat=(select parent_cat from __input); if @parent_cat is null then open @c as select id from cat where parent_cat is null; else open @c as select id from cat where parent_cat = @parent_cat; endif; while fetch @c do insert into __output values (@c.id); insert into __output select * from (execute procedure subcat(@c.id)) a; endwhile; close @c; END;
SQL-Code:
select c.* from cat c
inner join (EXECUTE PROCEDURE subcat(1)) a on c.id=a.id; |
AW: SQL Schleifen Problem
Hallo,
ich stand vor dem gleichen Problem bei meinem Programm ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz