Sortowanie tablic w Power Automate

Data publikacji: 2022-06-02

Jeśli tak, najprawdopodobniej wiesz, że go tam nie ma. 

W tym momencie nie ma nic takiego jak sort(array) lub sort(array, ascending) w Power Automate. A to może być dość problematyczne.

Ktoś może zwrócić uwagę, że tak naprawdę nie stanowi to problemu, ponieważ można posortować tablicę w innym miejscu, na przykład w PowerApps, a następnie przekazać ją do przepływu lub bazy danych, już posortowaną.

Ale co w przypadku, jeśli dane są już przechowywane w bazie danych w nieposortowany sposób, szczególnie zapisane w formie sekcji powtarzającej się?

W Developico jednym z naszych klientów jest duża organizacja pozarządowa. Ta organizacja pozarządowa otrzymała dotację od rządu na określony program. W programie tym było około 1000 uczestników, których pewne umiejętności zostały zmierzone na początku programu. Następnie uczestnicy wzięli udział w kursach i innych działaniach, które miały na celu poprawę tych umiejętności. Pod koniec programu uczestnicymusieli wykonać kilka testów, aby ponownie zmierzyć poziom tych umiejętności. 

Następnie organizacja pozarządowa i rząd były w stanie sprawdzić, czy program odniósł sukces w poprawie tych umiejętności. 

Wyniki tych testów były przechowywane na liście SharePoint w sekcji powtarzanej.

Problem zaczął się, gdy rząd wysłał wymaganie, aby te umiejętności zostały posortowane od największych wyników do najniższych, a następnie wydrukowane w dokumencie.

Mieliśmy już dane przechowywane w bazie danych, w powtarzającej się sekcji i musieliśmy stworzyć przepływ, który posortuje wyniki testu, a następnie utworzy plik pdf dla każdego członka programu jako dokumentację dla rządu. 

W tej pozycji moglibyśmy albo stworzyć aplikację, która pobierałaby przechowywane dane, sortowała je, przekazywała do Przepływu, a następnie tworzyła z niego plik PDF, albo w jakiś sposób zrobić to wszystko w przepływie, tworząc własne sortowanie w przepływie.

Zdecydowaliśmy się na to drugie.

Musimy utworzyć przepływ, który ma zainicjowane dwie tablice.

W jednym kroku inicjujemy Tablicę Nieposortowaną z kilkoma liczbami losowymi, a w następnym, Sorted Array (Posortowana Tablica), która w tym momencie jest pusta. W Sorted Array będziemy przechowywać posortowane liczby.

Następnie musimy zastosować pętle „Zastosuj dla każdego” i jako dane wyjściowe wybrać wartości z Nieposortowanej tablicy.

Pierwszym krokiem w „Zastosuj dla każdego” jest „Filtruj tablicę”. Jako źródło musimy wybrać Sorted Array. Następnie musimy określić filtr. Item() musi być mniejsza lub równa items(‘Zastosuj_dla_każdego’). Spowoduje to odfiltrowanie wszystkich wartości w sortowanej tablicy (która w tym momencie jest pusta, ale umieścimy tutaj wartości w późniejszych krokach), które są równe lub mniejsze od bieżącego elementu w nieposortowanej tablicy.

W następnym kroku musimy umieścić kolejną „Filtruj tablicę”. Jest to krok taki sam jak poprzednio, z tą różnicą, że musimy umieścić Item() jest większy niż items(‘Zastosuj_dla_każdego’). Ten krok spowoduje odfiltrowanie wszystkich elementów, które są większe niż bieżąca iteracja Nieposortowanej tablicy.

Ostatnim krokiem w pętli jest Zmienna Set, która zaktualizuje sortowaną tablicę

Tutaj jako wartość znajduje się wyrażenie: union(body(’Filter_array_less_than’),createArray(items(‘Zastosuj_dla_każdego’)), body(’Filter_array_greater_than’))

Ten krok ustawi wartość Sorted Array, która jest połączeniem wartości w Sorted Array, które są mniejsze lub równe niż bieżąca iteracja pętli, bieżąca iteracja pętli, która jest przekształcana w Tablicę, createArray(items(‘Zastosuj_dla_każdego’))) oraz wartości w Sorted Array, które są większe lub równe niż bieżąca iteracja pętli.

Pierwsza liczba naszej nieposortowanej tablicy to 2. Pierwsza iteracja pętli będzie wyglądać następująco:

  1. Filtruj tablicę mniejszą lub równą 2. Ponieważ w tym kroku pobierane są elementy z tablicy posortowanej, a w tym momencie tablica posortowana jest pusta, ten krok zwróci pustą tablicę. Ponieważ w pustej tablicy nie ma elementów mniejszych lub równych 2.
  2. Tablica filtrów większa niż 2. Dokładnie tak, jak w poprzednim kroku, ten krok zwróci pustą tablicę. Ponieważ w pustej tablicy nie ma elementów większych niż 2.
  3. W ostatnim kroku tej iteracji Sorted Array zostanie ustawiona na połączenie trzech tablic. Filtruj tablicę mniejszą niż, czyli pustą, tablicę utworzoną z bieżącej iteracji pętli [2] i inną pustą tablicę, którą jest Tablica filtrów większa niż 2.

Tak więc sortowana tablica ma teraz jedną wartość i jest to [2].

Zobaczmy kolejną iterację pętli. Następna liczba w nieposortowanej tablicy to 6.

  1. Filtruj tablicę mniejszą lub równą 6. W Sorted Array jest tylko liczba 2, więc ten krok zwróci [2], ponieważ 2 jest mniejsze niż 6.
  2. Tablica filtrów większa niż 6. W sortowanej tablicy jest tylko liczba 2, więc ten krok zwróci pustą tablicę, ponieważ 2 jest mniejsza niż 6.
  3. W ostatnim kroku tej iteracji Sorted Array zostanie ustawiona na połączenie trzech tablic. Filtruj tablicę mniejszą niż [2], tablicę utworzoną z bieżącej iteracji pętli [6] i pustą tablicę, która jest tablicą Filtruj większą niż.

Tak więc sortowana tablica zawiera teraz dwie wartości – [2, 6].

Przejdźmy teraz do trzeciej iteracji pętli. Następną liczbą w tablicy nieposortowanej jest 4.

  1. Filtruj tablicę mniejszą lub równą 4. W sortowanej tablicy są [2, 6], więc ten krok zwróci [2], ponieważ tylko 2 jest mniejsze niż 4.
  2. Tablica filtrów większa niż 4. W Sorted Array są [2, 6], więc ten krok zwróci [6], ponieważ 6 jest większe niż 4.
  3. W ostatnim kroku tej iteracji Sorted Array zostanie ustawiona na połączenie trzech tablic. Filtruj tablicę mniejszą niż [2], tablicę utworzoną z bieżącej iteracji pętli [4] i [6], która jest tablicą filtru większą niż.

Po 3 krokach iteracji Sorted Array wygląda teraz tak – [2, 4, 6].

Ten proces dotyczy wszystkich wartości w nieposortowanej tablicy. Na końcu sortowana tablica zawiera wszystkie wartości z nieposortowanej tablicy, ale teraz posortowane w porządku rosnącym.