Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[Access 2013] Dołączanie danych do wewnętrznej tabeli z kilku PC (frontów bazy).

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Czw Gru 14, 2017 5:26 pm  OP    Temat postu: [Access 2013] Dołączanie danych do wewnętrznej tabeli z kilku PC (frontów bazy). Odpowiedz z cytatem Pisownia

Mam następujący problem.
Kilku użytkowników dość intensywnie zapisuje po kilka, kilkanaście wierszy ze swojej lokalnej tabeli do wspólnej tabeli wewnętrznej zlokalizowanej na serwerze. Raz na kilka dni mam problem z blokowaniem się zapisu do tej tabeli, generowane są w sposób przypadkowy trzy różne w treści komunikaty, a użytkownicy muszą resetować swoje komputery.
Zdiagnozowałem problem. Wynika, że powodem blokowania jest intensywny i de-facto niesynchronizowany zapis z kilku PC do jednej tabeli wewnętrznej. Napisałem procedurę testową polegającą na wymuszeniu dołączania (w pętli) wielu wierszy do tabeli zlokalizowanej na serwerze. Już 2 uruchomione fronty bazy z takim testem spowodowały wymuszenie wszystkich 3 generowanych błędów. Szukam pomysłów na ucywilizowanie problemu.
Pomysł jaki mi się narzuca to pole w dodatkowej tabeli wewnętrznej jako flag/semafor (0/1) widoczny dla wszystkich PC do synchronizowania dołączania wierszy do tej wspólnej tabeli wewnętrznej. Procedura dołączania ma uwzględniać status flagu/semafora i powodować, że kolejne dołączanie wierszy z PC może się zacząć dopiero po zakończeniu poprzedniego dołączania. Wadą takiego rozwiązania jest konieczność monitorowania i reagowania na wystąpienie przypadku gdy któryś z PC ustawi flag i przestanie działać. Mogę wtedy przyjąć, że czekam założony czas (np. 20 sek.) i rozpoczynam dołączanie wierszy oraz na nowo obsługuję flag/semafor.

Może ktoś ma doświadczenie z bardziej wysublimowanym rozwiązaniem.
Bardzo będę wdzięczny za podrzucenie pomysłu.

Andrzej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mrowek



Dołączył: 28 Maj 2005
Posty: 330
Skąd: pniewy wlkp

PostWysłany: Czw Gru 14, 2017 11:48 pm      Temat postu: Odpowiedz z cytatem Pisownia

stawialbym normalny sql server gdzies w sieci i tam zapisywal lokalne dane. najmniej roboty.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Pią Gru 15, 2017 6:48 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Czy dobrze Cię rozumiem:
(1) Tabela do której wszystkie fronty dołączają wiersze będzie obsługiwana przez SQL serwer co oznacza brak problemów o których napisałem.
(2) Tabelę będzie można podlinkować do każdego frontu jak do tej pory (jest niezbędna dla kwerend wybierających rekordy z tej tabeli dla potrzeb innych formularzy w bazie).

Proszę potwierdź/skoryguj.

Ja ze swojej strony dopiszę procedurę obsługi z flagiem i podzielę się efektami.

Andrzej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7897

PostWysłany: Pią Gru 15, 2017 8:55 pm      Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
trzy różne w treści komunikaty
Możesz podać treść tych komunikatów?
Oraz:
Cytat:
Napisałem procedurę testową polegającą na wymuszeniu dołączania (w pętli) wielu wierszy
Mogę prosić o treść tej procedury, mam nadzieję, że wykorzystałeś transakcje?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Pią Gru 15, 2017 10:45 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Pozdrawiam wieczorowo
załączyłem w pliku wordowym 3 komunikaty, trzeci wydaje się być nie na temat ale też się pojawia i jakąś logikę jego treści daje się poukładać.

Procedura testowa (w każdym froncie) jest prosta i polega na zapętleniu dołączania pojedynczego wiersza tak aby dołączało się 100 wierszy. Oba fronty uruchamiam prawie jednocześnie. Na pierwszych dwóch screenach widać dwa zadania accessowe (identyczne) dołączające po 100 wierszy każdy. Tabela wynikowa jest linkowana z serwera (widać ją na pomarańczowym pasku okna pierwszego screena). Komunikacja od frontów do serwera po LAN-ie.
Pewną trudnością może być utworzenie kopii takiego środowiska. Jeżeli możesz takie utworzyć to posprzątam we frontach i je prześlę wraz z plikiem tabel wewnętrznych.
Co do transakcji - nie zastosowałem bo problem widzę gdzie indziej. Zdefiniuję go następująco: 2 (lub więcej - u mnie kilkanaście) frontów dołącza wiersze do wspólnej tabeli de facto nic o sobie nie wiedząc.
Mądrzej można by nazwać, że fronty zapisują tabelę bez synchronizowania dostępu do tej tabeli, a może jeszcze jakoś mądrzej :0

Pozdrawiam / Andrzej



Komunikaty_2017-12-15.docx
 Opis:
3 screeny - 3 komunikaty

Pobierz
 Nazwa pliku:  Komunikaty_2017-12-15.docx
 Wielkość pliku:  425.87 KB
 Pobierano:  37 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mrowek



Dołączył: 28 Maj 2005
Posty: 330
Skąd: pniewy wlkp

PostWysłany: Sob Gru 16, 2017 5:41 am      Temat postu: Odpowiedz z cytatem Pisownia

aaaa takie fronty.

komunikaty twierdza ze masz pliczek w trybie tylko jeden uzytkownik a defaultowo powinien byc otwarty w trybie wieluuzytkownikow, z innej strony moze jakas tabela jest zblokowana moze systemowa :< a najpewniej jeden uzytkownik nie ma uprawnien do zapisu pliku w katalogu drugiego uzytkownika

Cytat:
Try changing your; Access Options \ Advanced \ Default Open Mode to Shared


Cytat:
I see it now under options -> Client Options -> Open Mode -> Shared. I just needed to close and open the file again with Access. Thanks!


1) tak
2) tak (na korzysc i niekorzysc przemawia fakt ze posiadasz sqlserv ktory gdzies stoi sobie w sieci i nic go nie ruszy, +brak problemu z udzialami sieciowymi, -musi byc odpalony +wersja free styknie -moze to jest rozwiazanie zbyt szerokie +sql w sql serverze -linkowanie moze spowodowac problem (uzytkownicy uprawnienia itd) +w wersji express, adv. tools mozna podpiac SSRS i wyciagnac raporty na zewnatrz accessa, -konfiguracja +mozliwosci developerki dalszej +przeniesienie kodu na sql zamiast vb +wydajnosc +mozliwosc wyniesienia danych dla innych uslug np excel -refaktoring -migracja danych -czas potrzebny na to)

alternatywnie to zostaje zrobic na udziale sieciowym baze mdb do ktorej kazdy user w sieci lokalnej bedzie mial prawa zapisu i taka tabele tam trzymac (po za frontem typowy backend wiadomo ma plusy i minusy, minus ze udzial sieciowy i zabawa w uprawnienia itd itp, dostepnosc w sieci itd itp)

procedura, flagi itd nic nie zdzialaja jak to wina srodowiska na zewnatrz accessa / konfiguracja. (to nie ma zniechecic)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Numer GG
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Sob Gru 16, 2017 12:12 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzień dobry o poranku
Uruchomiłem mój test: dla 2 frontów bazowych i 100 dołączanych wierszy przez każdego z nich do wspólnej, linkowanej tabeli (czyli nie jest to przypadek, że jeden dopisuje drugiemu);
Po kilkunastu powtórzeniach mam wszystkie możliwe przypadki:
1. Dopisane 100 wierszy z frontu nr 1 i 100 wierszy z frontu nr 2 (bez komunikatu);
2. Dopisane 26 wierszy z frontu nr 1 i 100 wierszy z frontu nr 2 (z komunikatem nr 1);
3. Dopisane 100 wierszy z frontu nr 1 i 22 wiersze z frontu nr 2 (z komunikatem nr 1);
Spiskowo przypuszczam, że Access na czas dołączania wiersza(y) do tabeli ustawia jej status na wyłączną dostępność (???).

Mój pomysł na procedurę zapisu z flag-iem jest następujący:
1. Sprawdzam czy flag jest ustawiony na dopisywanie=false;
2. Jeżeli jest false to:
- ustawiam dopisywanie na true;
- uruchamiam dodatkowe sprawdzanie o którym dalej;
- dołączam wiersze do tabeli;
- ustawiam dopisywanie =false
3. Jeżeli jest true to w pętelce z ograniczoną do np. 20 liczbą iteracji:
- czekam 1 s (sleep 1000);
- ponownie sprawdzam status flagu;
- jeżeli jest false to rozpoczynam dołączanie wg pkt. 2
- po 20 iteracji wychodzę z procedury z komunikatem dla użytkownika i administratora;

Powyższy algorytm ma lukę i stąd pomyślałem o wprowadzeniu dodatkowego sprawdzania.
Np. 2 pliki frontu bazy (lub więcej) mogą w odstępie np. 1 ms sprawdzić flag i oba uruchomić procedurę dołączania wierszy (nadpisując flag) no i wszystko wraca do znanych komunikatów.
Dodatkowe sprawdzanie ma zweryfikować czy to kod z mojego frontu ustawił flag na dopisywanie=true co nie wykluczy nadpisanie flagu ale pozwoli na kontynuowanie dołączania wierszy tylko przez jeden (ostatni nadpisujący) front bazy.
I tu szukam pomysłu jaki identyfikator dopisywać obok flagu który byłby sprawdzany. Wydaje się że czas serwera z dokładnością do 1 ms wystarczy. Szukam innego identyfikatora bo pobieranie czasu serwera nie jest prostym i wdzięcznym rozwiązaniem.

Mam prośbę, rozwiń nieco myśli związane z przytoczonymi cytatami, ja w opcjach dostrzegam: domyślny tryb otwierania bazy, nic o tabelach, gdzie szukać o współdzieleniu (Open Mode to Shared) ?

Andrzej
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7897

PostWysłany: Sob Gru 16, 2017 8:28 pm      Temat postu: Odpowiedz z cytatem Pisownia

Ja czytam na przykład ostatni komunikat z Twojego załącznika:
Cytat:
"Operacja musi wykorzystywać kwerendę, którą można aktualizować".
I to śmiem przypuszczać jest Twoja wina.
Na przykład:
Why is my query read-only?
Dealing with Non-Updateable Microsoft Access Queries and the Use of Temporary Tables

Co do pozostałych komunikatów musiałabym zobaczyć kod.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Nie Gru 17, 2017 7:09 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dziękuję Karolina za Twój post.
Ja właśnie od swojej winy zawartej w komunikacie nr 3 (na mojej wcześniejszej liście) zacząłem sprawdzanie bo jest to screen z komunikatem od użytkownika.
Już wcześniej prześledziłem wszystkie zalecenia ze strony Allena Browna i wydaje mi się, że mojego przypadku tam nie ma. Podzielę się informacją, że najpierw przeprowadziłem kilkadziesiąt prób z aplikacją i testem uruchamiając jednego użytkownika i: zero błędów.
Dopiero podczas wykonywania testu symulującego 2 użytkowników pojawiły się błędy (w rzeczywistości użytkowników jest od kilku do kilkunastu).
Załączam spakowane 3 pliki:
- 2 pliki użytkowników w których trzeba przelinkować tabele z pliku nr 3 (instrukcje_be09);
- plik: instrukcje_be09 który powinien być zlokalizowany via LAN na jakimś serwerze.

Mrowek podesłał mi uwagę:
procedura, flagi itd nic nie zdzialaja jak to wina srodowiska na zewnatrz accessa / konfiguracja. (to nie ma zniechecic)

Przekonuję się, że jest w niej dużo racji. Mój pomysł na kod obsługi flagu tylko przesuwa miejsce powstawania błędu z: kwerend z INSERT INTO wywoływanych przez kilka aplikacji klienckich do: miejsca w procedurach obsługi flagu tworzącego plik notatnika dla pobrania czasu z serwera także wywoływanych przez te aplikacje.

Ale w nawiązaniu do komunikatu nr 2 chcę spróbować wykorzystać naturalny identyfikator jakim jest tekstowy numer stacji PC użytkownika który jest widoczny w tym komunikacie (panel sterowania -> system i dalej nazwa komputera). Jak pobrać ten numer przez VBA do zmiennej ???

Andrzej



Baza101.rar
 Opis:

Pobierz
 Nazwa pliku:  Baza101.rar
 Wielkość pliku:  114.78 KB
 Pobierano:  37 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Andrzej_55



Dołączył: 19 Lut 2016
Posty: 23

PostWysłany: Pon Gru 18, 2017 2:12 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Chcę dodać, że uruchomienie obu frontów i bazy wewnętrznej na pulpicie jednego komputera także umożliwia wygenerowanie błędów :). Wprowadzona przeze mnie pętla na kwerendzie dołączającej "skutecznie" wydłużyła czas dołączania wierszy do tabeli i umożliwia uruchomienie dołączania z drugiego frontu w trakcie działania pierwszego (w obu frontach przycisk: INSERT 1 wiersz 100 razy).

Andrzej.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.11921 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |