Hallo Access-Profis,
nachdem ich nun ein DB-Projekt fertig habe, traue ich mich an ein nächstes - und schon wieder Probleme:
Ich erstelle eine Datei zur Ausfallverwaltung von Lehrkräften; hierzu habe ich einen VBA-Code, der mir das jeweils aktuelle Schuljahr und den Vormonat als Filtereingabe an den Bericht weiterreichen soll. Das Feld [Monat1] ist ein nicht sichtbares Feld des Berichts, wird aber in der zugrunde liegenden Abfrage berechnet [Monat1:Monat([LeK_Beginn])].
Der Code lautet:
Private Sub cmd_AusfallVormonat_Click()
Dim strFilter As String
Dim strSchuljahr As String
Dim M As String
Dim Y As String
DoCmd.Minimize
Y = Year(Date)
'Berechnung des Vormonats
M = Month(Date) - 1
'Berechnung des aktuellen Schuljahres
If Date < DateSerial(Y, 8, 1) Then
strSchuljahr = Right$(Y - 1, 4) & "/" & Right$(Y, 2)
ElseIf Date > DateSerial(Y, 8, 1) Then
strSchuljahr = Right$(Y, 4) & "/" & Right$(Y + 1, 2)
End If
strFilter = "LeK_Beginn1 = " & "'" & strSchuljahr & "'" & " And Monat1 = " & "'" & M & "'"
DoCmd.OpenReport "rpt_MeldungAusfall", acViewPreview, , strFilter
DoEvents
On Error Resume Next
End Sub
Wenn ich den Filterausdruck händisch im Eigenschaftenblatt/Daten/Filter des Berichtes eingebe, funktioniert die Darstellung des Berichts; bei meinem VBA-Code hängt es aber mit der Rückmeldung der "Unverträglichkeit der Typen"?!
Lasse ich mir dann den String des generierten Filters im gestoppten Debugging-Code (vgl. Bild) anzeigen, scheint dieser korrekt zu sein; was mache ich denn falsch?
Vorab vielen Dank
gromax
Hallo,
könnte es sein, dass "Monat" kein Datenfeld vom Typ Text ist?
Hallo MaggieMay,
da fragst Du mich was?
Entsprechend der Genesis dieses Feldes [Monat1] habe ich dieses in der Abfrage berechnet und erhalte dort natürlich einen Zahlenwert.
Im Bericht habe ich dieses Feld dann eingefügt, dort wird es im Eigenschaftenblatt natürlich als Textfeld ausgewiesen; jetzt kann ich Dir darauf keine Antwort geben!
Wenn ich den Bericht aufrufe, kommt die Parameterabfrage, die für den Monat eine Eingabe verlangt??? Warum Monat? Das Feld/Steuerelementinhalt heißt in der Abfrage und im Bericht [Monat1] bzw. im Bericht als Name "txt_Monat" und schon gar nicht Monat!
Der Berg wird immer größer!
Viele Grüße
gromax
Hallo,
ZitatWarum Monat?
weil im OpenReport-Kriterium eben "Monat" als (Tabellen-)Feldname angegeben ist.
Private Sub cmd_AusfallVormonat_Click()
Dim strFilter As String
Dim strSchuljahr As String
[color=red]Dim lngM As Long
Dim lngY As Long
On Error Goto MyErr[/color]
DoCmd.Minimize
[color=red]lngY [/color]= Year(Date)
'Berechnung des Vormonats
[color=red]lngM [/color]= Month(Date) - 1
'Berechnung des aktuellen Schuljahres
If Date < DateSerial(lngY, 8, 1) Then
strSchuljahr = Right$([color=red]Cstr(lngY - 1), [/color]4) & "/" & Right$[color=red](Cstr(lngY), [/color]2)
ElseIf Date > DateSerial(lngY, 8, 1) Then
strSchuljahr = Right$([color=red]Cstr(lngY), [/color]4) & "/" & Right$([color=red]Cstr(Y + 1), [/color]2)
End If
strFilter = "LeK_Beginn1 =[color=red] '" [/color] & strSchuljahr & [color=red]"'[/color] And [color=red]Monat1 = " & lngM [/color]
DoCmd.OpenReport "rpt_MeldungAusfall", acViewPreview, , strFilter
[color=red]
'''''DoEvents
'''''On Error Resume Next
[/color]
[color=red]Exit_Sub:
Exit Sub
MyErr:
Msgbox "Fehler"
Resume Exit_Sub[/color]
End Sub
Den Berg wäre kleiner, wenn konsequent die Datentypen beachtet würden. ;)
Guten Morgen,
Zitat von: gromax am November 03, 2014, 00:11:31habe ich dieses in der Abfrage berechnet und erhalte dort natürlich einen Zahlenwert.
so natürlich ist das durchaus nicht, je nachdem wie die Berechnung aussieht. Es mag zwar eine Zahl enthalten, kann aber dennoch den Datentyp Text haben.
Hallo DF6GL, hallo MaggieMay,
wie Ihr das hier macht, ist schon beeindruckend! Mein Kompliment!!
Zu Dir, DF6GL:
Die Stringenz der Datentypen habe ich verstanden, hier versuche ich mich zu bessern; ich glaube, das kann ich hinbekommen! Was sich mir bislang gar nicht erschließt sind zwei Feststellungen:
1. Wie funktioniert das Zusammenspiel zwischen >>'<< und >>"<<? Ich kapiere die Logik nicht! Ich dachte immer, dass ein String-Ausdruck in >>"<<, Feldnamen in >>'<< eingebettet sind.
2. Die Fehler-Behandlung ist mir noch ein Rätsel, wahrscheinlich bleibt sie es sogar. Ich werde mal in die Bücher gehen müssen! Hast Du dazu einen Tipp? Ich nehme jeden Ratschlag an.
Apropos - das habe ich ja ganz vergessen: Dein Code läuft perfekt!! Vielen Dank!!
zu Dir, MaggieMay:
Woran erkenne ich denn, welcher Datentyp nach der Berechnung in der Abfrage mit >>Monat1:Monat([LeK_Beginn])<< hinterlegt ist? Vom Verständnis (na, daran liegt's wahrscheinlich) ist das dann eine Zahl vom Typ 'Long' oder 'Integer'?!? Wenn ich dieses Feld im Bericht platziere, dann steht dort beim Eigenschaftenblatt "Auswahltyp: Textfeld"!
Für Euren Einsatz vielen Dank!
gromax
Hallo,
1) das Hochkomma steht in Ausdrücken als Ersatz für einen Gänsefuß, wenn dieser Gänsefuß selbst Bestandteil eines (VBA-)Lateral-Strings, dessen Anfang und Ende ja selber durch einen Gänsefuß definiert wird. Sonst könnte diese Situation von VBA nicht richtig interpretiert werden .
VBA:
strString = "das ist ein Literal-String"
strString = "Select * from tblTabelle where Nachname ='Mustermann'"
Der zweite String wird so bei dessen Auswertung durch die Jet-Engine (Access-Datenbank-System) interpretiert:
Select * from tblTabelle where Nachname ="Mustermann"
D. H.: Ein String (Literal-String,Textwert) wird innerhalb eines VBA-Strings durch Hochkomma eingeschlossen.
2) was ist da unklar? Mit
On Error Goto Zeilenmarke
wir die Fehlerüberwachung angewiesen, beim Auftreten eines Fehlers in irgendeiner Codezeile an die "Zeilenmarke"-Marke zu spríngen, also ähnlich wie das veraltete Gosub.
Mit
Resume <ZeilenMarke>
wird die Fehlersituation gelöscht und der Code läuft an der "Zeilenmarke"-Codezeile weiter.
On Error Resume Next sorgt einfach für die Ausführung der nächsten Codezeile ohne Rücksicht auf eine evtl. aufgetretene Fehlersituation.
Der Doppelpunkt hinter der Sprungmarke definiert den Namen an dieser Stelle als Zeilenkennung. Statt einen Namen (Exit_Sub, das ist ein freigewählter Name und nicht zu verwechseln mit der Anweisung Exit Sub, durch die die Prozedur verlassen wird.)
zum Datentyp:
Monat1:Monat([LeK_Beginn]
Monat(), bzw. Month() ist eine Funktion, die einen Wert vom DatenTyp Variant/Integer zurückgibt. Das kann man in der VBA-Hilfe nachlesen:
ZitatGibt einen Wert vom Typ Variant (Integer) zurück, der den Monat im Jahr als ganze Zahl im Bereich von 1 bis 12 angibt.
Hallo DF6GL,
vielen Dank für die ausführliche Darstellung; das mit dem Hochkomma kann ich wirklich nachvollziehen - die Fehler-Routinen nötigen mir noch eingehenderes Nachdenken ab!
Mach's gut
gromax