1 Wstęp 2 Dwie bazy danych 3 Zapis danych do bazy SQL i

Transkrypt

1 Wstęp 2 Dwie bazy danych 3 Zapis danych do bazy SQL i
1
Wstęp
Często pojawiają się pytania o pewne przekłamania w raportach generowanych w systemie Golem. Na przykład jak to jest że robię raport dla
30 minut a suma czasów wynosi 60 minut !!!??? Wynika to ze specyficznego sposobu zapisu danych na podstawie których system generuje raporty.
2
Dwie bazy danych
Gromadzone przez system dane przechowywane są w dwu bazach danych – lokalnej bazie stacji zbierania danych (pliki .dat) oraz w bazie SQL.
Wszystkie te informacje które widzimy „na bieżąco” takie jak stan liczników, liczników czasu, czasy statusów itp. pobierane są bezpośrednio ze stacji
zbierania danych. Na ich podstawie tworzone są też niektóre raporty.
Większość raportów tworzona jest jednak na podstawie danych zapisywanych cyklicznie co jakiś czas w bazie danych SQL.
3
3.1
Zapis danych do bazy SQL i tworzenie raportów
Zapis przyrostów
Aby określić czas trwania jakiegoś wydarzenia mamy do dyspozycji dwie metody – zapisać kiedy owe zdarzenie miało swój początek i kiedy miało swój
koniec a potem policzyć czas od początku do końca. Metoda taka ma jednak jeden feler – jeśli z jakiegokolwiek powodu nie nastąpi zapis informacji o
końcu zdarzenia to możemy w konsekwencji uzyskać abstrakcyjne wyniki.
Powiedzmy że o 16:35, 1 marca zmieniono status na pracę a o 17:00 na awarię. Odejmujemy więc od jednej daty drugą i mamy 25 minut pracy.
Ale jeśli z jakiegoś powodu nie zapiszemy tego drugiego znacznika czasu to nastąpi bardzo poważny błąd bo się okaże że mamy początek ale nie
mamy końca i dane się „rozjadą”
Inną metodą jest cykliczne zapisywanie przyrostów liczników – co jakiś czas zapisujemy o ile się one zmieniły a jeśli chcemy poznać wartość dla
jakiegoś zakresu czasu to sumujemy wszystkie zapisane w tym czasie przyrosty.
Jeżeli przy takiej metodzie nastąpi błąd i nie będzie jakiegoś zapisu to dane i owszem – błędne będą, ale nie będzie to błąd który spowoduje tzw. utratę
integralności - np. suma zapisanych w czasie doby czasów będzie miała 23 a nie 24 godziny ale nie będzie to godzin 500 albo 0.
Każdy z liczników w systemie (liczniki czasów pracy, czasów statusów, liczniki produktu, braków energii etc.) ma swoją kopię – tzw. liczniki delta.
Kiedy zwiększany jest jakiś licznik zwiększany też jest jego licznik delta. Liczniki te są co godzinę zapisywane do bazy i kasowane.
Inaczej mówiąc program co godzinę zapisuje ile w ciągu tej godziny było produktu, czasu pracy, czasu postoju , czasu awarii, braków itd.
Zapis ten następuje zawsze pod koniec pełnej godziny oraz w dwu przypadkach o których za niżej.
Kiedy robimy raport dla wybranego zakresu czasu program sumuje
wszystkie zapisy które zostały poczynione w wybranym czasie.
Pamiętajmy jednak o tym że są to zapisy cogodzinne.
Jeżeli ustawimy filtr czasu od godziny 6:00 do 13:59 to dostaniemy
sumę wszystkich przyrostów zmiany bo (rysunek obok) filtr ten
„złapie’ wszystkie zapisy w danym zakresie.
Jeśli jednak ustawimy filtr na zakres od 9:00 do 9:30 to wynik będzie
zero!!!! Dlaczego ? Bo pomiędzy 9 a 9:30 nie było żadnego zapisu !
Jeśli ustawimy filtr na zakres od 9:30 do 10:00 to odczytamy że
efektywny czas pracy wynosił 60 minut ! Jak to – 60 minut w ciągu
pół godziny ? Ano tak. Bo został odczytany rekord stworzony o
godzinie 9:59 który dotyczy CAŁEJ godziny.
Może się jednak okazać że drugi podany przykład jest nieprawdziwy,
że dane nie będą zerowe. A to dla tego że system zapisuje dane nie
tylko pod koniec pełnej godziny.
3.2
Zapis przy zmianie zlecenia i pracownika
Każdy zapis liczników przyrostów opatrywany jest kodem zlecenia i kodem operatora, o ile oczywiście skonfigurowano maszyny z ich użyciem.
Poza zapisem pod koniec każdej godziny system zapisuje liczniki przyrostów przy każdej zmianie zlecenia i / lub operatora.
Wyżej pokazałem jak system generuje raport dla wybranego zakresu czasu – raport dla zlecenia robiony jest w ten sposób że system sumuje wszystkie
zapisy które opatrzone są numerem ID zlecenia.
Raport dla operatora robiony jest w taki sam sposób jak w przykładzie wyżej, czyli sumowane są zapisy z wybranego zakresu czasu, z tym że tylko te
które są opatrzone numerem ID operatora dla którego raport jest robiony.
3.3
Dlaczego właśnie tak?
Zapyta czytelnik – dlaczego właśnie tak? Dlaczego zapis jest robiony co godzinę a nie co minutę? Przecież gdyby był robiony co minutę to
dla dowolnego zakresu czasu dostalibyśmy poprawny wynik i moglibyśmy zawęzić badany czas do np. 15 minut.
Powiedzmy że mamy 30 maszyn. Co godzinę zapisujemy więc 30 rekordów z przyrostami liczników, czyli 720 na dobę, czyli ponad 17 tysięcy
miesięcznie. To dla bazy SQL żadna ilość. Za serwer może nam służyć dowolny komputer z dowolnym systemem a agregacja danych (ich podliczenie)
jest prawie natychmiastowa. Gdyby jednak zapis następował co minutę to byłby to milion zapisów miesięcznie a dyski serwera pracowały by non-stop
pochłaniając przeogromne ilości danych. Wymagało by to zastosowanie silnego serwera z szybkimi dyskami i szybkich sieci. Naszym celem nie było
jednak stworzenie kolejnego, koszmarnie drogiego systemu – być może dla Ciebie szanowny użytkowniku zakup serwera z odpowiednim
oprogramowaniem dla Golema za kilkanaście tysięcy nie stanowi żadnego problemu ale dla innego klienta i owszem, tym bardziej że wartość dodana
była by niewielka – na palcach jednej ręki można by wyliczyć zastosowanie dla tak dokładnego zapisu.
4
Podsumowanie
Jeżeli robimy raport dla operatora dla bieżącej doby a operator ten zdał maszynę o 17:34 zostanie to w raporcie uwzględnione. Jeżeli robimy raport dla
zlecenia które rozpoczęto o 12:11 a zakończono o 19:43 to zostanie to uwzględnione. I przy rozpoczęciu i przy zakończeniu dane są zapisywane.
Jednak jeśli zrobimy dowolny raport ogólny, np. raport czasu pracy w grupach czy raport zbiorczy dla maszyny to po pierwsze wybierajmy zawsze pełne
godziny, po drugie pamiętajmy że raport robiony „TERAZ” dotyczy czasu do ostatniej pełnej godziny.
Kontrolujmy też czas serwera – źle ustawiony czas serwera może powodować przedziwne błędy o czym przekona się jeden z naszych klientów