Druid Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Hallo Forum, ich habe folgenden Quelltext: on error goto err_sub_start do if not isnull(rs.fields(5).value) then 'Aktionen end if rs.movenext loop until rs.eof = true err_sub_start: 'Aktionen Er soll in den Fehlerabschnitt gehen, wenn rs leer ist, also kein aktueller Datensatz vorhanden ist. Mit not isnull(rs) kann ich es nicht abfragen. Das geht nicht. Er ignoriert aber komplett die Zeile on error goto err_sub_start Wenn er dann an den Punkt if not isnull(rs.fields(5).value) then bringt er den Laufzeitfehler 3021. Aber er sollte ja dann eigentlich zu err_sub_start gehen!!!! Warum macht er das nicht???? Gruß Druid :cool: Zitieren
Gast Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Mal anders formuliert, Du möchtest im Falle eines komplett leeren Recordsets reagieren können. Falls ja, dann frag das rs auf gleichzeitige BOF und EOF ab. <OT> Warum kommt mir nur das Opening von Simpsons in den Sinn wo Bart an der Tafel zur Strafe schreibt? "I will not use goto!I will not use goto!I will not use goto!I will not use goto!" </OT> Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 Mal anders formuliert, Du möchtest im Falle eines komplett leeren Recordsets reagieren können. Falls ja, dann frag das rs auf gleichzeitige BOF und EOF ab. <OT> Warum kommt mir nur das Opening von Simpsons in den Sinn wo Bart an der Tafel zur Strafe schreibt? "I will not use goto!I will not use goto!I will not use goto!I will not use goto!" </OT> Das habe ich mir auch schon überlegt. Aber es ist ja nicht eof oder bof. Da würde ja noch was kommen. Es sind immer wieder nur leere Datensätze dazwischengestreut. Ich mache eine Zuordnung von Servern zu IPs und die hohl ich mir aus zwei Tabellen in zwei Recordsets. Und bastel die dann zusammen. Da manche Server keine IP haben ist bei diesen Servern auch der RS leer. Aber danach kommt ja nochmal was *g* und vb bietet einem bei Fehlerroutinen keine andere Möglichkeit als goto... Zitieren
Gast Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 On Error Resume Next [i]möglicher Fehler[/i] If Err.Number<>0 Then [i]Fehlerbehandlung[/i] End If On Error Goto 0 Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 funktioniert nicht. der bleibt bei if not isnull(rs.fields(5).value) then hängen. Wenn ich die Fehlernummer im Direktfenster mit debug.print Err.Number ausgebe ist es die 3021. Aber er ignoriert mir total das on error resume next. on error resume next if not isnull(rs.fields(5).value) then if err.number <> 0 then msgbox err.number, vbokonly end if end if on error goto 0 I h*** VB!!! Greetz Druid :cool: Zitieren
Gast Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Versuch mal folgendes: On Error Resume Next Err.Raise (3021) If Err.Number <> 0 Then MsgBox Err.Number & " - " & Err.Description, vbOKOnly End If On Error GoTo 0 Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 er bleibt auch hier wieder bei err.raise(3021) hängen... Zitieren
Gast Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Hmm, ok, jetzt bin ich bischen überfragt, denn bei mir bringt er anstandslos die msg-Box mit der Nummer und Description. Was mir noch kurz einfällt. Statt: on error resume next if not isnull(rs.fields(5).value) then if err.number <> 0 then msgbox err.number, vbokonly end if end if on error goto 0 Schreib mal: on error resume next if not isnull(rs.fields(5).value) then msgbox "Ist nicht null!" end if if err.number <> 0 then msgbox err.number, vbokonly end if on error goto 0 Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 hab ich auch gemacht. Funktioniert leider immer noch nicht.. Der bleibt immer an der Stelle hängen, an der der Fehler erzeugt wird... Keine Ahnung... das komische ist in anderen Modulen funktioniert es einwandfrei, nur in dem ich es am dringendsten brauch, geht es nicht.. --> Murphy´s Law Zitieren
Gast Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Dann musst Du Dir wohl leider das Modul genauer anschauen, im Hinblick auf Differenzen zu anderen Modulen. Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 das werd ich dann wohl auch tun.. trotzdem danke für deine Hilfe... Gruß Druid :cool: Zitieren
Chiacomo Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Hallo Forum, ich habe folgenden Quelltext: on error goto err_sub_start do if not isnull(rs.fields(5).value) then 'Aktionen end if rs.movenext loop until rs.eof = true err_sub_start: 'Aktionen Er soll in den Fehlerabschnitt gehen, wenn rs leer ist, also kein aktueller Datensatz vorhanden ist. Mit not isnull(rs) kann ich es nicht abfragen. Das geht nicht. Er ignoriert aber komplett die Zeile on error goto err_sub_start Wenn er dann an den Punkt if not isnull(rs.fields(5).value) then bringt er den Laufzeitfehler 3021. Aber er sollte ja dann eigentlich zu err_sub_start gehen!!!! Warum macht er das nicht???? Gruß Druid :cool: Hy, ich verstehe dein Problem nicht. Ich würde das folgendermaßen machen: on error goto err_sub_start do while rs.eof = flase and rs.bof=false if not isnull(rs.fields(5).value) then 'Aktionen end if rs.movenext loop . . . exit function err_sub_start: 'Aktionen end function ich habe das bei mir nachgebaut und es hat funktioniert. kannst du vielleicht mal die ganze funktion zeigen, dann wäre es einfacher, den fehler zu finden? Chiacomo Zitieren
Peregrin Geschrieben 28. Oktober 2004 Geschrieben 28. Oktober 2004 Hi, er bleibt auch hier wieder bei err.raise(3021) hängen... Das riecht für mich nach einer Einstellung der Entwicklungsumgebung... Unter Menü <Extras><Optionen> auf dem Reiter <Allgemein> die Einstellung "Unterbrechung bei Fehlern" überprüfen. Wenn hier "Bei jedem fehler" aktiviert ist, kommt es zu dem Verhalten. Sollte man dann auf "Bei nicht verarbeiteten Fehlern" stellen. hth, Stephan Zitieren
Druid Geschrieben 28. Oktober 2004 Autor Geschrieben 28. Oktober 2004 @Chiacamo: tja es ist schön, dass es bei dir funzt. Bei mir leider nicht Anbei die komplette Funktion: Public Function fuk_import_gcf_data(ByVal TabName As String, ByVal Filename As String, ByVal tabno As Integer, ByVal type_data As String) Dim iCounter As Integer Dim sSQL2 As String Dim dbs As DAO.Database Dim qdf As DAO.QueryDef Dim rs_temp_2 As DAO.Recordset Dim null_rs As Boolean Set dbs = CurrentDb If type_data = "ac" Then DoCmd.RunSQL ("drop table tempimport_gcf_ac") DoCmd.TransferSpreadsheet acImport, , TabName, Filename, True, "Assets!" sSQL = "select Name, [Cust# Order / CC_(Portfolio item)] from tempimport_gcf_ac where Cost_allocation_active = 'YES'" Call mdl_database.createSQLRecordset(sSQL) Do sSQL = "insert into ta_gcf_ac (co, server) values ('" & rs.Fields(1).Value & "', '" & rs.Fields(0).Value & "')" DoCmd.RunSQL (sSQL) rs.MoveNext Loop Until rs.EOF = True rs.Close DoCmd.RunSQL ("drop table tempimport_gcf_ac") DoCmd.TransferSpreadsheet acImport, , TabName, Filename, True, "DCI!" sSQL = "select Auftragsnummer, [Server-Name/LPAR], Leistungsart, [9 / 2004 - 2004-10-04] from tempimport_gcf_ac where Auftragsnummer<>NULL or Auftragsnummer<>0" Call mdl_database.createSQLRecordset(sSQL) Do Do If Right(rs.Fields(2).Value, 1) = "[" Then rs.Edit rs.Fields(2).Value = Left(rs.Fields(2).Value, Len(rs.Fields(2).Value) - 2) rs.update Exit Do End If rs.Edit rs.Fields(2).Value = Left(rs.Fields(2).Value, Len(rs.Fields(2).Value) - 1) rs.update Loop rs.MoveNext Loop Until rs.EOF = True rs.Close sSQL2 = "select server from ta_gcf_ac" Set qdf = dbs.CreateQueryDef("", sSQL2) Set rs_temp_2 = qdf.OpenRecordset Do sSQL = "select * from tempimport_gcf_ac where [Server-Name/LPAR] = '" & rs_temp_2.Fields(0).Value & "'" mdl_database.createSQLRecordset sSQL iCounter = 0 Do If iCounter = 0 Then On Error goto err_sub_start If Not IsNull(rs.Fields(5).Value) Then sSQL = "update ta_gcf_ac set la_short = '" & rs.Fields(3).Value & "', ammount = " & rs.Fields(5).Value & ", month = " & Month(Date) & ", year = " & Year(Date) & " where server = '" & rs_temp_2.Fields(0).Value & "'" Else sSQL = "update ta_gcf_ac set la_short = '" & rs.Fields(3).Value & "', ammount = 0, month = " & Month(Date) & ", year = " & Year(Date) & " where server = '" & rs_temp_2.Fields(0).Value & "'" End If Else If Not IsNull(rs.Fields(5).Value) Then sSQL = "insert into ta_gcf_ac (co, server, la_short, ammount, month, year) values ('" & rs.Fields(0).Value & "', '" & rs.Fields(2).Value & "', '" & rs.Fields(3).Value & "', " & rs.Fields(5).Value & ", " & Month(Date) & ", " & Year(Date) & ")" Else sSQL = "insert into ta_gcf_ac (co, server, la_short, ammount, month, year) values ('" & rs.Fields(0).Value & "', '" & rs.Fields(2).Value & "', '" & rs.Fields(3).Value & "', 0, " & Month(Date) & ", " & Year(Date) & ")" End If End If DoCmd.RunSQL sSQL iCounter = iCounter + 1 rs.MoveNext Loop Until rs.EOF = True err_sub_start: rs_temp_2.MoveNext iCounter = 0 Loop Until rs_temp_2.EOF = True rs.Close rs_temp_2.Close ElseIf type_data = "sap" Then ElseIf type_data = "bck" Then End If End Function @Peregrin: Die Einstellung ist auf "Bei nicht verarbeiteten Fehlern"! Daran liegt es also nicht. Greetz Druid :cool: Zitieren
maxim_42 Geschrieben 3. November 2004 Geschrieben 3. November 2004 Was mir,ohne den Code näher analysiert zu haben, auffällt ist, dass deine Sprungmarke nur bei nCounter = 0 gesetzt wird. Ist das gewollt? Zitieren
Druid Geschrieben 4. November 2004 Autor Geschrieben 4. November 2004 jo das ist gewollt.. wenn iCounter<>0 dann ist er ja schon einmal durchgelaufen, d.h. dass der Recordset ein gültiges befülltes Objekt enthält. Also muss ich nur aktiv werden wenn iCounter = 0 Greetz Druid :cool: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.