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?
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.
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.
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 ? ?
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.
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.
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.
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
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.
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.
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
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?
Hallo,
ich kann das so nicht nachvollziehen.
Wie schaltest Du den Filter aus?
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....
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
Nicht zu fassen.
So eine einfache Lösung. Und volle Funktion.
Das geht richtig gut. Hin und Her. Einfach super.
Ich danke dir für deine tatkräftige Unterstützung zu meinem Anliegen.
Hallo Klaus,
Zitatauf die Variable "Jahreszahl" kann man ohne Not verzichten.
Bin ich ganz bei Dir :D
Hatte sie nur verwendet um den Unterschied zwischen Textfeld
und Tabellenfeld deutlicher darzustellen.
Ist aber ja jetzt auch egal, da Deine Lösung ja wohl beim TS nun funzt.
gruss ekkehard