Avatar billede susanne_larsen Nybegynder
07. marts 2003 - 11:45 Der er 19 kommentarer og
1 løsning

Sletning af record - hvis ikke mulig vis Access standard msgbox

Har set mig blind på et problem.
Har dB hvor bruger har mulighed for at arkivere data på diverse pc info.
Fungerer sådan set fint BORTSET fra at i meget sjældne tilfælde er arkivering af data ikke mulig da der eksisterer data i en anden tabel.
Ved godt jeg bare kan vælge at udbygge min kode så disse data slettes fra den pgl. tabel...

Det der undrer mig er at jeg ikke får en fejl fra Access når bruger forsøger at arkivere data. Der sker nada - recorden slettes jo af gode grunde ikke af den pgl tabel pga den referentielle integritet.

Min kode er som følger:

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 intSvar As Integer
    Dim sSQL As String
    Dim s1SQL As String
    Dim s2SQL As String
    Dim s3SQL As String
   
    ' spørg bruger om record skal slettes
    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!", vbYesNo + vbExclamation, "Bekræft arkivereing af PCdata!")
   
    If intSvar = vbNo Then Exit Sub

    '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 & "'"
   
    ' ******* 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
    CurrentDb.Execute s2SQL
    CurrentDb.Execute s1SQL
    CurrentDb.Execute s3SQL
    CurrentDb.Execute sSQL

    'sørg for at formularen viser de nye informationer, og dermed fjerner den slettede
    Me.Requery
 
    Exit Sub
   
Err_Handler:
 
    MsgBox "ERROR:" & Err.Description
End Sub


Det er garanteret en total logisk ting jeg har overset. Men kan pokkerme ikke lige finde ud af hvad.....
Avatar billede terry Ekspert
07. marts 2003 - 12:35 #1
I must admit that I do not quite understand what your problem is!

Are you expecting to see a message when the user tries to archive or what?
Avatar billede terry Ekspert
07. marts 2003 - 12:37 #2
try replaceing
CurrentDb.Execute sSQL with docmd.runsql sSQL
Avatar billede tma_oksboel Nybegynder
07. marts 2003 - 13:50 #3
Måske jeg helt har misforstået, men hvis de to tabeller er relateret til hinanden kan du jo bruge referentiel integritet, og hakke af i Kaskadevis sletning. Ved at vælge denne fjernes relaterede data automatisk, så der fjernes på én-siden.

Hilsen Torben
Avatar billede susanne_larsen Nybegynder
07. marts 2003 - 20:47 #4
Problemet er at samtlige sql statements eksekveres MINUS den første:
sSQL = "DELETE * FROM tblPCinfo WHERE PCnavn =  '" & PCnavn & "'"

Den kan ikke eksekveres hvis jeg har data i en tabel hvor jeg registrerer reetableringer (fordi jeg ikke har lagt koden ind endnu). Det jeg så ikke forstår er at jeg ikke med det samme får en fejlmeddelse. Mit script burde jo så blive stoppet med det samme, og min error handler skulle træde ind. Det gør den bare ikke....

(Som sidebemærkning - alt fungerer perfekt hvis jeg ikke har records registreret i min reetableringstabel)

>>tma oksboel. Har referentiel integritet, men kaskadevis sletning nej tak ;) ikke noget jeg har lyst til. Kan forårsage lidt for meget snavs ;))
Vil hellere kode mig ud af sagen...
Avatar billede kabbak Professor
08. marts 2003 - 00:29 #5
husk altid at slette fra yderste gren og ind til stammen, og ikke omvendt.
Avatar billede terry Ekspert
08. marts 2003 - 14:23 #6
I am totally lost here Susanne!
(fordi jeg ikke har lagt koden ind endnu) what do you mean with this?

as far as I can see your code should work and therefore you shouldnt get an error, but then I cant see your realationships so I can be sure.
Any chance of having a look at the dB? eksperten@santhell.dk
Avatar billede susanne_larsen Nybegynder
09. marts 2003 - 13:21 #7
>>terry har kopieret noget af min nuværende Db over i en ny og tilføjet lidt testdata.
Den form der volder problemer er frmPCinfo. Knappen [Arkiver PC]. Har sat 'er ud for koden hvor jeg vælger at slette i tblPCReetablering for at se om jeg får vist fejl - gør jeg ikke. Der skulle ellers vises fejl hvis du forsøger at slette den PC jeg har kaldt WXXPCXXX da der er data i tblReetablering ??

Håber du har en løsning
Avatar billede susanne_larsen Nybegynder
09. marts 2003 - 13:40 #8
>>kabbak
.....husk altid at slette fra yderste gren og ind til stammen, og ikke omvendt
;) gør jeg også G** men er noget forvirret over jeg ikke får en fejlmeddele når jeg vil arkivere data OG så ikke får en fejl når jeg i min kode udelader at slette evt. records i en relateret tabel hvor der er oprettet referentiel integritet til modertabellen ????
Avatar billede terry Ekspert
09. marts 2003 - 14:20 #9
Susanne have you sent your dB I havent received anything?
Avatar billede terry Ekspert
09. marts 2003 - 15:19 #10
Try this. First you need to remove the reference to ADO and make one to DAO.

CurrentDb.Execute sSQL, dbFailOnError

You should alsoe consider using a transaction. If one operation works then the next may fail :o(
Avatar billede susanne_larsen Nybegynder
10. marts 2003 - 19:13 #11
>>terry havn´t u recieved my mail yet, strange ??
Will try to send it once again........done

DAO and not ADO - impressive - no matter what I do I always land right in the middle of the land of complexity :))
Avatar billede terry Ekspert
10. marts 2003 - 21:01 #12
Hi Susanne>Yes I got your mail, although a bit delayed. Look at the coment I placed 09/03-2003 15:19:30 this solves your problem of NOT getting any message.
Avatar billede susanne_larsen Nybegynder
11. marts 2003 - 15:44 #13
Thnx Terry - will take a look when I get home
Avatar billede susanne_larsen Nybegynder
11. marts 2003 - 20:22 #14
hehe havde problemer med at bruge DAO - havde glemt at vinge den af i editoren G**. Har lige formateret min PC, såee

men nu er mit problem at en record ikke kan flyttes over i tblPCInfoARKIV, hvis der allerede findes en tilsvarende. Dvs. gamle records overskrives ikke i tblPCInfoARKIV. så min SQL

s2SQL = "INSERT INTO tblPCinfoARKIV SELECT* FROM tblPCinfo WHERE PCnavn= '" & PCnavn & "'"

afvises

Hvad pokker gør jeg så ???
Avatar billede terry Ekspert
11. marts 2003 - 20:30 #15
Hi Susanne, isnt this because you managed to insert a record into tblPCinfoARKIV while you still were having problems? So you can open the table directly and delete it/them.

This is also why I suggest using a transaction so that if one thing fails then they ALL fail.
Avatar billede susanne_larsen Nybegynder
11. marts 2003 - 20:47 #16
Hi Terry
U are right transactions is a must :)

I´m a bit confused - did not have any problems overwriting old records - so I thought :(

What can I do to make Access overwrite an old record in tblPCInfoARKIV ???
Am not interested in an forever expanding ARKIV table......
Avatar billede terry Ekspert
11. marts 2003 - 20:55 #17
You will need to delete any existing, but then WHY should any exist already?
Avatar billede susanne_larsen Nybegynder
11. marts 2003 - 21:09 #18
must be tired :p
because some of the stored information are reused on another PC

ex I have a pc called WXXPCXXX. After a while the user doesn´t need it any more. The PC is disassembled and is no longer a member on our net. The info is stored in my tblPCInfoARKIV. The name along with other features such as IP etc. is now vacant and can be used somwhere else. (That info is stored in another table).

I use the name WXXPCXXX on another location - and after a while I may have to store the info once again in tblPCInfoARKIV. Here I run into som problems as the table already contain a record of WXXPCXXX........
Avatar billede terry Ekspert
11. marts 2003 - 21:15 #19
I dont know what you use the information for but if you dont need to keep a history then I would delete the record in tblPCInfoARKIV but if you need a history the you MUST keep it. So change your primary key to a duplicates allowed. Sounds like your dB design needs looking at Susanne :o)
Avatar billede susanne_larsen Nybegynder
11. marts 2003 - 21:25 #20
:))

I am seriosly embaresed - You have no idea how much ROFL
Guess I should have left this enormous problem alone - and saved if for a day where I havn´t been working almost 15 hours non stop G****

adding a little code that cheks for dublicates and deletes an excisting old record id neccesary...

Thnx for your help :)
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