Wiecie może, jakimi prawami rządzą się formularze oparte o recordset
do tabeli podlinkowanej? Konkretnie chodzi mi o taki scenariusz:
1. Uruchamiam formularz bazujący na podlinkowane tabeli (ODBC, SQL
2005)
2. W Accesie (2007, accdb) modyfikuję dane w jednym z pól, zapisuję
3. Otwieram tabelę poza accesem (w moim przypadku interfejs web) -
modyfikacja z acc jest widoczna
4. Modyfikuję dane w jednym z pól, zapisuję
5. Przechodzę do accesa - (przechodzę do kolejnego i wracam do
bieżącego rekordu) - modyfikacja dokonana w web'ie nie jest widoczna
6. Po ponownym załadowaniu formularza zmiany są już widoczne
Poprawcie mnie jeżeli źle to interpretuję: synchronizacja danych
odbywa się w jedną stronę (ACC -> SQL)?
Jeżeli tak, to czy jest jakiś sposób na ładowanie najświeższych danych
przy przeładowaniu rekordu (wiem, że mogę skonstruować formularz
niezwiązany, który będzie ładował rekord prosto z bazy), ale być może
ten efekt jest do osiągnięcia przy formularzu związanym?
Z góry dzięki, za podzielenie się wiedzą,
PK
Hm, na pierwszy rzut oka to średnie rozwiązanie. Requery przeładuje
cały recordset, biorąc pod uwagę, że to tabela zdalna może to trochę
potrwać. Poza tym Requery ustawi recordset na pierwszym rekordzie i
konieczna będzie obsługa powrotu formularza do rekordu na którym
zostało wywołane requery.
Requery tak, ale raczej nie wystarczy, bo przeniesie focus do
pierwszego rekordu. Trzeba jeszcze przywrócić bieżący rekord. No ale
to też nie problem, można w tym celu zapamiętać położenie rekordu i
odtworzyć je za pomocą:
Me.Recordset.Move=...
Lepsze jest chyba jednak zapamiętanie klucza unikalnego i
przeniesienie focusa na rekord z tym kluczem. Czyli cos takiego:
id = Me!Identyfikator
Me.Requery
Me.Recordset.FindFirst "Identyfikator=" & id
K.P.
Nie uważacie, że to jest mało efektywne rozwiązanie? Na potrzebę
załadowania jednego rekordu odświeża się cały recordset?
| Wiecie mo�e, jakimi prawami rz�dz� si� formularze oparte o recordset
| do tabeli podlinkowanej? Konkretnie chodzi mi o taki scenariusz:
|
| 1. Uruchamiam formularz bazuj�cy na podlinkowane tabeli (ODBC, SQL
| 2005)
| 2. W Accesie (2007, accdb) modyfikuj� dane w jednym z p�l, zapisuj�
| 3. Otwieram tabelďż˝ poza accesem (w moim przypadku interfejs web) -
| modyfikacja z acc jest widoczna
| 4. Modyfikuj� dane w jednym z p�l, zapisuj�
| 5. Przechodzďż˝ do accesa - (przechodzďż˝ do kolejnego i wracam do
| bie��cego rekordu) - modyfikacja dokonana w web'ie nie jest widoczna
| 6. Po ponownym za�adowaniu formularza zmiany s� ju� widoczne
|
| Poprawcie mnie je�eli �le to interpretuj�: synchronizacja danych
| odbywa siďż˝ w jednďż˝ stronďż˝ (ACC -> SQL)?
|
| Je�eli tak, to czy jest jaki� spos�b na �adowanie naj�wie�szych danych
| przy prze�adowaniu rekordu (wiem, �e mog� skonstruowa� formularz
| niezwi�zany, kt�ry b�dzie �adowa� rekord prosto z bazy), ale by� mo�e
| ten efekt jest do osi�gni�cia przy formularzu zwi�zanym?
O tym jak cz�sto dane s� od�wie�ane decyduje parametr: Interwa� od�wie�ania
ODBC
(Opcje, zaawansowane).
Zwykle jest on ustawiony na do�� du�� ilo�� sekund - co ma sens!
Me.Requery jest sposobem natychmiastowym, je�li jednak �adujesz strasznie
du�y i czasoch�onny recordset, to to ju� w zasadzie Tw�j problem...
--
KN
Przeładowanie recordset to 2-3 s więc trochę za długo jak na nawigację
pomiędzy rekordami. Poszukam innego rozwiązania. Na razie przychodzi
mi do głowy formularz nie związany z oprogramowaną obsługą recordsetu
z danymi (nawigacja wg. recordsetu + wczytanie danych dla konkretnego
rekordu). Być może w recordsecie znajdzie się jeszcze jakaś właściwość
w stylu SeeChanges.
Póki co dzięki za pomoc.
PK.
Raczej bardziej odpowiedni byłby przycisk 'Odswiez dane', zeby
użytkownik kliknął sobie kiedy to mu potrzebne. Być może też szybciej
będzie sprawdzać jakiś timestamp dla bieżącego rekordu (odczyt selecta
z bazy) i przeładowywać dane tylko kiedy coś się zmieniło.
K.P.
jak zapytanie skonstruujesz tak �eby ci �adowa�o tylko jeden to jest ok
no chyba �e poruszasz si� po rekordach, to mo�e by� ma�y problem
Private WithEvents navRS As ADODB.Recordset
Private dataRS As DAO.Recordset
Private Sub Form_Open(Cancel As Integer)
Set navRS = New ADODB.Recordset
navRS.CursorLocation = adUseClient
navRS.Open "SELECT * FROM test", CurrentProject.Connection,
adOpenDynamic 'tabela podlinkowna
LoadRecord
End Sub
Private Sub LoadRecord()
Dim SQLStr As String
Me.RecordSource = SQLStr
End Sub
Private Sub GotoFirst_button_Click()
navRS.MoveFirst
LoadRecord
End Sub
Private Sub GotoLast_button_Click()
navRS.MoveLast
LoadRecord
End Sub
Private Sub GotoNext_button_Click()
navRS.MoveNext
LoadRecord
End Sub
Private Sub GotoPrev_button_Click()
navRS.MovePrevious
LoadRecord
End Sub
Private Sub SetNavState()
Me.RecordCounter.Caption = navRS.AbsolutePosition & "/" &
navRS.RecordCount
Me.Reload_button.Enabled = True
If navRS.AbsolutePosition = navRS.RecordCount Then
Me.Reload_button.SetFocus
Me.GotoNext_button.Enabled = False
Me.GotoLast_button.Enabled = False
If Me.GotoPrev_button.Enabled Then
Me.GotoPrev_button.SetFocus
End If
Else
Me.GotoNext_button.Enabled = True
Me.GotoLast_button.Enabled = True
End If
If navRS.AbsolutePosition <= 1 Then
Me.Reload_button.SetFocus
Me.GotoPrev_button.Enabled = False
Me.GotoFirst_button.Enabled = False
If Me.GotoNext_button.Enabled Then
Me.GotoNext_button.SetFocus
End If
Else
Me.GotoPrev_button.Enabled = True
Me.GotoFirst_button.Enabled = True
End If
End Sub
Pozdrawiam,
Jeszcze tylko pewnie powiniene� zablokowa� mo�liwo�� zmiany rekordu w inny
spos�b ni� za pomoca Twoich przycisk�w. Np zdeaktywowa� klawisze typu
PageDown. Ostatni formant przy klepni�ciu w enter przenowi focus domyslnie
do nast�pego rekordu, strza�ki te� potrafi� przenie�� focus do kolejnego
rekordu.
K.P.