![]() |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe die DLL schon direkt mit DW geladen. Die gleiche Fehlermeldung wie bei der EXE
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
@Hansa: Mensch - mußt Du gleich wieder der Keule kommen....
Hansa ist nicht verkehrt, er weiss einiges, gerade über Firebird und ich weiss noch wie er mich mit einem Paukenschlag in meinem 1.Post in der DP begrüßt hat :mrgreen:. Aber um das Ganze mal wieder etwas aufzulösen. Dieser Firebird-Installationskrempel gehört nun wirklich nicht unter die Überschrift. @Jens mach doch mal mit der Geschichte in Deinem ![]() Neige dazu Dir das ADO-Beispiel aus dem Datenbankthread an den Compiler zu legen und Dich hier auf die Ansteuerung des Virtual-Tree-View zu konzentrieren. Da gibt es noch Tücken genug. Viele Grüße in die Runde ! Martin |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Da gebe ich Dir recht. Leider ist es ja so, das das eine irgendwie auf dem anderen aufbaut.
Ich habe mich ja intensiv mit dem VST beschäftigt und will halt jetzt an die DB-Anbindung. Und dabei, ist ja der Fehler aufgetaucht. Aber trotzdem Danke für den Tip. Vieleicht sollte ich einfach einen neuen Thread aufmachen. Das Problem ist nur, das ich schon nicht mal mehr weiß, wie ich den überhaupt nennen könnte. Es ist eben auch nicht gegen Hansa gewesen. Nur ist es halt als Anfänger schwer, wenn man teilweise die Begriffe und Hintergründe nicht kennt, sich darein zu arbeiten. Auch das googeln ist dann nicht so einfach, wenn man nicht genau weiß wonach man eigentlich sucht. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Jens nimm Dir doch das Datenbankbeispiel aus dem anderen Thread und bau mal den VT ein. Morgen bin ich auf der CeBit aber am Freitag würde ich Dir dann aus dem Access VT Beispiel aind FB VT Beispiel bauen. Das mach ich nicht ohne Eigensinn. Mit dem VT habe ich bisher kaum gearbeitet und Du leistet da gerade Forschungsarbeit in meinem Sinne :mrgreen:
Grüße // Martin PS: ![]() |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Ich habe doch noch ein wenig getestet. Ich habe die Datenbank auch noch in einem anderen Ordner in einem anderen Programm. Auch da habe ich ja eine TZCon und TZQRY. Nur mit dem unterschied, das ich dort über eine DataSource ein DBGrid fülle.
Jetzt habe ich mal in beiden Anwendungen versucht, die Datenbankverbindung im Designmodus zu öffnen. In der mit dem DBGrid geht es und in der anderen, kommt dann schon der Fehler das die dll fehlt. Und nach langem genauem hinsehen, habe ich den Fehler dann doch noch gefunden. Es läuft. Und zwar, stand das Protokoll der TZConnection nicht auf Firebird2.0 sondern auf Firebirdd2.0. Wo ist denn da eigendlich der Unterschied. Jetzt geht alles, sogar meine Anbindung an mein VST. Yes (Eigeninitiative) :thumb: Sorry Hansa, das musste jetzt sein, ist aber nicht persönlich gemeint. Gruß und Dank an alle Jens PS: Besonderen Dank an Markus und Martin |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Übrigens,
werden die anderen dll´s auch benötigt. Nachdem ich die eingefügt hatte, muss ich mir irgendwie ausversehen, die Einstellungen vom Protokoll Firebird 2.0 auf Firebirdd 2.0 umgestellt haben. So kann es gehen. Fehler der dll´s behoben und in der Zwischenzeit einen neuen eingebaut. Naja, dies nur noch am Rande zur Information. Aber vielleicht, kann mir ja jemand mal den Unterschied der beiden Protokolle erleutern. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Zitat:
![]() alex |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Ah, danke schön, also wird das Protokoll
Embedded : use the firebirdd-2.0 protocol. von Lazarus verwendet |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nochmal zusammen.
Habe die ganze Anbindung jetzt am laufen, und wollte jetzt noch das befüllen von einem Record, auf ein Objekt (class) ändern. Habe das auch soweit alles angepaßt, habe allerdings jetzt beim kompelieren eine Fehlermeldung (siehe Anhang) Leider, kann ich den Grund dafür nicht finden. Delphi bring auch sonst keine Meldung wie man das so kennt. z.B. ; erwartet oder so;;;; Hier der gesamte Quellcode, was das VST angeht inkl. der Objekt Impelmentation...
Delphi-Quellcode:
{Mein Objekt}
type TOMB256PLUS = class public ID : integer; LfdNr : integer; Datum : String; Uhrzeit : String; Ereignis : String; Teilnehmer : String; Bereich : String; SysData : String; end; {Meine Datenbank / VST Anbindung} {******************************************************************************} { } { VST Zeilen farblich darstellen } { } {******************************************************************************} procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS.Create; Daten := TOMB256PLUS(VST.GetNodeData(Node)^); if Sender.Selected[Node] then Exit; Daten := (VST.GetNodeData(Node)); if Pos('Extern',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clAqua; if Pos('Unscharf',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clSkyBlue; if Pos('Störung',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clYellow; end; if Pos('Alarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Hauptalarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Überfall',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Einbruch',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Sabotage',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Voralarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; TargetCanvas.FillRect (ItemRect); end; procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); Daten.Free; end; procedure TForm1.VSTfüllen; begin if not QRYMB256PLUS.Active then QRYMB256PLUS.Open; QRYMB256PLUS.filtered := false; QRYMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; VST.NodeDataSize := Sizeof(TOMB256PLUS); QRYMB256PLUS.First; VST.RootNodeCount := QRYMB256PLUS.RecordCount; VST.SortTree(0,sdAscending,true); VST.EndUpdate; end; {VST Initialisieren mit den Daten aus der Datenbank} procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS.Create; VST.NodeHeight[Node] := 35; Include(InitialStates, ivsMultiline); Initialize(Daten); Daten.ID := QRYMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QRYMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QRYMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QRYMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QRYMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QRYMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QRYMB256PLUS.FieldByName('Bereich').AsString; if not QRYMB256PLUS.eof then QRYMB256PLUS.Next; end; {Größe vom Objekt dem VST zuweisen} procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin VST.NodeDataSize := SizeOf(TOMB256PLUS); end; {Werte dem VST zuweisen} procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS.Create; Daten := TOMB256PLUS(VST.GetNodeData(Node)^); case Column of 0: CellText:= IntToStr(Daten.ID); 1: CellText:= IntToStr(Daten.LfdNr); 2: CellText:= Daten.Datum; 3: CellText:= Daten.Uhrzeit; 4: CellText:= Daten.Ereignis; 5: CellText:= Daten.Teilnehmer; 6: CellText:= Daten.Bereich; end; end; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Habe den ganzen Abend noch an meinem Fehler gesucht, nur leider ohne Ergebnis.
Das Einzige, wo ich vermute, wo das her kommt liegt bei dem Event GetOnText. Kommentiere ich diesen Teil aus, Läuft mein Programm.
Delphi-Quellcode:
Irgenjemand da vieleicht noch eine Idee
var
Daten : TOMB256PLUS; begin Daten := TOMB256PLUS.Create; Daten := TOMB256PLUS(VST.GetNodeData(Node)^); case Column of 0: CellText:= IntToStr(Daten.ID); 1: CellText:= IntToStr(Daten.LfdNr); 2: CellText:= Daten.Datum; 3: CellText:= Daten.Uhrzeit; 4: CellText:= Daten.Ereignis; 5: CellText:= Daten.Teilnehmer; 6: CellText:= Daten.Bereich; end; end; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Zitat:
Zitat:
Somit ist die gerade zuvor erzeugte Instanz von die nicht mehr zu benutzen. Kurz: Die .Create Zeile ist zuviel und das im ganzen Code. Es reicht ein mal das Objekt pro Datensatz zu erstellen. Das machst du ja bereits bei der Init Routine.
Delphi-Quellcode:
Was macht deine "Initialize" Daten Funktion?procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : TOMB256PLUS; [...] Daten := TOMB256PLUS.Create; VST.NodeHeight[Node] := 35; Include(InitialStates, ivsMultiline); Initialize(Daten); Wann weist du den Objektzeiger dem VST-Data Zeiger zu? Jede Zeile hat ein pVirtualNode Record, an diesem hängt der Datenzeiger. Diesen scheinst du nicht zu setzen. Daher die Schutzverletzung. Daher geht dein GetText usw. nicht, weil es keine Referenz auf deine TOMB256PLUS Objekte findet. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Ich habe das ganze jetzt mal umgebaut, und dazu das Tutorial aus dem DelphiTreff zur Hilfe genommen.
Allerdings, klappt das alles nicht so, wie ich mir das vorstelle.
Delphi-Quellcode:
{VST Initialisieren mit den Daten aus der Datenbank}
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : TOMB256PLUS; begin VST.NodeDataSize := SizeOf(TOMB256PLUS); VST.NodeHeight[Node] := 35; while not QryMB256PLUS.Eof do begin Daten := TOMB256PLUS.Create; try Daten.ID := QRYMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QRYMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QRYMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QRYMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QRYMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QRYMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QRYMB256PLUS.FieldByName('Bereich').AsString; VST.AddChild(nil,Daten); except Daten.Free; end; end; end; Allerdings, habe ich das da auch nicht so ganz verstanden, In einem Video hier in der DP wird das VST einmal mit einem Record und einmal mit einem Object gefüllt. Im Tutorial ist dem Object irgendwie einRecord zugewiesen. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Delphi-Quellcode:
ist an der Stelle auch falsch.
VST.AddChild(nil,Daten);
mit addChild fügst du einen neuen Knoten hinzu (Würde auch generell gehen, wäre dein Projekt etwas anders aufgebaut). Da du das NodeCount setzt, sind die Knoten schon im Baum. Du brauchst also nur noch den Zeiger zeigen lassen ;-) Also hat du nun 2 Möglichkeiten. a) du nimmst den code aus dem letzten post und löscht aus deinem projekt die andere initialisierung oder b) du entfernst die schleife aus der init routine und lässt bei dem node den datenzeiger auf dein objekt zeigen. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Also irgendwie bin ich scheinba zu doof da zu.
Diese ganzen Möglichkeiten von Records, Objecten oder Objecten mit Records, hat mich total durcheinander gebracht. Ich poste Euch jetzt nochmal, meinen zur Zeit aktiven geamten Code der das VST angeht. Vieleicht, kann mir da dann ja mal jemand dran erklären, wo mein Fehler ist, und vorallem warum.
Delphi-Quellcode:
Das müssten alle Funktionen sein.
//Wird so in der Funktion aufgerufen, die meine Daten verwaltet.
QryMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'SELECT * FROM MB256PLUS';//'SELECT * FROM MB256PLUS'; QryMB256PLUS.Open; Form1.VSTfüllen; //Eigene Procedure end; procedure TForm1.VSTfüllen; var Daten : TOMB256PLUS; begin if not QRYMB256PLUS.Active then QRYMB256PLUS.Open; QRYMB256PLUS.filtered := false; QRYMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; VST.NodeDataSize := Sizeof(TOMB256PLUS); Daten := TOMB256PLUS.Create; QRYMB256PLUS.First; VST.RootNodeCount := QRYMB256PLUS.RecordCount; VST.SortTree(0,sdAscending,true); VST.EndUpdate; end; {Größe vom Objekt dem VST zuweisen} procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin VST.NodeDataSize := SizeOf(TOMB256PLUS); end; {Werte dem VST zuweisen} procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Daten : TOMB256PLUS; begin //Daten := TOMB256PLUS.Create; Daten := TOMB256PLUS(VST.GetNodeData(Node)^); case Column of 0: CellText:= IntToStr(Daten.ID); 1: CellText:= IntToStr(Daten.LfdNr); 2: CellText:= Daten.Datum; 3: CellText:= Daten.Uhrzeit; 4: CellText:= Daten.Ereignis; 5: CellText:= Daten.Teilnehmer; 6: CellText:= Daten.Bereich; end; end; procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : TOMB256PLUS; begin Daten.ID := QRYMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QRYMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QRYMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QRYMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QRYMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QRYMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QRYMB256PLUS.FieldByName('Bereich').AsString; end; procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); Daten.Free; end; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Delphi-Quellcode:
Wofür brauchst du da ein neues Daten Objekt? Was passiert damit?
procedure TForm1.VSTfüllen;
var Daten : TOMB256PLUS; begin if not QRYMB256PLUS.Active then QRYMB256PLUS.Open; QRYMB256PLUS.filtered := false; QRYMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; VST.NodeDataSize := Sizeof(TOMB256PLUS); Daten := TOMB256PLUS.Create; QRYMB256PLUS.First; VST.RootNodeCount := QRYMB256PLUS.RecordCount; VST.SortTree(0,sdAscending,true); VST.EndUpdate; end;
Delphi-Quellcode:
So jetzt weisst du hier einen nicht initialisierten Objekt dazu zu.
procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : TOMB256PLUS; begin Daten.ID := QRYMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QRYMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QRYMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QRYMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QRYMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QRYMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QRYMB256PLUS.FieldByName('Bereich').AsString; end; Müsste sogar in der IDE eine Warnung stehen. Wie wäre es HIER das Datenobjekt zu erzeugen (.Create) und anschließend den Zeiger zu dem Objekt an den Node-Datenzeiger hängen bzw. zuweisen. Wobei ich persönlich das arbeiten über InitNode vermeide, da etwas komplizierter und die Knotenanzahl fest stehen muss. InitNode ist aber performanter als eine iteratives vorgehen. Der Rest deines Codes sieht ganz gut aus. Aber ich habe den Eindruck das du noch nicht viel mit Objekten und Zeiger gearbeitet hast. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Genau, das ist mein Problem, und das verstehe ich auch irgendwie nicht so recht, und um ehrlich zu sein, habe ich bislang noch gar nicht mit Objekten gearbeitet. Das ist jetzt durch das VST entstanden.
In einem Übungsbeispiel, wurde damit gearbeitet. In einem anderen Übungsbeispiel mit Records. Und durch diese Geschichte bin ich auch total verwirrt mittlerweile. Ich habe mein Programm jetzt wieder umgebaut auf einen Record, und damit Funktioniert es so wie ich es mir vorstelle. Hier der Quellcode. Die Frage ist nur, ob es der Richtige und sichere Weg ist. Ich lese Daten von einer COM Schnittstelle, die in einer undefinierbaren Menge auftreten können. Das VST nutze ich zur Anzeige dieser Datensätze, die unter diversen Umständen im Sekunden Takt auftreten könne.
Delphi-Quellcode:
type PVSTRec = ^VSTRec; VSTRec = packed record ID, LfdNr : integer; Datum, Uhrzeit, Ereignis, Teilnehmer, Bereich : WideString; SysDatum : String; end; procedure TForm1.VSTFüllen; //Das VSTFüllen wird bei jedem neuen Datensatz aufgerufen, begin //dadurch realisiere ich, das die Anzeige immer aktuell ist. if not QryMB256PLUS.Active then QryMB256PLUS.Open; QryMB256PLUS.filtered := false; QryMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; VST.NodeDataSize := SizeOf(VSTRec); QryMB256PLUS.First; VST.RootNodeCount := QryMB256PLUS.RecordCount; VST.SortTree(0,sdAscending,true); VST.EndUpdate; end; procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates); var Daten : PVSTRec; begin Daten := Sender.GetNodeData(Node); VST.NodeHeight[Node] := 35; Include(InitialStates, ivsMultiline); Initialize(Daten^); Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; if not QryMB256PLUS.eof then QryMB256PLUS.Next; end; procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); var Daten : PVSTRec; begin Daten := Sender.GetNodeData(Node); if Sender.Selected[Node] then Exit; Daten := (VST.GetNodeData(Node)); if Pos('Extern',Daten.Ereignis) > 0 then TargetCanvas.Font.Color := clYellow; end; procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); var Daten : PVSTRec; begin Daten := Sender.GetNodeData(Node); if Sender.Selected[Node] then Exit; Daten := (VST.GetNodeData(Node)); if Pos('Extern',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clblue; if Pos('Unscharf',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clLime; if Pos('Störung',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clYellow; end; if Pos('Alarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Hauptalarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Überfall',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Einbruch',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Sabotage',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Voralarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; TargetCanvas.FillRect (ItemRect); end; procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Daten : PVSTRec; begin Daten := Sender.GetNodeData(Node); if Assigned(Daten) then Finalize(Daten^); end; procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Daten : PVSTRec; begin Daten := Sender.GetNodeData(Node); case Column of 0: CellText:= IntToStr(Daten.ID); 1: CellText:= IntToStr(Daten.LfdNr); 2: CellText:= Daten.Datum; 3: CellText:= Daten.Uhrzeit; 4: CellText:= Daten.Ereignis; 5: CellText:= Daten.Teilnehmer; 6: CellText:= Daten.Bereich; end; end; procedure TForm1.VSTHeaderClick(Sender: TVTHeader; Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then with Sender do begin if SortColumn <> Column then SortColumn := Column; if SortDirection = sdAscending then SortDirection := sdDescending else SortDirection := sdAscending; VST.SortTree(Column,SortDirection,true); end; end; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
So, war zwar ne schwere Geburt, aber ich habe es doch noch hinbekommen, meine VST Anbindung ohne InitFunktion und mit Object zu gestalten.
Ich hoffe, das jemand diesen Beitrag ließt, und eventuell mal sagen kann, ob ich das jetzt so richtig gemacht habe oder, ob ich noch was ändern muss oder sollte. Die Funktion ist komplett da und in Ordnung. Ich weiß nur nicht so genau, ob das mit den Einträgen einfügen und so alles so OK ist, ohne das ich nachher irgendwelche Performance Problem bekomme. Hier mal meine jetzige und hoffendlich fertige Lösung..
Delphi-Quellcode:
Ich bedanke mich schon mal, und hoffe auf Eure antworten.//Mein Object type TOMB256PLUS = class private ID : integer; LfdNr : integer; Datum : String; Uhrzeit : String; Ereignis : String; Teilnehmer : String; Bereich : String; SysData : String; end; //Eintrag in Form.Create VST.NodeDataSize := SizeOf(TOMB256PLUS); VSTFüllen; VST.ScrollIntoView(VST.GetLast, true); //Funktion VSTFüllen die durch FormCreate ausgelößt wird procedure TForm1.VSTFüllen; var Daten : TOMB256PLUS; begin if not QryMB256PLUS.Active then QryMB256PLUS.Open; QryMB256PLUS.filtered := false; QryMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; VST.NodeDataSize := SizeOf(TOMB256PLUS); while not QryMB256PLUS.EOF do begin Daten := TOMB256PLUS.Create; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil,Daten); QryMB256PLUS.Next; end; VST.EndUpdate; end; //Einträge in VST einfügen, wenn neue Datensätze kommen. {Datensatzverarbeitung} procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser); var i: Integer; Temp1 : Integer; Temp2 : String; Temp3 : String; Temp4 : String; Temp5 : String; Temp6 : String; Daten : TOMB256PLUS; begin Temp1 := ParserTreeView.Entries[0].LfdNr; Temp2 := ParserTreeView.Entries[0].Datum; Temp3 := ParserTreeView.Entries[0].Uhrzeit; Temp4 := ParserTreeView.Entries[0].Ereignis; Temp5 := ParserTreeView.Entries[0].Teilnehmer; Temp6 := ParserTreeView.Entries[0].Bereich; Application.ProcessMessages; QryMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'INSERT INTO MB256PLUS'+ '("LfdNr", "Datum", "Uhrzeit", "Ereignis", "Teilnehmer", "Bereich")'+ 'VALUES(:LfdNr,:Datum,:Uhrzeit,:Ereignis,:Teilnehmer,:Bereich)'; QryMB256PLUS.ParamByName('LfdNr').AsInteger := Temp1; QryMB256PLUS.ParamByName('Datum').AsString := Temp2; QryMB256PLUS.ParamByName('Uhrzeit').AsString := Temp3; QryMB256PLUS.ParamByName('Ereignis').AsString := Temp4; QryMB256PLUS.ParamByName('Teilnehmer').AsString := Temp5; QryMB256PLUS.ParamByName('Bereich').AsString := Temp6; QryMB256PLUS.ExecSQL; ConMB256PLUS.Commit; QryMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'SELECT * FROM MB256PLUS';//'SELECT * FROM MB256PLUS'; QryMB256PLUS.Open; VST.BeginUpdate; Daten := TOMB256PLUS.Create; QryMB256PLUS.Last; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil, Daten); VST.ScrollIntoView(VST.GetLast, true); VST.EndUpdate; DataMB256plus := ''; end; //Celltext Zuweisung procedure TForm1.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); case Column of 0: CellText:= IntToStr(Daten.ID); 1: CellText:= IntToStr(Daten.LfdNr); 2: CellText:= Daten.Datum; 3: CellText:= Daten.Uhrzeit; 4: CellText:= Daten.Ereignis; 5: CellText:= Daten.Teilnehmer; 6: CellText:= Daten.Bereich; end; end; //Objectdaten freigeben procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); Daten.Free; end; //Zeilen, je nach Ereignis einfärben procedure TForm1.VSTAfterItemErase(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; ItemRect: TRect); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); if Sender.Selected[Node] then Exit; if Pos('Extern',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clblue; if Pos('Unscharf',Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clLime; if Pos('Störung',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clYellow; end; if Pos('Alarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Hauptalarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Überfall',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Einbruch',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Sabotage',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; if Pos('Voralarm',Daten.Ereignis) > 0 then begin if Pos('EIN', Daten.Ereignis) > 0 then TargetCanvas.Brush.Color := clRed; end; TargetCanvas.FillRect (ItemRect); end; //Textfarbe bei blauen Zellen auf gelb setzen procedure TForm1.VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); if Sender.Selected[Node] then Exit; if Pos('Extern',Daten.Ereignis) > 0 then TargetCanvas.Font.Color := clYellow; end; Gruß Jens |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Sieht ganz gut aus, aber einen müssen wir abziehen, hätten die bei Rosental gesagt.
Du hast ein
Delphi-Quellcode:
doppelt.
VST.NodeDataSize := SizeOf(TOMB256PLUS);
Eigentlich reicht der eine im CreateForm. Wenn du einen Datensatz hinzufügst, würde ich die Daten direkt in das VST Objekt schreiben und dem VST hinzufügen. Erst in die DB schreiben und dann wieder alle DS laden, um dann zum letzten zu springen um diesen dann in das Objekt zu kopieren erscheint mir etwas umständlich. Kleine Anmerkung noch zu der Recordlösung. Dort nutzt du die Datentype String und Widestring. Dieses sind Zeigertypen. Records sind einfach ausdrückt zusammenhängende Speicherblöcke optimal ohne Zeiger drin. So kann dieser Speicherblock direkt z.B. von/auf Festplatte geschrieben/geladen werden ohne die Daten im Speicher zu suchen zu müssen. Der VST z.B. nutzt die Records um Geschwindigkeit gut zu machen. Bei 100 Datensätzen wird nur 1 mal Speicher belegt. Dadurch geht das sehr schnell. Nutzt du nun Huge-/Wide-Strings dann wird im Record nur ein Zeiger zu dem String abgelegt. Der kann zwar ganz normal genutzt werden, wird aber vom VST nicht mehr freigegeben und du erhälst Speicherlöcher. Das kannst du mit dem FastMM kontrollieren. Ein Beispiel befindet sich auch im DP Stammtischvideo #2. Es gibt 2,5 Möglichkeiten da drum rum zu kommen. 1) Shortstrings verwenden z.B. String[255] wobei die Stringlänge =<255 sein muss 2) du gibts den Huge-/Wide-String frei bei dem onFreeNode Ereignis 2,5) du schaltest die Hugestrings im Compiler aus Die Objektmethode ist dort anders. Im onFreeNode wird das komplett Objekt freigegeben also ist das gut. Nachteil bei 100 Datensätzen fordert der VST 100 mal Speicher für den Knoten im addNode an. Dauert dadurch etwas länger. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo generic,
Erstmal großes Dankeschön, für die gute Erklärung. Die VSTFüllen, habe ich abgewandelt.
Delphi-Quellcode:
Allerdings, mit der anderen, denke ich muss das so bleiben. Den Grund dafür, sehe ich, da beim schreiben in die Datenbank, ein ID erzeugt wird. (Generator der Firebird als Zähler).
procedure TForm1.VSTFüllen;
var Daten : TOMB256PLUS; begin if not QryMB256PLUS.Active then QryMB256PLUS.Open; QryMB256PLUS.filtered := false; QryMB256PLUS.filter := ''; VST.BeginUpdate; VST.Clear; //VST.NodeDataSize := SizeOf(TOMB256PLUS); while not QryMB256PLUS.EOF do begin Daten := TOMB256PLUS.Create; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil,Daten); QryMB256PLUS.Next; end; VST.EndUpdate; end;
Delphi-Quellcode:
Was für mich bedeuten tut, will ich die ID im VST sehen, muss ich diese ja aus der Datenbankabfragen, Oder?
//QryMB256PLUS.ParamByName('ID') wird durch die Datenbank erzeugt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
QryMB256PLUS.ParamByName('LfdNr').AsInteger := Temp1; QryMB256PLUS.ParamByName('Datum').AsString := Temp2; QryMB256PLUS.ParamByName('Uhrzeit').AsString := Temp3; QryMB256PLUS.ParamByName('Ereignis').AsString := Temp4; QryMB256PLUS.ParamByName('Teilnehmer').AsString := Temp5; QryMB256PLUS.ParamByName('Bereich').AsString := Temp6;
Delphi-Quellcode:
Da ich keine Zeitprobleme habe, und es kein Problem ist die Datenbank bei Programmstart zu laden, müsste die Variante mit den Objecten ja die bessere sein.
VST.BeginUpdate;
Daten := TOMB256PLUS.Create; QryMB256PLUS.Last; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil, Daten); VST.ScrollIntoView(VST.GetLast, true); VST.EndUpdate; Gibt es den da irgendeine Beschränkung der Anzahl der Datensätz, wo das keinen Sinn mehr macht, oder anders gefragt. Sollte ich das VST auf irgendeine bestimmte Anzahl Datensätze Begrenzen und nur bei Abfrage durch den Kunden die anderen sichbar machen. Ich denke da an so was...
Delphi-Quellcode:
Count := QryMB256PLUS.RecordCount-10000;
QryMB256PLUS.RecNo := Count; while not QryMB256PLUS.EOF do begin Daten := TOMB256PLUS.Create; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil,Daten); QryMB256PLUS.Next; end; VST.EndUpdate; end; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo nochmal zusammen,
habe das ganze jetzt ausgiebig geprüft, und habe leider festgestellt, das da noch irgendein zeitliches Problem bestehen muss. Starte ich meine Verbindung um Daten von der COM Schnittstelle zu holen, geht das, möchte ich diese allerdings wieder trennen, kommen zwar keine weiteren Daten ins VST, aber mein Programm scheint an irgendeiner Stelle hängen zu bleiben. Oder was ich eher Vermute, weil wenn ich lange Daten hole, und mein Programm minimiere, und später wieder vergrößern will, dauert das unwahrscheinlich lange bis das VST neu gezeichnet ist oder es hgeht gar nicht. Daher vermute ich, das ich mir irgendwo den Speicher zu mülle. Mein Object gebe ich allerdings wieder frei. Hier mal der Code..
Delphi-Quellcode:
Leider kann ich mit Haltepunkten nichts anfangen. Da ich bei den vielen bereits gesetzten nichts falsches Enddecken kann.
{Datensatzverarbeitung}
procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser); var i: Integer; Temp1 : Integer; Temp2 : String; Temp3 : String; Temp4 : String; Temp5 : String; Temp6 : String; Daten : TOMB256PLUS; begin Temp1 := ParserTreeView.Entries[0].LfdNr; Temp2 := ParserTreeView.Entries[0].Datum; Temp3 := ParserTreeView.Entries[0].Uhrzeit; Temp4 := ParserTreeView.Entries[0].Ereignis; Temp5 := ParserTreeView.Entries[0].Teilnehmer; Temp6 := ParserTreeView.Entries[0].Bereich; QryMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'INSERT INTO MB256PLUS'+ '("LfdNr", "Datum", "Uhrzeit", "Ereignis", "Teilnehmer", "Bereich")'+ 'VALUES(:LfdNr,:Datum,:Uhrzeit,:Ereignis,:Teilnehmer,:Bereich)'; QryMB256PLUS.ParamByName('LfdNr').AsInteger := Temp1; QryMB256PLUS.ParamByName('Datum').AsString := Temp2; QryMB256PLUS.ParamByName('Uhrzeit').AsString := Temp3; QryMB256PLUS.ParamByName('Ereignis').AsString := Temp4; QryMB256PLUS.ParamByName('Teilnehmer').AsString := Temp5; QryMB256PLUS.ParamByName('Bereich').AsString := Temp6; QryMB256PLUS.ExecSQL; ConMB256PLUS.Commit; QRyMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'SELECT * FROM MB256PLUS';//'SELECT * FROM MB256PLUS'; QryMB256PLUS.Open; VST.BeginUpdate; Daten := TOMB256PLUS.Create; QryMB256PLUS.Last; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger; Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString; Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString; Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString; Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString; Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString; end; VST.AddChild(nil, Daten); if Pos('Einbruch',Daten.Ereignis) or Pos('EINBRUCH',Daten.Ereignis) > 0 then begin CBAlarme.Items.Add(Daten.Ereignis); CBAlarme.ItemIndex := 0; CBAlarmeDatum.Items.Add(Daten.Datum); CBAlarmeDatum.ItemIndex := 0; end; if Pos('Störung',Daten.Ereignis) or Pos('STÖRUNG',Daten.Ereignis) > 0 then begin CBStoerungen.Items.Add(Daten.Ereignis); CBStoerungen.ItemIndex := 0; CBStoerungenDatum.Items.Add(Daten.Datum); CBStoerungenDatum.ItemIndex := 0; end; if Pos('Extern',Daten.Ereignis) > 0 then begin CBExtern.Items.Add(Daten.Ereignis); CBExtern.ItemIndex := 0; CBExternDatum.Items.Add(Daten.Datum); CBExternDatum.ItemIndex := 0; end; if Pos('Intern',Daten.Ereignis) > 0 then begin CBIntern.Items.Add(Daten.Ereignis); CBIntern.ItemIndex := 0; CBInternDatum.Items.Add(Daten.Datum); CBInternDatum.ItemIndex := 0; end; VST.ScrollIntoView(VST.GetLast, true); VST.EndUpdate; QRyMB256PLUS.Close; DataMB256plus := ''; end; procedure TForm1.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); Daten.Free; end; Hat vieleicht jemand eine Idee. Gruß und Danke Jens |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Push
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo,
wie sieht denn dein OnGetText jetzt aus ? Hoffentlich nur so was wie
Delphi-Quellcode:
ohne das .Create
var
Daten : TOMB256PLUS; begin Daten := TOMB256PLUS(VST.GetNodeData(Node)^); Zum zumüllen: - Task-Manager benutzen - MemCheck benutzen Ausserdem habe ich gesehen, verwendest du RecordCount und Last, das ist schlecht, wozu brauchst du das Count ? Besser wäre es, es selber zu zählen. RecordCount: ============ Select * from Tabelle und alle Datensätze übers Netz ziehen und dabei laaaangsam zählen -> durch Select Count(*) ersetzen Last ====: Ähnlich wie RecordCount was benutzt du zum Zugriff auf Firebird ? -> SQL-Monitor benutzen Update ====== Jetzt habe ich mir mal die vorige eite angesehen. Du bekommst über Generator/Trigger eine neue ID und benutzt Select * -> Last, um an die Id ranzukommen. Ist "Suboptimal". Wenn du wirklich der einzige bist, der in die DB schreibt, reicht ein Select Max(Id) As ID_Max From TableX Das erneute Auslesne der Daten ist nicht nötig, die hast du (abgesehen von der ID) ja gerade eingetragen. Bist du nicht der einzige, holst du dir per select Gen_Id(Generator_Variable,1) den nächstgößten ID-wert (der Generator wird hier auch gleichzeitg mit erhöht) und trägst den Datensatz incl. der ID ein. Heiko Heiko |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo Heiko,
Danke erstmal für die vielen Bemühungen. Habe alles so weit verstanden. In der Get Text ist natürlich kein Create mehr. Allerdings, habe ich das mit der Selekt Funktion jetzt mal versucht, allerdings mit dem Fehler, das das Feld ID nicht bekannt ist.
SQL-Code:
Die selbe Meldung, kommt bei deiner Variante
Select Max(Id) From MB256PLUS
SQL-Code:
Das Feld existiert aber und ist ein Generator.
Select Max(Id) As ID_Max From TableX
Irgendeine Idee Gruß Jens |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Das Feld heit ja auch nicht mehr id sondern max1 oder max_id
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo,
oder du liest das Feld aus über Fields[0].AsInteger schöner ist halt das mit as einem netten Namen zu geben Heiko |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Sorry, aber das versteh ich nicht.
Das Feld heißt in meiner Datenbank ID und nicht MAX_ID Kann mir mal jemand das erklären. mit dem AS |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
In deiner Tabelle heisst es vielleicht ID, in der Ergebnismenge aber nicht. Mit AS kann man den Namen in der Ergebnimenge setzen.
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Ja, das hatte ich mir durch das AS gedacht, aber was bedeutet das.
Wie wende ich dann sowas an.
SQL-Code:
heißt das, das mein Feld ID jetzt eine zusätzliche Bezeichnung hat, nämlich ID_Max.Select Max(Id) As ID_Max From MB256PLUS Aber wenn ich das eintrage, kommt die Meldung das das Feld ID nicht vorhanden ist. Ich habe die Select Funktion auch mal mit anderen Feldern versucht. Aber da kommt der selbe Fehler mit dem entsprechenden Feld.
Delphi-Quellcode:
Irgendwie klappt mir nur die gesamte Abfrage
QRyMB256PLUS.Close;
QryMB256PLUS.SQL.Text := 'Select * From MB256PLUS'; QryMB256PLUS.Open; |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Die Ergebnismenge hat auch nur ein Feld mit der Bezeichnung ID_Max
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo,
Bsp. Select Max(Id), Min(Id) From Tabelle Wie sollen denn die beiden Felder heissen ?, 2mal ID geht nicht. Das As gibt dem Teil einen neuen Namen
SQL-Code:
ergibt
Select Max(Id) As Max_Id, Min(Id) As Heiko From Tabelle
Max_Id Heiko 100 1 Mit FieldByName('Max_Id').AsInteger bzw. FieldByName('Heiko').AsInteger kommst du an die beiden Werte ran. Alternativ Fields[0].AsInteger und Fields[1].AsInteger Das nennt sich übrigens Feld-Alias. Lade dir doch mal IBExpert (Personal) runter, gebe die betreffende Query, dann siehst du auch, was rauskommt. Heiko |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Zitat:
Dann denn DB Insert ausführen und die letzte eingefügte ID auslesen. Jedes DB System hat dafür Funktionen. Bei MYSQL ist last_insert_id und bei MSSQL Identity. Bei FB/IB weis ich es leider nicht, aber es wird sowas geben. Die Id kopierst du auch in das Objekt und fügst das OBJ dem VST hinzu. Der VST schert sich eigentlich nicht um die paar Knoten die du hast. Intensiver wird es mit einer halben Mio an Knoten. Das ist dann aber auch eine Menge die kein Mensch mehr ansehen/auswerten wird. Das Speicherproblem kannst du mit auch mit dem FastMM finden. Ist kurz im Video erklärt bzw. in einen Entwickler ist ein Artikel (05/08) dazu. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo,
Unter FB ab 2.0 gibt es die Returning Clause. Bsp. Tabelle mit Feldern ID, Name, ID wird über Trigger gesetzt.
Delphi-Quellcode:
with Query do
begin SQL.Clear; SQL.Add('Insert Into Table1(Name) Values(:Name) Returning Id'); ParamByName('Name').AsString:= 'jippi'; ExecSQL; // oder Open, ausprobieren iNewId:= FieldByName('Id').AsInteger; end; Heiko |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Muss .ExecSQL heissen
Parameter heisst RET_ID
Delphi-Quellcode:
Besser per Position
iNewId:= ParamByName('RET_ID').AsInteger;
Delphi-Quellcode:
iNewId:= Params[1].AsInteger;
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Hallo zusammen,
Danke erstmal für die vielen, vielen antworten. Ich muss leider momentan immer viel arbeiten, und konnte mich bislang noch nicht intensiv mit den anworten befassen. Ich habe sie zwar alle gelesen, nur noch nicht intensiv versucht Sie umzusetzen. Also, bitte nicht glauben ich hätte kein Interesse an Euren antworten. Gruß Jens PS. Heute und Morgen Abend, werde ich mich dem Problem mal wieder widmen. |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Liste der Anhänge anzeigen (Anzahl: 1)
So, habe jetzt mal alles so weit durchgesehen, und versuche gerade, mich in die SQL Sprache zu arbeiten. Leider scheitert meine Abfragende Eingrenzung von Daten schon bei der einfachen Eingrenzung auf ein Spalte der Datenbank.
Ich habe vrsucht, zu Übungszwecken folgenden Aufruf über Button zu realisieren. Und bekomme unten angehangene Fehlermeldung.
Delphi-Quellcode:
Seltsamer weise frage ich nach dem Spalte ID, bekomme aber einen Fehler auf die Spalte LfdNr :gruebel:
procedure TForm1.Button1Click(Sender: TObject);
begin QRyMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'Select ID From MB256PLUS'; QryMB256PLUS.Open; end; Gruß Jens |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Du wirst ein persistentes Zugriffsfeld für die Spalte 'LfdNr' angelegt haben, welches nun keine Entsprechung im DataSet mehr hat.
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Was heißt das. Womit leg ich sowas an.
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Doppelklick auf DataSet (Table, Query)
|
Re: Datenbank in VirtualTreeView anzeigen und auswerten
![]() |
Re: Datenbank in VirtualTreeView anzeigen und auswerten
Die Frage ist, ob du mit persistenten Felder arbeitest, wenn ja darf die Struktur der Ergebnismenge nicht geändert werden
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 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 by Thomas Breitkreuz