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:
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:
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.
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
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:
- 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
- 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:
- Inicjalizacja na kroku startowym – wykorzystywana na kroku inicjującym obieg (i tylko tam)
- 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.
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:
Rysunek 5. Definicja funkcji SQL
Wstawienie parametrów i wykonania zapytanie zwróci nam poniższy wynik:
Rysunek 6. Wynik odpytania funkcji
Skoro mamy już funkcję, możemy ją wpleść w inicjalizację:
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:
- Pola daty od (początek wyliczania rekordów w funkcji)
- Pola Ile dni ( ile rekordów ma wygenerować funkcja)
- Wczytaj domyślne – przycisk służący do wywołania inicjalizacji
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.
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:
- Wyliczać ilość dni automatycznie
- 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).
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).
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.
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’.
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.
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.