Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Formular basierend auf Abfrage zuerst leer Starten

1,164 views
Skip to first unread message

Ralf Dorn

unread,
Aug 5, 2009, 4:37:01 PM8/5/09
to
Hallo alle zusammen,

ich habe ein Formular das auf eine Abfrage zugreift. In der Abfrage wird auf
ein Feld des Formulars zugegriffen. Ich möchte nun erreichen, dass beim
ersten Aufruf keine Daten angezeigt werden sondern erst wenn ich in dem Feld
das in der Abfrage verwendet wird etwas eingebe.
Ich habe auch zum im Ereignis "NachAktualisierung" den erneuten Aufruf der
Abfrage eingegeben.
Das funktioniert auch alles. Nur die eine Sache, dass beim Start immer der
erste Datensatz angezeigt wird.

Ich muss aber auch Datensätze bearbeiten können.

Einen schönen Gruß

Ralf Dorn

Jens Schilling

unread,
Aug 6, 2009, 4:12:38 AM8/6/09
to
Hallo, Ralf

Ralf Dorn wrote:
> ich habe ein Formular das auf eine Abfrage zugreift. In der Abfrage

> wird auf ein Feld des Formulars zugegriffen. Ich m�chte nun


> erreichen, dass beim ersten Aufruf keine Daten angezeigt werden
> sondern erst wenn ich in dem Feld das in der Abfrage verwendet wird
> etwas eingebe.
> Ich habe auch zum im Ereignis "NachAktualisierung" den erneuten
> Aufruf der Abfrage eingegeben.
> Das funktioniert auch alles. Nur die eine Sache, dass beim Start
> immer der erste Datensatz angezeigt wird.
>

> Ich muss aber auch Datens�tze bearbeiten k�nnen.

Trotz mehrfachem Lesens bin ich nicht sicher, ob ich Dich richtig verstehe;
ich versuch's trotzdem mal ;-)

Ein Formular besitzt die Eigenschaft "DataEntry", und daf�r zitiere ich
einmal die Hilfe:

Zitat:
Sie k�nnen mit der DataEntry-Eigenschaft angeben, ob ein gebundenes Formular
nur f�r die Dateneingabe ge�ffnet werden soll. Die Data Entry-Eigenschaft
gibt nicht an, ob Datens�tze hinzugef�gt werden k�nnen, sondern nur, ob
bestehende Datens�tze angezeigt werden.
Zitat Ende

Wenn ich Dein Anliegen nun richtig verstanden habe, k�nntest Du mit einem
Button und dem nachstehenden Einzeiler hin- und herschalten, also entweder
alle Datens�tze anzeigen, oder eben nur einen neuen Datensatz erfassen.

Me.DataEntry = Not Me.DataEntry

Aber, wie gesagt, ich bin nicht sicher, ob es das ist, was Du meinst.

--
Gruss
Jens

12. AEK - 10./11.10. + 31.10/1.11.2009, N�rnberg
http://www.donkarl.com/AEK


Ralf Dorn

unread,
Aug 6, 2009, 4:36:03 PM8/6/09
to
Hallo Jens,

> Wenn ich Dein Anliegen nun richtig verstanden habe, könntest Du mit einem

> Button und dem nachstehenden Einzeiler hin- und herschalten, also entweder

> alle Datensätze anzeigen, oder eben nur einen neuen Datensatz erfassen.


>
> Me.DataEntry = Not Me.DataEntry
>
> Aber, wie gesagt, ich bin nicht sicher, ob es das ist, was Du meinst.

Ich habe mich wahrscheinlich mal wieder zu umständlich ausgedrückt. Ich habe
ein Formular das als Datenquelle eine Abfrage hat. Ich will nun im Formular
einen Namen eingeben und dann soll die Abfrage ausgeführt werden.

Da ich beim Start des Formulars noch nichts eingegeben habe erhalte ich die
Abfrage nach dem wert für "Namen". Da lag der Fehler in meiner Fage ;-)

Also das Formular soll ohne meckern starten und erst mal nichts anzeigen.
Denn ich muss ja erst einen Namen eingeben und dann soll die Abfrage erst
ausgeführt werden.

Ich glaube jetzt habe ich es besser erklärt. Ich entschuldige mich für meine
schlechte Erklärung und hoffe trotzdem auf eine Antwort.

Gruß aus Ingolstadt

Ralf Dorn

Peter Doering

unread,
Aug 6, 2009, 5:39:40 PM8/6/09
to
Hallo,

Ralf Dorn wrote:

>> Wenn ich Dein Anliegen nun richtig verstanden habe, k锟絥ntest Du mit einem

>> Button und dem nachstehenden Einzeiler hin- und herschalten, also entweder

>> alle Datens锟絫ze anzeigen, oder eben nur einen neuen Datensatz erfassen.


>>
>> Me.DataEntry = Not Me.DataEntry
>>
>> Aber, wie gesagt, ich bin nicht sicher, ob es das ist, was Du meinst.
>

> Ich habe mich wahrscheinlich mal wieder zu umst锟絥dlich ausgedr锟絚kt. Ich habe

> ein Formular das als Datenquelle eine Abfrage hat. Ich will nun im Formular

> einen Namen eingeben und dann soll die Abfrage ausgef锟絟rt werden.


>
> Da ich beim Start des Formulars noch nichts eingegeben habe erhalte ich die

> Abfrage nach dem wert f锟絩 "Namen". Da lag der Fehler in meiner Fage ;-)


>
> Also das Formular soll ohne meckern starten und erst mal nichts anzeigen.
> Denn ich muss ja erst einen Namen eingeben und dann soll die Abfrage erst

> ausgef锟絟rt werden.

Im OP hast du geschrieben, dass der erste DS angezeigt werden sollte. Die
Vorgehensweise waere:

1. Die WHERE-Klausel aus der RecordSource des Formulars loeschen.
2. Nach Eingabe des Namens einen Filter auf das Formular setzen, das der
urspruenglichen WHERE-Klausel (ohne das Wort where) entspricht.

strBedingung = " Namensfeld = '" & Me!fldName.Value & "'"
Me.Filter = strBedingung
Me.FilterOn = True

Gruss - Peter

--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com

Karl Donaubauer

unread,
Aug 6, 2009, 6:39:40 PM8/6/09
to
Ralf Dorn wrote:
> ...

> Ich habe mich wahrscheinlich mal wieder zu umständlich ausgedrückt.
> Ich habe ein Formular das als Datenquelle eine Abfrage hat. Ich
> will nun im Formular einen Namen eingeben und dann soll die Abfrage
> ausgeführt werden.
>
> Da ich beim Start des Formulars noch nichts eingegeben habe erhalte
> ich die Abfrage nach dem wert für "Namen". Da lag der Fehler in
> meiner Fage ;-)
>
> Also das Formular soll ohne meckern starten und erst mal nichts
> anzeigen. Denn ich muss ja erst einen Namen eingeben und dann soll
> die Abfrage erst ausgeführt werden.
> ...

Du sprichst vermutlich von einem Parameterfenster.
Es ist nicht normal, dass ein solches erscheint, nur weil ein
Formularfeld leer ist, auf das sich die Datenherkunft bezieht.

In welcher Form wird es in der Abfrage verwendet?
Kriterium, eingetragener Parameter, Berechnung...?
Poste mal den SQL-Text der Abfrage.

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com + Anmeldung und Info zur
Access-Entwickler-Konferenz (AEK12), Oktober 2009, Nürnberg

Henry Habermacher

unread,
Aug 6, 2009, 11:19:17 PM8/6/09
to
Hallo Ralf

Ralf Dorn wrote:
> ich habe ein Formular das auf eine Abfrage zugreift. In der Abfrage wird
> auf ein Feld des Formulars zugegriffen. Ich möchte nun erreichen, dass
> beim ersten Aufruf keine Daten angezeigt werden sondern erst wenn ich in
> dem Feld das in der Abfrage verwendet wird etwas eingebe.
> Ich habe auch zum im Ereignis "NachAktualisierung" den erneuten Aufruf der
> Abfrage eingegeben.
> Das funktioniert auch alles. Nur die eine Sache, dass beim Start immer der
> erste Datensatz angezeigt wird.

Eine einfache Methode ist, das Formular zuerst mal an eine Dummy Datenquelle
zu binden (oder nicht zu binden).
Sobald beim Feld was eingegeben wurde (Feld_AfterUpdate Ereignis) machst Du
folgendes:

If Me.Recordsource = "DummyTable" Then
Me.Recordsource = "DeineAbfrage"
End If

Und schon wird die Abfrage Dein Feldinhalt schnappen und damit die Abfrage
gefiltert ausführen.

Wenn Du was eingeben willst, dann musst Du natürlich vorher auf die Abfrage
umschalten.

Eine Alternative ist, die Abfrage zuerst schon drin zu lassen aber beim
Form_Open diese ohne Datensätze anzeigen zu lassen. Das kannst Du erreichen,
indem Du einen Filter verwendest, der immer falsch zurückliefert:

Me.Filter = "0=1"
Me.FIlterOn = True

Wenn Du nun was im Suchfeld eingibst, setzt Du den Filter:
Me.Filter = "DeinFeld LIKE '" & Me!DeinFeld & "*'"
Me.FIlterOn = True

Eingeben kannst Du in diesem Fall immer, weil der Filter sich ja nicht auf
die neuen Datensätze wirkt. Allerdings solltest Du dann beim
Form_BeforeInsert im Fall, dass Me.NewRecord = True ist, den Filter so
setzen, dass der Datensatz nicht gleich wieder verschwindet, z.B. indem Du
diesen auf eines der eingegebenen Werte oder den erzeugten Autowert setzt.
Me.Filter = "DeineID=" & Me!DeineID
Me.FilterOn = True

Wie bereits Jens geschrieen hat, ist ebenfalls ein beliebter Ansatz mit
Me.DataEntry = True was zu machen, da dieses das Formular im Einfügemodus
öffnet, ohne einen Datensatz anzuzeigen. Den Filter kannst Du dann wie oben
ebenfalls nach der Aktualisierung Deines Suchfeldes setzen.

Gruss
Henry


--
AEK 12 - Anmeldung bei www.donkarl.com/?AEK
Microsoft MVP Office Access
Keine E-Mails auf Postings in NGs. Danke.
Access FAQ www.donkarl.com

Ralf Dorn

unread,
Aug 7, 2009, 3:34:01 AM8/7/09
to
Hallo alle zusammen,

danke für euere Hilfe. Ich denke, dass ich Peter's weg nehmen werde.

Vielen Dank nochmal.

Gruß

Ralf Dorn

Ralf Dorn

unread,
Aug 7, 2009, 3:39:01 AM8/7/09
to
Hallo Karl,

> In welcher Form wird es in der Abfrage verwendet?
> Kriterium, eingetragener Parameter, Berechnung...?
> Poste mal den SQL-Text der Abfrage.
>

SELECT Mietstellungen.Change, Mietstellungen.GeräteID, Mietstellungen.Name,
Mietstellungen.Vorname, Mietstellungen.Telefon, Mietstellungen.Abteilung,
Mietstellungen.Kostenstelle, Mietstellungen.Email, Mietstellungen.Lieferung,
Mietstellungen.Rückgabe, Mietstellungen.Bemerkung,
Mietstellungen.RückgabeTermin
FROM Mietstellungen
WHERE
(((Mietstellungen.GeräteID)=Trim([formulare]![Mietstellungen_GeräteId]![GeräteId])));

Wenn ich aber vorher das Formular als ungebunden eingegeben habe dann sind
mir alles Felder auf #Name gesprungen. Das war auch nicht im Sinne des
Erfinders.

Gruß

Ralf

Karl Donaubauer

unread,
Aug 7, 2009, 4:40:43 AM8/7/09
to

Ok. Der nächste Schritt wäre, exakt die Situation zu schildern und was
genau passiert. Da ist doch nix mit "Namen" etc. wie in deiner Schilderung.

Ist das obige die Datenherkunft des Formulares "Mietstellungen_GeräteId",
und dieses Formular willst du öffnen?

Ist das SQL-Statement eine gespeicherte Abfrage oder steht der
SQL-Text in der Eigenschaft Datenherkunft des Formulares?

Verwendest du diese Abfrage noch anderweitig im aktuellen Kontext,
in einem UFo oder einem Kombinationsfeld oder dergl. in dieser Weise,
also mit dem Formularbezug?

Was genau ist


[formulare]![Mietstellungen_GeräteId]![GeräteId]

?

Einfach ein gebundenes Feld im Formular, das du öffnest?
Das wäre seltsam, denn eine Filterung danach kann ja kaum
sinnvoll sein, wenn da nicht mehr dran hängt.

Wird das Feld GeräteId sonst irgendwie verwendet im Formular
oder in VBA-Codes oder Makros, die beim Öffnen oder Anzeigen
des Formulares ausgeführt werden?

Was genau steht im Parameterfenster, das beim Öffnen des
Formulares erscheint?

Der Grund für meine Fragen:
Wie ich schon schrieb, kommt kein Parameterfenster, wenn der
Feldbezug in der Datenherkunft einfach ein Steuerelement oder
Feldname aus dem zu öffnenden Formular ist und sonst nichts.
Egal ob dieses Feld leer ist oder nicht.

Das Formular sollte sich einfach ohne Datensätze öffnen.
Also genau das, was du willst, ohne, dass du irgenwelche Codes,
Tricks, Filtereien machen musst.

Wenn das bei dir nicht so ist, dann ist entweder noch etwas anderes
im Spiel, das du noch nicht verraten hast, oder deine Objekte haben
einen Schuss.

Ralf Dorn

unread,
Aug 7, 2009, 5:44:01 AM8/7/09
to
Hallo Henry,


> If Me.Recordsource = "DummyTable" Then
> Me.Recordsource = "DeineAbfrage"
> End If

Diese Methode funktioniert eigentlich ganz gut. Nur wenn er keinen Datensatz
dazu findet, legt er mir einen neuen an mit dem einen Feld und alle anderen
felder bleiben leer.

Kann ich irgendwie abfragen ob die Abfrage erfolgreich war? Oder mindestens
soll er keinen neuen Datensatz anlegen. Ich muss aber auch die Möglichkeit
haben eine gefundenen Datensatz zu editieren!

Gruß

Ralf Dorn

Ralf Dorn

unread,
Aug 7, 2009, 6:23:03 AM8/7/09
to
Hallo Karl,

entschuldige bitte aber ich habe einfach Name gewählt um ein Feld anzugeben.
Wenn in einer Antwort auf das Feld Name ein Quelltext geliefert wird muss ich
dieses Feld nur durch meinen Namen ersetzen.

Also ich denke es ist ganz einfach. Aber ich checke es nicht.

Ich habe eine Abfrage erstellt in der ich die GeräteID abfragen will. Also
wähle ich alle Felder aus und speichere die Abfrage ab. Dann habe ich ein
Formular über klick auf die Abfrage und dann Autoformular erzeugt. Dieses
Formular habe ich dann abgespeichert und dem Namen "Mietstellungen_GeräteId"
vergeben.

Im Formular habe ich im Feld GeräteID unter dem Ereignis "Nach
Aktualisierung" me.refresh eingegeben. Das würde auch alles funktionieren
wenn eben beim Aufruf des Formulars nicht die Abfrage nach der GeäteId kommen
würde.

Also einfach das Formular öffnen und erst mal nichts ausführen bis eine
geräteid eingegeben wurde und dann Enter oder tabulator usw. gedrückt wurde.
Dann erst die Abfrage starten.

Oder mache ich da was zu umständlich?

Gruß

Ralf Dorn


Henry Habermacher

unread,
Aug 7, 2009, 6:30:56 AM8/7/09
to
Hallo Ralf

Mit ein klein bisschen Erweiterung kriegen wir auch das hin:

Beim Form_Load machst Du folgende Zeile rein:
Me.AllowAdditions = False
Alternativ kannst Du das beim Formular auch fix einstellen, könnte aber
sein, dass die Einstellung dann und wann verloren geht, wenn Du debugst und
in den Entwurfsmodus wechselst. Bin aber nicht sicher, ob das auch fix ins
Formular geschrieben wird, wie der Filter.

Und dort wo Du dann auf die Abfrage umschaltest dann eben True

If Me.Recordsource = "DummyTable" Then
Me.Recordsource = "DeineAbfrage"

Me.AllowAdditions = True
End If

Karl Donaubauer

unread,
Aug 7, 2009, 6:52:27 AM8/7/09
to
Ralf Dorn wrote:
> ...

> Ich habe eine Abfrage erstellt in der ich die GeräteID abfragen
> will. Also wähle ich alle Felder aus und speichere die Abfrage ab.
> Dann habe ich ein Formular über klick auf die Abfrage und dann
> Autoformular erzeugt. Dieses Formular habe ich dann abgespeichert
> und dem Namen "Mietstellungen_GeräteId" vergeben.
>
> Im Formular habe ich im Feld GeräteID unter dem Ereignis "Nach
> Aktualisierung" me.refresh eingegeben. Das würde auch alles
> funktionieren wenn eben beim Aufruf des Formulars nicht die Abfrage
> nach der GeäteId kommen würde.
>
> Also einfach das Formular öffnen und erst mal nichts ausführen bis
> eine geräteid eingegeben wurde und dann Enter oder tabulator usw.
> gedrückt wurde. Dann erst die Abfrage starten.
>
> Oder mache ich da was zu umständlich?

Es ist nicht ganz klar, was du eigentlich erreichen willst mit dem
Formularbezug in der Abfrage. Es klingt etwas nach dem häufigsten
Fehler in diesem Zusammenhang, nämlich, dass ein gebundenes
Steuerelement für das Suchen oder Filtern von Daten verwendet
wird statt eines ungebundenen.

Mit einem gebundenen Steuerelement besteht immer die Gefahr
und Wahrscheinlichkeit, dass unnötige neue Datensätze angelegt
werden, bestehende verändert werden, und Klimmzüge in der
Programmierung und Gestaltung des Formulares nötig sind,
nur weil der Anwender eigentlich eine Filterung oder einen
Suchvorgang auslösen will.

Wenn dem also auch bei dir so ist, dann lege im Formularkopf
ein neues Steuerelement an, nenne es z.B. "txtSuchGId", lasse seine
Eigenschaft "Steuerelementinhalt" leer und verwende in der
Abfrage als Kriterium bei der GeräteId:

Forms!Mietstellungen_GeräteId!txtSuchGId

Nach Aktualisierung von txtGId verwendest du:

Me.Requery

Dann sollte sich das Formular ohne Datensätze öffnen und
nach Eigabe einer Id in txtSuchGId der entsprechende Datensatz
angezeigt werden, ohne weitere Klimmzüge.

Ralf Dorn

unread,
Aug 7, 2009, 8:15:01 AM8/7/09
to
Hallo Karl,

>Es klingt etwas nach dem häufigsten

>YFehler in diesem Zusammenhang, nämlich, dass ein gebundenes
>YSteuerelement für das Suchen oder Filtern von Daten verwendet
>wird statt eines ungebundenen.

Natürlich gehöre ich zu denen die den häufigsten Fehler machen. Es
funktioniert jetzt. Danke für deine Hilfe.

Nur eine Kleinigkeit hätte ich noch. Wenn kein Datensatz gefunden wird
möchte ich gerne eine Meldung ausgeben.

Wie gehe ich da vor?

Gruß

Ralf


Peter Doering

unread,
Aug 7, 2009, 8:26:05 AM8/7/09
to
Hallo,

Ralf Dorn wrote:

>>Es klingt etwas nach dem h�ufigsten
>>YFehler in diesem Zusammenhang, n�mlich, dass ein gebundenes
>>YSteuerelement f�r das Suchen oder Filtern von Daten verwendet
>>wird statt eines ungebundenen.
>
> Nat�rlich geh�re ich zu denen die den h�ufigsten Fehler machen. Es
> funktioniert jetzt. Danke f�r deine Hilfe.
>
> Nur eine Kleinigkeit h�tte ich noch. Wenn kein Datensatz gefunden wird
> m�chte ich gerne eine Meldung ausgeben.

Nach Aktualisierung des Suchfeldes:

If Me.RecordsetClone.RecordCount = 0 Then
MsgBox "Nix da."
End If

(in Karls Beispiel nach Me.Requery)

Aber wenn nichts gefunden wird, sieht das der Benutzer doch aufgrund der
leeren Liste. Warum die Meldung?

Ralf Dorn

unread,
Aug 7, 2009, 10:00:01 AM8/7/09
to
Hallo Peter,

> Aber wenn nichts gefunden wird, sieht das der Benutzer doch aufgrund der
> leeren Liste. Warum die Meldung?

Ich finde, dass es so aussieht als wenn gar nichts passiert wäre. Es ist
beim Start leer und auch nachdem ich mit TAB oder Enter weiter mache.

Ich danke dir und allen anderen die sich um mein banales Thema gekümmert
haben.

Ein schönes WE euch allen.

Gruß

Ralf Dorn

Karl Donaubauer

unread,
Aug 7, 2009, 11:16:49 AM8/7/09
to
Ralf Dorn wrote:
> ...
>> Es klingt etwas nach dem h锟絬figsten
>> YFehler in diesem Zusammenhang, n锟絤lich, dass ein gebundenes
>> YSteuerelement f锟絩 das Suchen oder Filtern von Daten verwendet
>> wird statt eines ungebundenen.
>
> Nat锟絩lich geh锟絩e ich zu denen die den h锟絬figsten Fehler machen. Es
> funktioniert jetzt. Danke f锟絩 deine Hilfe.
> ...

Noch ein Hinweis dazu:

Wenn der Anwender aus bestehenden Datens锟絫zen ausw锟絟len soll,
verwende ich kein Textfeld zur Eingabe des Suchbegriffes sondern
ein Kombinationsfeld. Das sonstige Vorgehen ist das gleiche, aber
ein Kombi hat gro锟絜 Vorteile:

Der Anwender sieht nur Daten, die es wirklich gibt und kann
nichts anderes eingeben ("Nur Listeneintr锟絞e" auf Ja).
Zudem kann man ihm durch weitere Spalten in der Kombiliste
die Auswahl des richtigen Eintrages erleichtern.

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com + Anmeldung und Info zur

Access-Entwickler-Konferenz (AEK12), Oktober 2009, N锟絩nberg


Ekkehard Böhme

unread,
Aug 7, 2009, 4:09:15 PM8/7/09
to
Hallo Henry,

Henry Habermacher schrieb:
<schnipp>

>
> Wie bereits Jens geschrieen hat, ist ebenfalls ein beliebter Ansatz mit
> Me.DataEntry = True was zu machen, da dieses das Formular im
> Einfügemodus öffnet, ohne einen Datensatz anzuzeigen.

Auch keinen neuen? IMO ja, und wenn da dann Standardwerte in Datenbasis
oder Formular angelegt sind,
sieht das doch für einen unbedarften Anwender auch komisch aus.
Da entspricht

> Eine Alternative ist, die Abfrage zuerst schon drin zu lassen aber
> beim Form_Open diese ohne Datensätze anzeigen zu lassen. Das kannst Du
> erreichen, indem Du einen Filter verwendest, der immer falsch
> zurückliefert:
>
> Me.Filter = "0=1"
> Me.FIlterOn = True
>
> Wenn Du nun was im Suchfeld eingibst, setzt Du den Filter:
> Me.Filter = "DeinFeld LIKE '" & Me!DeinFeld & "*'"
> Me.FIlterOn = True

doch eher dem, was der OP wohl will, - oder?

gruss ekkehard

0 new messages