Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Suchfunktion im formular





Frage

hi all :) ich hab folgendes Problem: Es is so, ich soll in einem Formular eine Suche einbauen, mit der man sämtliche Datenfelder durchsucht und dann der entsprechende Datensatz aufgezeigt wird, nur krieg ich genau das nicht hin. Ich habe in diesem Formular eine Suche mit hilfe des Formularfilters eingebaut.Da hab ich im Filter das Datenfeld "PC" genommen und unter Kriterien [Suchbegriff] eingegeben. So und wenn ich das dann starte, kommt eine Parameterabfrage. Is ja soweit kein Ding, aber wenn ich dann in dem Filter mehrer Datenfelder eingeben, um also in allen Datenfeldern suchen zu können, funktionniert das nicht!!! Muss ich da in jedem einzelnen Datenfeld unter Kriterien [Suchbegriff] eingeben oder was anderes?? wenn ihr aber einen anderen Vorschlag bezüglich der Suche im Formular habt, dann teilt mir das bitte mit!! Bin für jede Hilfe dankbar :-)

Antwort 1 von takeshi

Hi,

Also soweit ich das verstanden habe willst du mit mehreren Kriterien Datensätze herausfiltern.

Ich würde vorschlagen du machst das mit einer Abfrage. Da ich aber annehme, dass es lästig ist für jedes Kriterium einen Dialog für eine Parameterabfrage angezeigt zu bekommen, schlage ich weiter vor die Abfrage mit globalen Variablen aufzubauen.

Als erstes erstellst du ein Modul in dem für jedes benötigte Datenfeld eine globale Variable definierst und eine dazugehörige Funktion erstellst.

public var_größe as double
public var_farbe as string

public function größe_func as double
größe_func = var_größe
end function

public function farbe_func as string
farbe_func = var_farbe
end function


Mit diesen Befehlen richtest du globale Variablen ein die du dann in einer Abfrage einfügen kannst und per Formular abfragen lässt.

Als nächstes erstellst du ein leeres Formular in dem du alle Suchkriterien als Kombinations-, Text- oder Listen einfügst. Also einfach für jedes Suchkriterium ein Textfeld aufziehen. In diese Textfelder können dann die Suchkrietrien eingegeben werden und mit einem Klick auf einen Button kann dann das gewünschte Formular mit den gewünschten Datensätzen angezeigt werden.

Beim Button gibst du nun den Code ein der die DAten aus den TExtfeldern ausliest und in die globalen Variablen speichert. zB

var_größe = txt_größe


Nun hätten wir die Daten die wir für die Abfrage brauchen. Nun kommen wir zu den Kritierien in der Abfrage

Öffne die Abfrage im Entwurfsmodus und tipp bei den gewünschten Feldern bei Kriterien die Funktionsnamen ein
zB beim Feld größe tippst du bei Kriterien
größe_func
ein.

Das ganze wird nun folgendermaßen ablaufen. Der Benutzer öffnet das Formular in dem die Suchkrietrien einzugeben sind. Nachdem er die Felder ausgefüllt hat klickt er auf einen Button, der die Funktion hat das eigentlich Formular zu öffnen. Bevor das Fomular allerdings geöffnet werden, werden vorher alle eingegebenen Daten in die Globalen Variablen gespeichert. Beim Öffnen des Formulars (dass auf der Abfrage basieren muss) werden nun die Kriterien automatisch mit den Inhalten der globalen Variablen gefüllt und somit werden die gewünschten Daten abgefragt und im Formular angezeigt.

Anstatt Textfeldern kannst du natürlich auch Kombinations- oder Listenfelder benützen die schon Daten enthalten und die Benutzerfreundlichkeit zu erhöhen.

Spiel ein wenig herum und du wirst sehen es ist wirklich angenehm mit solchen Funktionen zu arbeiten.

Ich hoffe du hast alles verstanden.

Falls noch was unklar ist, melde dich einfach

mfg

takeshi

Antwort 2 von gummihuhn21

moin :)

dankeschön schon mal für deine mühe!
also ich hab jetzt alles der reihe nach so gemacht wie du es mir beschrieben hast.

Ich hab ein modul für sämtliche feldnamen (14 an der Zahl) erstellt. So und dann hab ich ein neues Formular erstellt mit eben diesen 14 Feldern.
Jetzt hab ich das Problem mit dem Button, welchen ich nehmen muss!! Ich hab die Befehlsschaltfläche "Formular öffnen" genommen, dann das Formular ausgewählt, welches zum Schluß die Ergebnisse anzeigen soll (Suchendformular), dann hab ich "Das Formular öffnen und alle Datensätze anzeigen" ausgewählt und dem Button die Bezeichnung "Suche starten" gegeben!Unter Eigenschaften "beim Klicken" hab ich jetzt "Ereignisprozedur" stehen und in dem VBA folgendes: var_PC = txt_PC usw. (für alle 14 Felder halt)!!!!

Daraufhin hab ich eine neue Abfrage namens Suchabfrage erstellt und in den 14 Feldern unter Kriterien "PC_func" eingetragen, aber wenn ich dann auf ausführen klicke, zeigt es mir keine Daten an!Is des normal???

Jap und wenn ich jetzt des Ausprobiere mit dem Suchformular, funktioniert des nicht, warum auch immer :-(

Was hab ich falsch gemacht??

Das sind die jeweiligen Codes:

1) Code des Buttons unter Eigenschaften "beim klicken" -> Ereignisprozedur


Private Sub Befehl55_Click()

var_PC = txt_PC
var_Beh = txt_Beh
var_Beschreibung = txt_Beschreibung
var_User = txt_User
var_Abteilung = txt_Abteilung
var_Asset = txt_Asset
var_Monitor = txt_Monitor
var_SFInvnr = txt_SFInvnr
var_OS = txt_OS
var_IP = txt_IP
var_Patchstecker = txt_Patchstecker
var_Drucker = txt_Drucker
var_Druckertyp = txt_Druckertyp
var_SFInvrDrucker = txt_SFInvnrDrucker

On Error GoTo Err_Befehl55_Click

Dim stDocName As String
Dim stLinkCriteria As String

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

Exit_Befehl55_Click:
Exit Sub

Err_Befehl55_Click:
MsgBox Err.Description
Resume Exit_Befehl55_Click

End Sub



2) Code des Moduls


Option Compare Database

Public var_PC As String
Public var_Beh As Double
Public var_Beschreibung As String
Public var_User As String
Public var_Abteilung As String
Public var_Asset As Double
Public var_Monitor As Double
Public var_SFInvnr As Double
Public var_OS As String
Public var_IP As String
Public var_Patchstecker As String
Public var_Drucker As Double
Public var_Druckertyp As String
Public var_SFInvnrDrucker As Double


Public Function PC_func() As String
PC_func = var_PC
End Function

Public Function Beh_func() As Double
Beh_func = var_Beh
End Function

Public Function Beschreibung_func() As String
Beschreibung_func = var_Beschreibung
End Function

Public Function User_func() As String
User_func = var_User
End Function

Public Function Abteilung_func() As String
Abteilung_func = var_Abteilung
End Function

Public Function Asset_func() As Double
Asset_func = var_Asset
End Function

Public Function Monitor_func() As Double
Monitor_func = var_Monitor
End Function

Public Function SFInvnr_func() As Double
SFInvnr_func = var_SFInvnr
End Function

Public Function OS_func() As String
OS_func = var_OS
End Function

Public Function IP_func() As String
IP_func = var_IP
End Function

Public Function Patchstecker_func() As String
Patchstecker_func = var_Patchstecker
End Function

Public Function Drucker_func() As Double
Drucker_func = var_Drucker
End Function

Public Function Druckertyp_func() As String
Druckertyp_func = var_Druckertyp
End Function

Public Function SFInvnrDrucker_func() As Double
SFInvnrDrucker_func = var_SFInvnrDrucker
End Function


Prüf die Codes bitte auf ihre Richtigkeit.

Ein riesen Dankeschön schonaml im voraus :o)

LG Christina

Antwort 3 von takeshi

Also der Code des Moduls ist absolut korrekt. Der code des Buttons auf den ersten Blick auch.

Bei den Kriterien der Abfrage muss in jedes Feld die dazugehörige Funktion eintragen.
So wie ich das oben verstanden habe hast du bei jedem Feld die Funktion PC_func eingetragen.

Wenn das der Fall ist kann es nicht funktionieren, da ja bei jedem Feld der Inhalt von PC_func eingetragen wird.

jede funktion muss zum dazugehörigen Feld bei Kriterien eingetragen werden.

Falls du das aber gemacht hast, musst du im Suchformular, ALLE Felder mit richtigen Daten ausfüllen. Gib einfach für jedes Feld die Daten ein damit nur ein gewisser Datensatz angezeigt wird. Also alle Daten eines Datensatzes.

Wenn du ein Feld leer lässt, funktioniert das ganze nicht. Wenn nicht alle Felder ausgefüllt werden müssen, kann ich dir derzeit leider keinen Tipp geben. Da muss ich selbst erst mal nachsehen wie das funktioniert.

Oder vielleicht hat ein anderer eine Idee wie das zu bewältigen ist.

Wenn alle oben stehenden Tipps nichts helfen, dann melde dich nochmal. Ich werde dir dann eine kleine Demo-Datenbank basteln in dem diese Funktion eingebaut ist.

Meine E-Mail-Adresse ist webmaster@otakuland.at
Melde dich ruhig wenn du nicht klar kommst.

mfg

takeshi

Antwort 4 von El Bobbele

Moin Takeshi!

Mit der Vorgehensweise müssen tatsächlich alle Felder ausgefüllt werden. Im obigen Beispiel werden String- und Double-Variablen verwendet. Werden diese Variablen nicht gesetzt, dann würde Access die Standardwerte benutzen, die da lauten "" (leere Zeichenfolge) und 0. Danach zu filtern macht sicherlich keinen Sinn.

In obigen Codeauszug werden stattdessen alle Variablen aus den Textfeldern gefüllt. Enthält ein Textfeld keinen Wert dann wird NULL an die Variablen zugewiesen und das mögen String und Double überhaupt nicht. Es wundert mich, dass gummhihuhn hier keine Laufzeitfehler erhält? *fragendguck*

Beide Resultate sind für ein Suchformular leider ungeeignet, wenn mindestens ein Feld leer bleiben kann/soll. Und im Falle von gummihuhn gehe ich sehr davon aus, dass nicht alle Felder bestückt werden müssen. Die einzige Lösung hier ist, jedes einzelne Feld auf einen vorhandenen Wert zu prüfen und dann Feld für Feld eine WHERE-Bedingung aufzubauen:

Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim strSQLWhere As String

'SQL-Anweisung ohne WHERE-Abschnitt hier festlegen
strSQL = "SELECT Dies FROM Das"

If Not IsNull(Me.txt_PC) Then
    strSQLWhere = "PC='" & Me.txt_PC & "' And "
End If

If Not IsNull(Me.txt_Asset) Then
    strSQLWhere = strSQLWhere & "Asset=" & Me.txt_Asset & " And "
End If

'Obige If-Bedingungen für jedes Feld wiederholen

'Letztes "And" abschneiden
If Right(strSQLWhere, 5) = " And " Then
    strSQLWhere = Left(strSQLWhere, Len(strSQLWhere) - 5)
End If

'SQL zusammenbauen
If Len(strSQL) > 0 Then
    strSQL = strSQL & " WHERE (" & strsqlwhere & ");"
Else
    strSQL = strSQL & ";"
End If

'SQL in der Abfrage des Berichts speichern
set db = CurrentDb
Set qdf = db.QueryDefs("AbfrageVomBericht")
qdf.SQL = strSQL
qdf.Close

'Hier Bericht öffnen


Ich hoffe, der Codeanriss reicht zur Realisierung. Ansonsten bitte nochmals melden, das bekommen wir auf jeden Fall in den Griff.

Gruss
El Bobbele

Antwort 5 von takeshi

Servus Bobbele,

deine Vorgehensweise ist tatsächlich die bessere im Fall von gummihuhn. Meine Vorgehensweise habe ich deshalb vorgeschlagen, weil ich 1. nicht wusste wieviele Suchfelder sie benötig (bei 14 währe es natürlich unpraktisch jedes Feld immer aufüllen zu müssen) und 2. ist das die einzige Variante, die ich immer anwende. Bei meinen Datenbanken nutze ich immer nur wenige Felder, die auch alle ausgefüllt werden müssen. Aber das ist bei mir immer beabsichtigt.

@ gummihuhn. Ich empfehle die Vorgehensweise von El Bobbele anzuwenden, da meine in deinem Fall zwar auch funktionieren würde, aber nicht gerade für schnelles Arbeiten dient.

mfg

takeshi

Antwort 6 von gummihuhn

hi bobbele!!

danke für deine Hilfe.
Anbei der Code, den ich unter dem Button "Suche starten" im Feld "beim klicken" drin stehen hab.
ich bekomm immer folgende Fehlermeldung: Fehler beim Kompillieren - Methode oder Datenobjekt nicht gefunden
Und da markiert er mir immer des txt_PC in dieser Zeile --> If Not IsNull(Me.txt_PC) Then
Was ist da falsch???

Nochwas:
1)Stimmt die SQL-Anweisung ohne WHERE- Anweisung??? da hab ich einfach sämtliche, benötigten Felder eingetragen und die Tabelle, in der all diese Datensätze drin stehn.



Hier der Code komplett:

Option Compare Database


Private Sub Befehl55_Click()

var_PC = txt_PC
var_Beh = txt_Beh
var_Beschreibung = txt_Beschreibung
var_User = txt_User
var_Abteilung = txt_Abteilung
var_Asset = txt_Asset
var_Monitor = txt_Monitor
var_SFInvnr = txt_SFInvnr
var_OS = txt_OS
var_IP = txt_IP
var_Patchstecker = txt_Patchstecker
var_Drucker = txt_Drucker
var_Druckertyp = txt_Druckertyp
var_SFInvrDrucker = txt_SFInvnrDrucker


Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim strSQLWhere As String

'SQL-Anweisung ohne WHERE-Abschnitt hier festlegen
strSQL = "SELECT tblHardware.PC, tblHardware.Beh, tblHardware.Beschreibung, tblHardware.User, tblHardware.Abteilung, tblHardware.Asset, tblHardware.Monitor, tblHardware.SFInvnr, tblHardware.OS, tblHardware.IP, tblHardware.Patchstecker, tblHardware.Drucker, tblHardware.Druckertyp, tblHardware.SFInvnrDrucker FROM tblHardware"



If Not IsNull(Me.txt_PC) Then
strSQLWhere = "PC='" & Me.txt_PC
End If

If Not IsNull(Me.txt_Beh) Then
strSQLWhere = strSQLWhere & "Beh=" & Me.txt_Beh
End If

If Not IsNull(Me.txt_Beschreibung) Then
strSQLWhere = strSQLWhere & "Beschreibung=" & Me.txt_Beschreibung
End If

If Not IsNull(Me.txt_User) Then
strSQLWhere = strSQLWhere & "User=" & Me.txt_User
End If

If Not IsNull(Me.txt_Abteilung) Then
strSQLWhere = strSQLWhere & "Abteilung=" & Me.txt_Abteilung
End If

If Not IsNull(Me.txt_Asset) Then
strSQLWhere = strSQLWhere & "Asset=" & Me.txt_Asset
End If

If Not IsNull(Me.txt_Monitor) Then
strSQLWhere = strSQLWhere & "Monitor=" & Me.txt_Monitor
End If

If Not IsNull(Me.txt_SFInvnr) Then
strSQLWhere = strSQLWhere & "SFInvnr=" & Me.txt_SFInvnr
End If

If Not IsNull(Me.txt_OS) Then
strSQLWhere = strSQLWhere & "OS=" & Me.txt_OS
End If

If Not IsNull(Me.txt_IP) Then
strSQLWhere = strSQLWhere & "IP=" & Me.txt_IP
End If

If Not IsNull(Me.txt_Patchstecker) Then
strSQLWhere = strSQLWhere & "Patchstecker=" & Me.txt_Patchstecker
End If

If Not IsNull(Me.txt_Drucker) Then
strSQLWhere = strSQLWhere & "Drucker=" & Me.txt_Drucker
End If

If Not IsNull(Me.txt_Druckertyp) Then
strSQLWhere = strSQLWhere & "Druckertyp=" & Me.txt_Druckertyp
End If

If Not IsNull(Me.txt_SFInvnrDrucker) Then
strSQLWhere = strSQLWhere & "SFInvnrDrucker=" & Me.txt_SFInvnrDrucker
End If

'Obige If-Bedingungen für jedes Feld wiederholen

'Letztes "And" abschneiden

If Right(strSQLWhere, 5) = " And " Then
strSQLWhere = Left(strSQLWhere, Len(strSQLWhere) - 5)
End If

'SQL zusammenbauen
If Len(strSQL) > 0 Then
strSQL = strSQL & " WHERE (" & strSQLWhere & ");"
Else
strSQL = strSQL & ";"
End If

'SQL in der Abfrage des Berichts speichern
Set db = CurrentDb
Set qdf = db.QueryDefs("Suchabfrage")
qdf.SQL = strSQL
qdf.Close


Dim stDocName As String
Dim stLinkCriteria As String

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



End Sub

Antwort 7 von gummihuhn

Ergänzung zu NOCHWAS: :o)
2) Muss ich an dem Punkt " SQL zusammenbauen"
etwas verändern?? wenn ja was?

3) Bleibt der Punkt "SQL in der Abfrage des
Berichts speichern" in diesem Code oder wo
muss ich den eintragen??? bin da nämlich nicht
ganz dahinter gestiegen :o), wie gehe ich den
da vor??

4) zu dieser Zeile:
Set qdf = db.QueryDefs("Suchabfrage")
--> Welche Abfrage soll ich da eingeben??


So des wärs fürs erste

LG Christina :O)

Antwort 8 von El Bobbele

Hallo Christina!

1) Ja, das ist so perfekt.

2) Eigentlich müsste ich hier mit Nein antworten, dummerweise ist mir hier beim Tippen ein Fehler unterlaufen. Wenn keine Bedingung festgelegt wird, tritt beim derzeitigen Code ein Laufzeitfehler auf. :-/ Führe bitte folgende Zeilenersetzung durch:
'Falsch:
If Len(strSQL) > 0 Then
'Richtig:
If Len(strSQLWhere) > 0 Then


3/4) Beide Punkte zielen auf die Abfrage, die in der Eigenschaft "Datenherkunft" des betroffenen Berichts genannt wird. Bisher hat dein Bericht doch sicherlich eine reguläre Abfrage verwendet? Oder steht dort ein reiner SQL-Ausdruck drin (SELECT Feld1, ... FROM...)? Im zweiten Fall solltest du eine neue Abfrage anlegen mit irgendeinem Inhalt - der wird sowieso beim ersten Ausführen überschrieben. Den Namen dieser Abfrage trägst du dann in die besagte Eigenschaft "Datenherkunft" des Berichts ein.

In deinem Codeauszug hast du beim "...QueryDefs..." den Begriff "Suchabfrage" verwendet. Dieses Wort ersetzt du nur durch den Namen der Abfrage, die am Bericht dranhängt, womit dieser Codeblock ebenfalls fertig ist.

Ganz am Ende deines Codes öffnest du ein Formular, dem Namen nach sogar das Formular, in dem sich der ganze aufgeführte Code befinden sollte! Dort sollte natürlich der Bericht geöffnet werden. :-) Führe demnach folgende Codeersetzungen durch:

Alt:
Dim stDocName As String
Dim stLinkCriteria As String

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

Neu:
DoCmd.OpenReport "<Hier den Namen des Berichts eintragen>", acViewPreview


Jetzt noch zum Anfang deines Beitrages. Der Laufzeitfehler mit dem txt_PC-Feld kann eigentlich nur auftreten, wenn es kein Steuerelement mit diesem Namen in deinem Suchformular gibt. Bist du wirklich sicher, dass hier kein Tippfehler vorliegt? Befindet sich der ganze Code auch wirklich im richtigen Formular (das mit den vielen Textfeldern)?

Ausserdem hast du bei keiner der strSQLWhere-Aufbauzeilen ein " And " hinten angegeben. Das muss zwingend an jedem Zeilenende angefügt werden:

Falsch:
If Not IsNull(Me.txt_PC) Then
    strSQLWhere = "PC='" & Me.txt_PC
End If

If Not IsNull(Me.txt_Beh) Then
    strSQLWhere = strSQLWhere & "Beh=" & Me.txt_Beh

Richtig:
If Not IsNull(Me.txt_PC) Then
    strSQLWhere = "PC='" & Me.txt_PC & "' And "
End If

If Not IsNull(Me.txt_Beh) Then
    strSQLWhere = strSQLWhere & "Beh=" & Me.txt_Beh & " And "
End If


Du hast in deiner Bedingung offensichtlich Felder vom Datentyp Text und Zahl. Achte darauf, dass du bei allen Bedingungen mit Text-Datentypen den Wert in Hochkommas ( ' ) fasst, das ist bei Text zwingend vorgeschrieben:

Text-Datentyp:
strSQLWhere = "PC='" & Me.txt_PC & "' And "

Zahlen-Datentyp:
strSQLWhere = "Beh=" & Me.txt_Beh & " And "


Das war es erstmal von meiner Seite, jetzt bist du wieder dran. :-)

Gruss
El Bobbele

Antwort 9 von gummihuhn

hi bobbele :o),

also dank deiner Verbesserungen und meines a weng Rumgespiele, haut des jetzt so einigermaßen hin, d.h. wenn ich jetzt in einem Feld etwas eingebe und auf suchestarten klicke, öffnen sich erst Parameterabfragen und zwar 3 Stück. wenn ich die mit ok wegklicke, geht scho mal die abfrage auf, aber es steht noch nix drin!!
Ohne Pause :) kommen wieder an die 10 Parameterabfragen, die ich wiederum mit ok wegklicke und erst dann zeigt es mir den gesamten gesuchten Datensatz im Bericht an!!!!
Soweit ja ganz ok allerdings möchte ich den datensatz sofort angezeigt bekommen ohne weiter parameterabfragen. Geht das den nicht???

Aber wenn ich dann erneut suche, zeigt es mir in der abfrage den zuvorgesuchten datensatz und den neuen dann, nach dem ewigen wegklicken der parameter, im bericht :o)
Kann man diesen Zwischenschritt mit der abfrage nicht weglassen?? Irgendwie??

joa des wars dann mal wieder von mir

bis dann :)
lg christina


Anbei der nun funktionierende code :

Private Sub Befehl61_Click()
On Error GoTo Err_Befehl61_Click

Dim stDocName As String

stDocName = "Suchabfrage2"
DoCmd.OpenQuery stDocName, acNormal, acEdit


Dim db As Database
Dim qdf As QueryDef
Dim strSQL As String
Dim strSQLWhere As String

'SQL-Anweisung ohne WHERE-Abschnitt hier festlegen
strSQL = "SELECT Hardware.PC, Hardware.Beh, Hardware.Beschreibung, Hardware.User, Hardware.Abteilung, Hardware.Asset, Hardware.Monitor, Hardware.SFInvnr, Hardware.OS, Hardware.IP, Hardware.Patchstecker, Hardware.Drucker, Hardware.Druckertyp, Hardware.SFInvnrDrucker FROM Hardware"



If Not IsNull(Me!PC) Then
strSQLWhere = "PC='" & Me!PC & "' And "
End If

If Not IsNull(Me!Beh) Then
strSQLWhere = strSQLWhere & "Beh=" & Me!Beh & " And "
End If

If Not IsNull(Me!Beschreibung) Then
strSQLWhere = strSQLWhere & "Beschreibung='" & Me!Beschreibung & "' And "
End If

If Not IsNull(Me!User) Then
strSQLWhere = strSQLWhere & "User='" & Me!User & "' And "
End If

If Not IsNull(Me!Abteilung) Then
strSQLWhere = strSQLWhere & "Abteilung='" & Me!Abteilung & "' And "
End If

If Not IsNull(Me!Asset) Then
strSQLWhere = strSQLWhere & "Asset=" & Me!Asset & " And "
End If

If Not IsNull(Me!Monitor) Then
strSQLWhere = strSQLWhere & "Monitor=" & Me!Monitor & " And "
End If

If Not IsNull(Me!SFInvnr) Then
strSQLWhere = strSQLWhere & "SFInvnr=" & Me!SFInvnr & " And "
End If

If Not IsNull(Me!OS) Then
strSQLWhere = strSQLWhere & "OS='" & Me!OS & "' And "
End If

If Not IsNull(Me!IP) Then
strSQLWhere = strSQLWhere & "IP='" & Me!IP & "' And "
End If

If Not IsNull(Me!Patchstecker) Then
strSQLWhere = strSQLWhere & "Patchstecker='" & Me!Patchstecker & "' And "
End If

If Not IsNull(Me!Drucker) Then
strSQLWhere = strSQLWhere & "Drucker=" & Me!Drucker & " And "
End If

If Not IsNull(Me!Druckertyp) Then
strSQLWhere = strSQLWhere & "Druckertyp='" & Me!Druckertyp & "' And "
End If

If Not IsNull(Me!SFInvnrDrucker) Then
strSQLWhere = strSQLWhere & "SFInvnrDrucker=" & Me!SFInvnrDrucker & " And "
End If

'Obige If-Bedingungen für jedes Feld wiederholen

'Letztes "And" abschneiden

If Right(strSQLWhere, 5) = " And " Then
strSQLWhere = Left(strSQLWhere, Len(strSQLWhere) - 5)
End If

'SQL zusammenbauen
If Len(strSQLWhere) > 0 Then
strSQL = strSQL & " WHERE (" & strSQLWhere & ");"
Else
strSQL = strSQL & ";"
End If

'SQL in der Abfrage des Berichts speichern
Set db = CurrentDb
Set qdf = db.QueryDefs("Suchabfrage2")
qdf.SQL = strSQL
qdf.Close



DoCmd.OpenReport "Hardwareberichtneu", acViewPreview


Exit_Befehl61_Click:
Exit Sub

Err_Befehl61_Click:
MsgBox Err.Description
Resume Exit_Befehl61_Click

End Sub





Antwort 10 von gummihuhn

hi du :)

es geht doch, habs hinbekommen. Nun will ich aber nicht einen Bericht zum Schluß haben, sondern ein
Formular und zwar genauso eins vom Look her wie das Formular, auf dem ich die Suche aufrufe!!!

als kleine erklärung:

Hardwareformular -> Suchformular -> Hardwareformular2 (sozusagen :o))

ich hoffe du verstehst mich !!??

dankeschön schonmal im voraus :o)

lg christina

Antwort 11 von El Bobbele

hi du! :-)

Ja, jetzt sieht die Sache schon wesentlich besser aus.

Am Anfang deines Codes gibt es noch drei Zeilen, die können ersatzlos gestrichen werden:

Dim stDocName As String

stDocName = "Suchabfrage2"
DoCmd.OpenQuery stDocName, acNormal, acEdit

Mit diesen drei Zeilen hast du vor dem Aufbau der neuen Abfrage die alte, gespeicherte Version auf den Bildschirm geholt. Das willst du doch nicht wirklich, oder?

Statt eines Berichts kannst du natürlich auch ein Formular öffnen. Du musst das Formular an die "Suchabfrage2"-Abfrage binden und die DoCmd.OpenReport-Zeile etwas umschreiben:

Alt:
DoCmd.OpenReport "Hardwareberichtneu", acViewPreview

Neu:
DoCmd.OpenForm "<Hier Formularname einfügen>"

Damit sollten wir dann am Ziel angekommen sein. :-)


Im Übrigen geht das alles etwas kürzer, guckst du hier:
Option Compare Database
Option Explicit

Private Sub Befehl61_Click()
On Error GoTo Err_Befehl61_Click
    Dim strSQLWhere As String
    
    If Not IsNull(Me!PC) Then
        strSQLWhere = "PC='" & Me!PC & "' And "
    End If
    
    If Not IsNull(Me!Beh) Then
        strSQLWhere = strSQLWhere & "Beh=" & Me!Beh & " And "
    End If
    
    If Not IsNull(Me!Beschreibung) Then
        strSQLWhere = strSQLWhere & "Beschreibung='" & Me!Beschreibung & "' And "
    End If
    
    If Not IsNull(Me!User) Then
        strSQLWhere = strSQLWhere & "User='" & Me!User & "' And "
    End If
    
    If Not IsNull(Me!Abteilung) Then
        strSQLWhere = strSQLWhere & "Abteilung='" & Me!Abteilung & "' And "
    End If
    
    If Not IsNull(Me!Asset) Then
        strSQLWhere = strSQLWhere & "Asset=" & Me!Asset & " And "
    End If
    
    If Not IsNull(Me!Monitor) Then
        strSQLWhere = strSQLWhere & "Monitor=" & Me!Monitor & " And "
    End If
    
    If Not IsNull(Me!SFInvnr) Then
        strSQLWhere = strSQLWhere & "SFInvnr=" & Me!SFInvnr & " And "
    End If
    
    If Not IsNull(Me!OS) Then
        strSQLWhere = strSQLWhere & "OS='" & Me!OS & "' And "
    End If
    
    If Not IsNull(Me!IP) Then
        strSQLWhere = strSQLWhere & "IP='" & Me!IP & "' And "
    End If
    
    If Not IsNull(Me!Patchstecker) Then
        strSQLWhere = strSQLWhere & "Patchstecker='" & Me!Patchstecker & "' And "
    End If
    
    If Not IsNull(Me!Drucker) Then
        strSQLWhere = strSQLWhere & "Drucker=" & Me!Drucker & " And "
    End If
    
    If Not IsNull(Me!Druckertyp) Then
        strSQLWhere = strSQLWhere & "Druckertyp='" & Me!Druckertyp & "' And "
    End If
    
    If Not IsNull(Me!SFInvnrDrucker) Then
        strSQLWhere = strSQLWhere & "SFInvnrDrucker=" & Me!SFInvnrDrucker & " And "
    End If
    
    'Letztes "And" abschneiden
    If Right(strSQLWhere, 5) = " And " Then
        strSQLWhere = Left(strSQLWhere, Len(strSQLWhere) - 5)
    End If
    
    DoCmd.OpenForm "<Hier Formularname eintragen>", acNormal, , strSQLWhere
Exit_Befehl61_Click:
    Exit Sub

Err_Befehl61_Click:
    MsgBox Err.Description
    Resume Exit_Befehl61_Click
End Sub


Im Gegensatz zur ursprünglichen Version fehlen hier die Zeilen, welche die Abfragengenerierung direkt betreffen. Wenn du dem zu öffnenden Formular eine feste Abfrage mit dem Inhalt der bisherigen strSQL-Variable (SELECT...FROM...) OHNE Bedingungen hinterlegst, dann kannst du das Formular direkt beim Aufruf mit dem erzeugten Bedingungsausdruck filtern. Verwende dazu den WhereCondition-Parameter von der OpenForm-Anweisung. Ich muss Tomaten auf den Augen gehabt haben, dass ich das mit dem überflüssigen Aufwand nicht früher gemerkt habe.

Das ist alles kein Muss! Dein bisheriger Code erfüllt im Endergebnis den gleichen Zweck. Der neue Codeblock erreicht nur das gleiche Ergebnis mit weniger Aufwand. Falls du die neue Fassung nutzen willst, dann tausche nur dein ganzes Click-Ereignis mit der neuen Fassung aus und erstelle die Abfrage für das Formular. Und natürlich noch den Formularnamen eintragen am Ende. Im anderen (alten) Fall arbeitest du nur die beiden ersten Codeabschnitte oben ab und ignorierst den dritten Block.

Gruss
El Bobbele

Antwort 12 von gummihuhn

hi bobbele :)

des funtioniert alles :o)
dankeschön :)

jetzt hab ich wieder ein problem und zwar:
möchte ich dasselbefür eine 2. tabelle erstellen, nur kommt dann da die fehlermeldung: Objekt unterstüzt diese Eigenschaft oder Methode nicht!

Des passiert wenn ich auf den "Suche starten"-Button klicke. Woran liegt es, dass ich diese Fehlermeldung bekomme??

Dankeschön schonmal :)

lg christina

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: