Tervehdys,
Miten voin tallettaa Access 2007:ssa tietueen paikan jonkin tapahtuman yhteydessä, ja sitten myöhemmin siirtää kohdistuksen siihen?
Esimerkki: On valittu tietue 3 ja painetaan nappia, jolloin avautuu toinen ikkuna. Käyttäjä peruu ikkunan avauksen, jolloin oletustoiminnon (Access siirtyy tietueeseen 1) sijasta aiemmin valitun tietueen paikka (3) on tallessa ja kohdistus siirretään siihen.
Yritin jotain tällaista:
Dim db As Database, rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("Tilaukset", dbOpenDynaset, dbOptimistic)Access ei kuitenkaan tykkää OpenRecordset-käskystä, ilmeisesti, koska tietokanta on jo käsiteltävänä.
Onko Accessin antama virheilmoitus tosiaankin "En tykkää" ?
Ei sen puoleen, jos ymmärsin oikein mitä olet tekemässä (eli sinulla on accessissa auki jokin näkymä tietokantaan) niin toisen yhteyden avaaminen samaan tietokantaan ei tiedä mitään siitä mikä rivi jollakin toisella yhteydellä on auki eikä pysty ohjaamaan sitä.
Eli käyttöliittymään liittyvä koodi pitäisi tehdä sinne käyttöliittymän puolelle.
Moikka taas kisahalo!
esim. näin...
'Module1 Option Compare Database Public LastSelectedRecord As Long
'Lomake1
Option Compare Database
Private Sub Form_Load()
If LastSelectedRecord < 0 Then
LastSelectedRecord = 0
End If
Set rs = Me.Recordset
rs.Move (LastSelectedRecord)
Set rs = Nothing
End Sub
Private Sub Peruuta_Click()
On Error GoTo Err_Peruuta_Click
LastSelectedRecord = CurrentRecord - 1
DoCmd.Close
Exit_Peruuta_Click:
Exit Sub
Err_Peruuta_Click:
MsgBox Err.Description
Resume Exit_Peruuta_Click
End SubMoikka taas kisahalo!
Tässä vielä pikku esimerkki VB6:lle...
'Module1 (Public)
Public db As Database, rs As Recordset
Public LastSelectedRecord As Long, rsTempLastSelectedRecord As Long
Public Sub SetValues(Source As Form, recSet As Recordset)
For i = 1 To recSet.Fields.Count - 1
Source.Text1(i).Text = recSet.Fields(i).Value
Next
End Sub
Public Sub MoveToRecord(index As Integer, recSet As Recordset, lRec As Long)
Select Case index
Case 0
If lRec > 0 Then recSet.MoveFirst
Case 1
If lRec > 0 Then recSet.MovePrevious
Case 2
If lRec < recSet.RecordCount - 1 Then recSet.MoveNext
Case 3
If lRec < recSet.RecordCount - 1 Then recSet.MoveLast
End Select
End Sub'Projektiin referenssi:
'Microsoft DAO 3.6 Object Library (dao360.dll)
'Form1
' lomakkeelle:
' 4 indeksoitua Text controllia (Text1(1) - Text1(4))
' 4 indeksoitua Komentopainiketta (Command1(0) - command1(3))
Private Sub Form_Load()
Dim dbPolku As String, TaulunNimi As String
dbPolku = App.Path & "\tietokanta.mdb"
TaulunNimi = "taulu"
Set db = OpenDatabase(dbPolku)
Set rs = db.OpenRecordset(TaulunNimi, dbOpenDynaset)
Dim i As Integer
If rs.RecordCount > 0 Then
rs.MoveLast: rs.MoveFirst
For i = 1 To rs.Fields.Count - 1
Text1(i).Text = rs.Fields(i).Value
Next
End If
End Sub
Private Sub Command1_Click(index As Integer)
MoveToRecord index, rs, LastSelectedRecord
LastSelectedRecord = rs.AbsolutePosition
SetValues Me, rs
End Sub
Private Sub Command2_Click()
If Not Form2.Visible Then Form2.Show
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Sub'Form2
' 4 indeksoitua Text controllia (Text1(1) - Text1(4))
' 4 indeksoitua Komentopainiketta (Command1(0) - command1(3))
Private rsTemp As Recordset
Private Sub Form_Load()
If rsTempLastSelectedRecord < 0 Then
rsTempLastSelectedRecord = 0
End If
Set rsTemp = rs.Clone
If rsTemp.RecordCount > 0 Then
rsTemp.Move (rsTempLastSelectedRecord)
Dim i As Integer
For i = 1 To rsTemp.Fields.Count - 1
Text1(i).Text = rsTemp.Fields(i).Value
Next
End If
End Sub
Private Sub Command1_Click(index As Integer)
MoveToRecord index, rsTemp, rsTempLastSelectedRecord
rsTempLastSelectedRecord = rsTemp.AbsolutePosition
SetValues Me, rsTemp
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set rsTemp = Nothing
End SubHalutessaan esimerkkiprojektin voi impata täältä
neau33 kirjoitti:
Moikka taas kisahalo!
esim. näin...
Kiitos, tämä ratkaisi ongelman.
Aihe on jo aika vanha, joten et voi enää vastata siihen.