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.

Bind data containing commas and/or quotation marks

If the data in any of the fields used for bind variables contains commas, you need to change the default behavior of the INLINE load statement to not interpret commas as field separators. 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 '|':

Also, if any of the bound fields contain single quotation marks, you need to add a Replace command to the LOAD statement that will add an extra single quotation mark after each single quotation mark in the value. This prevents the quote characters from being interpreted as the end of the string that is used in the WHERE clause. Note that database products may use different techniques for escaping single quotation marks.

Na przykład:

OdagBinding: LOAD Replace(VAL,'''','''''') AS VAL INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ] (ansi, txt, delimiter is '|', embedded labels);