PDA

Vollständige Version anzeigen : Probleme mit Recordset


-[WLN]-Aragorn
25.09.2003, 08:58
Public Sub fillLstTermine(iZeitraum As Integer)
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim iCount As Integer
Dim i As Integer
Dim strAndSQL As String
Dim strSQLStatus As String

If iZeitraum = 1 Then
strAndSQL = " and Wartungsdatum= CDate('" & CStr(Date) & "')"
ElseIf iZeitraum = 2 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 7 <= CDate('" & CStr(Date) & "')"
ElseIf iZeitraum = 3 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 30 <= CDate('" & CStr(Date) & "')"
ElseIf iZeitraum = 4 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 180 <= CDate('" & CStr(Date) & "')"
End If

If optGrpStatus.Value = 1 Then
strSQLStatus = "tbl_termine.Status=False"
cmdAbschliessen.Enabled = True
cmdLoeschen.Enabled = False
Else
strSQLStatus = "tbl_termine.Status=true"
cmdAbschliessen.Enabled = False
cmdLoeschen.Enabled = True
End If

strSQL = "SELECT tbl_termine.[Anlagen-ID] as anlagenid, tbl_termine.Wartungsdatum, "
strSQL = strSQL & "tbl_anlagen.Seriennummer, tbl_termine.Verantwortlicher "
strSQL = strSQL & "FROM tbl_anlagen INNER JOIN tbl_termine ON tbl_anlagen.[Anlagen-ID] = "
strSQL = strSQL & "tbl_termine.[Anlagen-ID]"
strSQL = strSQL & "WHERE " & strSQLStatus & strAndSQL & " order by wartungsdatum"


Set cnn = CurrentProject.Connection
rs.Open strSQL, cnn

lstTermine.RowSourceType = "Value List"
lstTermine.RowSource = ""

'iCount = lstTermine.ListCount
'For i = iCount - 1 To 0 Step -1
' lstTermine.RemoveItem i
'Next

lstTermine.ColumnCount = 4
lstTermine.ColumnWidths = "0cm;2,54cm;2,54cm;2,54cm"
Do Until rs.EOF
lstTermine.AddItem rs("anlagenid") & ";" & _
rs("Wartungsdatum") & _
";" & rs("Seriennummer") & _
";" & rs("Verantwortlicher")

rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub


Mir wirft es den Source immer bei ";" & rs("Verantwortlicher") her, nicht vor den anderen Feldern, sondern nur hier. Het jemand eine Ahnung wieso? Bin ratlos, unter Access Xp funktioniert das ganze, nur unter Access00 krieg ich es nicht hin.

Arne Dieckmann
25.09.2003, 09:02
Versuche in der Schleife mal diese Syntax:

Do Until rs.EOF
lstTermine.AddItem rs![anlagenid] & ";" & _
rs![Wartungsdatum] & _
";" & rs![Seriennummer] & _
";" & rs![Verantwortlicher]

rs.MoveNext

-[WLN]-Aragorn
25.09.2003, 09:11
Hi Arne,

leider produziert er denselben Fehler an der selben Stelle. Noch ne Idee?

Danke für Eure Hilfe

Arne Dieckmann
25.09.2003, 09:15
Schon etwas merkwürdig. Das Feld "Verantwortlicher" wird ja eigentlich selektiert. Du könntest die Felder testweise auch mal mit dem "Index" ansprechen (ungetestet):


Do Until rs.EOF
lstTermine.AddItem rs(0) & ";" & _
rs(1) & _
";" & rs(2) & _
";" & rs(3)

rs.MoveNext


Wenn es immer noch nicht klappt, dann hilft nur ein Upload Deiner Datenbank hier im Forum.

Sascha Trowitzsch
25.09.2003, 09:30
Hast du in den Verweisen irgendwelche Einträge, die als "Nicht vorhanden" deklariert sind? Daran könnte es liegen.

Vielleicht ist der Code aber auch aus irgendeinem Grund leicht inkompatibel zu A2000.
Vielleicht funktioniert er, nachdem du die DB dekompiliert hast.
(Befehlszeilenschalter DECOMPILE).

Ciao, Sascha

-[WLN]-Aragorn
25.09.2003, 10:10
@Arne: nein, über den Index klappt es leider auch nicht

@Sascha: Verweise sind alle gesetzt. Mit dem decompilieren überforderst du mich jetz aber. wie geht das? Hab auch in der Hilfe und meinen Büchern jetz spontan nix dazu gefunden
edit: man sollte auch mal die Suchfunktion im Forum benutzen

Anbei ne abgespeckte DB, in die ich nur schnell die benötigten Tabellen und Formulare importiert habe, ich hoffe es hilft.

Sascha Trowitzsch
25.09.2003, 10:54
OK, VBA ist manchmal etwas blöd...

Ich weiß nicht, warum es ausgerechnet das letzte rs() markiert.
Viel eher sollte es das mit lstTermine.AddItem machen!
In A2000 haben Listenfelder/Kombos noch nicht die Methode AddItem. Das gibt's erst in XP.

Du wirst also dem Listenfeld auf andere Weise den Inhalt zuweisen müssen.
(So ungefähr...
Dim S As String
Do
...
S= S & rs("anlagenid") & ... & ";"
...
Loop
lstTermine.RowSource = S )

Ciao, Sascha

-[WLN]-Aragorn
25.09.2003, 11:31
Danke Sascha und auch vielen Dank an die anderen, so

Do Until rs.EOF
S = rs![anlagenid] & ";" & rs![Wartungsdatum] & ";" & _
rs!Seriennummer]& ";" & rs![Verantwortlicher] _
rs.MoveNext
Loop
lstTermine.RowSource = S
rs.Close
Set rs = Nothing


scheint es zu funktionieren. Vielen Dank nochmal und einen schönen Tag noch

-[WLN]-Aragorn
26.09.2003, 08:40
HI Forum, nach dem ich das gestern dann getestet habe, bin ich darauf gekommmen das das noch nicht ganz so ist wie ich es gedacht habe.

Hier ein debug.print-Auszug aus meinem Direktfenster, der erste Abschnitt gibt den Wert des stringAndSQL an, der zweite Teil strSQL. Meine Frage ist folgende. Die beiden Variablen werden über die Optionsgruppen aus meiner hochgeladenen DB gefüllt. strAndSQL als Abfragekriterium in strSQL.


strAndSQL

Wartungsdatum <> CDate('26.09.2003')

strSQL

SELECT tbl_termine.[Anlagen-ID] as anlagenid, tbl_termine.Wartungsdatum, tbl_anlagen.Seriennummer, tbl_termine.Verantwortlicher

FROM tbl_anlagen INNER JOIN tbl_termine ON tbl_anlagen.[Anlagen-ID] = tbl_termine.[Anlagen-ID]

WHERE tbl_termine.Status=False and Wartungsdatum <> CDate('26.09.2003') order by wartungsdatum

Hier der Source meiner geänderten fillist-Methode


Public Sub fillLstTermine(iZeitraum As Integer)
Dim cnn As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim iCount As Integer
Dim i As Integer
Dim strAndSQL As String
Dim strSQLStatus As String


If iZeitraum = 1 Then
strAndSQL = " and Wartungsdatum <> CDate('" & CStr(Date) & "')"
Debug.Print strAndSQL
ElseIf iZeitraum = 2 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 7 <= CDate('" & CStr(Date) & "')"
ElseIf iZeitraum = 3 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 30 <= CDate('" & CStr(Date) & "')"
ElseIf iZeitraum = 4 Then
strAndSQL = " and wartungsdatum >= Cdate('" & CStr(Date) & "') and Wartungsdatum - 180 <= CDate('" & CStr(Date) & "')"
End If

If optGrpStatus.Value = 1 Then
strSQLStatus = "tbl_termine.Status=False"
cmdAbschliessen.Enabled = True
cmdLoeschen.Enabled = False
Else
strSQLStatus = "tbl_termine.Status=true"
cmdAbschliessen.Enabled = False
cmdLoeschen.Enabled = True
End If

strSQL = "SELECT tbl_termine.[Anlagen-ID] as anlagenid, tbl_termine.Wartungsdatum, "
strSQL = strSQL & "tbl_anlagen.Seriennummer, tbl_termine.Verantwortlicher "
strSQL = strSQL & "FROM tbl_anlagen INNER JOIN tbl_termine ON tbl_anlagen.[Anlagen-ID] = "
strSQL = strSQL & "tbl_termine.[Anlagen-ID]"
strSQL = strSQL & "WHERE " & strSQLStatus & strAndSQL & " order by wartungsdatum"
Debug.Print strSQL


Set cnn = CurrentProject.Connection
rs.Open strSQL, cnn

lstTermine.RowSourceType = "Value List"
lstTermine.RowSource = ""

'iCount = lstTermine.ListCount
'For i = iCount - 1 To 0 Step -1
' lstTermine.RemoveItem i
'Next

lstTermine.ColumnCount = 4
lstTermine.ColumnWidths = "0cm;2,54cm;2,54cm;2,54cm"

Do Until rs.EOF
S = rs![anlagenid] & ";" & rs![Wartungsdatum] & ";" & rs![Seriennummer] & ";" & rs![Verantwortlicher]
rs.MoveNext
Loop
lstTermine.RowSource = S
rs.Close
Set rs = Nothing

End Sub


Problem ist, obwohl ich sage Wartungsdatum <> CDate('26.09.2003'), also alle Datumswerte ungleich dem heutigen sollen angezeigt werden frisst er das nicht, ergo zeigt in meiner Listbox das nicht an ......

Habe ich da ein Problem mit dem Datumsformat oder wo könnte hier das Problem liegen?

P.S. Mein eigentliches Ziel ist es alle Datensätze mit einem Datum <= aktuelles Datum auszugeben, aber das funktioniert auch nicht

Arne Dieckmann
26.09.2003, 08:50
Vielleicht hilft Dir FAQ 6.8 (Link in meiner Signatur).

-[WLN]-Aragorn
26.09.2003, 09:01
Hi Arne,

leider hilft mir das so nicht weiter, trotzdem Danke, ein erneuter Blick in die FAQs kann bei mir als Neuling nie schaden.

Der Code läuft ja ohne Fehlermeldung durch, bei den Kriterien Heutiges Datum + 7/15/30/180 Tage funktioniert es ja, nur wenn ich in die Vergangenheit gehen möchte funktioniert es nicht.

Um bei meiner DB zu bleiben, ich will alle Termine in der Vergangenheit bis heute in der Listbox ausgeben und über eine Optionsgruppe nach Ihrem Status spalten. An den Typumwandlungsfunktionen kann es auch nicht liegen? Das die evtl. nicht mit dem rückwärts rechnen klar kommen?

Anne Berg
26.09.2003, 12:34
Folgender Code sollte bewirken was du willst:

If iZeitraum = 1 Then
strAndSQL = " and " & BuildCriteria("Wartungsdatum", 8, Date)
ElseIf iZeitraum = 2 Then
strAndSQL = " and " & BuildCriteria("Wartungsdatum", 8, _
">=" & Date - 7 & " and <= " & Date)
ElseIf iZeitraum = 3 Then
strAndSQL = " and " & BuildCriteria("Wartungsdatum", 8, _
">=" & Date - 30 & " and <= " & Date)
ElseIf iZeitraum = 4 Then
strAndSQL = " and " & BuildCriteria("Wartungsdatum", 8, _
">=" & Date - 180 & " and <= " & Date)
End If


Gerade bei Datumsabfragen liefert BuildCriteria zuverlässige Ergebnisse. Leider ist jedoch (in meiner AXP-Version) die Variable adDbdate falsch belegt :( (Es muss 8 und nicht 7 sein!)

Dann gibte es da noch die DateAdd-Funktion. Als String würde ich Datumfelder lieber nicht behandeln, zumindest nicht wenn damit gerechnet werden soll.