tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
3276
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    scherzkecks scherzkecks ist offline Mitglied Bronze
    Registriert seit
    Mar 2004
    Ort
    kesks
    Beiträge
    36
    Hallo,
    ich moechte aus einer Tabelle xyz

    ---------------------------------
    | id | owner_id | text |
    ---------------------------------
    | 1 | 0 | bla |
    ---------------------------------
    | 2 | 1 | bla |
    ---------------------------------
    | 3 | 2 | bla |
    ---------------------------------
    | 4 | 1 | bla |
    ---------------------------------

    so eine ausgabe des baumes:

    1 ->
    2 ->
    3
    4

    wie bekomme ich das hin?
     

  2. #2
    WieGehts WieGehts ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    130
    Hallo,
    kannst du bitte deine Ausgabe etwas genauer definieren. Mir ist nicht klar, was du in deiner Darstellung unter Baumn verstehst.
     

  3. #3
    scherzkecks scherzkecks ist offline Mitglied Bronze
    Registriert seit
    Mar 2004
    Ort
    kesks
    Beiträge
    36
    siehe link
    link
     

  4. #4
    WieGehts WieGehts ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    130
    Hallo,
    weil zur Zeit kein Datenbankserver verfügbar, habe ich das mal mit einem ClientDataSet ausprobiert. Für die Verwendung von ADOTable und ADOQuery habe ich den Codeteil der einen Server zur Ausführung voraussetzt, nur als Kommentar eingebaut - sollte aber, wenn die Serverdaten entsprechend ergänzt werden, funktionieren.

    Wenn du die Unit ausprobieren willst, leg ein neues Projekt an. Ziehe auf die Form ein ClientDataSet, eine ADOQuery, eine ADOTable, einen BitBtn und ein Memo. Dann sollte es klappen.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, DBClient, StdCtrls, Buttons, ADODB;
     
    type
      TForm1 = class(TForm)
        ClientDataSet1: TClientDataSet;
        Memo1: TMemo;
        BitBtn1: TBitBtn;
        ADOTable1: TADOTable;
        ADOQuery1: TADOQuery;
        procedure FormCreate(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private-Deklarationen }
      public
        { Public-Deklarationen }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      // Datenfelder erstellen - hast du in deiner DB schon
      with ClientDataSet1.FieldDefs.AddFieldDef do
      begin
        DataType := ftInteger;
        Name := 'ID';
      end;
      with ClientDataSet1.FieldDefs.AddFieldDef do
      begin
        DataType := ftInteger;
        Name := 'OwnerID';
      end;
      with ClientDataSet1.FieldDefs.AddFieldDef do
      begin
        DataType := ftString;
        Size := 20;
        Name := 'Text';
      end;
      ClientDataSet1.CreateDataSet;
      // Tabelle mit daten füllen - hast du in deiner DB schon
      ClientDataSet1.AppendRecord([ 1,  0, 'Eintrag 0']);
      ClientDataSet1.AppendRecord([ 2,  1, 'Eintrag 1,1']);
      ClientDataSet1.AppendRecord([ 3,  1, 'Eintrag 1,2']);
      ClientDataSet1.AppendRecord([ 4,  2, 'Eintrag 2,1']);
      ClientDataSet1.AppendRecord([ 5,  2, 'Eintrag 2,2']);
      ClientDataSet1.AppendRecord([ 6,  4, 'Eintrag 4,1']);
      ClientDataSet1.AppendRecord([ 7,  4, 'Eintrag 4,2']);
      // Erweiterung zu deinen Beispieldaten
      ClientDataSet1.AppendRecord([ 8,  4, 'Eintrag 4,3']);
      ClientDataSet1.AppendRecord([ 9,  4, 'Eintrag 4,4']);
      ClientDataSet1.AppendRecord([10,  4, 'Eintrag 4,5']);
      ClientDataSet1.AppendRecord([11,  2, 'Eintrag 2,3']);
      ClientDataSet1.AppendRecord([12,  1, 'Eintrag 1,3']);
      ClientDataSet1.AppendRecord([13, 11, 'Eintrag 11,1']);
    end;
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
     
      procedure ClientDataSet1Ausgabe(Owner, Ebene: Integer);
      var RecNr: Integer;
      begin
        // Daten filtern
        ClientDataSet1.SetRange([Owner], [Owner]);
        // Alle Datensätze in diesem Bereich bearbeiten
        while not ClientDataSet1.Eof do
        begin
          // die Datensatznummer merken
          RecNr := ClientDataSet1.RecNo;
          // Daten ausgeben
          Memo1.Lines.Add(StringOfChar(' ', Ebene * 4) + '->' +
                      ClientDataSet1.FieldByName('ID').AsString + '  ' +
                      ClientDataSet1.FieldByName('OwnerID').AsString + '  ' +
                      ClientDataSet1.FieldByName('Text').AsString);
          // Ausgabe eines untergeordneten Zeiges aufrufen
          ClientDataSet1Ausgabe(ClientDataSet1.FieldByName('ID').AsInteger, Ebene + 1);
          // nach rückkehr von ausgabe eines untergeordneten zweiges den vorherigen zustand wieder herstellen
          ClientDataSet1.SetRange([Owner], [Owner]);
          ClientDataSet1.RecNo := RecNr;
          // zum nächsten Datensatz gehen
          ClientDataSet1.Next;
        end;
      end;
     
      procedure ADOTable1Ausgabe(Owner, Ebene: Integer);
      var RecNr: Integer;
      begin
        ADOTable1.Filter := 'OwnerID=' + IntToStr(Owner);
        while not ADOTable1.Eof do
        begin
          RecNr := ADOTable1.RecNo;
          Memo1.Lines.Add(StringOfChar(' ', Ebene * 4) + '->' +
                      ADOTable1.FieldByName('ID').AsString + '  ' +
                      ADOTable1.FieldByName('OwnerID').AsString + '  ' +
                      ADOTable1.FieldByName('Text').AsString);
          ADOTable1Ausgabe(ADOTable1.FieldByName('ID').AsInteger, Ebene + 1);
          ADOTable1.Filter := 'OwnerID=' + IntToStr(Owner);
          ADOTable1.RecNo := RecNr;
          ADOTable1.Next;
        end;
      end;
     
      procedure ADOQuery1Ausgabe(Owner, Ebene: Integer);
      var RecNr: Integer;
      begin
        ADOQuery1.Filter := 'OwnerID=' + IntToStr(Owner);
        while not ADOQuery1.Eof do
        begin
          RecNr := ADOQuery1.RecNo;
          Memo1.Lines.Add(StringOfChar(' ', Ebene * 4) + '->' +
                      ADOQuery1.FieldByName('ID').AsString + '  ' +
                      ADOQuery1.FieldByName('OwnerID').AsString + '  ' +
                      ADOQuery1.FieldByName('Text').AsString);
          ADOQuery1Ausgabe(ADOQuery1.FieldByName('ID').AsInteger, Ebene + 1);
          ADOQuery1.Filter := 'OwnerID=' + IntToStr(Owner);
          ADOQuery1.RecNo := RecNr;
          ADOQuery1.Next;
        end;
      end;
     
    begin
      ClientDataSet1.IndexFieldNames := 'OwnerID;ID';                 // Index einstellen
      ClientDataSet1Ausgabe(0, 0);                                    // Ausgabe starten
    {
      ADOTable1.TableName := deine Tabelle;
      ADOTable1.IndexFieldNames := 'OwnerID;ID';
      ADOTable1.Open;
      ADOTable1.Filtered := True;
      ADOTable1Ausgabe(0, 0);
     
      ADOQuery1.SQL.Text := 'SELECT * FROM deine_Tabelle ORDER BY OwnerID, ID';
      ADOQuery1.Open;
      ADOQuery1.Filtered := True;
      ADOQuery1Ausgabe(0, 0);                                                     {}
    end;
     
    end.
     

  5. #5
    scherzkecks scherzkecks ist offline Mitglied Bronze
    Registriert seit
    Mar 2004
    Ort
    kesks
    Beiträge
    36
    klappt wunderbar.
    Vielen Dank.
    Aber es muss in einem TreeView ausgegen werden, damit ich die knoten zu laufzeit verschieben kann und sich das in der DB aendert.

    Vielen Dank fuer die Muehe, echt klasse von Dir

     

  6. #6
    WieGehts WieGehts ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    130
    Hallo,
    ich habs befürchtet, dass du sowas machen willst. Aber aus deinem Beispiel war das nicht erkennbar.
    Schau dir die Tree-Komponente von Delphi an (Online Hilfe). Du kannst dann den Code verwenden, aber anstatt der Ausgabe ins Memo musst du einen Knoten erstellen (Create). Anstatt der Ebene übergibst du den Knoten, zu dem du den erzeugten Knoten als Unterknoten dranhängst.
    Möchte dich aber gleich warnen - wenn du eine größere Menge von Knoten benötigst, wird das (sehr) langsam. Dann solltest du dir eine andere Komponente suchen. Angeblich gibt es welche, die schneller sind als das Delphi-Original.
     

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 05.01.11, 09:05
  2. Daten aus Tabelle 1, Ordnen nach Tabelle 2
    Von Leomuck im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 14.06.08, 13:25
  3. Daten aus 2 ter Tabelle Auslesen
    Von counteract im Forum PHP
    Antworten: 8
    Letzter Beitrag: 09.08.06, 12:34
  4. Antworten: 26
    Letzter Beitrag: 08.08.05, 15:08
  5. Antworten: 2
    Letzter Beitrag: 02.06.05, 22:56