Konwersja danych
Aplikacja finansowo księgowa firmy napisana w Clipperze 5.3 przechowuje dane w postaci plików DBF. Struktura katalogów samej aplikacji zorganizowana jest w postaci katalogu systemu podstawowego oraz podkatalogów poszczególnych magazynów. Na podstawie
analizy przechowywanych w poszczególnych plikach danych określono że wstępnie na potrzeby sklepu internetowego potrzebnych będzie kilka tabel z systemu podstawowego oraz ze wszystkich poszczególnych magazynów. Rysunek 6 przedstawia fizyczną organizację aplikacji na dysku sieciowym widzianą od strony użytkowników sieci Windows a z drugiej strony od wewnątrz serwera. Z poziomu użytkownika widziana jest struktura katalogów począwszy od wnętrza katalogu „sklep” bowiem tak udostępniony zasób Samby jest mapowany jako dysk logiczny.
Położenie całości aplikacji magazynowej na dyskach serwera umożliwiło dostęp do tych danych pod kątem ich konwersji dla sklepu internetowego, bez zbędnego obciążania sieci wewnętrznej transferami a jedynie obróbką samych danych na poziomie serwera. W celu zapewnienia integralności danych konwersja wykonuje się automatycznie w godzinach nocnych, tak aby to nie kolidowało z działalnością firmy a jednocześnie zapewniało aktualność danych. Charakter działania aplikacji magazynowej wymusił takie przystosowanie modułu konwersji do struktury katalogów, aby dodanie kolejnych magazynów automatycznie zapewniało pobieranie danych także z nich.
W celu konwersji z formatu DBF do formatu tekstowego rozpatrywano dwa warianty. Pierwszy opierał się na konwersji skryptem napisanym w języku Perl natomiast drugi zakładał wykorzystanie gotowego i wielokrotnie szybszego programu w języku C którego autorem jest Brad Eacker a kod był opublikowany w 1994r w grupach USENET.
Ostatecznie przeważyła szybkość konwersji nad elastycznością rozwiązania w Perlu. Chcąc jednak zachować możliwość dostosowywania „wyciąganych” danych z tabel DBF, wyjściowe pliki po kompletnej konwersji DBF na TXT obrabiane są już skryptem shellowym napisanym z wykorzystaniem natywnych unixowi narzędzi takich jak awk czy tr.
Poniższy listing prezentuje ten skrypt opatrzony komentarzami wyjaśniającymi wykonywane działania:
Skrypt służy do konwersji danych z formatu DBF (z systemu MGZ) na formaty wykorzystywane w systemie SQL eMarket. Na początku wyświetla informacje o zadaniu oraz ustawia maskę tworzenia plików (umask 027), co zapewnia odpowiednie prawa dostępu do plików. Następnie skrypt definiuje zmienne, które zawierają ścieżki do katalogów i programów wykorzystywanych w konwersji, takie jak KAT_MGZ
, KAT_TMP
oraz DBFLST
.
Skrypt usuwa stare pliki .LST
i .IN
z poprzednich konwersji, aby uniknąć ich nakładania się. Kolejnym krokiem jest przetwarzanie plików DBF na format LST, co odbywa się przy użyciu programu DBFLST
dla różnych plików, takich jak CENNIK.DBF
, CENY_DEW.DBF
, ODBIORCY.DBF
czy DOSTAWCY.DBF
. Następnie, w przypadku danych magazynowych, skrypt iteruje po katalogach z magazynami w systemie MGZ, przetwarzając pliki MAGAZYN.DBF
na plik .LST
w katalogu tymczasowym.
Po konwersji do formatu LST skrypt przetwarza te pliki za pomocą narzędzia awk
, które usuwa zbędne spacje, zamienia tekst na wielkie litery i wstawia odpowiednie separatory, tworząc pliki .IN
. Po tej operacji pliki LST są usuwane, a następnie skrypt ustawia odpowiednie prawa dostępu do nowych plików .IN
.
Skrypt wyświetla zajętość plików .IN
w katalogu tymczasowym i uruchamia transfer plików na serwer eMarket za pomocą FTP, korzystając z listy poleceń zapisanej w pliku transfer
. Na końcu skrypt informuje o zakończeniu transferu, wyświetlając komunikat „Załadowane”.
Archiwizacja i przesyłanie danych
Skrypty są wywoływane cyklicznie co noc wykonując wstępne przygotowanie danych oraz ich przesłanie przy pomocy ftp na serwer internetowy, gdzie następuje dalsza faza obróbki danych i ich ładowanie do PostgreSQL. Oprócz skasowania starych zbiorów i wkopiowania na ich miejsce nowych wykonywana jest także archiwizacja. Przy pomocy poniższej listy poleceń skryptu „transfer” dane przekazywane są protokołem ftp na serwer internetowy:
Skrypt rozpoczyna połączenie z serwerem FTP o nazwie inet-serwer
w trybie binarnym, co zapewnia poprawny transfer plików, w tym tych zawierających dane nie tekstowe. Następnie zmienia katalog roboczy na serwerze FTP na /home/bazy/emarket/tmp
, gdzie znajdują się pliki do przesłania. Przed przesłaniem nowych plików skrypt usuwa stare pliki, takie jak CENNIK.IN
, CENY_DEW.IN
, DOSTAWCY.IN
, MAGAZYN.IN
oraz ODBIORCY.IN
, aby uniknąć konfliktów.
Po usunięciu poprzednich plików skrypt przesyła nowe pliki z lokalnego katalogu /bofh/bazy/emarket/tmp
do katalogu /home/bazy/emarket/tmp
na serwerze FTP. Komendy put
przesyłają odpowiednie pliki, takie jak CENNIK.IN
, CENY_DEW.IN
, DOSTAWCY.IN
, MAGAZYN.IN
i ODBIORCY.IN
. Następnie skrypt wykonuje komendę ls
, która wyświetla zawartość katalogu na serwerze FTP, pozwalając sprawdzić, czy pliki zostały prawidłowo przesłane.
Na końcu skrypt kończy połączenie z serwerem FTP za pomocą komendy bye
. Skrypt zapewnia prawidłowy transfer danych oraz dba o to, by pliki były aktualizowane na serwerze.
Wyniki wykonania całej operacji są „wyświetlane” na standardowe wyjście (stdout) a następnie wysyłane pocztą email do administratora. Pozwala to na kontrolę poprawności działania całej operacji, gdyż odbywa się ona bezobsługowo. Cykliczność wykonania tych działań realizowana jest dwoma wpisami w pliku konfiguracyjnym crontab. Zapewniają one oprócz konwersji i przekazania danych na serwer internetowy także archiwizację całości systemów finansowo księgowych firmy i umieszczenie ich w katalogu udostępnionym obsłudze w celu przegrania na wymienne nośniki:
Skrypt do archiwizacji jest uruchamiany codziennie o 3:00 w nocy, w dni robocze (od poniedziałku do soboty), przez cron
. W jego pierwszej części, po wstawieniu tematu wiadomości „Status archiwizacji”, skrypt wyświetla informacje o rozpoczynającej się archiwizacji.
Następnie w skrypcie ustawiana jest zmienna d1adaty
, która pobiera aktualną datę w formacie 20yyMMdd
, co pozwala na nadanie odpowiedniej nazwy archiwum. Skrypt przygotowuje dwa zestawy danych do archiwizacji: dane księgowości (KSH
) oraz dane magazynowe (MGZ
). Po przejściu do odpowiednich katalogów (/work/ksieg
dla księgowości i /work/sklep
dla magazynów), skrypt wykonuje komendy tar
do spakowania danych w formie archiwum .tgz
. Wynikiem są pliki ksz<d1adaty>.tgz
i mzz<d1adaty>.tgz
, które są zapisane w katalogu /home/archiwa
.
Po zakończeniu archiwizacji, skrypt wyświetla zajętość plików w katalogu /home/archiwa
za pomocą du -k
, a także sprawdza dostępność miejsca na dyskach poleceniem df -ki
. Na końcu skrypt wypisuje komunikat „KONIEC”, informując o zakończeniu procesu.
Warto zauważyć, że w konfiguracji cron
używamy harmonogramu 0 3 * * 1,2,3,4,5,6
dla archiwizacji, co oznacza uruchamianie tego zadania codziennie o 3:00 rano, w dni robocze (od poniedziałku do soboty). Kolejny cron o 20:00 wykonuje konwersję danych, używając skryptu /bofh/bazy/emarket/konwersja
. W obu przypadkach wyniki błędów są przesyłane na adres operator
za pomocą sendmail
.
Struktura konwertowanych plików
W celu wykonania operacji konwersji danych na potrzeby sklepu internetowego poddano analizie zawartość poszczególnych plików DBF systemów magazynowych. Wyodrębniono przydatne tabele i na ich podstawie określone pola niezbędne dla działania sklepu. Poniższy fragment każdego z plików przekazywanych do zaimportowania do bazy SQL obrazuje jakie dane są wykorzystane z systemów finansowo księgowych firmy:
Plik CENNIK.IN zawiera informacje o towarach. Każdy rekord składa się z czterech pól: identyfikatora towaru (ind
), nazwy towaru w kodowaniu cp852
, oznaczenia producenta oraz stanu magazynowego i stawki VAT. Na przykład, w pierwszym wierszu 167636
to identyfikator towaru, a nazwa towaru to „UCHWYT ZEZ+OBEJMA FI 40”, oznaczenie producenta to „UCHWYT ZEZ+OBEJMA”, stan wynosi 16, a VAT to 22.
Plik CENY_DEW.IN zawiera ceny netto towarów. Każdy rekord ma identyfikator towaru, cenę netto i symbol waluty. Na przykład, dla towaru o identyfikatorze 330055
cena netto wynosi 1146.72
w walucie ZLP
.
Pliki DOSTAWCY.IN i ODBIORCY.IN zawierają dane o dostawcach i odbiorcach. Każdy rekord składa się z identyfikatora (ind
), krótkiej nazwy (nazwa krotka
), pełnej nazwy (nazwa długa
), adresów (od adres1
do adres6
), oraz numeru NIP. Na przykład, dostawca o identyfikatorze 1
to firma „WIZJA TV”, której adres to „UL. PAWINSKIEGO 5A/BLOK D, 02-106 WARSZAWA”.
Plik MAGAZYN.IN zawiera dane o stanach magazynowych. Każdy rekord składa się z identyfikatora towaru (ind
), daty (w formacie YYYYMMDD
), stanu dyspozycyjnego i stanu księgowego. Na przykład, dla towaru o identyfikatorze 240029
stan dyspozycyjny i stan księgowy wynoszą oba 2
.
Te pliki stanowią zestaw danych, które są używane w systemie do zarządzania towarami, cenami, dostawcami, odbiorcami oraz stanami magazynowymi.