PDA

Vollständige Version anzeigen : Suchfunktion mit ComboBox


Hopper
10.05.2001, 17:30
Hallo

Ich habe vor kurzem angefangen, mit Visual Basic zu arbeiten. Nun bin ich wieder an eine meiner Grenzen gestossen und brauche Eure Hilfe !
Ich möchte eine Suchfunktion mit einer ComboBox erstellen. Aber nun von Anfang an, ich habe eine Tabelle mit vielen Infos über Prominente, in einer zweiten Tabelle habe ich die Namen. Die beiden Tabellen sind nun miteinander verknüpft. Nun habe ich mir eine Eingabemaske kreiert, um neue Prominente hinzufügen zu können. Den Namen habe ich ja bereits in einer Tabelle und möchte ihn nun via ComboBox auswählen. Das Problem liegt nun darin, dass wenn ich einen Namen auswähle und in das nächste Textfeld wechsle "verschwindet" dieser wieder. Ich hoffe ihr versteht was ich machen will (bin wie auch in VB in erklären kein Genie).

Hier mal etwas Code :

Private Sub Form_Load()
datNeu.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\Program Files\Autogramme\Admin\Autogramme.mdb"
'datNeu.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\Autogramme\Autogramme.mdb"
datNeu.CommandType = adCmdTable
datNeu.RecordSource = "A_Autogramme"
datNeu.Refresh

' Binden des Datenobjektes txtName
Set txtID.DataSource = datNeu.Recordset
txtID.DataField = "PKID"

Set txtNameDB.DataSource = datNeu.Recordset
txtNameDB.DataField = "Name"

Set txtBorn.DataSource = datNeu.Recordset
txtBorn.DataField = "Born"

Set txtDeath.DataSource = datNeu.Recordset
txtDeath.DataField = "Death"

Set txtBusiness.DataSource = datNeu.Recordset
txtBusiness.DataField = "Business"

Set txtMotiv.DataSource = datNeu.Recordset
txtMotiv.DataField = "Motiv"

Set txtMotivE.DataSource = datNeu.Recordset
txtMotivE.DataField = "Motiv_e"

Set txtSource.DataSource = datNeu.Recordset
txtSource.DataField = "Source"

Set txtMotiv.DataSource = datNeu.Recordset
txtMotiv.DataField = "Motiv"

Set txtWebsite.DataSource = datNeu.Recordset
txtWebsite.DataField = "link"

Set txtCatDB.DataSource = datNeu.Recordset
txtCatDB.DataField = "category"

Set chkIP.DataSource = datNeu.Recordset
chkIP.DataField = "ip"

Set chkShop.DataSource = datNeu.Recordset
chkShop.DataField = "shop"

Set txtZeitwert.DataSource = datNeu.Recordset
txtZeitwert.DataField = "Zeitwert"

' öffnen der Verbindung zur Namen-Tabelle, Combobox abfüllen und Feld zuweisen
datNamen.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\Program Files\Autogramme\Admin\Autogramme.mdb"
'datNamen.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\Autogramme\Autogramme.mdb"
datNamen.CommandType = adCmdTable
datNamen.RecordSource = "T_Namen order by name"
datNamen.Refresh

Do While Not datNamen.Recordset.EOF
cboNamen.AddItem datNamen.Recordset!Name
cboNamen.ItemData(cboNamen.NewIndex) = datNamen.Recordset!Id
datNamen.Recordset.MoveNext
Loop

Set cboNamen.DataSource = datNamen.Recordset
cboNamen.DataField = "Name"

If cboNamen.ListCount > 0 Then
cboNamen.ListIndex = 0
End If

' öffnen der Verbindung zur Category-Tabelle, Combobox abfüllen und Feld zuweisen
datCat.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\Program Files\Autogramme\Admin\Autogramme.mdb"
'datCat.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\Autogramme\Autogramme.mdb"
datCat.CommandType = adCmdTable
datCat.RecordSource = "T_Category"
datCat.Refresh

Do While Not datCat.Recordset.EOF
cboCategory.AddItem datCat.Recordset!category
cboCategory.ItemData(cboCategory.NewIndex) = datCat.Recordset!PKid
datCat.Recordset.MoveNext
Loop

Set cboCategory.DataSource = datCat.Recordset
cboCategory.DataField = "category"

If cboCategory.ListCount > 0 Then
cboCategory.ListIndex = 0
End If

End Sub

Danke für Eure Hilfe !!
Sabine

Stefan Kulpa
10.05.2001, 18:09
Hallo Sabine,

das ist etwas schwierig zu beantworten.
Aus Deinen Sourcen heraus ist so nichts zu entdecken, was zu dem Effekt führen kann.
Es kann nun also an der Art der Verknüpfung in der Access-Datenbank liegen, oder aber es handelt sich um einen Bug in VB6 der mit letzten ServicePack (5) behoben wurde.
Letzteres läßt sich relativ schnell beheben.
Bei der Verknüpfungsgeschichte müssten man wissen, wie (und warum) du die Felder verknüpft hast. Ich persönlich bin kein Freund von gebundenen Controls, aber das ist ein anderes Thema ...
Falls das möglich ist, probier's mal ohne die Verknüpfungen.

Gruß

Hopper
12.05.2001, 22:50
Hallo Stefan

Sorry, dass ich mich erst jetzt melde.
Ich habe vorhin noch die Überschrift gelesen und dabei festgestellt, dass ich wohl eine schwache Minute habe.
Es geht darum, dass ich ein Form kreiert habe um einen neuen Datensatz zu erfassen. Mein Problem ist, dass ich den Namen und die Kategory aus je einer anderen Tabelle auslesen will. Aus diesem Grund habe ich die Comboboxen erstellt um dort die Auswahl zu treffen. Wie würdest Du diese Aufgabe lösen ? Ich kann Dir sonst mal das ganze Form mailen, wenn Du willst.

Danke und Gruss
Sabine

Stefan Kulpa
13.05.2001, 07:20
<font face="Verdana" size="2">Hallo Sabine,

wenn ich das richtig verstanden habe, hast Du eine Datenbank (Access?) mit drei Tabellen:</font><pre><font face="Courier New" size="2">
A_Autogramme
PKID
Name
Born
Business
Motiv
Motiv_e
Source
link
category
ip
shop
Zeitwert

T_Namen
Id
Name

T_Category
PKid
category</font></pre>
<font face="Verdana" size="2">wobei Du wahrscheinlich innerhalb der Datenbank folgende Relationen erstellt hast(?):</font>


<font face="Courier New" size="2">A_Autogramme.PKID <-> T_Namen.Id oder A_Autogramme.Name <-> T_Namen.Name</font><font face="Verdana" size="2"> ?

Falls der Name in T_Name dem Feld Name in A_Autogramme entspricht, hast Du ein
Feld zuviel ...</font>


<font face="Courier New" size="2">A_Autogramme.PKid <-> T_Category.PKid oder A_Autogramme.category <-> T_Category.category</font> ?
<font face="Verdana" size="2">
Hier gilt das gleiche wie für den Namen, falls die Inhalte aus den Feldern category identisch sind.</font>
<font face="Verdana" size="2">Unter der Voraussetzung, dass es für jeden "Autogramm-Gejagten" nur einen Eintrag in der Tabelle A_Autogramme gibt, würde ich folgende Relationen einsetzen:
</font>
<font face="Courier New" size="2">A_Autogramme.Name <-> T_Namen.Id UND A_Autogramme.category <-> T_Category.PKid</font>
<font face="Verdana" size="2">
wobei es sich allerdings bei den Feldern A_Autogramme.Name und A_Autogramme.category
jeweils um Long-Werte handelt!
Die entsprechenden Werte in diesen Feldern verweisen dann auf die eindeutigen (?)
Werte in den Feldern T_Namen.Id und T_Category.PKid.</font>
<font face="Verdana" size="2">Zumindest hast Du damit Deine Datenbank "normalisiert" -
sprich Redundanzen entfernt.

Das die Inhalte der Textfelder "verschwinden", wenn Du den Namen wechselst, mag damit
zusammenhängen, dass die Relationen hier nicht sauber "greifen". Es wäre vielleicht auch
besser hier mit einem oder mehreren ADO-Datensteuerelementen zu arbeiten, anstatt als
Datenquelle die Recordsets selbst zu benutzen. Alternativ kannst Du natürlich beim Click-Event
der Combobox in dem entsprechenden Recordset "suchen" - beim Treffer würde dann der
Datensatzzeiger auf den entsprechenden Datensatz springen und die Felder würden aktualisiert
- damit übernimmst Du aber die Arbeit eines ADO-Datensteuerelements ...

Übrigens hast Du eine Zuweisung in Deinen Sourcen doppelt:

Set txtMotiv.DataSource = datNeu.Recordset
txtMotiv.DataField = "Motiv"

Vielleicht kommst Du mit diesen Hinweisen einen Schritt weiter ...

Gruß</font>

Hopper
13.05.2001, 12:17
Hallo Stefan

Die Relationen habe ich angepasst, danke für die ausführliche Beschreibung. Nun habe ich aber ganz andere Probleme. Ich muss vielleicht noch sagen, dass ich noch nich all zu lange mit VB arbeite. Nun, ich habe zwei ADODC Steuerelemente, einen mit der Tabelle A_Autogramme und das andere mit der Tabelle T_Namen. Ich weiss nun nicht genau, wie ich den Namen zuweisen kann, nun gibt es mir die PKId an. Alles was ich ausprobiert habe funktioniert nicht. Also anstatt Michael Schumacher steht jetzt 387. Hier nochmals der Code. Was mache ich nun falsch ?

Danke und Gruss
Sabine

Private Sub cboNamen_Click()
datAutogramme.Recordset.MoveFirst
datAutogramme.Recordset.Find "PKID=" & cboNamen.ItemData(cboNamen.ListIndex)
End Sub

Private Sub datAutogramme_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
If TabAutogramme.Tab = 2 Then
SetPicture App.Path & "\" & datAutogramme.Recordset!Bild
End If
End Sub

Private Sub Form_Load()

datAutogramme.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\Autogramme\Autogramme.mdb"
datAutogramme.CommandType = adCmdTable
datAutogramme.RecordSource = "A_Autogramme"
datAutogramme.Refresh

' Auslesen Recordset
Do While Not datAutogramme.Recordset.EOF
' Hinzufügen Name in Combo
cboNamen.AddItem datAutogramme.Recordset!PKId
' Merke des Primary Keys in Itemdata (Wichtig! Jeder Satz braucht einen eindeutigen Eintrag)
cboNamen.ItemData(cboNamen.NewIndex) = datAutogramme.Recordset!PKId
' Nächster Satz
datAutogramme.Recordset.MoveNext
Loop

' Binden des Datenobjektes txtName
Set lblID.DataSource = datAutogramme.Recordset
lblID.DataField = "PKID"

'Set lblTitel.DataSource = datAutogramme.Recordset
'lblTitel.DataField = "PKId"

Set cboPerson.DataSource = datNamen.Recordset
cboPerson.DataField = "Name"

Set txtBorn.DataSource = datAutogramme.Recordset
txtBorn.DataField = "Born"

Set txtDeath.DataSource = datAutogramme.Recordset
txtDeath.DataField = "Death"

Set txtBusiness.DataSource = datAutogramme.Recordset
txtBusiness.DataField = "Business"

Set txtMotiv.DataSource = datAutogramme.Recordset
txtMotiv.DataField = "Motiv"

Set txtMotivEng.DataSource = datAutogramme.Recordset
txtMotivEng.DataField = "Motiv_e"

Set txtHerkunft.DataSource = datAutogramme.Recordset
txtHerkunft.DataField = "Source"

Set txtWebsite.DataSource = datAutogramme.Recordset
txtWebsite.DataField = "link"

Set txtKategorie.DataSource = datAutogramme.Recordset
txtKategorie.DataField = "fk_category"

Set chkIP.DataSource = datAutogramme.Recordset
chkIP.DataField = "ip"

Set chkShop.DataSource = datAutogramme.Recordset
chkShop.DataField = "shop"

Set txtZeitwert.DataSource = datAutogramme.Recordset
txtZeitwert.DataField = "Zeitwert"

If cboNamen.ListCount > 0 Then
cboNamen.ListIndex = 0
End If

'Zusammenzählen der Zeitwerte in der Tabelle und ausgeben des Gesamtwertes der Sammlung
rs.Open "SELECT sum(Zeitwert) as summe from [T_Autogramme]", _
"provider=microsoft.jet.oledb.4.0;" & _
"data source=D:\Autogramme\Autogramme.mdb"
lblWert.Caption = rs!Summe
rs.Close

'Combobox mit dem Inhalt der T_Namen auffüllen
datNamen.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\Autogramme\Autogramme.mdb"
datNamen.CommandType = adCmdTable
datNamen.RecordSource = "T_Namen order by name"
datNamen.Refresh

Do While Not datNamen.Recordset.EOF
cboPerson.AddItem datNamen.Recordset!Name
cboPerson.ItemData(cboPerson.NewIndex) = datNamen.Recordset!PKId
datNamen.Recordset.MoveNext
Loop

End Sub

Stefan Kulpa
13.05.2001, 13:05
<font face="Verdana" size="2">Hallo Sabine,

in dem Teilstück</font>

<PRE><FONT SIZE=1 FACE=Courier New> <FONT COLOR=#008000>'Auslesen Recordset</FONT>
<FONT COLOR=#000080>Do</FONT> <FONT COLOR=#000080>While</FONT> <FONT COLOR=#000080>Not</FONT> datAutogramme.Recordset.EOF
<FONT COLOR=#008000>'Hinzufügen Name in Combo</FONT>
cboNamen.AddItem datAutogramme.Recordset!PKId
<FONT COLOR=#008000>'Merken des Primary Keys in Itemdata;</FONT>
<FONT COLOR=#008000>'Wichtig! Jeder Satz braucht einen eindeutigen Eintrag</FONT>
cboNamen.ItemData(cboNamen.NewIndex) = datAutogramme.Recordset!PKId
<FONT COLOR=#008000>'Nächster Satz</FONT>
datAutogramme.Recordset.MoveNext
<FONT COLOR=#000080>Loop</FONT>

</FONT></PRE>

<font face="Verdana" size="2">füllst Du die ComboBox mit den IDs (cboNamen.AddItem datAutogramme.Recordset!PKId)
und nicht mit den Namen; so kann die Combo auch nur die Nummer und nicht den Namen anzeigen ...

Gruß</font>