Avatar billede yxos Nybegynder
16. januar 2006 - 18:30 Der er 10 kommentarer og
1 løsning

Positionering i subform 2

en fortsættelse af
http://www.eksperten.dk/spm/679689 og
http://www.eksperten.dk/spm/679976.

frmMain er hovedform; den har ingen tilknyttet tabel.
Den har derimod en del subforms, som har tilknyttet Record source: Tabel1.

Form frmMain har bla. to subforms; frmListe1 og frmListe2 som hver viser en liste over records fra Tabel1, men med forskelig status, bestemt ud fra felt Tabel1.chkStatus.

frmMain har også en subform frmDetail som viser detailindholdet af Tabel1 records.

Jeg bruger frmListe1 og frmListe2 til at positionere i frmDetail, som kun viser én record af gangen. Til dette bruges en Parent/child relation som er opbygget almindeligt via en wisard i Access.
Dvs. Når jeg klikker på en record fx. frmListe1, så vises detailindholdet i frmDetail.

Problemet er så når jeg sætter et X i chkStatus i frmDetail.
Dette gør at recorden skal forsvinde fra frmListe1, og istedet vises i frmListe2.

Det gør jeg ved følgende event:

Private Sub chkStatus_AfterUpdate()
  ' First save current record:
  DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

  ' Then do the requery:
  Me.Parent.Parent.frmListe1.Requery
  Me.Parent.Parent.frmListe2.Requery
End Sub

Problemet er bare, at disse Requeries forårsager Requeries af frmDetail fordi dette kommer standard fra Wizarden:

Sub Form_Current()
' Denne kode er oprettet af formularguiden.
    Dim strParentDocName As String

    On Error Resume Next
    strParentDocName = Me.Parent.Name

    If Err <> 0 Then
        GoTo Form_Current_Exit
    Else
        On Error GoTo Form_Current_Err
        Me.Parent![frmDetail].Requery
    End If

Form_Current_Exit:
    Exit Sub

Form_Current_Err:
    MsgBox Err.Description
    Resume Form_Current_Exit
End Sub


Der sker så det, at NÅR jeg har sat et X i chkStatus i frmDetail, så refresher det frmListe1 og frmListe2 fint nok, men den viser så  derefter en ANDEN record i frmDetail, end den jeg satte krydset i,  og det er jo ikke så smart.

Kan man ikke gemme positionen på den nuværende record i Sub chkStatus_AfterUpdate(), og så lave requery, og så gen-positionere på den gemte record?
Hvordan ?
Avatar billede terry Ekspert
16. januar 2006 - 19:28 #1
not quiet sure what you mean by

"men den viser så  derefter en ANDEN record i frmDetail, end den jeg satte krydset i,  og det er jo ikke så smart."

do you mean that it does NOT show the correct recor, or that you want it to place the record selector on the record?
Avatar billede yxos Nybegynder
16. januar 2006 - 20:38 #2
frmListe1 er baseret på en query der selecter fra Tabel1 hvor Tabel1.Status = 0  (unticked)
frmListe2 er baseret på en query der selecter fra Tabel1 hvor Tabel1.Status = -1 (Ticked)

Exempel
Tabel1 indeholder 3 records, hvor alle Status = unticked.

Dvs. alle records vises i frmListe1. frmListe2 er tom.

Klik på record 1 i frmListe1, for herved at vise alle datafelter fra record 1 i frmDetail.

Klik så på chkStatus i frmDetail (sæt Tabel1.Status = -1)
Herved trigges chkStatus_AfterUpdate() som laver requery på frmListe1 og frmListe2.

record er nu forsvundet fra frmListe1, og vises istedet i frmListe2.

Men samtidig er fucus ændres, så nu vises record 2 i frmDetail, og altså ikke længere record 1, som var den der blev ændret i.

Klikker man i den i chkStatus, ryger den også ned i frmListe2, og det samme gør record 3 når den klikkes.
Den skifter altså focus hver gang Requeries bliver kørt, og det er det jeg gerne vil avoide.
Avatar billede yxos Nybegynder
21. januar 2006 - 12:35 #3
ok, stor mundfuld åbenbart.
Men kan jeg så i det mindste ikke bare få kommandoerne der kan gemme en record position i en variabel, og senere bruge variablen til at gøre denne record til current.

Fx. hvis current record er 105, så skal 105 gemmes i en variabel. Hvordan?
Så sker alt det beskrevet ovenfor, og pointeren ryger ad hækkenfeldt til!
Derfor skal record 105 igen gøres current ved hjælp af variablen. Hvordan ?

Håber dette er nemmere at forstå end ovennævnte, indrømmet, temmelig komplicerede forklaring.
Avatar billede terry Ekspert
21. januar 2006 - 13:00 #4
Its not a case of it being a "stor mundfuld" but sometimes its necessary to do our own work :o) And also a case of undertsanding what exactly it is you want.

If its enough to save the position of the current record then you can us eteh forms bookmark property for this.

Put this in a module so that it is can be used throught your program.

Public MyBookmark as variant


Now you can use this to save the current position

myBookmark = Me.bookmark

an dthsi to restore to the saved position

Me.Bookmark = myBookmark

og god weekend
Avatar billede yxos Nybegynder
21. januar 2006 - 13:28 #5
stor forståelse for at også andet skal passes.
Men nogen gange ved du godt, at efter et par dage uden svar, kan det godt betyde at ens spørgsmål er gået lidt i glemmebogen. Derfor min "simplificerede" udgave af spørgsmålet.
Jeg burde have vidst at du ikke ville glemme mig !
No offence meant :-)
Jeg vil prøve dit forslag senere. Lige nu har fruen meldt sin ankomst om en halv time efter 2 dage hjemmefra, og så skal der jo prioriteres, og jeg er ret sikker på at jeg ikke scorer mange point hos fruen hvis jeg sidder optaget af Access problemer ;-)

Også rigtig god weekend til dig Terry!
Avatar billede yxos Nybegynder
21. januar 2006 - 18:12 #6
Nu har jeg prøvet det, men det virker ikke.
Jeg har defineret myBookmark i et modul, og anbragt kodelinierne med Bookmark i min _afterupdate event som angivet.

Men Me.Bookmark har ingen værdi.  MsgBox(Me.Bookmark) viser blot "?".
Avatar billede yxos Nybegynder
28. januar 2006 - 10:31 #7
Terry, Jeg tester på livet løs, når jeg har tiden, men er endnu ikke nået til den endelige løsning.
Jeg tror du er inde på det rigtige med RecordsetClone.Findfirst, men jeg får nogen "Object" fejl. Jeg har sendt det til dig.
Avatar billede yxos Nybegynder
30. januar 2006 - 09:21 #8
Løsningen er at lave endnu en form; frmListeTotal som viser ALLE records fra Tabel1.

Så laves en repositionering i DENNE form INDEN der laves Requiry  for Liste1 og Liste2:
Positionering bruger et nøglefelt fra Tabel, fx. Id

Private Sub chkStatus_AfterUpdate()
  ' First save current record:
  DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

  myId = Me.Id
 
  ' Reposition to myId in form frmTotal:
  Me.Parent.Parent.frmTotal.SetFocus
  Me.Parent.Parent.frmTotal.Form.RecordsetClone.Findfirst "[Id] = " & myId
  Me.Parent.Parent.frmTotal.Form.Bookmark = Me.Parent.Parent.frmTotal.Form.RecordsetClone.Bookmark

  ' Then do the requery:
  Me.Parent.Parent.frmListe1.Requery
  Me.Parent.Parent.frmListe2.Requery
End Sub


Terry, læg et svar.
Dette har krævet mere end jeg regnede med, så hvis du vil have flere points, så sig til.
Avatar billede terry Ekspert
30. januar 2006 - 12:05 #9
30 points is fine :o)
Avatar billede yxos Nybegynder
30. januar 2006 - 13:49 #10
Right.
Then, all you need to do is put an answer :-)
Avatar billede terry Ekspert
30. januar 2006 - 19:08 #11
I'd better wake up then :o)
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