Waar systeemfoutmelding vervangen door eigen melding

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
236
Hoi,
Ik probeer te achterhalen waar ik een systeemboodschap kan vervangen voor "mijn eigen boodschap"
Ik doel bijvoorbeeld op een dubbel record situatie.
Als ik bij een "tekst zonder opmaak veld" (een kolomnaam uit van een tabel) de acties:
Na Bijwerken; Bij gewijzigd, Bij Wijzigen en Bij verlaten voorzie van een On Error GoTo code
dan blijkt er dus NIET naar de foutmelding gegaan te worden.
De systeemboodschap "Duplicate Key...." komt te voorschijn.
De On Errorr Goto situatie lijkt dus niet geactiveerd te worden.

Kortom bij welke gebeurtenis maak ik mijn eigen boodschap ingeval er een systeemmelding komt?

Voorbeeld van de gebruikte VB
Code:
Private Sub Plaatsnaam_Dirty(Cancel As Integer)
On Error GoTo Err_Plaatsnaam_Dirty
MsgBox ("Bij Gewijzigd")

Exit_Plaatsnaam_Dirty:
    Exit Sub
    
Err_Plaatsnaam_Dirty:
'MsgBox Err.Description
 MsgBox ("Ingevoerde plaats komt al voor in deze tabel, druk op <esc> toets en geeft de juiste plaatsnaam")
 Resume Exit_Plaatsnaam_Dirty

End Sub
Ron
 
Je checkt denk ik op de verkeerde plek, en op de verkeerde manier. Je kunt de fout afvangen op de gebeurtenis <Bij fout> van het formulier, en je moet het foutnummer afvangen, want er kunnen uiteraard meerdere soorten fouten optreden, die verschillende nummers hebben. Een voorbeeldje:

Code:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
   If DataErr = 3146 Then
      MsgBox ("Je probeert een dubbele waarde in te voeren.")
      Response = 0
   End If  
End Sub
 
Octafish,
dat had ik ook al geprobeerd en me vervolgens inderdaad gerealiseerd dat je dan de foutcodes 1 voor 1 moet af testen.
Als ik jouw oplossing gebruik dan gebeurt er nog niets.
Ik denk dat het te maken heeft met de ODBC koppeling voor de tabellen.
Als ik het teruggeven error nummer (1062) uit test dan wordt er niet op gereageerd.
Of het getoonde nummer is niet goed, wellicht Hexadecimal ?
Ik heb dus nu het volgende
Code:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
   If DataErr = 1062 Then
      MsgBox ("Je probeert een dubbele waarde in te voeren.")
      Response = 0
   End If
End Sub

ODBC error.JPG

Ron
 
Ik heb mijn voorbeeldje van een pagina gehaald waar uitgerekend een Oracle koppeling niet werkt...
 
Tardis, Michel,

Bedankt voor de doorverwijzing.
Dat was nuttig en het lijkt te werken mits ik het op de juiste plek in mijn formulier "plak"

Als ik dit doe bij "Bij Fout"
Code:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Static Property Get MySQLErrorMessage(iCode As Integer) As String

   On Error GoTo MySQLErrorMessage_Error

Select Case iCode
    Case 1062
        MySQLErrorMessage = "You tried to insert a duplicate record where duplicates are not permitted. Please remove any duplicate values and retry:"
    Case 1142
    'May be associated with DAO error code 3155, 3156, 3157
        MySQLErrorMessage = "You do not have sufficient privilege to perform the actions. Please contact the adminstrator if you require the privilege:"
    Case 1364
        MySQLErrorMessage = "There are required values that weren't filled in. Please fill in all values:"
    Case Else
        MySQLErrorMessage = ""
End Select

   On Error GoTo 0
   Exit Property

MySQLErrorMessage_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure MySQLErrorMessage of Module modError"

End Property
End Sub
Dan krijg ik de melding:
Er wordt een End Sub verwacht

Als ik de code plaats als een algemene declaratie dan wordt de fout dus niet afgevangen.
De vraag is dan ook:
Waar plaats ik deze code, indien mogelijk zou dat dan ergen in een module "kunnen" en ik op het juiste plaatsen deze module "aanspreek"

Min VB kennis is nou niet erg optimaal.

Ron
 
Wat je zo te zien gedaan hebt, is een Property Get midden in je Private Sub gezet. Ik vermoed dat de Property Get ... End Property beter op zijn plaats is in een klasse module.
Zowiezo kun je nooit een procedure in een andere procedure plakken. Dan krijg je dit soort meldingen :)
 
Ok,
Dan zet ik deze hele code in een module
Die code staat dan onder:
Rubriek Algemeen MysglErrorMessage[PropertyGet]
en hoe roep ik deze aan, zeker vanuit Formulier Bij Fout.
Code:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
  ?????  
End Sub

Wat ik al aangaf de VB kennis is pover.

Ron
 
Hoi,
Kunnen jullie me nog een tipje van de sluier oplichten? Hoe roep ik de code aan?
Ron
 
Bij mij werkt dat prima. Wat je waarschijnlijk niet doet, is iets veranderen aan de datum o.i.d. Een record moet er wel zijn, nieuw of bestaand, voordat hij kan worden opgeslagen. Omdat het subformulier datum als standaardwaarde heeft, is er geen status voor een nieuw record als je in één van de twee tekstvakken klikt. Er wordt dus ook geen record aangemaakt.
 
Michel,
Ik heb inderdaad geen aanpassing van een Mutatiedatum. Dat laat ik over aan MySql, ik had gelezen dat je in een tabel minimaal 1 veld moet hebben van type Timestamp met als attribute: on update CURRENT_TIMESTAMP.
Als je dan ook nog een update doet vanuit VB dan lukt dat niet.
Dus op de een of andere manier moet je dus de "fout afvanging" zien te activeren.
Blijkbaar doet ODBC dat dus wel goed want die merkt dat er een dubbel record geschreven gaat worden, nog voor dat je een nieuw wilt aanmaken
 
Nog suggesties voor me om de foutroutine / code aan het werk te kunnen zetten?

Ron
 
Hoi,
Heeft iemand nog een suggestie hoe ik deze foutafhandeling echt geactiveerd kan krijgen?

Ron
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan