PDA

Vollständige Version anzeigen : If Abfrage fürs Listenfeld


M!cha
11.07.2006, 10:25
Huhu, hab da eine frage und zwar ob es möglich ist eine if abfrage zb. auf die erste oder zweite Spalte eines Listenfeldes zu beziehen.

Hab ein normales ungebundenes Textfeld, wenn da der Eintrag mit dem Eintrag aus der ersten Spalte des Listenfelds übereinstimmt soll er mir zb nur Daten zu diesem Datensatz ausgeben... ist das irgendwie möglich?

grüße M!cha

Worf1001
11.07.2006, 10:27
Hallo,

so:


If Me!Listenfeld.Column(1) = "Text" Then ...


Column(1) bezieht sich in diesem Fall auf die 2. Spalte. (2) dann auf die 3. Spalte. etc. etc.

M!cha
11.07.2006, 10:39
Ah, super,
ich würde das halt gerne irgendwie hinbekommen das er mir direkt beim starten im Listenfeld nur noch Datensätze zu dem Kunden der oben ausgewählt ist anzeigt.

würde ich das dann mit nem .show Befehl machen? weil ichs ja irgendwie verhindern muss das er mir alle Datensätze anzeigt.

J_Eilers
11.07.2006, 10:43
Hi,

weise doch einfach die RowSource entsprechend zu. Dabei müsste man nur wissen, woher man weiß, welche Kunden angezeigt werden soll und wie die Datenherkunft des Listenfeldes gerade aussieht.

Smaug
11.07.2006, 10:44
hierzu muss man die RowSource des Listenfeldes einschränken, etwa so:
Me!Liste.RowSource = "Select Feld1,Feld2...from Tabelle Where Primärschlüsselfeld = " & Kriteriumswert
Ist das Primärschlüsselfeld vom Typ Text muss das Kriterium in Hochkommas gesetzt werden:
... Where Primärschlüsselfeld ='" & Kriteriumswert & "'"

M!cha
11.07.2006, 10:57
Also, mein Feld in dem der Kunde steht heisst dfkurzname die Tabelle heisst Wartungen das Feld das den kurznamen beinhaltet Kunde, dann müsste ich bei Feld1 dfkurzname hinschreiben oder Kunde?
Und wofür muss das Primärschlüsselfeld angegeben werden?

J_Eilers
11.07.2006, 11:55
Eigentlich vergibt man jeder Tabelle einen Primärschlüssel, damit jeder Datensatz eindeutig zuordnenbar ist. dfkurzname ist das Feld im Formular?

Me!Liste.RowSource = "SELECT * FROM Wartungen WHERE dfkurzname = '" & Me!dfkurzname & "'"

M!cha
11.07.2006, 12:29
Ja, ich hab der Tabelle auch nen Primärschlüssel gegeben, wollte nur wissen wofür man den in dem Code braucht.
Mein Formularfeld ist dfkurzname, genau.

Mein Feld in der Tabelle heisst kunde, also müsste es theoretisch

Me!Listenfeld.RowSource = "SELECT * FROM Wartungen WHERE Kunde = '" & Me!dfkurzname & "'"

sein oder?
Das klappt aber irgendwie auch nicht, ka warum :/

J_Eilers
11.07.2006, 12:43
Und was bedeutet klappt nicht?

M!cha
11.07.2006, 12:47
Das er immer noch alle Daten bei allen Kunden anzeigt und nicht nur die Daten zu dem aktuellen Kunden rausfiltert

J_Eilers
11.07.2006, 13:01
Hast du den Namen des Listenfeldes angepasst? Wie sieht die Datenherkunft dort aus?

Anne Berg
11.07.2006, 13:03
Aber die Datenherkunft des Listenfeldes ändert sich schon, oder?

Willst du die Daten denn auch im Formular sehen, also weitere (Ungebundene?) Textfelder damit füllen?

Deine Beschreibung ist leider zu unpräzise als dass man da helfen könnte... :rolleyes:

M!cha
11.07.2006, 13:07
Den Namen des Listenfelds habe ich angepast, die Daten aus dem Listenfeld kommen aus der Tabelle Wartungen.

Und die Daten die zu dem jeweiligen aktiven Kunden gehören möchte ich im Listenfeld stehen haben, also das er mir statt allen Wartungen nur noch die im Listenfeld anzeigt die auch zu dem Kunden gehören der oben im Feld angegeben ist.

Anne Berg
11.07.2006, 13:10
An welches Ereignis ist der Code gebunden, wann wird er ausgeführt?

M!cha
11.07.2006, 13:15
Der Code soll direkt bei öffnen des Formulars ausgeführt werden, damit man direkt nur noch die Kunden zum aktuellen Kunden sieht.

Ich hab quasy oben nen Feld in dem Hans drinne steht und der soll mir dann alle Wartungen vom Kunden Hans anzeigen, geben ich oben Otto ein soll er mir alle zum Kunden Otto anzeigen, so das man von Anfang an nur die Wartungen sieht die auch von dem Kunden sind der Ausgewählt wurde.

Anne Berg
11.07.2006, 13:19
Wie kommt denn der Hans beim Öffnen oben in das Feld hinein? Das wäre dann doch wohl die geeignete Stelle, auch gleich das Listenfeld zu initialisieren...

Wenn du es aber selbst eingeben willst, wäre vermutlich das AfterUpdate-Ereignis des Textfeldes zu empfehlen.

M!cha
11.07.2006, 13:28
Ja selbst eingeben will ich es momentan schon, da der Name über ein Kombinationsfeld rausgesucht werden kann.

Anne Berg
11.07.2006, 13:37
Wie willst du denn "direkt beim Öffnen" Daten anzeigen, für deren Auswahl du erst eine Eingabe machen musst?! :eek:

Mann-o-Mann - ein, zwei Sätze mehr und das Problem wäre längst gelöst! :rolleyes:

M!cha
11.07.2006, 13:50
Als standard Wert steht halt der erste Kunde aus er Liste da, deshalb soll direkt auch nur die Wartungen zu dem da stehen. Wie das direkt beim Öffnen gehen soll kann ich dir leider auch nicht sagen.
Und zu dem Kunden können halt schon mehrere Verträge vorliegen sodass die direkt angezeigt werden sollten wenn nun der erste Kunde 2, 3 oder egal wieviele Verträge hat.

Anne Berg
11.07.2006, 13:56
Versuche es doch mal mit folgender Voreinstellung der Rowsource:

Select * From Wartungen Where Kunde= [dfkurzname]


... und dann ein Me!listenfeld.Requery nach Änderung der Auswahl.

M!cha
11.07.2006, 14:27
hm, dem entsprechend würde der code so aussehen (wlist ist mein Listenfeld)

Me!wlist.RowSource = "SELECT * FROM Wartungen WHERE Kunde = [dfKurzname]

Me!wlist.Requery

"

So bekomm ich immer noch alle Datensätze angezeigt.

Evntl gibs da auch ne Lösung das über ne ganz normale Abfrage zu lösen?

Anne Berg
11.07.2006, 14:39
Du zeigst immer noch nur eine einzige Codezeile ohne jeglichen Hinweis auf den Kontext - was soll man damit anfangen?!

Außerdem sagte ich, du solltest das Select-Statement direkt eintragen, bei den Eigenschaften des Listenfeldes.

Warum das nicht klappt, liegt daran wie du das einsetzt, aber das verrätst du uns ja nicht. :confused:

Im übrigen ist eine Abfrage auch nicht anderes als ein SQL-Statement...

Worf1001
11.07.2006, 15:24
im Open-Ereignis des Formulars kannst Du folgendes eingeben:


Dim strSQL As String
strSQL = "SELECT * FROM Wartungen WHERE Kunde = '" & Me!Textfeld & "*'"
Me!Listenfeld.Rowsource = strSQL


Für mich stellt sich jedoch die Frage: Das Feld "Kunde" in der Tabelle "Wartungen", enthält das wirklich die Bezeichnung des Kunden? Oder ist dort eventuell der Schlüsselwert (->Primärschlüssel) zu der Tabelle "Kunden"? Wenn dem so ist, dann ist natürlich klar, dass dies nicht funktioniert...

Anne Berg
11.07.2006, 15:40
Nein, so geht das ganz sicher auch nicht, aber wenn du unbedingt beim Öffnen bereits einen beliebigen (den ersten) Kunden anzeigen willst, dann so:

Private Sub Form_Open(Cancel As Integer)
Me!dfKurzname = Me!wList.Column(1, 0) ' 2. Spalte aus 1. Zeile
Me!wlist.RowSource = "SELECT * FROM Wartungen WHERE Kunde = [dfKurzname]
End Sub

' und aktualisieren nach Auswahl...

Private Sub dfKurzname_AfterUpdate()
Me!wList.Requery
End Sub

Worf1001
11.07.2006, 17:04
Warum nicht?

Dein Code verstehe ich nicht?

Was bedeutet:

Me!dfKurzname = Me!wList.Column(1, 0) ' 2. Spalte aus 1. Zeile
-> Im Listenfeld sind ja nicht Kunden, sondern Wartungen!?!?

Me!wlist.RowSource = "SELECT * FROM Wartungen WHERE Kunde = [dfKurzname]
-> Warum schreibst Du das jetzt plötzlich so [dfKurzname]?

Anne Berg
11.07.2006, 20:38
Me!dfKurzname = Me!wList.Column(1, 0) ' 2. Spalte aus 1. Zeile
-> Im Listenfeld sind ja nicht Kunden, sondern Wartungen!?!?Nicht ganz, es sind die Wartungen zu den Kunden. Die Kunden-ID (bzw. Kurzname) sollte dort also schon enthalten sein, sonst macht das ganze Vorhaben keinen Sinn.
In meinem Beispiel steht dieser Suchbegriff in der 2. Spalte, deshalb der Kommentar. Muss evtl. an die tatsächliche Spaltennr. angepasst werden.
(bei "Select * ..." weiß man - bzw. wir! - ja nicht, was dabei herauskommt)Me!wlist.RowSource = "SELECT * FROM Wartungen WHERE Kunde = [dfKurzname]
-> Warum schreibst Du das jetzt plötzlich so [dfKurzname]? Da fehlt übrigens am Ende ein Gänsefüßchen.
Was heißt plötzlich? Das hatte ich schon im Beitrag #20 so stehen - muss aber nicht sein, zugegebenermaßen. ;)


PS: "warum nicht?"
...weil beim Öffnen das "Textfeld" noch keinen Inhalt hat, zumindest wurde uns gegenteilige Information nicht hinreichend nahe gebracht.

M!cha
13.07.2006, 09:20
Huhu, sry war gestern unterwegs deshalb konnt ich nichtmehr antworten...

Ich versuch nochma kurz die Situation darzustellen,

habe ein Kombifeld dort kann man zwischen mehreren Kunden wählen die in der Tabelle Kunden stehen, als standardwert dort ist der erste Kunde den ich nun einfach mal Hans nenne festgelegt.

Dann gebe ich über ein Formular Daten ein... Speicher diese in eine Tabelle Wartungen

Anschließend habe ich ein Listenfeld erstellt ( wlist ) und dort die Daten aus Tabelle Wartungen herausgenommen.

Tabelle Wartungen hat als Primärschlüssel die Wartungsnr dann kommt das Feld Kunde in dem der wert des Feldes dfKurzname aus dem Formular mit dem Listenfeld steht.

Nun möchte ich das ich das Formular öffne, dort steht oben in der Kombo box durch den Standardwert direkt Hans und man kann dann umschalten zwischen mehreren Kunden, also soll beim starten des Formulars alle Datensätze zum Kunden Hans stehen und wenn ich zb. auf Oskar umschalte dann alle Wartungen zum Kunden Oskar sodass ich immer nur die Wartungen zu dem ausgewählten Kunden sehe und nicht zu allen wie es ja eigentlich der Fall ist nachdem sich das Listenfeld alle Datensätze aus der Tabelle Wartungen holt, in der ja zu allen möglichen Kunden Wartungen enthalten sind.

Nun würde ich gerne wissen Ob das überhaupt möglich ist irgendwie zu lösen und wenn ja wie und wo *gg*
Bin nicht wirklich nen Profi in Access und in vba schon garnicht, würde mir aber gerne so ein Formular anlegen, wenns geht also möglichst einfach erklären, hoffe vorallem es ist nun ein wenig klarer geworden wie ich es mir vorstelle.

mfg M!cha

J_Eilers
13.07.2006, 09:33
Geht, folgenden Code im Formularereignis beim Anzeigen und beim Kombi nach Aktualisierung:

Dim strSQL As String

strSQL = "SELECT * FROM Wartungen WHERE Kunde = '" & Me!dfKurzname & "'"
Me!wlist.RowSource = strSQL

Wenn das immer noch nicht klappt, poste bitte die Datenherkunft des Kombifeldes und die gebundene Spalte.

M!cha
13.07.2006, 09:48
Huhu, also habe nun diesen Code hinzugefügt gleiche bei nach aktualisieren aber tut sich nichts, sprich er zeigt mir immer noch bei jedem Kunden alle Datensätze an.


Private Sub Kunden_Open(Cancel As Integer)
Dim strSQL As String

strSQL = "SELECT * FROM Wartungen WHERE Kunde = '" & Me!dfKurzname & "'"
Me!wlist.RowSource = strSQL
End Sub



Das gleiche beim After update Ereignis


Die kombo Box bezieht seine Daten, also die Kunden aus der Tabelle Kunden, in der der Kurzname der Primärschlüssel ist.

Anne Berg
13.07.2006, 10:05
Stelle bitte eine Demo-DB zur Verfügung, anders ist es wohl nicht zu klären, was da bei dir falsch läuft.

J_Eilers
13.07.2006, 10:07
Ich schrieb beim Anzeigen, beim Öffnen ist es zu früh. Und die Datenherkunft soll man sogar markieren und posten können. So kommen wir nicht weiter, deswegen --> Annes Post lesen.