Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: TomTom2903 am April 05, 2012, 11:19:17

Titel: Suche im Unterformular
Beitrag von: TomTom2903 am April 05, 2012, 11:19:17
Hallo,
habe ein Problem mit einer Suche im Unterformular. In meinem Hauptformular habe ich 4 Textfelder in die ich Suchbegriffe eingeben kann und ich bekomme mein gewünschtes Ergebnis.
Allerdings ist mir gestern aufgefallen, dass das nicht stimmt. Das Listenfeld (Datensatzherkunft ist eine Querry) zeigt mir augenscheinlich am Anfang alle Datensätze an, allerdings nach der ersten Eingabe verschwinden bestimmte Datensätze.

Das Listenfeld hat 6 Spalten. die ersten 2 Spalten haben teilweise aber auch keine Daten enthalten und diese Datensätze in denen keine Daten enthalten sind machen mir bei der Eingabe Probleme. Sie verschwinden. Zur Info, nicht jeder Kunde gehört einem Verband oder Konzern an.

Bsp.:
   Verband   Konzern   Kunde   Ort
1   mali         bali          zorn      hamburg
2   muru       baku        doro      camelot
3                                 hier       Verschwindet
4   maco      polo          Atlas      Welt

So wenn ich jetzt nach Kunde filter: Eingabe: "h" ist mein komplettes Listenfeld leer. Lösche ich "h" sind wieder die Datensätze 1, 2  und 4 da. Datensatz 3 ist erst nach neuem Öffnen des Formulars wieder im Listenfeld vorhanden.

Mein Code lautet:
Private Sub Form_Load()
   strVerband = ""
   strKonzern = ""
   strSuchbegriff = ""
   strOrtsuche = ""
End Sub

Private Sub txtVerband_Change()
   If Nz(Me!txtVerband.Text) <> 0 Then
       strVerband = Me!txtVerband.Text
   End If
   Call FktLstKunde
End Sub

Private Sub txtKonzern_Change()
   If Nz(Me!txtKonzern.Text) <> 0 Then
       strKonzern = Me!txtKonzern.Text
   End If
   Call FktLstKunde
End Sub

Private Sub txtSuchbegriff_Change()
   If Nz(Me!txtSuchbegriff.Text) <> 0 Then
       strSuchbegriff = Me!txtSuchbegriff.Text
   End If
   Call FktLstKunde
End Sub

Private Sub txtOrtsuche_Change()
   If Nz(Me!txtOrtSuche.Text) <> 0 Then
       strOrtsuche = Me!txtOrtSuche.Text
   End If
   Call FktLstKunde
End Sub

Private Function FktLstKunde()
   Me!lstKunden.RowSource = "Select *" & _
                           "FROM qry_Sys_Kundensuche " & _
                           "WHERE Verban like '" & strVerband & "*' and Konzer like '" & strKonzern & "*' " _
                           & "and Name1 LIKE '" & strSuchbegriff & "*' and Ort like '" & strOrtsuche & "*'"
   Me!lstKunden.Requery
End Function

Danke schon jetzt für eure Tipps.

Grüße
Tom


Nachtrag:
Wenn ich beim Datensatz 3 z.B. Null Null in die leeren Felder eintrage, funktioniert das. Aber warum funktioniert es nicht wenn die Felder leer sind?!
Titel: Re: Suche im Unterformular
Beitrag von: DF6GL am April 05, 2012, 19:06:57
Hallo,

die Nz-Funktion greift logisch nicht bei der Text-Eigenschaft eines Steuerelementes.  Diese Eigenschaft hat den Datentyp String . Besser:

   If Len(Me!txtVerband.Text) <> 0 Then

wobei diese IF-Bedingungen eh überflüssig sind.
Titel: Re: Suche im Unterformular
Beitrag von: Beaker s.a. am April 06, 2012, 00:05:38
Hallo Franz,
Zitatdie Nz-Funktion greift logisch nicht bei der Text-Eigenschaft eines Steuerelementes
Ich glaube doch. Man muss nur dem FalsePart einen Leerstring zuweisen:
Nz(Me!txtVerband.Text,"")
und darauf abfragen:
If Nz(Me!txtVerband.Text,"") = "" Then
Obwohl ich es meistens auch per Len mache; -
wegen NULL aber so:
If Len(Control & "") > 0 Then
gruss ekkehard
Titel: Re: Suche im Unterformular
Beitrag von: DF6GL am April 06, 2012, 09:28:30
Hallo,


nun, ich habe mich nicht auf den Vergleich mit 0 oder mit ""  bezogen, sondern auf das Greifen der NZ-Funktion auf die Text-Eigenschaft des Steuerelementes.



If Nz(Me!txtVerband.Text) <> 0 Then
funktioniert aus zwei Gründen nicht richtig:


die NZ-Funktion kann Me!txtVerband.Text nicht "bearbeiten" weil kein Variant.


die NZ-Funktion liefert aus o. g. Grund keinen Ersatzwert, auch wenn einer als 2. Parameter angegeben ist, sondern den Wert des Parameters selber, hier also einen NullString ("").   Insofern würde z. B.   If Nz(Me!txtVerband.Text,0) <> 0 Then    nicht (erwartungsgemäß)  funktionieren.



If Nz(Me!txtVerband.Text,"")  = "" Then    ist hier im Endeffekt identisch mit  If Me!txtVerband.Text = "" Then  

Aus dem Objektkatalog (Klasse: Textbox, Element: Text):
Zitat
Property Text As String
    Element von Access.TextBox
Titel: Re: Suche im Unterformular
Beitrag von: TomTom2903 am April 06, 2012, 16:56:35
Hallo Franz,
Hallo Ekkehard,
Aber die Lösung des Problems, warum immer die Datensätze mit den "leeren" Feldern verschwinden ist das ja nicht?!
Gruß
Tom
Titel: Re: Suche im Unterformular
Beitrag von: DF6GL am April 06, 2012, 17:15:26
Hallo,


hast Du den Code wie vorgeschlagen schon geändert?



Das Problem sollte mit diesem Rowsource-SQL-String und der Änderung  nicht auftreten...


Ansonsten lad die DB komprimiert/repariert und gezippt hie hoch...
Titel: Re: Suche im Unterformular
Beitrag von: Beaker s.a. am April 06, 2012, 22:45:04
Hallo Franz,
Danke für Deine Erläuterungen bezügl. Nz.
gruss ekkehard
Titel: Re: Suche im Unterformular
Beitrag von: TomTom2903 am April 09, 2012, 22:17:07
Hallo Franz,
werde ich morgen gleich probieren. Danke mal so weit.
Noch einen schönen abend...
Tom
Titel: Re: Suche im Unterformular
Beitrag von: TomTom2903 am April 10, 2012, 08:29:55
Hallo Franz,
funktioniert einwandfrei! Vielen Dank

Noch eine Frage: Wie funktioniert es den auch ohne If-Clause? Möchte meinen Code natürlich verbessern.
Und da ich ja nur unter einer erfüllten Bedingung meine String Datentypen mit Daten füllen möchte, weiß ich gearde nicht wie das ohne eine If Anweisung gehen soll...

Zitat von: DF6GL am April 05, 2012, 19:06:57
Hallo,

die Nz-Funktion greift logisch nicht bei der Text-Eigenschaft eines Steuerelementes.  Diese Eigenschaft hat den Datentyp String . Besser:

   If Len(Me!txtVerband.Text) <> 0 Then

wobei diese IF-Bedingungen eh überflüssig sind.

Grüße
Tom
Titel: Re: Suche im Unterformular
Beitrag von: DF6GL am April 10, 2012, 09:07:50
Hallo,

verstehe die Frage nicht ganz...  

Der Code könnte so vereinfacht werden:





Option Explicit
Private strVerband As String,    strKonzern  As String,    strSuchbegriff  As String,    strOrtsuche  As String

Private Sub Form_Load()
  strVerband = ""
   strKonzern = ""
   strSuchbegriff = ""
   strOrtsuche = ""

End Sub

Private Sub txtVerband_Change()
   Call FktLstKunde
End Sub

Private Sub txtKonzern_Change()
   Call FktLstKunde
End Sub

Private Sub txtSuchbegriff_Change()
    Call FktLstKunde
End Sub


Private Sub txtOrtsuche_Change()
    Call FktLstKunde
End Sub

Private Function FktLstKunde()
   Me!lstKunden.RowSource = "Select *" & _
                           "FROM qry_Sys_Kundensuche " & _
                           "WHERE Verban like '" & Me!txtVerband & "*' and Konzer like '" & Me!txtKonzern & "*' " _
                           & "and Name1 LIKE '" & Me!txtSuchbegriff & "*' and Ort like '" & Me!txtOrtsuche & "*'"
   Me!lstKunden.Requery   'vermutlich auch überflüssig
End Function

Titel: Re: Suche im Unterformular
Beitrag von: TomTom2903 am April 10, 2012, 09:34:29
Hallo Franz,
hab das auch so schon ausprobiert. Allerdings funktioniert das nicht.

Alle Me!txt... (ohne .Text am ende) lasse ich im Direktbereich ausgeben. Sie sind immer mit dem Wert "Null" belegt.
Die Querry wird daher auch nur mit Null Datensätzen bestückt und die Ergebnisse nicht gefiltert.

Nehme ich jetzt in die Querry alle Me!txt....Text (.Text am Ende) bekomme ich die Fehlermeldung "Laufzeitfehler 2185" Sie können auf die Eigenschaft oder Methode eines Steuerelement nur verweisen, wenn das Steuerelement den Fokus hat.

Ich bräuchte ja wenn aber die Text Felder, damit ich die Querry mit den entsprechenden Daten füttern kann.

Gruß
Thomas
Titel: Re: Suche im Unterformular
Beitrag von: DF6GL am April 10, 2012, 12:06:53
Hallo,

ja, Du hast Recht, habe die Geschichte mit dem Change-Ereignis und der Text-Eigenschaft nicht mehr  "bedacht" ....

Insforn mußt Du Zuweisung an die Variablen weiter verwenden, diese If-Bedingungen sind aber weiterhin überflüssig.