Avatar billede fcjohn Nybegynder
05. marts 2005 - 12:10 Der er 12 kommentarer og
1 løsning

Historik ved sletning

Jeg har en noget data der kommer fra en forespørgsel. NÅr noget af dette data slettes vil jeg gerne gemme det i en anden tabel(Min historik). Problemet er at jeg ikke kan pege på det i min subform, da det kommer fra en forespørgsel og fange den eller de slettede rækker. Jeg har så fundet ud af at jeg kan gemme en delmængde af dataen i et recordset, og så sammenligne med et andet recordset efter sletningen er blevet effektueret.
Jeg kan bare ikke lige gennemskue om jeg bruger de rigtige recordsets(adodb), for det virker som om det bare peger på databasen og ikke bliver gemt i det recordset jeg har oprettet i et modul. Når jeg så vil sammenligne, har begge recordsets det samme indhold, og så er det jo ligesom ligemeget...
Desuden ved jeg ikke hvordan eller rettere hvornår sletningen er fundet sted i access. Er det Ondelete eller afterdelconfirm på formularen?
Avatar billede terry Ekspert
05. marts 2005 - 12:21 #1
In a sub form you can delete more than one record at a time. So it could maybe be an idea to make your own delete procedure so that you can only delete the selected record.
Then you should be able to insert the date into a historik table before the record actually gets deleted, for example in the BeforeDelConfirm event

Private Sub Form_BeforeDelConfirm(Cancel As Integer, _
                                  Response As Integer)
    ' Suppress default Delete Confirm dialog box.
    Response = acDataErrContinue    ' Display custom dialog box.
    If MsgBox("Delete this record?", vbOKCancel) = vbCancel Then
        Cancel = True   
    else
    '''>>>>>Insert into your historik table here
    End If
End Sub


You can remove the record selectors in form properties.
Avatar billede terry Ekspert
05. marts 2005 - 12:22 #2
You can also add a button to the form using the button wizard. This will allow you to deleted the selected record.
05. marts 2005 - 12:35 #3
Jeg har lavet et eksempel som du kan hente på min hjemmeside: http://www.makeiteasy.dk/eksempler/Downloads.htm

Eksemplet hedder: "Gem historik på dine tabeller" og gemmer både ved sletning, opdatereing og indsættelse.
Avatar billede fcjohn Nybegynder
05. marts 2005 - 16:23 #4
Thomas> Jeg har kigget lidt på dit eksempel, men stod af da der stod noget om det kune skulle være i en form baseret på tabeller og ikke forespørgsler, er det ikke rigtigt?
Jeg skal kode rimeligt meget om, hvis jeg skal ændre det til at være baseret på tabeller, så jeg ville egentligt helst gøre det som beskrevet i toppen, hvis altså det kan lade sig gøre.

Terry> Hvis jeg har to løkker hvor jeg gennemløber og sammenligner de to recordsets, vil det vel ikke være et problem at have flere sletninger ad gangen?

Jeg forstår stadig ikke hvorfor jeg ikke kan gemme et recordset før jeg sletter og så sammenligne med et andet efter sletningen uden at de første bliver opdateret og dermed magne til det andet. Skal det monstro gemes i et array, og hvordan gøres det så? Jeg tænker at recordset er gemt som pointere og ikke fysisk, det er sgu så længe siden jeg har beskæftiget mig med dette, så jeg kan ikke huske hvordan det er med pointere og det...
Avatar billede fcjohn Nybegynder
05. marts 2005 - 16:28 #5
Jeg skal måske lige tilføje, at det recordset jeg har oprettet i modulet er erklæret sådan her: public recslet as new adodb.recordset

Og at datamængden sjældent vil komme til at omfatte mere end 10-20 poster, så det bliver ikke supertungt at lave de to gennemløb.
Avatar billede terry Ekspert
05. marts 2005 - 17:21 #6
this may give you some ideas
Option Compare Database

Dim rs As ADODB.Recordset

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
Dim rst As DAO.Recordset

    Set rst = Me.RecordsetClone
   
    rs.MoveFirst
    Do Until rs.EOF
       
        rst.FindFirst "ID = " & rs!ID
       
        If rst.NoMatch Then
            Debug.Print "Record Deleted " & rs!ID
        End If
   
        rs.MoveNext
    Loop

End Sub

Private Sub Form_Load()
Dim cn As ADODB.Connection
   
    Set rs = New ADODB.Recordset
    With rs
       
        Set .ActiveConnection = CurrentProject.Connection
       
        .Open "Select * From T2", , , adLockOptimistic

   
    End With
   

End Sub
Avatar billede terry Ekspert
05. marts 2005 - 17:28 #7
In the form load I initilalize the recordset which is declared at the top of the form (Dim rs As ADODB.Recordset)
It needs to be opened with the same record source which you have in the form.

Now when I deleted records I compare a recordset which is a copy of the forms record set against the recordset I made when I opened the form.

I have placed the code in the BeforeDelConfirm event but it should maybe be moved to the AFTER delete event.

You will also need to refresh the recordset (rs) so that it is up to date.
Avatar billede fcjohn Nybegynder
05. marts 2005 - 17:35 #8
Jeg tror jeg er ved at have den, selvom jeg synes at access opfører sig ulogisk. Ind i mellem får jeg at vide at noget af mit første recordset er blevet slettet, men det er kun i de felter der er tomme, hmm!

Terry> Det er stort set det samme som du foreslår, jeg har gjort. Jeg opretter det første recordset under beforedelconfirm og det andet ved afterdelconfirm, og det funger, bortset fra førnævnte lille detalje, men en anden ting der undrer mig, er at jeg ikke kan se den opdaterede record i min historiktabel, før der er gået noget tid, nogen gange op til en halv time efter! Jeg har delt databasen, så der er vel en forsinkelse på, men SÅ meget når tabellerne ligger på samme maskine som jeg arbejder på??!!
Avatar billede terry Ekspert
05. marts 2005 - 17:42 #9
The records you write to the historik table should be visible as soon as they are written. Íf you have a recordset open on the historik table then you maybe need to refresh it.

The recordset which is to hold the original data should be opened as early as possible I think
Avatar billede fcjohn Nybegynder
06. marts 2005 - 21:51 #10
Dette her ser ud som om det virker, jeg er dog ikke sikker på at det er den mest optimale.

Terry> Kan du ikke sende et svar, og evt. lige fortælle om der er noget at det jeg har gjort, som ikke holder?

Option Compare Database

Dim recslet As ADODB.Recordset

Private Sub Form_AfterDelConfirm(Status As Integer)

Dim con As ADODB.Connection
Dim strsql As String

Set con = CurrentProject.Connection

recslet.MoveFirst

Do While Not recslet.EOF
     
    If IsNull(DLookup("[id]", "tbl_1", "id = " & recslet!id)) Then
         
        strsql = "insert into tbl_2 values (" & recslet!id & ",'" & recslet!tekst & "')"
       
        con.Execute strsql
       
    End If
   
    recslet.MoveNext

Loop

recslet.Close

con.Close

End Sub

Private Sub Form_Delete(Cancel As Integer)

Dim con As ADODB.Connection
Dim strsql As String

Set con = CurrentProject.Connection

Set recslet = New ADODB.Recordset

strsql = "select * from tbl_1"

recslet.Open strsql, con

End Sub
Avatar billede fcjohn Nybegynder
06. marts 2005 - 21:55 #11
Ups, du havde sendt et svar...
Avatar billede fcjohn Nybegynder
06. marts 2005 - 22:02 #12
recslet skal åbnes som 'adOpenStatic' fandt jeg så lige ud af...
Avatar billede terry Ekspert
07. marts 2005 - 09:32 #13
It looks fine to me. I'm sure there are other ways to do this and some may be a little faster. But when we are only talking of a limited number of records I think this way is fine.

and thanks for the points
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

IT-JOB

Netcompany A/S

Network Engineer

Netcompany A/S

Test Consultant

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Ingeniør til Satellitkommunikation