Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Probleme mit Select Statement

  Alt 23. Jan 2006, 18:44
Moin,

was ich nicht so ganz verstehe ist der Zugriff. Warum über SQL Query Analyzer?

Naja, ich habe mal eine Prozedur auf dem Server angelegt...

SQL-Code:
CREATE PROCEDURE [LoadTree] (@Aparent INTEGER = NULL, @Aebene INTEGER = 0) AS

SET NOCOUNT ON

DECLARE @id INTEGER
DECLARE @bez VARCHAR(100)
DECLARE @zeilen CURSOR
DECLARE @ebene INTEGER

SET @ebene = @Aebene

IF @Aebene = 0 BEGIN
  CREATE TABLE ##temp (ID INTEGER, bez VARCHAR(100))
END

IF @Aparent IS NULL BEGIN
  SET @zeilen = CURSOR FOR
    SELECT id, bezeichnung
    FROM tabelle
    WHERE parent_id IS NULL
    ORDER BY parent_id, bezeichnung
END
ELSE BEGIN
  SET @zeilen = CURSOR FOR
    SELECT id, bezeichnung
    FROM tabelle
    WHERE parent_id = @Aparent
    ORDER BY parent_id, bezeichnung
END

OPEN @zeilen
FETCH NEXT FROM @zeilen INTO @id, @bez
WHILE @@FETCH_STATUS = 0 BEGIN
  INSERT ##temp VALUES (@id, @bez)
  SET @ebene = @ebene + 1
  EXEC loadtree @id, @ebene
  FETCH NEXT FROM @zeilen INTO @id, @bez
END
CLOSE @zeilen
DEALLOCATE @zeilen

IF @Aebene = 0 BEGIN
  SELECT *
  FROM ##temp
  DROP TABLE ##temp
END

SET NOCOUNT OFF
Aufruf im SQL Query Analyzer:
EXEC LoadTree oder wenn ein Unterbaum geladen werden soll...
EXEC LoadTree 1 1 steht hier für: zeige alle Elemente die die ParentID = 1 haben und deren Unterelemente.

In Delphi würde das folgendermaßen aussehen (Zugriff über DBExpress)...

Delphi-Quellcode:
procedure TForm.LoadTree(ATree: TTreeView;
                         ASQLConnection:TCRSQLConnection;
                         ANode:TTreeNode;
                         AStream:TMemoryStream;
                         AID: integer);
var SDS:TSimpleDataSet;
    Stream:TMemoryStream;
begin
  Stream:=nil;
  try
    if not assigned(AStream) then
      Stream:=TMemoryStream.Create
    else
      Stream:=AStream;

    SDS:=TSimpleDataSet.Create(Self);
    try
      SDS.Connection:=ASQLConnection;
      SDS.DataSet.CommandText:=
        'SELECT *'#13 +
        'FROM tabelle'#13 +
        'ORDER BY parent_id, bezeichnung';

      if not assigned(AStream) then
        SDS.SaveToStream(Stream, dfXMLUTF8);

      SDS.LoadFromStream(Stream);
      SDS.Filtered:=false;
      if AID >= 0 then
        SDS.Filter:='parent_id = '+inttostr(AID)
      else
        SDS.Filter:='parent_id IS NULL';
      SDS.Filtered:=true;
      SDS.First;
      while not SDS.Eof do begin
        LoadTree(
          ATree,
          ASQLConnection,
          ATree.Items.AddChild(ANode, SDS.FieldByName('bezeichnung').AsString),
          Stream,
          SDS.FieldByName('id').AsInteger
        );
        SDS.Next;
      end;
    finally
      SDS.free;
    end;
  finally
    if not assigned(AStream) and assigned(Stream) then
      Stream.free;
  end;
end;
Aufruf:
  LoadTree(TreeView, SQLConnection); MfG
Thorsten
  Mit Zitat antworten Zitat