ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
3276
3276
EMPFEHLEN
-
24.08.05 21:04 #1
- 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?
-
Hallo,
kannst du bitte deine Ausgabe etwas genauer definieren. Mir ist nicht klar, was du in deiner Darstellung unter Baumn verstehst.
-
30.08.05 21:26 #3
- Registriert seit
- Mar 2004
- Ort
- kesks
- Beiträge
- 36
siehe link
link
-
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.
-
01.09.05 18:39 #5
- 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
-
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
-
Access 2010 / VBA: Daten einer Tabelle mit Daten anderer Tabelle überschreiben
Von grotten im Forum Office-AnwendungenAntworten: 0Letzter Beitrag: 05.01.11, 09:05 -
Daten aus Tabelle 1, Ordnen nach Tabelle 2
Von Leomuck im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 14.06.08, 13:25 -
Daten aus 2 ter Tabelle Auslesen
Von counteract im Forum PHPAntworten: 8Letzter Beitrag: 09.08.06, 12:34 -
Gleichzeitiges Befüllen von Tabelle a_user und Tabelle user mit Daten
Von morphi79 im Forum PHPAntworten: 26Letzter Beitrag: 08.08.05, 15:08 -
Tabelle mit Daten aus anderer Tabelle füllen
Von kippi01 im Forum PHPAntworten: 2Letzter Beitrag: 02.06.05, 22:56





Zitieren
Login





