Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Raphael90 am März 15, 2011, 14:10:04

Titel: Filter Laufzeitfehler 2001
Beitrag von: Raphael90 am März 15, 2011, 14:10:04
Hallo,

erstmal gibt von mir ein großes Lob fürs Forum!
Ihr hat mir schon oft weitergeholfen!

Jetzt habe ich aber ein Problem, bei dem ich überhaupt nicht mehr weiter weiß. :(

In einem Formular haben ich drei Kombinationsfelder, eine Checkbox und ein Unterformular.
In dem Unterformular werden die Datensätze in einem Datenblatt angezeigt, die durch die Kombinationsfelder und die Checkbox im Hauptformular gefiltert werden können.

Ein Cbx filtert nach dem gespeichertem Typ(Text) des Datensatzes, ein anderes Cbx nach einem gespeicherte Wert(Zahl) genauso wie die Checkbox.
Das dritte Cbx berechnet aus mehrern Werten des Datensatzes einen Prozentsatz und filtert nach diesem.

Jetzt ist mein Problem, dass ich diese Filter gerne Kombinieren möchte und habe sie einfach durch mehrer "AND" verbunden, das funktioniert soweit auch prima. Wenn ich allerdings sowohl nach dem Prozentsatz als auch nach Typ gleichzeitig filtern möchte erhalten einen Laufzeitfehler 2001 "Sie haben die vorherige Operation abgebrochen". Alle anderen Kombinationsmöglichkeiten funktionieren!
Google hat mir sehr viel zu diesem Fehler ausgespuckt nur hilft das alles nicht.

Nun bin ich kein Profi in Access und das ist alles mehr schlecht als recht zusammengeschustert und finde jetzt den Fehler nicht :(

Ich Vermute den Fehler irgendwo in der Prozentberechnung, da ich mir auch nicht 100% sicher bin, ob die Typen alle zusammenpassen aber es funtioniert nur so...

Wäre super, wenn ihr mir helfen könnt :)

hier mal mein Code:

Private Sub kombifilter()
Dim flaechekap1 As String
Dim flaechekap2 As Double


cbxname.SetFocus
If cbxname.Text <> "Alle" Then

namefilter = "Name = '" & cbxname.Text & "'"          'Filter für den Typ

Else
namefilter = "[ID] LIKE ""*"" "    'PLatzhalter falls nichts ausgewählt wurde

End If

'---------

cbxkapazitaet.SetFocus

If cbxkapazitaet <> "Alle" Then    'Berechnung des Prozentsatzes  mit eine Tolleranz nach oben und unten

kapfilter = "([Aktivmasse Masse (g)]/([Aktivmasse Masse (g)]+[Ruß Masse (g)]+[Grafit Masse(g)]+[Bindermasse (g)])) >= " & (Str(((cbxkapazitaet) * 0.01) - 0.03)) & " AND " & "([Aktivmasse Masse (g)] / ([Aktivmasse Masse (g)] + [Ruß Masse (g)] + [Grafit Masse(g)] + [Bindermasse (g)])) <= " & (Str(((cbxkapazitaet) * 0.01) + 0.03))
Else
kapfilter = "[ID] LIKE ""*"" "

End If

'---------

cbxflaechenkap.SetFocus
If cbxflaechenkap <> "Alle" Then                            'Wert mit Tolleranz        

flaechenkap1 = (cbxflaechenkap - 0.3)
flaechenkap1 = Replace(flaechenkap1, ",", ".")
flaechenkap2 = (cbxflaechenkap + 0.3)
flaechenkap2 = Replace(flaechenkap2, ",", ".")

flaechenfilter = "[Angaben Flächenkapazität(mAh/cm2)] >= " & flaechenkap1 & " AND " & "[Angaben Flächenkapazität(mAh/cm2)] <=" & flaechenkap2

Else

flaechenfilter = "[ID] LIKE ""*"" "

End If

'----------

vorhandencb.SetFocus
If vorhandencb.Value = 0 Then                                    
vorhandenfilter = "[ID] LIKE ""*"" "   'alle

Else
vorhandenfilter = "[Rest] > 0"         'Nur vorhandene

End If

Filte
End Sub


und:

Private Sub Filte()

Me.Elektroden_Anode_weiter.Form.Filter = "" & namefilter & " AND " & flaechenfilter & " AND " & kapfilter & " AND " & vorhandenfilter & ""

Me.Elektroden_Anode_weiter.Form.FilterOn = True
Me.Elektroden_Anode_weiter.Form.OrderByOn = True
End Sub




Titel: Re: Filter Laufzeitfehler 2001
Beitrag von: imp666 am März 15, 2011, 14:34:53
Sind namefilter, flaechenfilter, kapfilter, vorhandenfilter Global definiert?
Haben sie bereits passende Einträge, wenn du das Sub "Filte" aufrufst?
Hat "cbxkapazitaet" tatsächlich einen numerischen Wert (sofern nicht "Alle" ausgewählt ist)?

Zeilen wie diese kapfilter = "[ID] LIKE ""*"" " würde ich weglassen, bzw. eher wie folgt verwenden kapfilter="" und einfach den String später beim Zusammenbauen (was du ja in der Sub "Filter" machst) entsprechend anpassen, z.B.: ... & iif(kapfilter="",""," AND " & kapfilter) & ...
Die Like-Abfrage benötigt sonst nur (Rechen-)Zeit.

Versuche mal nachzuvollziehen (Debugger im Einzelschrittmodus), was in deinen (globalen) Variablen steht und ob die immer korrekt gefüllt werden.
Man kann hier leider nicht genau sehen, was in den einzelnen Feldern steht bzw. stehen kann und eine Prognose was da schief läuft ist dann eher schwer.
Titel: Re: Filter Laufzeitfehler 2001
Beitrag von: bahasu am März 15, 2011, 14:44:25
Hi

und weitere Fragen:
Warum ist
Dim flaechekap1 As String
Dim flaechekap2 As Double
das eine als String und das andere als Double definiert?
Wenn ich das korrekt verstanden habe, willst Du mit beiden rechnen?

Warum mußt Du die Formatierung (Replace(flaechenkap1, ",", ".")) ändern?
Bin mir nicht sicher, ob diese "Umformatierung" ohne Umwandlung in einen String funktioniert. Hast Du das getestet?

Harald
Titel: Re: Filter Laufzeitfehler 2001
Beitrag von: Raphael90 am März 15, 2011, 15:37:56
Wow danke für die schnellen Antworten

Zitat von: imp666 am März 15, 2011, 14:34:53
Sind namefilter, flaechenfilter, kapfilter, vorhandenfilter Global definiert?
Haben sie bereits passende Einträge, wenn du das Sub "Filte" aufrufst?

Ich wusste, dass ich etwas vergesse.
Also ja sie sind Global definiert und per Definition haben sie noch keine Einträge.
Allerdings wird "Filte" nur von "kombifilter" aufgerufen und daher sind dann Einträge vorhanden.

Zitat von: imp666 am März 15, 2011, 14:34:53

Hat "cbxkapazitaet" tatsächlich einen numerischen Wert (sofern nicht "Alle" ausgewählt ist)?

"cbxkapazitaet" hat die Werte "Alle" und die Zahlen von 1 bis 100 und habe da dann (leichtsinnigerweise?) aufs Casting von VBA vertraut. Wenn ich der cbx sage, dass sie numerische Werte enthält, bekomme ich mit "Alle" Probleme, dass ist nicht sauber und schön funktioniert alleine für sich aber.

Zitat von: imp666 am März 15, 2011, 14:34:53
Zeilen wie diese kapfilter = "[ID] LIKE ""*"" " würde ich weglassen, bzw. eher wie folgt verwenden kapfilter="" und einfach den String später beim Zusammenbauen (was du ja in der Sub "Filter" machst) entsprechend anpassen, z.B.: ... & iif(kapfilter="",""," AND " & kapfilter) & ...
Die Like-Abfrage benötigt sonst nur (Rechen-)Zeit.

Werde ich ändern.
Nur befürchte ich, dass es daran nicht liegt. Aber man weiß ja nie.

Zitat von: imp666 am März 15, 2011, 14:34:53
Versuche mal nachzuvollziehen (Debugger im Einzelschrittmodus), was in deinen (globalen) Variablen steht und ob die immer korrekt gefüllt werden.
Man kann hier leider nicht genau sehen, was in den einzelnen Feldern steht bzw. stehen kann und eine Prognose was da schief läuft ist dann eher schwer.

Das passt soweit leider alles

In den Feld "cbxname" steht wirklich nur ein x-belieber Name "Hans", "Peter" usw. und
cbxflaechenkap hat ähnlich wie "cbxkapazitaet" Den Wert "Alle" und die Zahlen von 1 bis 5 in 0,1er Schritten.

Zitat von: bahasu am März 15, 2011, 14:44:25
Hi

und weitere Fragen:
Warum ist
Dim flaechekap1 As String
Dim flaechekap2 As Double
das eine als String und das andere als Double definiert?
Wenn ich das korrekt verstanden habe, willst Du mit beiden rechnen?

Warum mußt Du die Formatierung (Replace(flaechenkap1, ",", ".")) ändern?
Bin mir nicht sicher, ob diese "Umformatierung" ohne Umwandlung in einen String funktioniert. Hast Du das getestet?

Harald

Interessant :-X
Es soll natürlich beides Double sein. Da gibtsn Lob für VBA, dass es das einfach so mitmacht.

Die Formatierung musste ich ändern, da in der cbx die Werte 1-5 in 0,1er Schritte mit "," stehen VBA aber gerne "." haben möchte...
Auch hier habe ich der cbx nicht explizit gesagt, dass es sich um numerische Werte handelt.
Aber der Teil an sich ist getestet und funktioniert.
Titel: Re: Filter Laufzeitfehler 2001
Beitrag von: imp666 am März 15, 2011, 17:00:50
Dann würde ich zwecks debug nochmal empfehlen in filte folgende Änderung vorzunehmen:

Private Sub Filte()
dim s as string

s = namefilter & " AND " & flaechenfilter & " AND " & kapfilter & " AND " & vorhandenfilter
msgbox(s)
' Me.Elektroden_Anode_weiter.Form.Filter = "" & namefilter & " AND " & flaechenfilter & " AND " & kapfilter & " AND " & vorhandenfilter & ""

Me.Elektroden_Anode_weiter.Form.FilterOn = True
Me.Elektroden_Anode_weiter.Form.OrderByOn = True
End Sub


Poste dann mal das was Msgbox ausgibt hier bitte... dann sehen wir ja, was da zusammen gebaut wird.
In der Zeile in der du den String zusammensetzt, kannst du übrigens getrost das "" &  am Anfang und das & "" am Ende weglassen, denn du fügst dem String damit einen Leerstring hinzu, das ist unnötig.
Titel: Re: Filter Laufzeitfehler 2001
Beitrag von: Raphael90 am März 16, 2011, 08:54:42
Ja stimmt die sind unnötig.

Die Msgbox gibt folgendes aus:

Name ='Li. Titanat' AND [ID] LIKE "*" AND ([Aktivmasse Masse (g)]/([Aktivmasse Masse (g)]+[Ruß Masse (g)]+[Grafit Masse(g)]+[Bindermasse (g)])) >= .82 AND ([Aktivmasse Masse (g)]/([Aktivmasse Masse (g)]+[Ruß Masse (g)]+[Grafit Masse(g)]+[Bindermasse (g)])) <= .88 AND [ID] LIKE "*"

Dieser Filter Produziert z.B. den Fehler.