tabele Microsoft Power Fx

Uwaga

Microsoft Power Fx to nowa nazwa języka formuł dla aplikacji kanw. Te artykuły działają w toku, ponieważ Microsoft wyodrębnia język z aplikacji kanwy, integruje go z innymi produktami Microsoft Power Platform i udostępnia je jako open source. Zacznij od przeglądu Microsoft Power Fx, aby znaleźć wprowadzenie do języka.

Microsoft tabele Power Fx organizują dane w rekordy, pola i kolumny ze źródeł, takich jak Microsoft Excel, SharePoint i SQL Server. Poznaj te struktury, aby pisać formuły, które uzyskują dostęp do danych tabelarycznych, kształtują je i skutecznie manipulują nimi.

  • Rekord zawiera co najmniej jedną kategorię informacji dotyczących osoby, miejsca lub rzeczy. Na przykład rekord może zawierać imię i nazwisko, adres e-mail i numer telefonu jednego klienta. W innych narzędziach rekordy mogą funkcjonować pod nazwą „wiersz”, „element” lub „pozycja”.
  • Tabela zawiera jeden rekord lub wiele rekordów, które zawierają te same kategorie informacji. Tabela może na przykład zawierać imiona i nazwiska, adresy e-mail i numery telefonów 50 klientów.

Można utworzyć rozmaite formuły przyjmujące nazwę tabeli jako argument (analogicznie do formuł w programie Excel, które używają odwołań do komórek jako argumentów). Niektóre formuły w usłudze Power Fx zwracają tabelę, która odzwierciedla inne określone przez Ciebie argumenty. Można na przykład utworzyć formułę:

  • w celu zaktualizowania rekordu w tabeli, określając tę tabelę jako jeden z wielu argumentów funkcji Patch
  • w celu dodania lub usunięcia kolumn w tabeli albo zmiany ich nazw, określając tę tabelę jako argument funkcji AddColumns, DropColumns lub RenameColumns. Żadna z tych funkcji nie modyfikuje oryginalnej tabeli. Zamiast tego funkcja zwraca inną tabelę utworzoną na podstawie innych określonych argumentów.

Elementy tabeli

Zrzut ekranu przedstawiający rekordy, pola i kolumny, które tworzą tabelę.

Rekordy

Każdy rekord zawiera co najmniej jedną kategorię informacji dotyczących osoby, miejsca lub rzeczy. W przykładzie pokazano wcześniej rekord dla każdego produktu (Czekolada, Chleb i Woda) oraz kolumna dla każdej kategorii informacji (Price, Quantity on Hand i Quantity on Order).

W formule można się odwołać do samego rekordu, z pominięciem kontekstu tabeli. W tym celu należy użyć nawiasów klamrowych. Na przykład rekord { Name: "Strawberries", Price: 7.99 } nie jest skojarzony z tabelą. Pamiętaj, że nazwy pól, takie jak Name i Price w tym przykładzie, nie są ujęte w cudzysłów.

Pola

Pole to fragment informacji zawartych w rekordzie. Pole takie można sobie wyobrazić jako wartość w kolumnie odpowiadająca określonemu rekordowi.

Podobnie jak w przypadku kontrolek, do pola lub rekordu można się odwołać za pomocą .operatora w rekordzie. Na przykład funkcja First(Products).Name zwraca pole Name odpowiadające pierwszemu rekordowi w tabeli Products.

Pole może zawierać inny rekord lub tabelę, co widać w przykładzie dotyczącym funkcji GroupBy. Można zagnieździć dowolną liczbę poziomów rekordów i tabele.

Kolumny

Kolumna odwołuje się do tego samego pola dla co najmniej jednego rekordu w tabeli. W poprzednim przykładzie każdy produkt ma pole ceny, a cena znajduje się w tej samej kolumnie dla wszystkich produktów. Poprzednia tabela zawiera cztery kolumny, które są widoczne w poziomie u góry:

  • Nazwisko
  • Cena
  • Ilość rzeczywista
  • Ilość w zamówieniu

Nazwa kolumny odzwierciedla pola w niej zawarte.

Wszystkie wartości w kolumnie reprezentują ten sam typ danych. W poprzednim przykładzie kolumna "Quantity on Hand" zawsze zawiera liczbę i nie może zawierać ciągu, takiego jak "12 jednostek", dla jednego rekordu. Pole może być także puste.

Kolumny mogą być nazywane "polami" w innych narzędziach.

Tabela

Tabela składa się z co najmniej jednego rekordu. Każdy rekord ma wiele pól mających spójne nazwy dla wszystkich rekordów.

Każda tabela przechowywana w źródle danych lub kolekcji ma nazwę. Nazwa umożliwia odwoływanie się do tabeli i przekazywanie jej do funkcji przyjmujących tabele jako argumenty. Tabele mogą być również wynikiem działania funkcji lub formuły.

Jak przedstawiono w poniższym przykładzie, tabelę można wyrazić w formule, korzystając z funkcji Table i zestawu rekordów ujętych w nawiasy klamrowe:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Można również zdefiniować jednokolumnową tabelę, korzystając z nawiasów kwadratowych. Odpowiednikiem powyższych danych byłby następujący zapis:

[ "Strawberry", "Vanilla" ]

Formuły tabel

W programie Excel i usłudze Power Fx można za pomocą formuł w podobny sposób modyfikować liczby i ciągi tekstowe:

  • W programie Excel można na przykład wpisać wartość typu 42 w komórce A1, a następnie w innej komórce wpisać formułę, taką jak A1+2, w celu uzyskania wartości 44.
  • W usłudze Power Apps ustaw właściwość Default elementu Slider1 na wartość 42 i ustaw właściwość Text etykiety na wartość Slider1.Value + 2, aby została wyświetlona wartość 44.

W obu przypadkach obliczona wartość zmienia się automatycznie, jeśli zmienisz wartości argumentów (np. liczbę w komórce A1 lub wartość elementu Slider1).

W podobny sposób można za pomocą formuł korzystać z danych w tabelach i rekordach oraz manipulować nimi. Nazwy tabel mogą stanowić argumenty w niektórych formułach, takich jak formuła Min(Catalog, Price) umożliwiająca przedstawienie najniższej wartości w kolumnie Price tabeli Catalog. Inne formuły zwracają wyniki w postaci całych tabel. Na przykład formuła RenameColumns(Catalog, "Price", "Cost") zwraca wszystkie rekordy z tabeli Catalog, ale zmienia nazwę kolumny Price na Cost.

Podobnie jak w przypadku liczb, formuły obejmujące tabele i rekordy są automatycznie przeliczane, jeśli zmieni się źródłowa tabela lub rekord. Jeśli koszt produktu w tabeli Catalog zostanie zmniejszony poniżej poprzedniej wartości minimalnej, wartość zwrócona przez formułę Min zostanie automatycznie zmieniona z uwzględnieniem nowego kosztu.

Funkcje tabel i właściwości kontrolek

Rozważ użycie funkcji Lower. Jeśli zmienna welcome zawiera ciąg tekstowy „Hello, World”, formuła Lower(welcome) zwraca wartość „hello, world”. Ta funkcja nie zmienia wartości w tej zmiennej. Lower jest funkcją czystą, która jedynie przetwarza dane wejściowe i generuje dane wyjściowe. To wszystko; nie ma żadnych efektów ubocznych. Wszystkie funkcje w programie Excel i większość funkcji usługi Power Fx to czyste funkcje, które umożliwiają automatyczne ponowne obliczanie wartości dla skoroszytu lub aplikacji.

Usługa Power Fx oferuje zestaw funkcji, które operują na tabelach w taki sam sposób. Te funkcje umożliwiają pobieranie tabel jako danych wyjściowych, a następnie filtrowanie, sortowanie, przekształcanie, redukowanie i podsumowywanie całych tabel danych. W rzeczywistości funkcji Lower i wiele innych funkcji, które zwykle akceptują pojedynczą wartość, może również akceptować jednokolumnową tabelę jako dane wejściowe.

Wiele funkcji korzysta z tabeli o jednej kolumnie do tworzenia danych wejściowych. Jeśli cała tabela zawiera tylko jedną kolumnę, można określić ją według nazwy. Jeśli tabela zawiera wiele kolumn, można określić jedną z tych kolumn, korzystając ze składni Table.Column. Na przykład Products.Name zwraca tabelę jednokolumnową wyłącznie z wartościami Nazwa z tabeli Produkty.

Można całkowicie zmienić kształt tabeli, używając funkcji AddColumns, RenameColumns, ShowColumns lub DropColumns. Te funkcje również zmieniają tylko dane wyjściowe, a nie źródło.

Formuły behawioralne

Inne funkcje zostały zaprojektowane specjalnie do modyfikowania danych i powodują efekty uboczne. Ponieważ te funkcje nie są funkcjami czystymi, należy je starannie skompilować. Nie mogą one brać udziału w automatycznym przeliczaniu wartości w aplikacji. Tych funkcji można używać tylko w formułach behawioralnych.

Zakres rekordów

Niektóre funkcje działają, oceniając formułę we wszystkich rekordach tabeli— jeden rekord naraz. Wynik formuły jest używany na różne sposoby:

  • AddColumns — formuła udostępnia wartość nowej kolumny.
  • Average, Max, Min, Sum, StdevP, VarP — formuła udostępnia wartość do zagregowania.
  • Filter, Lookup — formuła określa, czy rekord powinien być uwzględniony w danych wyjściowych.
  • Concat — formuła określa ciągi, które mają zostać połączone.
  • Distinct — formuła zwraca wartość służącą do zidentyfikowania zduplikowanych rekordów.
  • ForAll — formuła może zwrócić dowolną wartość. Możliwe są efekty uboczne.
  • Sort — formuła zawiera wartość, według której rekordy mają zostać posortowane.
  • With — formuła może zwrócić dowolną wartość. Możliwe są efekty uboczne.

W ramach tych formuł można odwoływać się do pól przetwarzanego rekordu. Każda z tych funkcji tworzy „zakres rekordów”, w którym jest oceniana formuła. Pola rekordu stanowią identyfikatory najwyższego poziomu. Z całej aplikacji możesz też odwoływać się do właściwości kontrolki i innych wartości.

Przyjmijmy na przykład tabelę produktów umieszczoną w zmiennej globalnej:

Zrzut ekranu przedstawiający tabelę Products z żądanymi i dostępnymi ilościami.

Set( Products,
    Table(
        { Product: "Widget",    'Quantity Requested': 6,  'Quantity Available': 3 },
        { Product: "Gadget",    'Quantity Requested': 10, 'Quantity Available': 20 },
        { Product: "Gizmo",     'Quantity Requested': 4,  'Quantity Available': 11 },
        { Product: "Apparatus", 'Quantity Requested': 7,  'Quantity Available': 6 }
    )
)

Aby określić, czy którykolwiek z tych produktów ma więcej żądań niż jest dostępny:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Pierwszy argument, który zostanie uwzględniony w funkcji Filter, to tabela rekordów objętych działaniami, a drugi argument to formuła. Funkcja Filter pozwala uzyskać zakres rekordów do oceny tej formuły. Zakres udostępnia pola poszczególnych rekordów — w tej sytuacji są to pola Product, Quantity Requested i Quantity Available. Wynik porównania określa, czy każdy rekord powinien być uwzględniony w wyniku funkcji:

Zrzut ekranu przedstawiający przefiltrowaną tabelę Products, w której żądana ilość przekracza dostępną ilość.

Dodając do tego przykładu, możesz obliczyć, ile z każdego produktu należy zamówić:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

W tym miejscu dodasz kolumnę obliczeniową do wyniku. Funkcja AddColumns ma własny zakres rekordów używany do obliczania różnicy między żądanymi elementami i dostępnymi elementami.

Zrzut ekranu przedstawiający tabelę Products po dodaniu kolumny obliczeniowej Quantity To Order.

Na koniec możesz zmniejszyć tabelę wyników tylko do żądanych kolumn:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Zrzut ekranu przedstawiający tabelę wyników zawierającą tylko kolumny Product (Produkt) i Quantity To Order (Ilość do zamówienia).

Należy pamiętać, że w poprzednich przykładach w niektórych miejscach używasz cudzysłowów podwójnych (") i pojedynczych cudzysłowów (') w innych miejscach. Pojedyncze cudzysłowy są wymagane podczas odwoływania się do wartości obiektu, takiego jak pole lub tabela, jeśli nazwa obiektu zawiera spację. Użyj cudzysłowów, gdy nie odwołujesz się do wartości obiektu, ale zamiast tego mówisz o nim, zwłaszcza w sytuacjach, gdy obiekt jeszcze nie istnieje, jak w przypadku funkcji AddColumns.

Uściślanie

Nazwy pól dodawane za pomocą zakresu rekordów zastępują te same nazwy z innego miejsca w aplikacji. Gdy to przesłonięcia ma miejsce, nadal można uzyskać dostęp do wartości spoza zakresu rekordów @ przy użyciu operatora uściślania :

  • Aby uzyskać dostęp do wartości z zagnieżdżonych zakresów rekordów, użyj @ operatora o nazwie tabeli, na której działasz, zgodnie z tym wzorcem:
    Tabela[@NazwaPola]
  • Aby uzyskać dostęp do wartości globalnych, takich jak źródła danych, kolekcje i zmienne kontekstowe, użyj wzorca [@NazwaObiektu] (bez oznaczenia tabeli).

Jeśli tabela, na której pracujesz, jest wyrażeniem, takim jak Filter(Table, ... ), nie można użyć operatora uściślania. Tylko najbardziej wewnętrzny zakres rekordów może uzyskiwać dostęp do pól z tego wyrażenia tabeli, nie używając operatora uściślania.

Załóżmy na przykład, że masz kolekcję X:

Zrzut ekranu przedstawiający kolekcję X zawierającą wartości 1 i 2.

Tę kolekcję można utworzyć przy użyciu funkcji ClearCollect( X, [1, 2] ).

Druga kolekcja to Y:

Zrzut ekranu przedstawiający kolekcję Y zawierającą wartości A i B.

Tę kolekcję można utworzyć przy użyciu funkcji ClearCollect( Y, ["A", "B"] ).

Oprócz tego definiujemy zmienną kontekstową o nazwie Value, korzystając z formuły: UpdateContext( {Value: "!"} )

Zbierzmy wszystkie dane. W tym kontekście następująca formuła:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

powoduje utworzenie tej tabeli:

Zrzut ekranu przedstawiający zagnieżdżony wynik ForAll łączący pozycje X, Y i globalna wartość.

Co się tu dzieje? Najbardziej zewnętrzna funkcja ForAll definiuje zakres rekordów dla X, dzięki czemu można uzyskać dostęp do pola Wartość każdego rekordu podczas przetwarzania. Dostęp do niego można uzyskać, używając słowa Wartość lub X [@Value].

Najbardziej wewnętrzna funkcja ForAll definiuje inny zakres rekordów dla Y. Ponieważ ta tabela ma również pole Wartość zdefiniowane, użycie Wartość tutaj odwołuje się do pola w rekordzie Y i nie jest już to pole z X. Aby uzyskać dostęp do pola XWartość, musisz użyć dłuższej wersji z operatorem jednoznaczności.

Ponieważ Y jest najbardziej wewnętrznym zakresem rekordów, uzyskiwanie dostępu do pól tej tabeli nie wymaga uściślania, więc można użyć tej formuły z tym samym wynikiem:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

Wszystkie zakresy rekordów kolekcji ForAll zastępują zakres globalny. Zdefiniowana zmienna kontekstowa Value nie jest dostępna według nazwy bez operatora uściślania. Aby uzyskać dostęp do tej wartości, należy użyć opcji [@Value].

Funkcja Ungroup spłaszcza wynik, ponieważ funkcje ForAll zwrócą zagnieżdżoną tabelę wyników.

Tabele jednokolumnowe

Aby wykonywać operacje na jednej kolumnie tabeli, użyj funkcji ShowColumns, tak jak w poniższym przykładzie:

ShowColumns( Products, "Product" )

Ta formuła powoduje utworzenie tabeli z jedną kolumną:

Zrzut ekranu przedstawiający jednokolumna tabelę zawierającą wartości Product.

Aby uzyskać krótszą alternatywę, określ element Table.Column, która wyodrębnia tabelę jednokolumnową zawierającą tylko kolumnę z tabeli. Ta formuła daje na przykład taki sam skutek, jak użycie opcji ShowColumns.

Products.Product

Rekordy wbudowane

Rekordy można wyrazić przy użyciu nawiasów klamrowych zawierających wartości pól nazwanych. Na przykład pierwszy rekord w tabeli na początku tego tematu można wyrazić za pomocą następującej formuły:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Można również osadzić formuły w innych formułach, jak w poniższym przykładzie:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Rekordy można zagnieżdżać przez zagnieżdżenie nawiasów klamrowych, jak pokazano w poniższym przykładzie:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Jeśli nazwa kolumny zawiera znaki specjalne, takie jak spacja lub dwukropek, należy ją ująć w cudzysłów pojedynczy. Aby użyć cudzysłowu pojedynczego w nazwie kolumny, podwój go.

Wartość w kolumnie Price nie obejmuje symbolu waluty (np. znaku dolara). To formatowanie jest stosowane po wyświetleniu wartości.

Tabele wbudowane

Tabelę można utworzyć, korzystając z funkcji Table i zestawu rekordów. Tabelę z początku tego tematu można wyrazić za pomocą następującej formuły:

Table( 
   { Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
   { Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
   { Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

Tabele można także zagnieżdżać:

Table( 
   { Name: "Chocolate", 
     'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
                                { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
   }
)

Wbudowane tabele wartości

Tabele jednokolumnowe można tworzyć, określając wartości w nawiasach kwadratowych. Tabela wynikowa zawiera jedną kolumnę o nazwie Value.

Na przykład funkcja [ 1, 2, 3, 4 ] jest równoznaczna z Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) i zwraca tę tabelę:

Zrzut ekranu przedstawiający tabelę wartość śródwierszową zawierającą liczby od 1 do 4.