Zum Inhalt springen

Probleme mit on Error goto


Empfohlene Beiträge

Geschrieben

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:

Geschrieben

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>

Geschrieben
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...

Geschrieben

On Error Resume Next

  [i]möglicher Fehler[/i]

  If Err.Number<>0 Then

    [i]Fehlerbehandlung[/i]

  End If

On Error Goto 0

Geschrieben

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:

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

Dann musst Du Dir wohl leider das Modul genauer anschauen, im Hinblick auf Differenzen zu anderen Modulen.

Geschrieben
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

Geschrieben

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

Geschrieben

@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:

Geschrieben

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:

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...