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 Sub
Moikka 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 Sub
Halutessaan 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.