Avatar billede susanne_larsen Nybegynder
12. marts 2003 - 16:13 Der er 12 kommentarer og
1 løsning

....måske problem med transaction :[

i forlængelse af http://www.eksperten.dk/spm/325592 har jeg rodet mig ud i en underlig sag

Flg kode burde fungere fint

Private Sub cmdArkiverPC_Click()

On Error GoTo Err_Handler

    Dim ws As DAO.Workspace  'Nuværende arbejdsområde der kræver transaction
    Dim db As DAO.Database    'Inde i transaction.
    Dim bInTrans As Boolean  'Flag transaction er aktiv
   
    Dim intSvar As Integer
    Dim sSQL As String
    Dim s1SQL As String
    Dim s2SQL As String
    Dim s3SQL As String
    Dim s4SQL As String
    Dim s5SQL As String
    Dim sSQLfjern As String      ' bruges til at slette evt. gl. record inden ny sættes ind i tblPCinfoARKIV
   

    'Initialiser databaseobjekt inde i transaction
    Set ws = DBEngine(0)
    ws.BeginTrans
    bInTrans = True
    Set db = ws(0) 
   
    intSvar = MsgBox("Er du sikker på at du vil arkivere data på PCén" + vbLf + Me.PCnavn + " ?" + vbLf + vbLf + "Du skal kun vælge at arkivere data, hvis PCén f.eks. ikke længere er " + vbLf + "oprettet i ODK´s netværk, eller hvis den får et andet navn." + vbLf + vbLf + "Data på PCén vil blive slettet fra denne formular!" + vbLf + vbLf + "OBS husk at overføre evt. special licenser til formularen Licenoversigt !!", vbOKCancel + vbExclamation, "Bekræft arkivereing af PCdata!")
   
    If intSvar = vbOK Then
        ws.CommitTrans
        bInTrans = False
    End If


  '*****Sletter evt. gammel record i tblPCInfoARKIV
    sSQLfjern = "DELETE * FROM tblPCinfoARKIV WHERE PCnavn = '" & PCnavn & "'"

    sSQL = "DELETE * FROM tblPCinfo WHERE PCnavn =  '" & PCnavn & "'"
    s1SQL = "DELETE * FROM tblOversigt WHERE PCnavnRef = '" & PCnavn & "'"
    s2SQL = "INSERT INTO tblPCinfoARKIV SELECT* FROM tblPCinfo WHERE PCnavn= '" & PCnavn & "'" 
    s3SQL = "DELETE * FROM tblPClicenser WHERE PCnavnRef = '" & PCnavn & "'"
   
    '*******Sletter evt. registreringer i reetableringstabellen **********
    s4SQL = "DELETE * FROM tblPCReetablering WHERE PCnavnRef = '" & PCnavn & "'"
                 
    CurrentDb.Execute sSQLfjern, dbFailOnError    ' slet evt. gl. record
    CurrentDb.Execute s2SQL, dbFailOnError        ' indsæt ny record i tblPCinfoARKIV
    CurrentDb.Execute s1SQL, dbFailOnError        ' slet record fra tblOversigt
    CurrentDb.Execute s3SQL, dbFailOnError        ' slet record fra tblPClicenser
    CurrentDb.Execute s4SQL, dbFailOnError        ' slet record fra tblPCReetablering
    CurrentDb.Execute sSQL, dbFailOnError        ' slet record fra tblPCinfo

    'sørg for at formularen viser de nye informationer, og dermed fjerner den slettede
    Me.Requery
   
   
    Exit Sub
   
Exit_Err_Handler:
' her ryddes op
  On Error Resume Next
    Set db = Nothing
   
        ' Foretag Rollback hvis transaction er aktiv
        If bInTrans Then
            ws.Rollback
      End If
       
    Set ws = Nothing
Exit Sub
   

Err_Handler:
' hvis arkivering ikke er mulig vis fejlmeddelelse
        MsgBox Err.Description, vbExclamation, "Arkivering ikke mulig: Fejl " & Err.Number
   
        Resume Exit_Err_Handler
End Sub


Mit problem er som følger:
Har jeg fx en record med navnet Y i tblPCinfoARKIV og ønsker at arkivere en record med samme navn, kan koden ikke altid afvikles. Jeg får ingen fejlmeddelelse og der sker intet. MEN hvis jeg så vælger at lukke min dB og afslutter Access. Stater basen op igen og forsøger igen så er der ingen problemer. Alt fungerer som det skal og al kode virker.

Hvad pokker er der nu galt ???
Avatar billede terry Ekspert
12. marts 2003 - 16:27 #1
remove
On Error Resume Next
from your error routine or you will never get here!
Avatar billede terry Ekspert
12. marts 2003 - 16:34 #2
Susanne isnt there something wrong here?
her ryddes op
  On Error Resume Next 'You will NOT get to the next line!
    Set db = Nothing
   
        ' Foretag Rollback hvis transaction er aktiv
        If bInTrans Then
            ws.Rollback
      End If
       
    Set ws = Nothing
Avatar billede terry Ekspert
12. marts 2003 - 16:37 #3
alter your code to
Exit_OK:
    Set db = Nothing
    Set ws = Nothing

  Exit Sub
   
Exit_Err_Handler:
   
        ' Foretag Rollback hvis transaction er aktiv
        If bInTrans Then
            ws.Rollback
      End If
      Goto Exit_OK
       
    Set ws = Nothing
Avatar billede susanne_larsen Nybegynder
12. marts 2003 - 17:28 #4
>>terry am happy you spend so much time on E ;)

have altered the code - but doesnt help

same problem - if I close the dB + Access, start it again - everything works -seriously strange
Avatar billede susanne_larsen Nybegynder
12. marts 2003 - 17:39 #5
??? have made a compact and repair
apparently it did the trick - what the *** is happening

am rather worried about this code - would like to be able know that it ALWAYS works .P
Avatar billede susanne_larsen Nybegynder
12. marts 2003 - 18:14 #6
by the by what is the proper syntax

vbCrLf
or vbLf ??
Avatar billede terry Ekspert
12. marts 2003 - 18:30 #7
vbCrLf
Avatar billede terry Ekspert
12. marts 2003 - 18:30 #8
if you can send me the dB then I will take a look
Avatar billede susanne_larsen Nybegynder
12. marts 2003 - 18:45 #9
You are most welcome to se if you can find the problem - if any .... sometimes it works and sometimes it doesn´t. Hate those kind of errors :[

have send you the annoying dB
Avatar billede terry Ekspert
12. marts 2003 - 19:47 #10
Hi Susanne, I have made a number of changes and it should now work. I should have seen the problem earlier, but better late than never.
Here is one problem.

If intSvar = vbOK Then
        ws.CommitTrans
        bInTrans = False
    End If

You are commiting the transaction BEFORE you have even done anything. The commit is used at the end of the changes to tell Access you want to KEEP the changes.
Avatar billede susanne_larsen Nybegynder
13. marts 2003 - 09:58 #11
Hi Terry
....and there I was so very sure Access was the stupid one ;)
You have made a number of alterations, but not so many that I am totally lost :))
One of the more "amusing" and essential is the Exit Sub I´ve forgotten if the user presses Cancel

Thnx a bundle Terry. By the by have You considered establishing a course teaching the stupid how to find their way in the jungle called "The world of Access". If so count me in LOL

The code that works:

Private Sub cmdArkiverPC_Click()
' arkiver data på PC - er en god ide fx pga historikken
'  sletter bruger i tblBrugere og overfører data til tblOphørteBrugere

On Error GoTo Err_Handler
' Hvis sletning/arkivering ikke er mulig. Vis Access fejlmeddelelse

    Dim ws As DAO.Workspace  'Nuværende arbejdsområde der kræver transaction
    Dim db As DAO.Database    'Inde i transaction.
   
    Dim intSvar As Integer
    Dim sSQL As String
    Dim s1SQL As String
    Dim s2SQL As String
    Dim s3SQL As String
    Dim s4SQL As String
    Dim s5SQL As String
    Dim sSQLfjern As String      ' bruges til at slette evt. gl. record inden ny sættes ind i arkiv tabel
   
   
    ' spørg bruger om record skal slettes
    intSvar = MsgBox("Er du sikker på at du vil arkivere data på PCén" & vbCrLf & Me.PCnavn & " ?" & vbCrLf & vbCrLf & "Du skal kun vælge at arkivere data, hvis PCén f.eks. ikke længere er " + vbLf + "oprettet i ODK´s netværk, eller hvis den får et andet navn." + vbLf + vbLf + "Data på PCén vil blive slettet fra denne formular!" + vbLf + vbLf + "OBS husk at overføre evt. special licenser til formularen Licenoversigt !!", vbOKCancel + vbExclamation, "Bekræft arkivereing af PCdata!")
   
    If intSvar = vbOK Then
    'Now we can start the transaction
        Set ws = DBEngine(0)
        ws.BeginTrans
        Set db = CurrentDb
    Else
'************  I am sure you dont want to continue if you choose Cancel *******
        Exit Sub
    End If


  '*****Sletter evt. gammel record i tblPCInfoARKIV, da dubletter ikke er tilladt
    sSQLfjern = "DELETE * FROM tblPCinfoARKIV WHERE PCnavn = '" & PCnavn & "'"

    'her koden der sletter den aktuelle post og de tilhørende underposter
    '***********
    sSQL = "DELETE * FROM tblPCinfo WHERE PCnavn =  '" & PCnavn & "'"
    s1SQL = "DELETE * FROM tblOversigt WHERE PCnavnRef = '" & PCnavn & "'"
    s2SQL = "INSERT INTO tblPCinfoARKIV SELECT* FROM tblPCinfo WHERE PCnavn= '" & PCnavn & "'"
   
    'Sletter evt. registreringer i licens tabellen
    s3SQL = "DELETE * FROM tblPClicenser WHERE PCnavnRef = '" & PCnavn & "'"
   
    '*******Sletter evt. registreringer i reetableringstabellen **********
    s4SQL = "DELETE * FROM tblPCReetablering WHERE PCnavnRef = '" & PCnavn & "'"
   
    ' ******* overfører først PCéns data fra tblPCinfo til tblPCinfoARKIV ******
    ' så slettes PC og evt tilknyttede brugere i i tblOversigt og i tblPClicenser
    ' dernæst slettes PCén fra tblPCinfo - - - til sidst slettes evt. reg. i tblPCReetablering
       
    CurrentDb.Execute sSQLfjern, dbFailOnError    ' slet evt. gl. record
    CurrentDb.Execute s2SQL, dbFailOnError        ' indsæt ny record i tblPCinfoARKIV
    CurrentDb.Execute s1SQL, dbFailOnError        ' slet record fra tblOversigt
    CurrentDb.Execute s3SQL, dbFailOnError        ' slet record fra tblPClicenser
    CurrentDb.Execute s4SQL, dbFailOnError        ' slet record fra tblPCReetablering
    CurrentDb.Execute sSQL, dbFailOnError        ' slet record fra tblPCinfo

    'sørg for at formularen viser de nye informationer, og dermed fjerner den slettede
    Me.Requery
   
    'If we get here then we can now save (commit)
    ws.CommitTrans
   
       
Exit_OK:
    Set db = Nothing
    Set ws = Nothing

    Exit Sub
   
Err_Handler:
' hvis arkivering ikke er mulig vis fejlmeddelelse
    MsgBox Err.Description, vbExclamation, "Arkivering ikke mulig: Fejl " & Err.Number
   
    ' Foretag Rollback hvis transaction er aktiv
    ws.Rollback
     
    GoTo Exit_OK
   
End Sub


diverse vbLf er ikke erstattet med vbCrLf endnu :)
Avatar billede terry Ekspert
13. marts 2003 - 20:06 #12
Thanks for the points Susanne.
Concerning the course, well you may see/hear more in that area, hopefully in the near future :o)
Avatar billede susanne_larsen Nybegynder
17. marts 2003 - 10:40 #13
:) looking forward to it
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester