Elementarz wdrożeniowca – o inicjalizacji listy pozycji słów kilka.

Facebooktwitterpinterestlinkedinmail
dotyczy wersji: 8.0.x; autor: Bartłomiej Spyrka

W procesach wykorzystujących listy pozycji (np. faktury, rejestracja czasu pracy)  mogą pojawić się sytuacje, gdzie należy wprowadzić bardzo dużą ilość danych. Przy procesach wymagających wprowadzenia każdej możliwej informacji użytkownik korzystający z workflow stoi przed nie lada wyzwaniem zarówno pod względem czasowym jak i pod względem cierpliwości.

W sytuacji, gdy czynność wykonywana przez pracownika jest możliwa do określenia poprzez pewne ramy powtarzalności i określone zasady można mu to ułatwić stosując inicjalizację na liście pozycji.

Inicjalizacja to nic innego jak wstępne załadowanie danych na listę bez większego wysiłku samego pracownika.

Przykład realizowanej funkcjonalności

W artykule, przedstawiona zostanie funkcjonalność inicjalizacji listy pozycji w oparciu o prosty obieg rejestrujący obecność pracowników na zmianie w pewnym przedsiębiorstwie XYZ.

Istnieje obieg o poniższym schemacie:

ini1-p1

Najistotniejszy w tym wypadku będzie krok Rejestracji, gdzie lista pozycji będzie dostępna do edycji. Kolejne kroki nie będą opisywane w niniejszym artykule, gdyż nie mają one żadnego wpływu na niniejszy temat.

Budowa formularza:

ini1-p2

Rysunek 1 Inicjalizacja – wygląd formularza

Powyżej wskazano budowę formularza wykorzystywanego w scenariuszu z inicjalizacją. Cały formularz jest w trybie edycji, leczy z wyłączoną ręczną możliwością dodawania pozycji (1)  oraz włączonym przyciskiem wczytywania wartości domyślnych (2). Wyłączenie / włączenie powyższych funkcjonalności jest opcjonalne. W przypadku wykorzystywania inicjalizacji warto bliżej zapoznać się z możliwościami dot. List pozycji na konkretnych krokach. W BPS Designer Studio wchodzimy na interesujący nas krok (Rejestracja) -> zakładka Formularze w bieżącym kroku.

ini1-p3

Rysunek 2. Dodatkowe możliwości listy pozycji na krokach

 

Po zbudowaniu podstawowych części formularza możemy zająć się sednem sprawy czyli inicjalizacją.

Konstrukcja inicjalizacji

ini1-p4

Rysunek 3. Konfiguracja inicjalizacji subelementów

Konfiguracji dokonujemy bezpośrednio na interesującej nas liście pozycji. Atrybut listy pozycji -> konfiguracja-> zakładka inicjalizacji.

Inicjalizację możemy podzielić na dwa tryby:

  1. Statyczny – tryb wykorzystywany przeważnie do zainicjowania jednego wiersza – aby odjąć 1 kliknięcie w przycisk dodawania, wykorzystywany rzadko. Inicjalizacja tym sposobem, może wprowadzić informacje do listy pozycji wedle wpisanych wartości
  2. Dynamiczny SQL – opcja zaawansowana, znacznie potężniejsza niż ta z pkt 1. Pozwala na wskazanie zapytaniem SQL, wartości jakimi mają się uzupełnić wiersze na liście pozycji. W tym artykule wykorzystamy tryb zaawansowany, odwołujący się do customowej funkcji na serwerze SQL, korzystającej z parametrów dostępnych na formularzu.

Kiedy można inicjalizować? Inicjalizacją jesteśmy w stanie sterować w prosty sposób:

  1. Inicjalizacja na kroku startowym – wykorzystywana na kroku inicjującym obieg (i tylko tam)
  2. Inicjalizacja na innych krokach – możliwość zainicjowania danych na subelementach na pozostałych krokach, gdzie po raz pierwszy kontrolka będzie widoczna.

Od wersji 8.0 powyższe dwie opcje, nie mają dla nas ograniczeń, a to ze względu na JavaScript o którym później przy okazji automatyzacji.

 

Zapytanie SQL do inicjalizacji danych

Konstrukcja zapytania SQL do zbudowania inicjalizacji jest w gruncie rzeczy prosta. Oczywiście stopień skomplikowania zapytania zależy od przypadku w jakim chcemy skorzystać z tej funkcjonalności. Omawiany w tym artykule przykład ma za zadanie zainicjalizowanie list pozycji wierszami odpowiadającymi kolejno dniom kalendarzowym – począwszy od daty startowej do daty końcowej – pobieranych z atrybutów formularza.  I tak samo zapytanie może, ale nie musi zwrócić nam żadnych rekordów, co oznacza ni mniej ni więcej: ile wierszy zwróci SQL tyle pozycji nam się zainicjalizuje na subelementach. Zapytanie SQL NIE MUSI być zdefiniowane funkcją, może mieć postać zwykłego zapytania.

Konstrukcja zapytania

Select ‘Przykladowy Tekst’ as ‘DET_Att1’,  ‘{12}’ as DET_Att2

Zapytanie ma konstrukcję wartość – kolumna do której chcemy wstawić daną. Na podstawie powyższego przykładu wywnioskujemy, że tekst ‘Przykładowy tekst’ trafi do kolumny na liście pozycji DET_Att1, a wartość z atrybutu o ID 12 trafi do kolumny DET_Att2. Skąd wziąć informację o ID bądź odpowiednim DETcie? Rzućmy okiem na poniższy screen.

ini1-p5

Rysunek 4. Mapowanie kolumn dla inicjalizacji

 

Wracając do naszego przypadku biznesowego i wspomnianej wcześniej funkcji SQL…. Na SQL zdefiniowano funkcję SQL przyjmującą dwa parametry (data startu, ilość dni) która ma za zadanie wygenerować odpowiednią ilość wierszy. Poniżej przedstawiono przykładową konstrukcję funkcji:

ini1-p6

Rysunek 5. Definicja funkcji SQL

Wstawienie parametrów i wykonania zapytanie zwróci nam poniższy wynik:

ini1-p7

Rysunek 6. Wynik odpytania funkcji

 Skoro mamy już funkcję, możemy ją wpleść w inicjalizację:

ini1-p8

Rysunek 7. Zapytanie inicjalizujące listę pozycji. Widok podstawowy i zaawansowany

Powyżej zaprezentowano widok z konfiguracji inicjalizacji listy pozycji wykorzystujący funkcję SQL. Zauważmy, iż sama funkcja zwraca kolumny o aliasach date oraz dateName które muszą być odpowiednio zmapowane na kolumny listy pozycji (u nas DET_Att2, oraz DET_Att3). Na drugiej części screena widać, że do odpytania funkcji SQL skorzystano z wartości dwóch atrybutów formularza (Data od ID = 738, oraz Ile dni ID = 740).

 

Uruchomienie funkcjonalności

Przechodząc na formularz, aby sprawdzić działanie inicjalizacji musimy skorzystać z trzech rzeczy:

  1. Pola daty od  (początek wyliczania rekordów w funkcji)
  2. Pola Ile dni ( ile rekordów ma wygenerować funkcja)
  3. Wczytaj domyślne – przycisk służący do wywołania inicjalizacji

ini1-p9

Rysunek 8. Wygląd formularza

 

Wypełnienie pól 1 i 2 danymi, oraz wciśnięcie przycisku ‘Wczytaj domyślne’ spowoduje nam dostarczenie parametrów do funkcji SQL i kolejno wygenerowanie pozycji na subelementach.

ini1-p10

Rysunek 9. Wynik inicjalizacji z 3 dniami

 

W zasadzie to mógłby być koniec artykułu, ale można sobie zadać pytanie czy nie można tego bardziej zautomatyzować? Otóż można! Przykładowo:

  1. Wyliczać ilość dni automatycznie
  2. Po zmianie daty końcowej włączyć automatyczna inicjalizację

Trochę automatyzacji na formularzu

Powyższe punkty można zrealizować  w sposób zaprezentowany poniżej.  Realizacja pierwszego punktu może zostać oparta o prosta funkcję JavaScript wyliczającą różnicę w dniach daty od i daty do. Funkcję taką rejestrujemy na poziomie obiegu ( w zakładce styl i zachowanie).

ini-p11

Rysunek 10. Przykładowa funkcja JS  wyliczająca różnicę między datami

Wywołanie powyższej funkcji wstawiamy na zmianę wartości interesujących nas atrybutów. W naszym wypadku będzie to zmiana wartości w atrybucie ‘Data do’. Designer Studio -> Atrybut Data do-> zakładka ‘Styl i zachowanie’ -> Sekcja ‘Skrypt na zmianę wartości’. Wynik działania skryptu wstawiamy do atrybutu ‘Ile dni’ (AttText1).

ini1-p12

Rysunek 11. Skrypty  do wyliczania interwału między dwoma datami.

Dzięki powyższej konfiguracji zautomatyzowaliśmy wyliczanie różnicy w dniach między dwoma datami dostępnymi na formularzu. Daje nam to możliwość wykorzystania pole ‘Ile dni’ jako techniczne, pozbywamy się odpowiedzialności ciążącej na użytkowniku do wyliczania różnicy w dniach ‘ręcznie’. Atrybut można schować przed użytkownikiem.

 

Druga część również jest relatywnie prosta do wykonania. W wersji 8.0+ pojawiły się dodatkowe funkcje JS wspierające zachowanie na liście pozycji. Znajdziemy je w kreatorze zapytań JS w zakładce Lista pozycji.

ini1-p13

Rysunek 12. Edytor wyrażeń JS i Lista pozycji

Z punktu widzenia celu, który chcemy osiągnąć – automatyczne wczytanie danych na listę pozycji po zmianie wartości w polu ‘Data do’ skorzystamy z funkcji

SubelementInitialization(741);

Gdzie 741 to ID kontrolki naszej listy pozycji (Inicjalizacji).

Zabieg stosujemy w bardzo prosty sposób, do JS na zmianę wartości atrybutu pola ‘Data do’ do uprzednich wartości dodajemy wywołanie powyższej funkcji i …gotowe. Warto wspomnieć o jeszcze jednej choć nie zawsze oczywistej rzeczy, kolejność wykonywania skryptów na zmianę wartości MA znaczenie! Poniżej screen z poprawną konfiguracją JS na zmianę wartości pola ‘Data do’.

ini1-p14

Rysunek 13. Pełny JS na zmianę wartości pola Data do.

Efektem całości prac jest lista pozycji, która automatycznie generuje się na podstawie dwóch parametrów określanych przez użytkownika.

ini1-p15

Rysunek 14. Wygenerowana lista pozycji

Podsumowanie

Reasumując powyższy artykuł, wraz z wersją 8.0+ pojawiło się kilka ciekawych możliwości w obsłudze listy pozycji. Jedną z nich jest inicjalziacja, którą można wspomóc drobnymi poprawkami otrzymując całkiem nieźle funkcjonujący automat.