AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

SQL Schleifen Problem

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

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

AW: SQL Schleifen Problem

  Alt 27. Jun 2011, 17: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
 
#2

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 08: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
 
#3

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 09: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 RWarnecke
RWarnecke

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

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 09: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
H3llsing

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

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 09:52
VIELEN DANK an alle die sich mein Problem angeommen haben.

ich habe mich nun für joachimd 's Lösung entschieden, da es die performanteste und schnellste ist =)
Funktioniert wunderbar!
Vielleicht sollte ich mich auch mal in SP's einlesen

Geändert von H3llsing (28. Jun 2011 um 10:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

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

AW: SQL Schleifen Problem

  Alt 28. Jun 2011, 09: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 09:33 Uhr) Grund: Formatierung
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:47 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