PDA

Vollständige Version anzeigen : Filterung des Unterunterformulars


Helios Son
06.07.2006, 12:19
Hallo,

in meinem Hauptformular habe ich ein Kombinationsfeld. Dort kann man nach Modulen 1 bis 5 auswählen. Bei Modul 1 und 2 wird ein Unterformular angezeigt. (Visible = true) und bei Modul 3 - 5 ein anders Unterformular.

In dem Formular für Modul 3 - 5 gibt es wieder ein Unterformular in dem die eigentlichen Daten angezeigt werden. Je nach ausgewähltem Modul (3 - 5)sollen dort die Daten gefiltert erscheinen. Mein VBA-Code (z.B. für Modul 3) sieht dafür folgendermaßen aus:

If cbModul.Column(1) = "Modul 3" Then
Me![Unterformular Teilzielermittlung OWK].Form.[Unter-Unterformular_qryOWK_Teilziele].Form.Filter = "Modul = 3"
Me![Unterformular Teilzielermittlung OWK].Form.[Unter-Unterformular_qryOWK_Teilziele].Form.FilterOn = True
...
End If


Wenn ich nun in dem Kombinationsfeld Modul 3 auswähle, dann stürzt mir Access komplett ab. (...Fehlerbericht an MS schicken). Aber kurz vorher sehe ich noch, dass die Filterung erfolgte.

Wenn ich die Zeile mit FilterOn = True herausnehme, dann passiert der Fehler nicht. Aber dann wird ja auch nicht gefiltert.



Was habe ich ich falsch gemacht? Und wie kann ich das umgehen?

Gruss Helios

Worf1001
06.07.2006, 12:27
Hallo,

probiere es mal so:


If cbModul.Column(1) = "Modul 3" Then
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Filter = "Modul = 3"
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].FilterOn = True
...
End If

Worf1001
06.07.2006, 12:28
Und vielleicht mal die Datenbank komprimieren / reparieren.

Anne Berg
06.07.2006, 12:31
Auf die ".Form"-Notation kann man wohl inzwischen verzichten, sollte aber keinen Unterschied machen. Allerdings sollten Punkt und Rufzeichen in jedem Fall korrekt eingesetzt werden, und zwar so: "...OWK].Form![Unter-..."

Worf1001
06.07.2006, 12:36
Eben so wie ich es beschrieben habe :p

Helios Son
06.07.2006, 12:37
Erstmal Danke für Eure schnelle Antwort.

Aber leider funktionieren beide Tipps nicht.

Beim

If cbModul.Column(1) = "Modul 3" Then Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Filter = "Modul = 3" Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].FilterOn = True ... End If

kommt die Fehlermeldung: Laufzeitfehler 438: Objekt unterstützt die Eigenschaft oder Methode nicht.

Und die Hinzunahme von dem Ausrufezeichen ( "...OWK].Form![Unter-...") hat leider auch nichts gebracht. Da stürzt Access auch ab.

Gruss Helios

Worf1001
06.07.2006, 12:46
Hallo,

stimmt, falsch geschrieben:


If cbModul.Column(1) = "Modul 3" Then
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Form.Filter = "Modul = 3"
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Form.FilterOn = True
...
End If


Hast Du schon komprimiert/repariert?

Helios Son
06.07.2006, 12:51
Ja, ich habe es schon komprimiert und repariert. Auch mit .Form. habe ich es schon probiert. :(

Ich habe es auch schon mal mit Access 2000 probiert. Dort crasht es zwar nicht gleich. Aber es spinnt auch rum. So erscheint folgende Meldung wenn ich den Schließen-Button im Formular drücke:

Kann Aktion nicht durchführen!

Gruss Helios

Worf1001
06.07.2006, 12:53
Ja, hast du alle Updates installiert?

Ist es möglich die Datenbank mal hier zu posten. Würde gerne auch mal probieren.

Helios Son
06.07.2006, 12:56
Posten nicht unbedingt.

Aber per EMail würde ich sie senden. (ca 5MB)

Gruss Helios

Worf1001
06.07.2006, 12:57
Okay, worf1001@gmail.com

falls Du sie zippen willst, bitte im Format *.ZIP.

Helios Son
06.07.2006, 13:18
Mail ist raus.

Anne Berg
06.07.2006, 13:19
Ich vermute mal, dass da noch etwas mehr Code in deinem Klassenmodul steht. Du sprachst z.B. vom Ein-/Ausblenden von Unterformularen...

Worf1001
06.07.2006, 13:19
Habs gesehen

Bis jetzt: Stürzt bei mir ab, bevor ich überhaupt etwas im Formular machen kann

Helios Son
06.07.2006, 13:22
Ja genau so ist es. Das liegt daran, dass wenn das Formular geöffnet wird, automatisch Modul 3 ausgewählt wird.

Helios Son
06.07.2006, 13:25
Der gesammte Code für das Formular:

Option Compare Database
Option Explicit

Private Sub cbModul_AfterUpdate()

'-----Formular für Grundwasser anzeigen-----
If cbModul.Column(1) = "Modul 1" Or cbModul.Column(1) = "Modul 2" Then
Me![Unterformular Teilzielermittlung GWK].Visible = True
Me![Unterformular Teilzielermittlung OWK].Visible = False

Me![Unterformular Teilzielermittlung GWK]!cbTXT1.RowSource = "SELECT DISTINCT Allg_Daten_GWK.Name_GWK, Allg_Daten_GWK.GWK_Nr FROM Allg_Daten_GWK"
Me![Unterformular Teilzielermittlung GWK]!cbTXT1 = Me![Unterformular Teilzielermittlung GWK]!cbTXT1.Column(0, 0)


'-----Formular für Oberflächenwasser anzeigen------------
ElseIf cbModul.Column(1) = "Modul 3" Or cbModul.Column(1) = "Modul 4" Or cbModul.Column(1) = "Modul 5" Then
Me![Unterformular Teilzielermittlung GWK].Visible = False
Me![Unterformular Teilzielermittlung OWK].Visible = True

'-----Kominationsfeld füllen und ersten Eintrag auswählen
Me![Unterformular Teilzielermittlung OWK]!cbTXT1.RowSource = "SELECT DISTINCT qry_OWK_Messstellen.Name_OWK, qry_OWK_Messstellen.Nr_OWK FROM qry_OWK_Messstellen ORDER BY qry_OWK_Messstellen.Name_OWK;"
Me![Unterformular Teilzielermittlung OWK]!cbTXT1 = Me![Unterformular Teilzielermittlung OWK]!cbTXT1.Column(0, 0)

End If

'---------Buttons je nach Modul anzeigen/ausblenden------

If cbModul.Column(1) = "Modul 3" Then
Me![Unterformular Teilzielermittlung OWK]!btInvest.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btOberlieger.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btGrundwasser.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btBevoelkerung.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btLandwirtschaft.Visible = True
'Me![Unterformular Teilzielermittlung OWK].Form![Unter-Unterformular_qryOWK_Teilziele].Form.Filter = "Modul = 3"
'Me![Unterformular Teilzielermittlung OWK].Form![Unter-Unterformular_qryOWK_Teilziele].Form.FilterOn = True
'Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Filter = "Modul = 3"
'Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].FilterOn = True

ElseIf cbModul.Column(1) = "Modul 4" Or cbModul.Column(1) = "Modul 5" Then
Me![Unterformular Teilzielermittlung OWK]!btInvest.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btOberlieger.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btGrundwasser.Visible = False
Me![Unterformular Teilzielermittlung OWK]!btBevoelkerung.Visible = False
Me![Unterformular Teilzielermittlung OWK]!btLandwirtschaft.Visible = False

End If


End Sub


'Unter Verweise muss Microsoft DAO 3.6 Object Libary ausgewählt werden

'----------------Initialisierung der Kombinationsfelder----------------
Private Sub Form_Open(Cancel As Integer)
Me!cbModul = cbModul.Column(1, 2)
Call cbModul_AfterUpdate
Me![Unterformular Teilzielermittlung OWK]!cbTXT1 = [Unterformular Teilzielermittlung OWK]!cbTXT1.Column(0, 0)
End Sub


'-----------------Formular schließen--------------------
Private Sub Befehl29_Click()
On Error GoTo Err_Befehl29_Click

DoCmd.Close

Exit_Befehl29_Click:
Exit Sub

Err_Befehl29_Click:
MsgBox Err.Description
Resume Exit_Befehl29_Click

End Sub





'----zu erwartende Investition Unterformular öffnen----------
Private Sub Befehl38_Click()
On Error GoTo Err_Befehl38_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "tblZu_erwartende_Investitionen"
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_Befehl38_Click:
Exit Sub

Err_Befehl38_Click:
MsgBox Err.Description
Resume Exit_Befehl38_Click

End Sub

Worf1001
06.07.2006, 13:30
Der Fehler liegt hier:


Private Sub Form_Open(Cancel As Integer)
Me!cbModul = cbModul.Column(1, 2)
Call cbModul_AfterUpdate
Me![Unterformular Teilzielermittlung OWK]!cbTXT1 = [Unterformular Teilzielermittlung OWK]!cbTXT1.Column(0, 0)
End Sub

Helios Son
06.07.2006, 13:34
Wenn ich dort etwas heraus nehme, dann löst das nicht mein Problem. Es verlagert es nur. Der Fehler tritt dann erst auf wenn ich Modul 3 auswähle.

Oder irre ich mich da?

Gruss Helios

Worf1001
06.07.2006, 13:36
Also, wenn ich die letzten Zeile


Me![Unterformular Teilzielermittlung OWK]!cbTXT1 = [Unterformular Teilzielermittlung OWK]!cbTXT1.Column(0, 0)


lösche, habe ich keine Probleme mehr. Und Modul 3 ist ausgewählt. Und ich kann wechseln und machen wie ich will.

Worf1001
06.07.2006, 13:37
Doch nicht... (jetzt plötzlich wieder) :boah:

Anne Berg
06.07.2006, 13:38
Mich irritiert, dass du die Visible-Eigenschaft (False) setzt, ohne dich um den FoKus zu kümmern...

Auch würde ich zunächst einmal eine Fehlerbehandlung hinzufügen und sämtliche Steuerelemente mit vollständiger und korrekter Syntax ansprechen - dann kann man das schon mal als Ursache ausschließen!

Beispiel: cbModul.Column(..) --> Me!cbModul.Column(...)

Helios Son
06.07.2006, 13:42
Bei mir funktioniert das nicht, auch wenn ich die letzte Zeile herauslösche. :(

Immer wenn ich Modul 3 aufrufe, dann stürzt es ab.

Worf1001
06.07.2006, 13:44
Hey schicke doch Anne auch mal deine DB. Ist wirklich ein verwirrendes Problem... :entsetzt:

Helios Son
06.07.2006, 13:46
Anne, würdst Du Dir die DB mal anschauen?

Wenn ja, dann nenne mir mal bitte Deine Email-Adresse

Gruss Helios

Anne Berg
06.07.2006, 13:48
anne_berg(at)gmx.de ;)

Helios Son
06.07.2006, 13:52
Die Mail ist raus. :)

Gruss Helios

Worf1001
06.07.2006, 14:00
Eine Alternative wäre, anstatt der Filter-Methode: SQL-Select zu verwenden.

Das heisst beim Wählen des entsprechenden Moduls, einen SQL-String zusammenzubauen und dem Unter-Unterformular zuzweisen.

Helios Son
06.07.2006, 14:03
Wie würde das denn funktionieren, wenn das Formular als Datenherkunft schon qryOWK_Teilziele hat?

Anne Berg
06.07.2006, 14:30
Also, ich schätze es liegt an der (eigentlich unzulässigen) Verknüpfung des UU-Formulars mit Hilfe eines Textfeldes. Da würde ich mir an deiner Stelle mal eine andere Lösung einfallen lassen. (z.B. Formularfeldbezug in der zugrunde liegenden Abfrage)

Worf1001
06.07.2006, 14:32
@Anne: Ich habe bemerkt, dass der Fehler / Absturz bei der FilterOn-Eigenschaft auftritt.

Helios Son
06.07.2006, 14:35
Ja, genau da liegt das Problem. Er filtert sogar noch, aber dann klemmt's irgendwo.

Helios Son
06.07.2006, 14:43
@Anne: Wie würde das mit einem Formularfeldbezug aussehen? Ich kann mit dem Begriff nicht allzuviel anfangen. Ich soll also in der dem UUFo zugrundeliegende Abfrage etwas ändern? Soll ich da einen Parameter verwenden? Wenn ja, wie erstelle ich dann den Bezug zu dem Kombinationsfeld cbModul?

Gruss Helios

Worf1001
06.07.2006, 14:45
So, habe ich das gemeint mit SQL:


If cbModul.Column(1) = "Modul 3" Then

strSQL = "SELECT tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID, tblOWK_Ursachenbewertung_Gesamt.OWK_Nr, " & _
"tblUrsachenkatalog.Urs_Bez, tblUrsachenkatalog.Modul, tblOWK_Ursachenbewertung_Gesamt.Urs_Nr, " & _
"tblOWK_Ursachenbewertung_Gesamt.Bewertung, tblOWK_Ursachenbewertung_Gesamt.Bemerkung, tblOWK_Teilziele.Bew_Para, " & _
"tblOWK_Teilziele.Entw_Ziel, tblOWK_Teilziele.[Ist], tblOWK_Teilziele.Bas_Inv, tblOWK_Teilziele.Bas_Bev, " & _
"tblOWK_Teilziele.Bas_Lan, tblOWK_Teilziele.Aus_Oberl, tblOWK_Teilziele.Aus_GWK " & _
"FROM (tblOWK_Ursachenbewertung_Gesamt INNER JOIN tblUrsachenkatalog ON " & _
"tblOWK_Ursachenbewertung_Gesamt.Urs_Nr = tblUrsachenkatalog.Urs_Nr) LEFT JOIN tblOWK_Teilziele ON " & _
"tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID = tblOWK_Teilziele.OWK_U_ID " & _
"WHERE tblUrsachenkatalog.Modul = 3;"

Me![Unterformular Teilzielermittlung OWK]!btInvest.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btOberlieger.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btGrundwasser.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btBevoelkerung.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btLandwirtschaft.Visible = True
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Form.RecordSource = strSQL

Helios Son
06.07.2006, 14:48
@Worf1001:
Die SQL Abfrage habe ich auch so hinbekommen. :)

Aber was ich nicht weiss ist, wie ich diese Abfrage in ein Formular eintrage.


Neu: Sorry, ich habe nicht richtig gelesen.

Worf1001
06.07.2006, 14:49
Beim Unter-Unterformular nimmst Du die Datenherkunft heraus. Und dann der Code so wie ich geschrieben habe.

Helios Son
06.07.2006, 14:53
SUPER!!!!

Es hat geklappt. Viele, vielen Dank Euch beiden!!!

Jetzt kann es weiter gehen. Klasse. :)

Worf1001
06.07.2006, 14:54
Ne moment, mit Modul 4 und 5. Was soll da genau mit dem Unter-Unterformular passieren? Ist mir nicht so ganz klar.

Helios Son
06.07.2006, 15:08
Das Modul 4 und 5 arbeitet ähnlich. Es werden nur andere Ursachen (siehe tblUrsachenkatalog) angezeigt.

Für Modul 1 und 2 existiert ein eigenes Unterformular (Unterformular Teilzielermittlung GWK) Da habe ich aber noch nicht weit entwickelt.

Worf1001
06.07.2006, 15:11
es wird einfach nichts hinter Urs-Nr angzeigt? Muss das so sein?

Du musst dafür natürlich auch die Herkunft wieder anpassen, wenn ich das richtig verstehe:


If cbModul.Column(1) = "Modul 3" Then

strSQL = "SELECT tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID, tblOWK_Ursachenbewertung_Gesamt.OWK_Nr, " & _
"tblUrsachenkatalog.Urs_Bez, tblUrsachenkatalog.Modul, tblOWK_Ursachenbewertung_Gesamt.Urs_Nr, " & _
"tblOWK_Ursachenbewertung_Gesamt.Bewertung, tblOWK_Ursachenbewertung_Gesamt.Bemerkung, tblOWK_Teilziele.Bew_Para, " & _
"tblOWK_Teilziele.Entw_Ziel, tblOWK_Teilziele.[Ist], tblOWK_Teilziele.Bas_Inv, tblOWK_Teilziele.Bas_Bev, " & _
"tblOWK_Teilziele.Bas_Lan, tblOWK_Teilziele.Aus_Oberl, tblOWK_Teilziele.Aus_GWK " & _
"FROM (tblOWK_Ursachenbewertung_Gesamt INNER JOIN tblUrsachenkatalog ON " & _
"tblOWK_Ursachenbewertung_Gesamt.Urs_Nr = tblUrsachenkatalog.Urs_Nr) LEFT JOIN tblOWK_Teilziele ON " & _
"tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID = tblOWK_Teilziele.OWK_U_ID " & _
"WHERE tblUrsachenkatalog.Modul = 3;"

Me![Unterformular Teilzielermittlung OWK]!btInvest.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btOberlieger.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btGrundwasser.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btBevoelkerung.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btLandwirtschaft.Visible = True
Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Form.RecordSource = strSQL


ElseIf cbModul.Column(1) = "Modul 4" Or cbModul.Column(1) = "Modul 5" Then

strSQL = "SELECT tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID, tblOWK_Ursachenbewertung_Gesamt.OWK_Nr, " & _
"tblUrsachenkatalog.Urs_Bez, tblUrsachenkatalog.Modul, tblOWK_Ursachenbewertung_Gesamt.Urs_Nr, " & _
"tblOWK_Ursachenbewertung_Gesamt.Bewertung, tblOWK_Ursachenbewertung_Gesamt.Bemerkung, tblOWK_Teilziele.Bew_Para, " & _
"tblOWK_Teilziele.Entw_Ziel, tblOWK_Teilziele.[Ist], tblOWK_Teilziele.Bas_Inv, tblOWK_Teilziele.Bas_Bev, " & _
"tblOWK_Teilziele.Bas_Lan, tblOWK_Teilziele.Aus_Oberl, tblOWK_Teilziele.Aus_GWK " & _
"FROM (tblOWK_Ursachenbewertung_Gesamt INNER JOIN tblUrsachenkatalog ON " & _
"tblOWK_Ursachenbewertung_Gesamt.Urs_Nr = tblUrsachenkatalog.Urs_Nr) LEFT JOIN tblOWK_Teilziele ON " & _
"tblOWK_Ursachenbewertung_Gesamt.OWK_U_ID = tblOWK_Teilziele.OWK_U_ID " & _
"WHERE tblUrsachenkatalog.Modul = 4 OR tblUrsachenkatalog.Modul = 5;"

Me![Unterformular Teilzielermittlung OWK]![Unter-Unterformular_qryOWK_Teilziele].Form.RecordSource = strSQL

Me![Unterformular Teilzielermittlung OWK]!btInvest.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btOberlieger.Visible = True
Me![Unterformular Teilzielermittlung OWK]!btGrundwasser.Visible = False
Me![Unterformular Teilzielermittlung OWK]!btBevoelkerung.Visible = False
Me![Unterformular Teilzielermittlung OWK]!btLandwirtschaft.Visible = False

End If

Helios Son
06.07.2006, 15:15
Genau. Ich würde die SQL Abfrage für jedes Modul machen.
Besser wäre es vielleicht, wenn für die SQL in eine Extra-Methode schreibt und nur einen Parameter für die Modulnummer übergeben.

Worf1001
06.07.2006, 15:18
ah, dann ist es bei 4 und 5 noch nicht fertig!?!?

Ja, wie Du es dann machen willst, kommt nicht so darauf an.

Helios Son
06.07.2006, 15:22
Noch ist es nicht fertig. ich hatte die Filterung erst einmal nur für Modul 3 gemacht. der Rest kommt nun. :)

Vielen dank nochmal.