Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SQL Schleifen Problem (https://www.delphipraxis.net/161292-sql-schleifen-problem.html)

H3llsing 27. Jun 2011 14:52

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

Iwo Asnet 27. Jun 2011 15:17

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.

p80286 27. Jun 2011 15:32

AW: SQL Schleifen Problem
 
Zitat:

Zitat von H3llsing (Beitrag 1108535)
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.

Das klingt als ob eine Datenbank im Spiel wäre

Zitat:

Zitat von H3llsing (Beitrag 1108535)
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 wiederum ist es ein Problem der Oberfläche!?

Warscheinlich war mein Arbeitstag zu lang, ich versteh das Problem nicht.

Gruß
K-H

H3llsing 27. Jun 2011 15:42

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.

p80286 27. Jun 2011 16:28

AW: SQL Schleifen Problem
 
Zitat:

Zitat von H3llsing (Beitrag 1108535)
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.

Nur um mich zu vergewissern,
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

FredlFesl 27. Jun 2011 17:44

AW: SQL Schleifen Problem
 
Na denn: Eine Prozedur, um alle Artikel einer Kategorie und Unterkategorien auszulesen.

Delphi-Quellcode:
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;
Na ja, und Resourcenschutzblöcke noch, und die Feldnamen und Tabellennamen richtig machen und so.

H3llsing 28. Jun 2011 08:49

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;

H3llsing 28. Jun 2011 09:18

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;

joachimd 28. Jun 2011 09:26

AW: SQL Schleifen Problem
 
Tabelle erzeugen:
SQL-Code:
CREATE TABLE cat(id AutoInc, parent_cat Integer, text Char(10 )) IN DATABASE;
Rekursive Prozedur, um alle Unter-Kategorien zu bekommen:
SQL-Code:
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;
Verwendung (gib alle Unter-Kategorien von Eintrag 1):
SQL-Code:
select c.* from cat c
inner join (EXECUTE PROCEDURE subcat(1)) a
  on c.id=a.id;

RWarnecke 28. Jun 2011 09:29

AW: SQL Schleifen Problem
 
Hallo,

ich stand vor dem gleichen Problem bei meinem Programm Code-Orakel. Ich habe das erstmal so gelöst, wie in diesem Beitrag. Ich weiß, dass es nicht die optimalste Lösung ist. Sie sollte aber auf Dein Beispiel anwendbar sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:56 Uhr.
Seite 1 von 2  1 2      

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