Tworzenie powiązań między wyrażeniami w aplikacjach szablonu On-demand

Powiązania między danymi w aplikacji szablonu określają dane z odpowiadającej aplikacji selekcji, które są używane do tworzenia zapytań wydawanych podczas ładowania danych do aplikacji On-demand.

Podstawowa forma tworzenia powiązań między wyrażeniami — $(od_FIELDNAME) — może zostać zmodyfikowana w celu udoskonalenia selekcji i zapewnienia, że aplikacja szablonu ładuje dane poprawnie.

Ostrzeżenie: Aplikacje szablonów utworzone pierwotnie za pomocą rozszerzenia programu Qlik Sense do generowania aplikacji On-demand (On-demand App Generation) powinny zostać zmienione w taki sposób, aby korzystały z podejścia przedstawionego poniżej do utworzenia powiązania z dużą liczbą selekcji z pola.

Tworzenie powiązań do dużej liczby selekcji z pola

Program Qlik associative engine ogranicza liczbę wartości, które mogą zostać skonkatenowane w pojedynczej instrukcji LET. Aby uniknąć tego ograniczenia, można użyć instrukcji INLINE LOAD w celu wydajnego utworzenia listy wartości rozdzielanych przecinkami.

Najpierw należy utworzyć podprogram skryptu w celu przetworzenia tabeli INLINE.

SUB BuildValueList(VarName, TableName, ColName, QuoteChrNum) IF $(QuoteChrNum) = 0 THEN LET LOADEXPR = 'Concat($(ColName),' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ELSE LET CHREXPR = ' chr(' & '$(QuoteChrNum)' & ') '; LET LOADEXPR = 'Concat( $(CHREXPR) & $(ColName) & $(CHREXPR)' & ',' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ENDIF _TempTable:   LOAD $(LOADEXPR) Resident $(TableName); Let vNoOfRows = NoOfRows('_TempTable'); IF $(vNoOfRows)> 0 THEN LET $(VarName) = Peek('CombinedData',0,'_TempTable'); ENDIF drop table _TempTable; drop table '$(TableName)'; END SUB;
Uwaga: Wywołania podprogramu BuildValueList muszą wykorzystywać konkretne wartości przeznaczone dla parametru QuoteChrNum. Gdy pole przetworzone przez podprogram jest liczbowe, wówczas parametr musi być ustawiony na 0. W przypadku danych znakowych parametr musi być ustawiony na 39

Powiązanie należy napisać, używając tabeli INLINE w celu utworzenia struktury wartości pola, która będzie ładowana bez względu na liczbę wartości.

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

Wyrażenie $(od_ORIGIN) {"quote": "", "delimiter": "") zostanie zastąpione listą wartości pola ORIGIN z aplikacji selekcji. Wartości będą rozdzielane znakami nowego wiersza. Jeśli pole ORIGIN zawiera trzy wartości BOS, JFK, ORD, wówczas rozszerzona tabela INLINE wygląda, jak poniżej:

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL BOS JFK ORD ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

Wartość zmiennej ORIGIN po wywołaniu podprogramu BuildValueList będzie następująca:

'BOS','JFK’,'JFK'

Wiązanie wartości opcjonalnych i wykluczonych

W niektórych sytuacjach konieczne jest utworzenie warunku filtrującego w zapytaniu dla skryptu aplikacji szablonu On-demand z użyciem pól, których nie można wybrać bezpośrednio w aplikacji selekcji. Na przykład w rekordach sprzedaży może być używany kod regionu, taki jak REGION_CODE, a w aplikacji selekcji może być używane łatwiej rozpoznawalne pole REGION_NAME, które służy do wybierania regionów. Aplikacja selekcji może obejmować model używający osobnej tabeli w celu powiązania kodu REGION_CODE z polem REGION_NAME, co umożliwia użytkownikom wybieranie wartości z pola REGION_NAME w celu kontroli stanu selekcji.

Wybór wartości z pola REGION_NAME powoduje zmianę ich stanu na wybrane, a wybór wartości kodu REGION_CODE powoduje zmianę ich stanu na opcjonalne, czyli otrzymują kolor biały zamiast zielonego. Ponadto jeśli projekt arkuszy aplikacji selekcji wyklucza kod REGION_CODE z zestawu jej paneli filtrowania, wówczas nie ma sposobu na rozszerzenie tworzącego powiązania wyrażenia $(od_REGION_CODE) w skrypcie aplikacji On-demand na listę wybranych regionów, ponieważ wartości kodu REGION_CODE nigdy nie będą wybrane, czyli nigdy nie będą miały koloru zielonego.

W takim przypadku rozwiązaniem jest dodatkowa składnia, która pozwala dokładniej kontrolować wartości stanu selekcji używane w poszczególnych operacjach wiązania danych. Prefiks od_ w części nazwy pola w każdym wyrażeniu tworzącym powiązania On-demand może zawierać kombinację liter oznaczających, czy wartości używane w powiązaniu mają stan wybrane, czy stan opcjonalne. Poprawne przykładowe kombinacje z użyciem kodu REGION_CODE:

Poprawne kombinacje z użyciem kodu REGION_CODE
Wzór Rozszerzenie
$(ods_REGION_CODE) Wybrane (zielone) wartości kodu REGION_CODE
$(odo_REGION_CODE) Opcjonalne (białe) wartości kodu REGION_CODE
$(odso_REGION_CODE) Wybrane lub opcjonalne wartości kodu REGION_CODE
$(od_REGION_CODE) Tak samo jak kod $(ods_REGION_CODE) — tylko wybrane (zielone) wartości kodu REGION_CODE

W przykładzie aplikacji On-demand z danymi dotyczącymi sprzedaży następujące wyrażenie do wiązania danych zapewnia, że w powiązaniu REGION_CODE uwzględnione są wybrane albo opcjonalne wartości kodu REGION_CODE:

$(odso_REGION_CODE)

Wiązanie wartości liczbowych

Gdy dane przeznaczone do powiązania z aplikacją On-demand zawierają liczby zamiast ciągów, wówczas użyteczne jest pozbycie się znaków cudzysłowów otaczających wartości w polach liczbowych. Jeśli na przykład rekordy sprzedaży zawierają kolumnę liczbową DAY_OF_WEEK, a użytkownik aplikacji selekcji ma wybrać dowolne kombinacje wartości DAY_OF_WEEK, należy rozszerzyć zapytanie agregacji używane do ładowania aplikacji selekcji w taki sposób, aby dołączyć wartości DAY_OF_WEEK zarówno do listy SELECT, jak i do listy GROUP BY. Jeśli cudzysłowy będą umieszczane wokół wartości DAY_OF_WEEK po ich wybraniu, wówczas może wystąpić błąd zapytania w środowisku wykonawczym, gdy baza danych nie obsługuje automatycznej konwersji typu z ciągu na liczbę.

W takim przypadku na końcu części FIELDNAME wyrażenia tworzącego powiązania można dodać sufiks, który spowoduje, że powiązanie pola będzie używało wartości liczbowych z aplikacji selekcji zamiast ciągów. Ten sufiks to _n, jak w poniższej klauzuli WHERE:

WHERE DAY_OF_WEEK IN ( $(od_DAY_OF_WEEK_n) );

W takim przypadku rozszerzenie będzie następujące:

WHERE DAY_OF_WEEK IN ( 1,2 );

Wymóg konkretnej liczby selekcji

W niektórych sytuacjach konieczne może być określenie wymogu, aby zapytanie aplikacji On-demand zawierało konkretną liczbę lub konkretny zakres wartości dla podanego pola. Jeśli na przykład zapytanie aplikacji On-demand zawiera klauzulę BETWEEN, która pozwala uzyskać dane o całej sprzedaży od daty początkowej do daty końcowej, wówczas wyrażenie tworzące powiązanie dla pola YEARQUARTER może zawierać sufiks [2], który będzie wymagać wyboru dokładnie dwóch wartości dla YEARQUARTER, jak poniżej:

$(od_YEARQUARTER)[2]

Punkt nawigacji aplikacji On-demand w aplikacji selekcji pozostanie wyłączony, dopóki wybór nie będzie obejmował dokładnie dwóch wartości YEARQUARTER. Zostanie wyświetlony komunikat informujący o konieczności wyboru dokładnie dwóch wartości YEARQUARTER.

Ograniczenia dotyczące liczby wybranych elementów tworzą wymaganie wstępne łączące aplikację selekcji z aplikacją On-demand. Działanie takich wyrażeń różni się od działania wyrażeń tworzących powiązania, w których nie są stosowane ograniczenia dotyczące liczby. Gdy na przykład skrypt aplikacji szablonu zawiera wyrażenie tworzące powiązania bez ograniczenia dotyczącego liczby, jak poniżej:

$(od_MYFIELD)

wówczas nie istnieje żadne wymaganie określające, że aplikacja selekcji ma zawierać pole o nazwie MYFIELD ani że jakiekolwiek wartości tego pola (jeśli ono istnieje) muszą być wybrane. Jeśli aplikacja selekcji nie zawiera pola o nazwie MYFIELD lub jeśli użytkownik nie dokona żadnego wyboru z tego pola, wówczas punkt nawigacji aplikacji On-demand nadal może zostać włączony — w przypadku dokonania innych wyborów — w celu spełnienia warunku wartości dotyczącego limitu rekordów.

Jeśli jednak wyrażeniem tworzącym powiązania jest:

$(od_MYFIELD)[1+]

oznacza to, że istnieją dwa wymagania względem aplikacji selekcji:

  • Aplikacja selekcji musi zawierać pole o nazwie MYFIELD.
  • Użytkownik musi wybrać co najmniej jedną wartość dla pola MYFIELD.

Tego typu wyrażenia tworzące powiązania muszą być używane ostrożnie, ponieważ ograniczają zakres aplikacji selekcji, które mogą być używane z aplikacją szablonu. Nie należy używać tego ograniczenia dotyczącego liczby względem powiązań aplikacji selekcji, chyba że to wymaganie dotyczące liczby wybranych elementów ma dotyczyć wszystkich aplikacji selekcji, które łączą się z tą aplikacją szablonu.

W celu wykonania procesu tworzenia powiązań między danymi usługa aplikacji On-demand stosuje podejście oparte na podstawianiu ciągu, które nie uwzględnia komentarzy występujących w skrypcie. Oznacza to, że w komentarzach nie należy używać wyrażeń tworzących powiązania, chyba że po wygenerowaniu aplikacji te komentarze mają zawierać listę wartości powiązanych.

Możliwe jest także definiowanie innych ograniczeń dotyczących liczby. W poniższej tabeli podsumowano różne kombinacje ograniczeń dotyczących liczby wybranych elementów.

Różne kombinacje ograniczeń dotyczących liczby wybranych elementów
Wzorzec ograniczenia Wymaganie dotyczące wyboru
$(od_YEARQUARTER)[2] Muszą zostać wybrane dokładnie 2 wartości YEARQUARTER.
$(od_YEARQUARTER)[2-4] Wybór musi obejmować od 2 do 4 wartości YEARQUARTER.
$(od_YEARQUARTER)[2+] Muszą zostać wybrane co najmniej 2 wartości YEARQUARTER.
$(od_YEARQUARTER)[2-] Mogą zostać wybrane maksymalnie 2 wartości YEARQUARTER.
Uwaga: Kontrola, która ustala, czy wszystkie ograniczenia dotyczące liczby w aplikacji szablonu zostały spełnione, jest wykonywana podczas generowania aplikacji. Jeśli ograniczenie dotyczące liczby jest naruszone, wówczas żądanie wygenerowania aplikacji zostanie odrzucone i pojawi się komunikat o błędzie.

Zmiana znaków cudzysłowu wartości oraz znaków ograniczników

Gdy lista wartości z pola wybranego w aplikacji selekcji On-demand zostanie wstawiona do skryptu aplikacji szablonu, wówczas wartości zostaną otoczone pojedynczymi cudzysłowami i będą rozdzielone przecinkami. Są to znaki domyślne dla cudzysłowów i ograniczników. Te wartości można zmieniać w składni dołączanej do instrukcji wiązania dla każdego pola. Na przykład:

$(odso_ORIGIN){"quote": "|", "delimiter": ";"}

Te nowe wartości są następnie używane podczas formatowania listy wartości powiązania pobieranych z aplikacji selekcji. Na przykład jeśli wybrane wartości są pierwszymi trzema miesiącami roku, wówczas lista zostanie skonstruowana w następujący sposób:

|January|;|February|;|March|

Domyślne wartości dla cudzysłowu i ogranicznika działają dla większości standardowych baz danych SQL. Jednak mogą nie działać dla niektórych baza danych SQL i nie działają dla większości dynamicznych źródeł danych, takich jak NoSQL i REST. W przypadku takich źródeł należy dołączyć wyrażenie wiązania, aby zmienić znaki cudzysłowów i ograniczników.

Tworzenie powiązań między danymi zawierającymi znaki cudzysłowów

Jeśli dane w jakichkolwiek polach używanych dla zmiennych powiązania zawierają cudzysłowy pojedyncze lub podwójne, wówczas należy zmienić domyślne działanie instrukcji ładowania INLINE w taki sposób, aby cudzysłowy nie były interpretowane jako ograniczniki wartości. Zmień ogranicznik, używając specyfikacji formatowania, na znak, który nigdy nie występuje w wartościach pola podlegającego powiązaniu. Ten sposób przedstawiono poniżej na przykładzie znaku '|':

OdagBinding:

LOAD * INLINE [

VAL

$(odso_ORIGIN){"quote": "", "delimiter": ""}

]

(ansi, txt, delimiter is '|', embedded labels);