Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Formular mit Bedingung öffnen

Begonnen von accessy, Oktober 24, 2012, 20:06:48

⏪ vorheriges - nächstes ⏩

accessy

Ihr habt mir super geholfen was das Öffnen eines Formulars mit meinen Besuchsberichten und der Verknüpfung der Kundennummer KNR betrifft.
Das war über diesen VBA Code.

Private Sub Dok_Datum_DblClick(Cancel As Integer)
  Dim Jahreszahl As String
  Jahreszahl = Right$([Dok-Datum], 4)
  DoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR & "'", , acDialog
End Sub

Jetzt habe ich ein anderes Formular, dass hat noch ein Feld mehr drin, nämlich das Datum. (So sind die Daten drin ..... 24.10.2012)
Es gibt Einträge von 2004 bis 2012.
Ich möchte per Doppelklick auf dieses Feld Datum die letzten 4 Zeichen des Datums nehmen und als Jahreszahl für die Bedingung in diesem VBA Code einbauen.

Aber wie muss ich den oben eingegebenen VBA Code ändern, damit zusätzlich noch das Jahr als Filterbedingung gilt?

MzKlMu

#1
Hallo,
und wo kommt dann die gesuchte Jahreszahl her bzw. wie wird die Filterbedingung Jahr abgefragt?

PS;
Das Right ist überflüssig und die Variable Jahreszahl auch, für das Jahr gibt es eine extra Funktion, die das Jahr als Zahl ermittelt.

Year(Datumsfeld) liefert das Jahr als Zahl.
Gruß Klaus

Beaker s.a.

Hallo,
@Klaus
Zitatund wo kommt dann die gesuchte Jahreszahl
Auch wenn da das "Me!" fehlt solltest DU das aber richtig
vermuten können  ;)
Interessanter wäre doch die Frage was das für ein Feld in
der DS-Herkunft des Berichtes ist (Name, Datentyp).

@accessy
Was Klaus sagen will:
Jahreszahl = Year(Me!Dok-Datum)
Ansonsten, unter der Vermutung, dass im Bericht auch ein
Datumfeld vorliegt (Luftcode):
DoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR & "' AND Year(Datumsfeld) = " & Jahreszahl, , acDialog
gruss ekkehard

PS, OT, aber immer aktuell; - verwende keine Sonder- und Leerzeichen in Objektnamen.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

#3
Hallo,
@ekkehard
ich fragte nach der gesuchten Jahreszahl bzw. nach der Filterbedingung.
Er ermittelt ja die Jahreszahl aus dem Dok-Datum. Die Frage ist doch jetzt wo kommt das Jahr für den Vergleich her, Inputbox?

Das Datumsfeld in der Datensatzherkunft ist wohl das Feld "Dok-Datum". Und dann sollte das auch so aussehen:
DoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR & "' AND Year([Dok-Datum]) = " & ????? , , acDialog

Gefragt ist der Teil mit den ? ?
Gruß Klaus

accessy

Erst einmal vielen Dank für die vielen Hinweise dazu.
Ich bin jetzt bißchen verwirrt. Ich hatte die Sache mit dem Right$ aus meinem kleinen Excel-VBA Grundkenntnisstand genommen.
Die Sache mit YEAR kannte ich nicht.
Aber es funktioniert bisher noch nicht.

Die Sache mit der KNR ist klar. Das funktioniert.
Dieses Formular hat zusätzlich noch das Feld DOK-DATUM und ist in der Tabelle als Datum/Uhrzeit definiert.
Also, z.B. Kunde Müller hat 520 Einträge, und die Datumseinträge sehen so aus:
12.04.2007
22.05.2007
05.10.2007
31.01.2008
17.11.2008
04.02.2009
11.03.2009
16.05.2009
20.07.2009

usw.. usw...
Da sind dann - was weiß ich - 75 Einträge aus 2004....114 Einträge aus 2008... 84 Einträge aus 2011.....usw..

Also, wenn ich den Kunden im Stammformular anzeige und im Unterformular auf die Registerkarte Werkzeuge klicke, erscheinen alle 520 Einträge dieses Kunden aufgelistet sortiert nach Datum Abwärts. Einwandfrei ...!!!

Jetzt wollte ich es erreichen, dass ich bei einem Doppelklick auf dieses Feld DOK-DATUM der acDialog nur die Werkzeuge des Jahres zeigt.
Mache ich einen Doppelklick auf das Datum 17.05.2006, dann soll das Formular im acDialog alles aus 2006 zeigen.
Mache ich einen Doppelklick auf das Datum 22.08.2011, dann soll das Formular im acDialog alles aus 2011 zeigen.

Daher auch mein Gedanke, dass ich mit diesem RIGHT$... die Jahreszahl auslesen und dann irgendwie in diesen Code einbauen muss.
Wörtlich gesprochen hieße es dann bei einem Doppelklick auf das Datum 15.05.2007
KNR='" & Me!KNR & "'  ....... und alles größer 2006 und kleiner 2008, so dass alles aus 2007 gezeigt wird.

Ich hoffe, meine Erklärungen sind jetzt besser.

MzKlMu

Hallo,
dann bleibt der Aufruf wie er ist und Du musst beim Doppelklick zusätzlich filtern.
Etwa so:

Me.Filter = "Year([Dok-Datum]) = " & Year(Me.[Dok-Datum])
Me.FilterOn = True


Im Ereignis "Beim Doppelklick" des Feldes Dok-Datum.

Bin mir gerade nicht sicher, ob auch wieder nach der KNR gefiltert werden muss, bitte probieren und melden.
Gruß Klaus

accessy

Weia... Jetzt geht gar nichts mehr.

Das ist der Code

Jahreszahl = Year(Me!Dok-Datum)
DoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR & "'  & Jahreszahl" , , acDialog
Me.Filter = "Year([Dok-Datum]) = " & Year(Me.[Dok-Datum])
Me.FilterOn = True


Jahreszahl wird gefragt
und dann WAHR

Das wird jetzt heftig kompliziert.
Vielleicht geht das gar nicht, was ich da vorhabe.

MzKlMu

Hallo,
jetzt hast Du aber einen ziemlichen Durcheinander angerichtet, das habe ich auch keinesfalls vorgeschlagen. Dass das völlig unlogisch ist, musst Dir eigentlich auch klar sein. Lies mal genau, was ich oben geschrieben habe. Du benötigst 2 verschiedene Prozeduren.
Eine um das Formular zu öffnen, wie gehabt:

DoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR , , acDialog

Hierin kein weiterer Code.

Und im Ereignis "Beim Doppelklick" des Feldes "Dok-Datum" zusätzlich:
Me.Filter = "Year([Dok-Datum]) = " & Year(Me.[Dok-Datum])
Me.FilterOn = True
Gruß Klaus

accessy

Wenn ich die DB öffne, sollte sich mein Hauptformular öffnen, aber nicht dieses Unterformular.
Das muss ich jetzt erst einmal schließen, um in mein Hauptformular zu kommen.

Ich glaube, ich muss das wieder fallen lassen. Das geht alles nicht.
Vielleicht sollte ich per Doppelklick eine Abfrage einlesen lassen.
Ich werde das mal versuchen hinzubiegen.


Beaker s.a.

Hallo,
@Klaus
Zitatich fragte nach der gesuchten Jahreszahl
Wohl wieder mal ein Problem mit dem pesönlichen Verständnis; -
gesucht wird für mich in Tabellen mit einem Suchbegriff,
der halt irgendwo herkommt (Formular/Inputbox).
Ich hatte den Code eben so verstanden, das [Doc-Datum] ein
Textfeld im Form ist und eben nicht das Feld in der Tabelle.
Weshalb ich in meiner Codezeile ja auch einen Dummy (Datumsfeld)
verwendet habe.
Die Frage nach diesem Feld ist für mich auch immer noch offen.
Vielleicht haben das TextControl und das Tabellenfeld auch
ungünstigerweise den gleichen Namen.

@accessy
Warum die Flinte gleich in Korn werfen; - das kriegen wir schon hin.
Muss aber noch Fragen stellen.
In #4 hast Du jetzt geschrieben, das es sich um ein UFo handelt.
Wieso willst Du das mit .OpenForm noch mal öffnen?
ZitatAlso, wenn ich den Kunden im Stammformular anzeige und
im Unterformular auf die Registerkarte Werkzeuge klicke, erscheinen
alle 520 Einträge dieses Kunden aufgelistet sortiert nach Datum Abwärts.
Einwandfrei ...!!!
D.h. aber ja auch, dass das UFo über die Kunden-Nr. mit dem HFo
verknüpft ist; - da entfällt doch schon mal die Filterung auf die KNR,
oder nicht?
Ein UFo kannst Du aber einfach filtern, um nur die gewünschten DS
zu sehen.
Da ist Klaus' Ansatz zielführend.
Komplett dann etwa so (Luftcode, Tabellenfeldname anpassen):
Private Sub Dok_Datum_DblClick(Cancel As Integer)
  Dim Jahreszahl As Integer

  Jahreszahl = Year(Me![Dok_Datum])

   Me.Filter = "Year([DatumsfeldInTabelle]) = Jahreszahl"
   Me.FilterOn = True

End Sub

Wobei
Me das UFo ist,
Dok_Datum das Textfeld im Form.
Hier fällt übrigens auf, dass der Name, der aus dem Prozedurkopf
ersichtlich ist, bisher immer falsch geschrieben wurde:
Dok_Datum vs. Dok-Datum.
Oder ist das der Unterschied zwischen Formularfeld und Tabellenfeld?
hth
gruss ekkehard


und übrigens, noch was ...
ZitatDoCmd.OpenForm "Besuchsberichte", , , "KNR='" & Me!KNR & "'  & Jahreszahl" , , acDialog
Das ein Vergleich immer zwei Seiten braucht ( ???? = Jahreszahl, was
übrigens auch Klaus' Frage aus #3 entspricht), solltest Du jetzt
aber auch schon gelernt haben.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
auf die Variable "Jahreszahl" kann man ohne Not verzichten.

Private Sub Dok_Datum_DblClick(Cancel As Integer)
   Me.Filter = "Year([DatumsfeldInTabelle]) = " & Year(Me![Dok_Datum])
   Me.FilterOn = True
End Sub
Gruß Klaus

accessy

Nur kurz mal erwähnt.
Ich bin ein kleines bißchen Excel-Lastig, habe auch von hier kommend nur wenig VBA Erfahrung.
Ich wurde erst einmal aufgeklärt, dass es in Access keine Spalten, sondern Felder gibt...etc...usw...
Sollte jetzt aber kein Vorwurf sein.

Also, ich habe den Code jetzt laufen.

Private Sub Dok_Datum_DblClick(Cancel As Integer)   
Me.Filter = "Year([Dok-Datum]) = " & Year(Me![Dok-Datum])   
Me.FilterOn = True
End Sub


Der funktioniert erst einmal gut.
Die Sache hat aber noch einen Haken.
Wenn ich den Filter wieder ausschalte,
dann wird die DB auf den DS Nr. 1 zurückgesetzt und das UF zeigt mir stattdessen jetzt die Werkzeuge des Kunden von DS 1 an.
Das ist nicht günstig.

Ich würde mir sowieso noch eine Variable einbauen mit Typ Boolean, um per Doppelklick den Filter ON/OFF zu schalten.
Aber jetzt erstmal muss beim Ausschalten des Filters wieder der Zustand zu sehen sein, der zuvor galt.

Nochmal anders.
Der Kunde hat 520 Artikel aus mehreren Jahren, die ich jetzt im UF sehe.
Ich mache den Doppelklick auf das Datum 16.06.2009.
Jetzt schaltet der Filter sich ein und zeigt mir alles aus 2009. Okay..passt
Dann schalte ich den Filter aus und sollte nun von diesem Kunden wieder alle 520 Artikel haben.

Dazu müsste ich jetzt die Datenherkunft  Tabelle mit Feldnamen [Werkzeug_Artikel] im Zusammenhang mit der KNR dieses Kunden durchlaufen, oder?


MzKlMu

Hallo,
ich kann das so nicht nachvollziehen.
Wie schaltest Du den Filter aus?
Gruß Klaus

accessy

Na im Moment durch Klick auf das Icon "Filter entfernen".

Wenn ich aber in das Doppelklick_Ereignis eine Variable definiere,
z.B. so

DIM ANAUS as BOOLEAN
If ANAUS = True then
  Me.Filter = "Year([Dok-Datum]) = " & Year(Me![Dok-Datum])   
  Me.FilterOn = True
else
  if ANAUS = False then
  Anweisung für den Kunden alle Jahre wieder zu zeigen
  Me.FilterOn = False
end if


Aber ich weiß noch gar nicht, ob das in Access überhaupt geht...
Das sind alles Excel Codeteile, die ich verwende.

Erst mal brauche ich noch den Tipp, dass bei "Filter enfernen"
der DS mit der KNR stehen bleibt und wieder alle Jahre zeigt.

Im Grunde genommen ein HIN- und Herspringen durch das Doppelklicken
Doppelklick ....zeige nur z.B:...2008....
Doppelklick ....zeige alle Jahre
Doppelklick ....zeige nur 2008
Doppelklick ....zeige wieder alle Jahre....

MzKlMu

#14
Hallo,
Filter entfernen entfernt alle Filter. Versuche es mal so, das sollte klappen, getestet:
Private Sub Dok-Datum_DblClick(Cancel As Integer)
   If Me.FilterOn = False Then
       Me.Filter = "Year([Dok-Datum]) = " & Year(Me![Dok-Datum])
       Me.FilterOn = True
   Else
       Me.Filter = ""
       Me.FilterOn = False
   End If
End Sub
Gruß Klaus