PDA

Vollständige Version anzeigen : im Listenfeld Datensätze anzeigen lassen


swati
20.08.2009, 14:39
HAllo Ihr Spezialisten!

Ich habe folgendes Problem wo ich nicht weiterkommen:
und zwar habe ich ein Listenfeld in der folgende 3 Werte auswählbar sind
"0 - 30 cm"; "31 - 100 cm"; "> 100 cm"
dabei werden die Werte D_5, D_6 oder D_7 übergeben

also ich wähle ich MST aus, bekomme im kombifeld Datum_2 das entsprechende Datum angezeigt und wenn ich das dann auswähle soll in der Kombibox mttl_Tiefe der Wert (0-30 msw.) markiert sein, der die entsprechende Kennung des PARA_ID hat also (D5, D6, D7)

Leider scheitere ich hier. Hat da jemand eine Idee?:)

Atrus2711
20.08.2009, 14:46
Hi,
d.h. MST und Datum2 sind nur Suchkriterien für mttl_Tiefe? Warum sind die zwei dann gebunden? Das Suchen ändert dann schon Werte!

Was hast du denn eigentlich vor?

(PS: Tolle Namen :( )

swati
20.08.2009, 14:57
HAllo Atrus2711!

Ich habe vor Daten abzuspeichern und diese dann verteilt nach Kategorien hier also Flusstiefe (0 bis >100 cm) über Listenfelder-Auswahl abzuspeichern in die PARA_Wert-TAbelle. JEdoch soll es möglich sein diese Einzeldaten über die Listenfelder anzugucken.
ANbei nochmal die korrigierte Fassung der test-db

Atrus2711
20.08.2009, 15:14
Hi,

soweit dachte ich mir das schon. :)

Die Eingabe/Änderung von Werten und das Suchen von von vorhandenen Werten lassen sich ja auch durchaus durch Eingabehilfen wie Kombi- und Listfeld untersützen.

Aber man sollte die Datenpflege (Eingabe/Änderung) und die Suche/Anzeige trennen. Bei der Suche ist z.B. die MST nur eine Bedingung. Bei der Eingabe ändert sie Werte!

Du könntest die Suchfelder ungebunden (!) einrichten un dim Kopf plazieren. Je nach Wunsch (den ich noch nicht so ganz durchdrungen habe) können diese Suchbegriffe dann andere Suchbegriffe begrenzen (Stichtwort kaskadierende Kombifelder) oder gleich die Daten im Formular anzeigen.

Die Eingabe oder Änderungen von Werten geschieht dann imer für den gerade aktuellen Satz; die Felder können dann per Eingabehilfen (z.B. Kombifeld) gewählt werden, die dabei aber nicht als Suchkriterium, sondern nur als Eingabehelfer fungieren.

swati
20.08.2009, 15:22
Hallo Atrus2711!
DAnke für Deine Überlegungen. JEdoch möchte ich das ändern und auch sichen in eine "rutsch" erledigen..:) ;)

Könnte man nicht mit Listidex übr VBA eine Suche nach Datum2_requery bauen . und dann den schon abgespeiteren Wert im Listenfeld anzeigen lassen? HAst Du da eine Idee?

Atrus2711
20.08.2009, 15:32
Mir ist der Zusammenhang der 3 Felder nicht klar.

Wer hängt da von wem ab?

swati
20.08.2009, 15:39
das List-Feld MSt hat nur die Messtellen, nach Aktueldierung wird im KombifeldDatum_2 die "Datumse" angezeigt, dis schon in der PARA_Wert TAbellen vorhanden sind und das Listfeld mttl_Tiefe soll zu einen Datensatz aus MST/Datum2 gehören aber auch auswählbar bleiben..

Atrus2711
20.08.2009, 15:53
Vielleicht magst du erstmal die Tabellen- und Feldnamen sowie die Datentypen so wählen, dass man damit was anfangen kann. Auch sollte die rechte Listbox sich entscheiden, ob sie ihren Wertevorrat aus einer Wertliste oder einer (zufälligerweise?) inhaltsgleichen Tabelle entnimmt....

Wenn das erledigt ist, könnte man erwägen, über ein Recordset (das erste nötige Recordset in dem Wust) die aktuelle ID zu MSt und Datum zu ermitteln und diese ID dann als Value der rechten Listbox einzusetzen.

Soleikum
20.08.2009, 17:07
Hallo swati
ich hab an deiner DB etwas herrumgefummel und bin zu folgender Lösung gekommen (siehe Anhang).

Kannst du damit etwas anfangen?

swati
20.08.2009, 17:13
HAllo Soleikum!


Hura Das ist es . Ich werde versuchen das mal in meiner Datenbank einzubauen. Danke erstmal;) :) ;)

swati
22.08.2009, 16:48
HAllo Soleikum!

Leider hänge ich trotz Deiner LÖsung weiter fest. Wenn ich nämlich die Daten von einem zweites Listenfeld (Trockenheit) abspeichern will, zeigt Access nur für das erste die abgespeicherte DAten an Me.mttl_Tiefe = RS.Fields("PARA_ID")
Me.Trockenheit = RS.Fields("PARA_ID")

Gibt es da dennoch eine Lösung für?:)

Soleikum
24.08.2009, 20:57
In meinem Lösungsansatz bin ich davon ausgegangen, das es die Kombination Mst und Datum nur einmal gibt, so das die Abfrage für RS nur maximal einen Datensatz zurückliefert. In der jetzigen Tabelle Para_Wert gibt es aber Zwiemal die ídentische Kombination von Mst und Datum (einmal für mttl_Tiefe und einmal für Trockenheit).
So werden bei der Kombination
617_0001 & 10.02.2002
die Datensätze
617_0001 10.02.2002 D_3
617_0001 10.02.2002 D_6
zurückgegeben.
Im Ausgelesenen Feld 'RS.Fields("PARA_ID")' ist der Wert 'D_3', da der Datensatzzeiger auf den ersten Datensatz steht.
Um das gewünschte Ergebnis zu erziehlen müssen alle Datensätze abgefragt werden, un je nachden ob das letzte Zeichen (als Integer convertiert) kleiner oder grösser als 5 ist der Liste mttl_Tiefe oder Trockenheit zugeordnet werden.
So sieht hier mein code aus:
If Datum_2.Text <> "" Or Not IsNull(Me.Datum_2) = True Or Me.Datum_2 > 0 Then
strDatum = Format(Me!Datum_2, "dd.mm.yyyy")
Set RS = db1.OpenRecordset("SELECT * FROM Para_Wert WHERE MSt = '" & Me![MSt] & "' And Datum = '" & strDatum & "' ;")
While Not RS.EOF
If CInt(Right(RS.Fields("PARA_ID"), 1)) < 5 Then
Me.Trockenheit = RS.Fields("PARA_ID")
Else
Me.mttl_Tiefe = RS.Fields("PARA_ID")
End If
RS.MoveNext
Wend
End If
Ich hoffe, dies hilft dir weiter.

swati
25.08.2009, 14:42
Hallo Soleikum!

Super Danke jetzt funktioniert das was ich haben wollte mit der MArkierung auch von mehreren Listboxen . Dazu habe ich noch eine Funktion ZifferausString benutzt, welche mir die PARA-ID- Werte in Zahlen umwandelt. Somit kann ich alle Daten in eine TAbelle speichern und diese mir auch im Formular anzeigen lassen/verändern

Folgenden Code habe ich verwendet:
Dim i As Integer
Dim strDatum As String
Dim RS As DAO.Recordset, db1 As DAO.Database
Set db1 = CurrentDb

If Datum_2.Text <> "" Or Not IsNull(Me.Datum_2) = True Or Me.Datum_2 > 0 Then
strDatum = Format(Me!Datum_2, "dd.mm.yyyy")
Set RS = db1.OpenRecordset("SELECT * FROM Para_Wert WHERE MSt = '" & Me![MSt] & "' And Datum = '" & strDatum & "' ;")
While Not RS.EOF

If CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 5) Then
Me.Wasserstand2 = RS.Fields("PARA_ID")


ElseIf CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 8) Then
Me.mttl_Tiefe = RS.Fields("PARA_ID")

ElseIf CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 12) Then
Me.Trübung = RS.Fields("PARA_ID")

ElseIf CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 15) Then
Me.Sicht = RS.Fields("PARA_ID")


ElseIf CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 22) Then
Me.Fließ_Geschw = RS.Fields("PARA_ID")

ElseIf CInt(ZiffernAusString(RS.Fields("PARA_ID")) < 27) Then
Me.Beschattung = RS.Fields("PARA_ID")



'Else
' Me.Sicht = RS.Fields("PARA_ID")
End If
RS.MoveNext
Wend
End If



End Sub

Public Function ZiffernAusString(S)
If IsNull(S) Then
ZiffernAusString = Null
Else
Dim Res As String, Ch As String, i As Long
Res = ""
For i = 1 To Len(S)
Ch = Mid(S, i, 1)
If IsNumeric(Ch) Then Res = Res & Ch
Next i
ZiffernAusString = Res
End If
End Function