Hi,
hab mich im Forum umgeschaut und irgendwie nichts gefunden, was mir auf anhieb helfen würde, daher mein Anliegen:
Ich habe zwei Tabellen
In einer Tabelle habe ich Kundendaten
in der anderen Tabelle Aufträge.
Unter Aufträge habe ich eine Spalte in der die Kunden-ID eingetragen wird und die beiden Tabellen sind über die Kunden-ID verknüpft.
Nun möchte ich eine TreeView (Baumansicht) aufbauen. Die wie folgt aussehen soll:
(-) Kunde 1
Auftrag 1
Auftrag 4
Auftrag 5
(-) Kunde 2
Auftrag 2
Auftrag 3
und so weiter.....
Und über Doppelklick auf den Auftrag soll, sich der Auftrag dann öffnen.
Ich gehe stark davon aus, dass das simpel ist, hab leider nur sehr beschränkte Kenntnisse in VBA. Schuster mir für gewöhnlich aus Vorlagen das zusammen was ich brauche, nur finde ich eine solche Vorlage nicht :D
Hallo,
muss das ein TreeView sein ?
Ein Hauptformular für die Kundenanzeige und darin ein über die Schlüsselfelder verknüpftes Unterformular halte ich da für geeigneter. Da kann auch bei Bedarf direkt geändert (oder eingetragen) werden. Auch das mit dem Doppelklick für ein weiteres Formular ist dann simpel.
Mit der Openform Methode kann dann der PS des Auftrags übergeben werden.
Ja es sollte eine TreeView sein.
Ich habe zum einen die Möglichkeit zu filtern über ein Eingabefeld.
Und mit der TreeView möchte ich mir die Option offen halten, direkt nach dem Auftrag zu suchen, wenn ich weiß wo er ist.
Hallo,
beide Anforderungen wären über ein Haupt-/Unterform besser zu lösen...
Hallo,
ich halte zu diesem Zweck ein TreeView für ungeeignet. Ein TreeView verwendet man für echte Baumstrukturen, was ja hier gar nicht vorliegt. Das ist eine einfache 1:n Beziehung. Für Hafo-Ufo gerade zu ideal.
Mhm....
Also im grunde habe ich mehrere Formulare.
Eines in das ich die TreeView reinpacken will und rechts daneben das Unterformular, in dem der jeweilige Auftrag erscheinen soll, wenn ich diesen in der TreeView mit Doppelklick ansteuere.
Hallo,
der Sinn eines TreeView erschließt sich mit immer noch nicht. Das genannte Hafo/Ufo Kombination macht das doch viele viel einfacher. Im Hafo ein Listenfeld (statt des TreeView) zur Auswahl des Kunden und im Ufo die Details des Auftrags. Für die paar Felder eines Auftrags braucht man zur Anzeige kein extra Formular, das kann das Ufo auch.
Was willst Du im Auftrag sehen, oder auch die Positionen eines Auftrags ?
Das ist praktischer (und einfacher) als das TreeView.
Okay gut, ich wollte es nur möglichst einfach formulieren, jetzt verstehe ich woran ihr euch aufhängt.
Also im Grunde ist es noch weiter verschachtelt.
Sagen wir von Region zu Stadt, dann von Stadt zu Kunde und letzlich von Kunde zu Aufträge :D
In jeder Tabelle gibt es dann einen Primärschlüssel, der in der untergeordneten Tabelle wieder auftaucht um die beiden Tabellen zu verknüpfen.
Also letzlich:
Region
[-]Stadt
[-]Stadt2
[-]Kunde1
[-]Kunde2
[-]Auftrag1
Region2
... und so weiter
Hallo,
ich denke mal, wir haben schon verstanden, wie das aussehen soll... 8)
Wenn Du das nun unbedingt so haben willst, schau mal unter "Treeview" bei diesem Link:
http://dbwiki.net/wiki/Access_Beispieldatenbanken
und bei:
https://msdn.microsoft.com/en-us/library/aa733703(v=vs.60).aspx
Soooo ich bin ein ganzes Stück weiter, vom Prinzip her scheint es richtig zu sein, er Fragt aber beim Ausführen nach einem Makro, dass ich nicht habe, und auch nicht weiß welches das sein könnte.
So schaut das ganze nun bisher aus:
Option Compare Database
Option Explicit
Dim objTreeview As MSComctlLib.TreeView
Private Sub ctlTreeView_enter(cancel As Integer)
Dim db As DAO.Database
Dim rstRegion As DAO.Recordset
Dim rstKunde As DAO.Recordset
Dim objNode As MSComctlLib.Node
Set db = CurrentDb
Set rstRegion = db.OpenRecordset("tbl_Region")
Set objTreeview = Me.ctlTreeView.Object
Do While Not rstRegion.EOF
Set objNode = objTreeview.Nodes.Add(, , "Region" & rstRegion![tbl_Region_id], _
rstRegion![tbl_Region_name])
Set rstKunde = db.OpenRecordset _
("SELECT * FROM [tbl_Kunde] WHERE [tbl_Kunde_Region_id] = '" & rstRegion![tbl_Region_id] & "'")
Do While Not rstKunde.EOF
objTreeview.Nodes.Add "Region" & rstRegion![tbl_Region_id], tvwChild, "Kunde" _
& rstKunde![tbl_Kunde_id], rstKunde![tbl_Kunde_name]
rstKunde.MoveNext
Loop
rstRegion.MoveNext
Loop
Set objNode = Nothing
rst.Close
Set rst = Nothing
Set db = Nothing
End Sub
Hallo,
1. VBA-Code sollte stets per Copy & Paste eingefügt und nicht abgetippt werden
2. Fehlermeldungen sollten nicht beiläufig erwähnt sondern zitiert werden, am besten noch mit Hinweis auf die konkrete Codezeile
rstRegion![tbl_Region_id] ist vom Typ Text? Andernfalls entferne die Hochkommata.
Sorry ich lern das noch :D
Also die Fehlermeldung war folgende:
sie haben als einstellung der ereigniseigenschaft den ausdruck beim Hingehen eingegeben. Dieser Ausdruck hat einen Fehler verursacht:
Deklaration der Prozedur entspricht nicht der Beschreibung eines Ereignisses oder einer Prozedur mit dem selben Namen.
*Der Ausdruck gibt möglicherweise weder den Namen eines Makros noch den Namen einer Benutzerdefinierten Funktion noch [Ereignisprozedur] zurück.
Mit der Hilfestellung:
Dieser Fehler tritt auf, wenn ein Ereignis nicht ausgeführt werden konnte, weil der Speicherort der Logik für das Ereignis nicht ausgewertet werden kann. Falls z. B. die OnOpen-Eigenschaft eines Formulars auf =[Field] festgelegt ist, tritt dieser Fehler auf, weil die Ausführung eines Makros oder Ereignisnamens erwartet wird, wenn das Ereignis auftritt.
Hi,
dieses Statement hat mich zu dem Hinweis veranlasst, man möge den Code stets kopieren und nicht freihändig eintippen:
Private Sub ctlTreeView_enter([color=red]cancel [/color]As Integer)denn dann hätte "Cancel" nicht klein geschreiben sein dürfen - sofern es denn in diesem Zusammenhang überhaupt als Parameter in Frage kommt.
Tut es aber nicht, wie die von dir nachgelieferte Fehlermeldung belegt:
ZitatDeklaration der Prozedur entspricht nicht der Beschreibung eines Ereignisses oder einer Prozedur mit dem selben Namen
Es ist also durchaus sinnvoll, alle relevaten Informationen bereits von Anfang an zu liefern. ;-)
Hallo,
ergänzend:
Auch enter würde Enter geschrieben, wenn es ein solches Ereignis geben würde.
Ich werde künftig versuchen mich daran zu halten ;)
Bin noch relativ neu hier
Der Code funzt mitlerweile super, aber ich stehe bereits vorm nächsten Problem.
Nachfolgende der Code:
Option Compare Database
Option Explicit
Dim WithEvents m_Treeview As MSComctlLib.TreeView
Private Sub Form_Load()
With objTreeView
.Appearance = ccFlat
.BorderStyle = ccNone
.Style = tvwTreelinesPlusMinusText
End With
TreeViewFuellen
End Sub
Private Property Get objTreeView() As MSComctlLib.TreeView
If m_Treeview Is Nothing Then
Set m_Treeview = Me!tvwTreeView.Object
End If
Set objTreeView = m_Treeview
End Property
Public Sub TreeViewFuellen()
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim objNode As MSComctlLib.Node
Dim strVorherigeRegion As String
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM tbl_Region WHERE tbl_region_id IS Not NULL", dbOpenDynaset, dbSeeChanges)
Do While Not rst.EOF
If Not rst!tbl_region_id = strVorherigeRegion Then
Set objNode = objTreeView.Nodes.Add(, , "Region" & rst!tbl_region_id, rst!tbl_region_name)
End If
objNode.Expanded = False
TreeViewFuellen_Rekursiv db, rst!tbl_region_id
strVorherigeRegion = rst!tbl_region_id
rst.MoveNext
Loop
End Sub
Public Sub TreeViewFuellen_Rekursiv(db As DAO.Database, lngtbl_region_id As Long)
Dim rst As DAO.Recordset
Dim objNode As MSComctlLib.Node
Set rst = db.OpenRecordset("SELECT * FROM qryRegionKunde WHERE tbl_region_id = " & lngtbl_region_id, _
dbOpenDynaset, dbSeeChanges)
Do While Not rst.EOF
If Not rst.EOF Then
Set objNode = objTreeView.Nodes.Add("Region" & rst!tbl_region_id, tvwChild, "Kunde" & _
rst!tbl_kunde_id, rst!tbl_kunde_name)
Else
Exit Sub
End If
objNode.Expanded = False
TreeViewFuellen_Rekursiv2 db, rst!tbl_kunde_id
rst.MoveNext
Loop
End Sub
Public Sub TreeViewFuellen_Rekursiv2(db As DAO.Database, lngtbl_kunde_id As Long)
Dim rst As DAO.Recordset
Dim objNode As MSComctlLib.Node
Set rst = db.OpenRecordset("SELECT * FROM qryKundeBestellung WHERE tbl_kunde_id = " & lngtbl_kunde_id, _
dbOpenDynaset, dbSeeChanges)
Do While Not rst.EOF
If Not rst.EOF Then
Set objNode = objTreeView.Nodes.Add("Kunde" & rst!tbl_kunde_id, tvwChild, "Bestellung" & _
rst!tbl_bestellung_id, rst!tbl_bestellung_nummer)
Else
Exit Sub
End If
objNode.Expanded = False
Debug.Print "Kunde"
rst.MoveNext
Loop
End Sub
So weit, so gut, das funktioniert auch.
Nun möchte ich es in der untersten Instanz so einrichten, dass per Doppelklick in der treeView auf eine Bestellung, sich ein Formular öffnet mit allen Infos zu der Bestellung.
Ich habe aber keinen blasen schimmer, wie ich das angehen soll :D
Hi,
das sollte sich dann wohl im Doppelklick-Ereignis des Nodes lösen lassen.
Die Informationen zum Öffnen bzw. Filtern des Formulars müssten dem Knoten entnommen werden können.
Das hab ich mir schon gedacht.
Ich bin halt leider ein Laie und suche mir alles zusammen.
Ich hab da mal folgenden Code zusammengesucht:
Private Sub tvwTreeView_DblClick()
If Not tvwTreeView.SelectedItem Is Nothing Then
DoCmd.OpenForm "frm_Bestellung", WhereCondition:="tbl_Bestellung_ID = " XXXX
End If
End Sub
Die Bestellung im TreeView zeigt ja den Namen der Bestellung und wenn ich Doppelklick drauf mache, sollte er über den Key mir den Datensatz (heißt Bestellung im Formular "frm_Bestellung" anzeigen. Nur irgendwo muss ich ihm das ja sagen, dass er den Namen zu Berücksichtigen hat.
Die Frage ist in welcher Form und wo.... ich hab da den Ort mit "XXXX" vorgesehen"
Beim Doppelklick-Ereignis brauchst Du nicht mehr auf SelectedItem ungleich Nothing abfragen.
Ich hab Dir mal was reinkopiert:
Private Sub MenueBaum_DblClick()
Dim strKey As String
Dim strText As String
Dim Node As Object
Dim nodCurrent As MSComctlLib.Node
Set nodCurrent = Node
strKey = MenueBaum.SelectedItem.Key
strText = MenueBaum.SelectedItem.text
Set nodCurrent = Nothing
msgbox strKey, vbInformation, strText
End Sub