AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Schleifen Problem

Ein Thema von H3llsing · begonnen am 27. Jun 2011 · letzter Beitrag vom 28. Jun 2011
Antwort Antwort
Seite 1 von 2  1 2      
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#1

SQL Schleifen Problem

  Alt 27. Jun 2011, 15:52
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
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#2

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 16:17
Welches RDBMS?
Einige RDBMS können rekursive Queries ausführen, bei anderen müsste eine UDF oder eine SP geschrieben werden.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 16:32
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

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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 16:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 17:28
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#6

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 18:44
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.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 09:49
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;
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 10:18
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;
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#9

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 10:26
Tabelle erzeugen:
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;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de

Geändert von joachimd (28. Jun 2011 um 10:33 Uhr) Grund: Formatierung
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 10:29
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.
Rolf Warnecke
App4Mission
  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 23: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