Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

VB 6 - unerklärlicher Rücksprung aus einer Funktion

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

wie schon durch den Threadtitel deutig bekomme ich einen seltsamen (weil ungewollten und unerklärlichen) Rücksprung aus einer Funktion.


Public Function get_free_install_id() As Integer

Dim lngFehler As Long

Dim intInstallID As Integer

    modDatenbank.sqlQuery.CommandText = "select max(installations_id) from " & strQualifier & ".installationstabelle;"

    [COLOR="Red"]Set modDatenbank.rsValues = modDatenbank.sqlQuery.Execute[/COLOR]

    On Error Resume Next

        intInstallID = CInt(modDatenbank.rsValues.Fields(0).Value) + 1

        lngFehler = Err.Number

    On Error GoTo 0

    If lngFehler <> 0 Then

        get_free_install_id = 1

    Else

        get_free_install_id = intInstallID

    End If

End Function

letzte Ausgeführte Zeile vor dem Rücksprung aus der Funktion Dies ist eine von drei fast identischen Funktionen, von denen die anderen beiden wie gewünscht funktionieren. (Ich habe sie mit Copy&Paste erzeugt und lediglich die Tabellen- und ID-Namen geändert) Die Deklarationen im Modul modDatenbank lauten:

Public rsValues As Recordset

Public sqlQuery As New Command

Visual Basic 6.0 SP3 auf Microsoft Windows XP [Version 5.1.2600]


Public rsValues As Recordset

Public sqlQuery As New Command

was hast du in den verweisen drin? nur ADO, ADO und DAO?

versuch mal Recordset als ADO.Recordeset zu deklarieren.

übergib dem CommandType von deinem Command.Execute ein adCmdText, so muss ADO sich nicht anstrengen um herauszufinden ob dein SQL ein SQL, eine tabelle, stored proc, etc. ist.

Visual Basic 6.0 SP3 auf Microsoft Windows XP [Version 5.1.2600]

VB6 SP6 ist übrigens die aktuellste ;-)

s'Amstel


Public rsValues As Recordset

Public sqlQuery As New Command

was hast du in den verweisen drin? nur ADO, ADO und DAO?

[...]

Habe nur ADO 2.7 gehabt, jetzt ADO 2.7 und DAO 3.6

[...]

versuch mal Recordset als ADO.Recordeset zu deklarieren.

übergib dem CommandType von deinem Command.Execute ein adCmdText, so muss ADO sich nicht anstrengen um herauszufinden ob dein SQL ein SQL, eine tabelle, stored proc, etc. ist.

[...]

Habe ich jetzt. Das Problem besteht weiterhin. Und vor allen Dingen wundert es mich, daß es bei den zwei vorhergegangenen Funktionen einwandfrei geklappt hat und bei der dritten Funktion der Ausstieg kommt.

[...]

VB6 SP6 ist übrigens die aktuellste ;-)

s'Amstel

Hmm, an SP6 komme ich nicht dran um es zu installieren.

Habe ich jetzt. Das Problem besteht weiterhin. Und vor allen Dingen wundert es mich, daß es bei den zwei vorhergegangenen Funktionen einwandfrei geklappt hat und bei der dritten Funktion der Ausstieg kommt.

wird die funktion einfach beendet, d.h. zum End Function gesprungen? was steht dann in Err.Number bzw. Err.Description drin?

Hmm, an SP6 komme ich nicht dran um es zu installieren.

sorry, is mir nicht ganz klar, was du meinst. meinst du, du kommst mangels genügender rechte lokal nicht dran, oder konntest du das SP nicht ausfindig machen? hier zu finden und wärmstens zu empfehlen: http://www.microsoft.com/downloads/details.aspx?familyid=9EF9BF70-DFE1-42A1-A4C8-39718C7E381D&displaylang=de

s'Amstel

wird die funktion einfach beendet, d.h. zum End Function gesprungen? was steht dann in Err.Number bzw. Err.Description drin?

[...]

Wenn ich es durchtrace, dann springt er einfach nach dem .execute-Befehl zu der Stelle an der die Funktion aufgerufen wurde (ohne je das End Function zu erreichen, es sieht so aus, als ob dort ein Exit Funktion wäre, ist es aber mit Sicherheit nicht) Err.Description hat zu diesem Zeitpunkt keinen Wert, da es erst nach dem On Error Resume Next initialisiert wird und dahin komme ich leider nicht.

[...]

sorry, is mir nicht ganz klar, was du meinst. meinst du, du kommst mangels genügender rechte lokal nicht dran, oder konntest du das SP nicht ausfindig machen? hier zu finden und wärmstens zu empfehlen: http://www.microsoft.com/downloads/details.aspx?familyid=9EF9BF70-DFE1-42A1-A4C8-39718C7E381D&displaylang=de

s'Amstel

Rechte habe ich schon, bloß ich sitze hier am Firmen-PC mit einer automatischen und angepassten Softwareverteilung, so daß ich diesen Schritt ungerne gehen würde. Versuche ich aber jetzt als ultima ratio. Danke für den Link. :)

Mit SP6 besteht das Problem weiterhin.

Hi,

ich würde eventuell mal versuchen, den Command auf Prozedurebene zu deklarieren, zudem ist die Deklaration mit "AS New XXX" nicht sonderlich gut, weil die Objekte nie den Zustand "nothing" erreichen.

"On Error Resume Next" initialisiert das Err-Objekt nicht, es schaltet die Fehlerhandlung aus!

Ob das jetzt ein Problem ist kann ich nicht sagen, jedoch sollte man sparsam damit umgehen, da die Fehlerbehandlung projektweit ausgeschaltet wird.

(In Deinem Fall sollte das "On Error Goto 0" die Sache jedoch wieder aufheben).

Wenn Du ADO schon drin hast, nimm DAO wieder raus.

Mit der Installation vom SP 6 wäre ich vorsichtig, zumindest wenn man einige Controls aus der CommonControls verwendet, manche Dinge gehen mit dem SP 6 nicht mehr (oder unter größeren Umständen).

SP 5 sollte jedoch auf jeden Fall installiert sein, da sind einige Änderungen geschehen.

Einen schönen Abend.

Hi,

ich würde eventuell mal versuchen, den Command auf Prozedurebene zu deklarieren, zudem ist die Deklaration mit "AS New XXX" nicht sonderlich gut, weil die Objekte nie den Zustand "nothing" erreichen.

Wenn ich den Command auf Prozedurebene deklariere, dann fehlt mir noch die Zuweisung des Command zu der jeweiligen Connection. Ich weise bei dem Connect auf die jeweilige Datenbank noch die .ActiveConnection zu.


'modDatenbank

Public Function connect_db_odbc(ByVal strDatenbank As String, ByVal strUser As String, strPassword As String) As Boolean

On Error Resume Next

    Set connDatenbank = New Connection

    connDatenbank.CursorLocation = adUseClient

    connDatenbank.Open "Data Source=" & strDatenbank & "; User ID=" & strUser & "; PWD=" & strPassword

    strPassword = ""

    sqlValues.ActiveConnection = connDatenbank

    sqlValues.CommandType = adCmdText

    lngFehler = Err.Number

On Error GoTo 0

    If lngFehler = 0 Then connect_db_odbc = True Else connect_db_odbc = False

End Function

"On Error Resume Next" initialisiert das Err-Objekt nicht, es schaltet die Fehlerhandlung aus!

Ob das jetzt ein Problem ist kann ich nicht sagen, jedoch sollte man sparsam damit umgehen, da die Fehlerbehandlung projektweit ausgeschaltet wird.

(In Deinem Fall sollte das "On Error Goto 0" die Sache jedoch wieder aufheben).

Stimmt. Err.Number ist aber vom Aufruf der Function bis zu dem ominösen Exit = 0

Wenn Du ADO schon drin hast, nimm DAO wieder raus.

Erledigt.

Mit der Installation vom SP 6 wäre ich vorsichtig, zumindest wenn man einige Controls aus der CommonControls verwendet, manche Dinge gehen mit dem SP 6 nicht mehr (oder unter größeren Umständen).

SP 5 sollte jedoch auf jeden Fall installiert sein, da sind einige Änderungen geschehen.

Einen schönen Abend.

Habe jetzt schon den SP6 drauf. Bis jetzt noch keine Seiteneffekte.

Ok. Das Problem besteht nicht mehr seit ich den Aufruf der Function nicht mehr aus einem 'On Error Resume Next ... On Error GoTo 0'-Block durchführe, obwohl es zwei Mal vorher geklappt hat. Komsiches Verhalten. :rolleyes: Aber danke Euch für die Mühe.

Wenn ich den Command auf Prozedurebene deklariere, dann fehlt mir noch die Zuweisung des Command zu der jeweiligen Connection. Ich weise bei dem Connect auf die jeweilige Datenbank noch die .ActiveConnection zu.

--> Das kannst Du ja bequem über einen 2. Paremeter in der Funktion machen:


Public Function get_free_install_id(ByRef oActiveCon As ADODB.Connection _

) As Integer


Dim lngFehler As Long

Dim intInstallID As Integer


-->    HIER die Zuweisung

    Set modDatenbank.sqlQuery.ActiveConnection = oActiveCon

-->


    modDatenbank.sqlQuery.CommandText = "select max(installations_id) from " & strQualifier & ".installationstabelle;"

    Set modDatenbank.rsValues = modDatenbank.sqlQuery.Execute

    On Error Resume Next

        intInstallID = CInt(modDatenbank.rsValues.Fields(0).Value) + 1

        lngFehler = Err.Number

    On Error GoTo 0

    If lngFehler <> 0 Then

        get_free_install_id = 1

    Else

        get_free_install_id = intInstallID

    End If

End Function

Wie gesagt, mit "On Error Resume Next" vorsichtig umgehen, ein Error Handler sieht im Normalfall so aus (zumindest für VB 6):

Private Function get_All_ID(ByRef oActiveCon As ADODb.Connection _

) As Integer

On Error GoTo Err_get_All_ID



'   -----------------Procedure-Exit---------------

Exit_get_All_ID:


    ' --> Zerstörung von Objekten

    ' --> Set obj = Nothing o.ä.


    '   Prozedur verlassen

    Exit Function

'   -----------------Err-Handler------------------

Err_get_All_ID:

    Call MsgBox("Fehler: " & Err.Number & vbCrLf & Err.Description, _

                vbExclamation, "TITEL")


    ' Rückgabewert der Function

    ' = False o.ä.


    Resume Exit_get_All_ID

End Function

Seiteneffekte bei den CommonControls treten auch nur in bestimmten Fällen auf, hauptsächlich beim Zugriff aufs TreeView per API (SetWindowLong, Backcolor setzen etc...).

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.