Dotyczy
Program Microsoft Office SharePoint Online na platformie Microsoft 365 Microsoft Office SharePoint Online na platformie Microsoft 365 Small Business

autorstwa Justin Joyce, LANtek

Uwaga: Ten artykuł jest częścią kolekcji wpisów z czterech lat blogu Uzyskaj punkt dla użytkowników końcowych programu SharePoint.

Omówienie: niestandardowe raporty starzenia bez kodu

Jednym z często wymaganych elementów funkcjonalnych witryny programu SharePoint jest raport o przedawnieniu dla zadań lub elementów listy. Innymi słowy, ile dni/miesięcy minęło od ostatniej modyfikacji tego elementu listy?

Na powierzchni wydaje się to być bardzo proste żądanie. W końcu mamy daty tworzenia i modyfikowania elementów, mamy możliwość przechowywania niestandardowych dat, gdy pewne zmiany elementów mają miejsce za pośrednictwem odbiorców zdarzeń. Mamy kolumny obliczeniowe, w których możemy dołączyć formuły podobne do programu Excel, aby pracować z naszymi informacjami. Wydaje się to dość prostą propozycją. Wybieramy pole daty, tworzymy kolumnę obliczeniową, a następnie wykonujemy formułę na wzór [DateField] — [Dzisiaj]. Ach, nie tak szybko jednak! Jak wie każdy, kto próbował tego "prostego" zadania, próba użycia czegoś takiego jak [Dzisiaj] w kolumnie obliczeniowej powoduje problemy. Spróbuj wstawić [Dzisiaj] do pola formuły kolumny obliczeniowej, aby wyświetlić komunikat o błędzie podobny do następującego:

Komunikat o błędzie

Dlaczego? Ma to też wspólnego ze sposobem obliczania kolumn obliczeniowych.

Weźmy na przykład prostą formułę:

= JEŻELI( [Kolumna1]<=[Kolumna2], "OK", "Nie OK")

Wszystko to oznacza, że jeśli kolumna Nr1 jest mniejsza niż kolumna2 lub równa kolumnie 2, zostanie wyświetlony przycisk OK, w przeciwnym razie zostanie wyświetlony komunikat Nie OK. Jest to dość typowa formuła podstawowa dla kolumny obliczeniowej i przyjmuje podstawowe założenie dotyczące elementu listy zawierającego te kolumny: Wartości kolumn Kolumna1 i Kolumna2 nigdy nie będą mogły zostać zmienione bez zdarzenia Update w elemencie listy.

To prawda, kolumny obliczeniowe będą obliczane ponownie tylko po zaktualizowaniu listy (lub utworzeniu), ponieważ zakładają, że obliczane informacje znajdują się w samym elemencie. Powoduje to problem, gdy próbujesz użyć czegoś, co zmienia się niezależnie od pól elementu, takich jak dzisiejsza data.

Teraz nie byłem na spotkaniu, gdzie zdecydowali, że jest to sposób, w jaki kolumny obliczeniowe będą funkcjonować, jednak, gdybym musiał wykształcony chyba zakładam, że działają one w ten sposób dla wydajności. Wyobraź sobie, że masz listę kilku tysięcy elementów, z których każda zawierała kolumnę obliczeniową wymagającą aktualizacji "na żywo". Oznaczałoby to, że jakiś mechanizm, być może zadanie czasomierza, musiałby iterować poszczególne elementy, które tak często zawierały tę kolumnę obliczeniową, i aktualizować jej wartość. Może to być bardzo opodatkowane pod względem wydajności, ponieważ w przypadku większych wdrożeń to zadanie może stale działać i zmieniać elementy. To tylko moje przypuszczenie, ale to ma sporo sensu, jeśli o tym myślisz.

Istnieją pewne sugestie dotyczące podobnych rozwiązań, które polegają na nakłonieniu programu SharePoint do zaakceptowania wartości Dzisiaj, tworząc najpierw kolumnę o nazwie Dzisiaj, a następnie dodając ją do formuły, a następnie usuwając. Wszystkie są dobre i dobre, ale pamiętaj o tym, co powiedziałem, gdy kolumny obliczeniowe są aktualizowane. Ta wartość zmieni się tylko wtedy, gdy element zostanie zaktualizowany, co oznacza, że wartości wkrótce będą niepoprawne, szczególnie w przypadku obliczeń dziennych.

Widziałem, jak inni zapisują wartości na stronie za pomocą sprytnego języka JavaScript. To również działa, ale jestem prawie kategorycznie przeciwko skrypt klienta, gdy można tego uniknąć.

Implementacja:

Więc co robić? Kolumny obliczeniowe nie są odpowiedzią na tak zwane "nietrwałe" funkcje, takie jak Dzisiaj. Możliwe, że możemy opracować kod niestandardowy, aby zająć się tym dla nas jak kolumna obliczana, zadanie czasomierza lub zaplanowany proces, aby przyjść i zaktualizować każdy element, który wymaga wykonania tego obliczenia. To prowadzi nas z powrotem do problemu wydajności wspomniałem w ostatnim akapicie choć, a dodatkowo jest to kruche rozwiązanie, które byłoby bardzo specyficzne dla witryny / listy / kolumny, o których mowa. Oprócz tych dwóch obaw, trzeba by również znaleźć nerdy facet, taki jak ja, że wie, jak kodować i przekonać go do opracowania tego rozwiązania dla Ciebie. Ale istnieje prostszy sposób!

Jeśli masz prawa do tworzenia pól i edytowania stron w witrynie, a także masz odrobinę wiedzy na temat funkcji XSLT i tworzenia widoków, możesz utworzyć szablon XSL, który może być dołączony do widoku listy i będzie wiernie obliczać wartość za każdym razem, gdy strona zostanie zażądana. Ten scenariusz usuwa nasze obawy dotyczące wydajności i nie wymaga kodu niestandardowego do opracowywania i wdrażania za pośrednictwem rozwiązania.

Doskonale. Więc jak to robimy?

  1. Utwórz lub wybierz pole, które będzie pełnić rolę naszego źródła. Musi to być typ daty.

  2. Utwórz pole, które będzie pełnić rolę symbolu zastępczego obliczanej wartości.

  3. Dodaj oba te pola do typu zawartości i dodaj ten typ zawartości do listy.

  4. Tworzenie widoku tej listy zawierającej zarówno kolumny źródłowe, jak i zastępcze.

  5. Przekaż szablon XSL do biblioteki stylów.

  6. Ustaw właściwość "Link XSL" składnika Web Part widoku listy za pośrednictwem interfejsu użytkownika.

  7. Sukces!

Zapoznajmy się z przykładowym przypadkiem użycia i przejdźmy przez implementację. Nasz klient chciał zapoznać się z ich główną listą, która powie im, jak długo dany element listy siedział w swoim statusie. Ta lista zawierała niestandardowy typ zawartości witryny pochodzący z typu elementu i dodany do listy. Na miejscu był już odbiornik zdarzeń, który rejestrował każdorazową zmianę pola stanu w elemencie listy i zapisanie tej daty w kolumnie o nazwie "Zmieniono stan daty". Wszystko to okablowanie nie jest wymagane i można to zrobić za pomocą dowolnego pola daty (tak się dzieje, jest to nasza implementacja, ale eksperymentuj). Minimum, którego potrzebujesz, to pole daty źródłowej i pole zastępcze do przechowywania obliczeń (więcej na ten temat w następnym akapicie) dodane do listy, chociaż zalecam używanie kolumn witryny i typów zawartości witryny na wypadek, gdyby można było ponownie użyć tego rozwiązania w innych miejscach w witrynie.

Mamy więc datę źródła, którą możemy wykorzystać w naszych obliczeniach względem dzisiejszej daty. Teraz możemy utworzyć niestandardową kolumnę witryny, która będzie służyć jako kontener dla naszej obliczonej wartości. W takim przypadku wybrałem użycie kolumny obliczeniowej, ponieważ nie będzie można jej zmienić w formularzach nowych elementów ani edytować ich, ale można ją wybrać do wyświetlania w widokach, ponieważ nie chcemy, aby użytkownicy wprowadzali w tej kolumnie dowolne wartości. To może być mylące, dlaczego nie jest wyświetlany w widokach, itp.

Teraz, gdy mamy kolumnę witryny, możemy dodać ją do naszych typów zawartości, które będą używane na naszej liście. Następnie musimy utworzyć widok, który zostanie później dostosowany za pomocą naszego XSLT. Utwórz widok standardowy zawierający kolumnę daty źródłowej i nową kolumnę obliczeniową, która będzie pełnić rolę symbolu zastępczego obliczonej wartości.

Mamy teraz wszystko, czego będziemy wymagać do obsługi naszego niestandardowego raportu o starzeniu się. Pozostaje tylko utworzenie naszego szablonu XSL, przekazanie go do biblioteki stylów witryny i połączenie go z widokiem listy. Szablon XSL, którego będziemy używać, będzie zawierał zwykłą adiustację wygenerowaną przez program SharePoint do generowania widoku, a także naszą własną niestandardową adiustację używaną do zastąpienia niektórych części tego elementu i obliczenia naszej żądanej wartości dla nas.

Dając kredyt, gdzie kredyt jest należny, szablony XSL do wykonywania rzeczywistych obliczeń używam do tego rozwiązania zostały łaskawie dostarczone przez "swirch" na forach MSDN:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Pobierz arkusz stylów XSL (aging.zip), który zestawiłem, tutaj:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Otwarcie go w ulubionym edytorze tekstów spowoduje wyświetlenie dużej ilości normalnej adiustacji XSL programu SharePoint do renderowania widoków, jeśli przewijasz w dół do wiersza 357, zobaczysz początek szablonów niestandardowych dodanych do adiustacji, z których pierwszy to szablon "DateDiff", a następnie "calculate-julian-day" i "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Są to nasze trzy szablony, które będą wykonywać i wyświetlać nasze obliczenia w naszych widokach. Jeśli zamierzasz używać innych nazw pól niż określono wcześniej w tym artykule, musisz przejść przez te szablony i zamienić wszelkie odwołania do innych nazw. Pamiętaj, że w tym celu należy użyć nazwy WEWNĘTRZNEJ pola, a nie nazwy wyświetlanej.

Gdy szablon będzie gotowy do pracy, przejdź do biblioteki stylów i przekaż go w folderze "Arkusze stylów XSL", a następnie skopiuj link do pliku. Pozwoli nam to na późniejsze łatwe wprowadzanie w nim zmian lub dodawanie ich do różnych części witryny, jak nam się podoba.

Następnie przejdź do listy i wybierz widok utworzony wcześniej w tym artykule. W menu "Akcje witryny" kliknij pozycję "Edytuj stronę".

Polecenie Edytuj stronę wyświetlane w menu Akcje witryny

Znajdź składnik Web Part widoku listy na stronie i otwórz menu składnika Web Part, klikając małą strzałkę w dół w prawym górnym rogu. Z tego menu wybierz polecenie "Edytuj składnik Web Part".

Polecenie Edytuj składnik Web Part w menu składnika Web Part

Spowoduje to otwarcie menu składnika Web Part po prawej stronie okna przeglądarki.

Menu składnika Web Part

Kliknij znak + dla sekcji "Różne" i znajdź właściwość "Link XSL".

Właściwość Łącze XSL w menu składnika Web Part

Wklej link do pliku XSL w bibliotece stylów skopiowanej wcześniej (może to być link względny lub bezwzględny).

Wklejone łącze do pliku XSL

Kliknij przycisk OK, aby zapisać zmiany, a następnie kliknij przycisk "Zatrzymaj edytowanie" na wstążce "Strona" u góry strony.

Przycisk Zakończ edycję na karcie Strona

Jeśli wszystko zostało skonfigurowane poprawnie, teraz powinny być widoczne liczby w kolumnie "Dni w stanie".

Kolumna dni ze stanem wyświetlająca liczbę

Oto jak wyglądałoby to z pewnymi danymi testowymi różnych dat:

Raport wiekowania z testowymi danymi

Podsumowanie:

Oto odpowiedni, dobrze sformatowany, niezawodny i wydajny sposób tworzenia raportu o przedawnieniu w programie SharePoint. Zawiera on prostą implementację bez kodu. Ma to sporo potencjalnych aplikacji oprócz jednego przypadku użycia, który badaliśmy tutaj. Innym typowym scenariuszem dla tego typu raportu jest dołączenie go do listy zadań, dzięki czemu można szybko sprawdzić, jak długo trwało tworzenie zadania.

Miłej pracy!

--Justin

Justin Joyce

Komentarze

Brak kroków 2012-10-08 03:51 ok I po wykonaniu kroków, ale musi być coś brakuje - jak XSL będzie wiedzieć, której daty użyć, lub które pole, aby dodać dni od do? nienawidzić, gdy kroki są pomijane.

Brak kodu, uzgodnione! 2012-08-30 12:12 Zgadzam się - nie sądzę, że to naprawdę liczy się jako "brak kodu".Co ciekawe, poprzez jakiś screwup sharepoint, mam pracy kolumny obliczeniowej przy użyciu dzisiaj ... nie wiesz, jak i dlaczego, bo nie mogę go zrobić ponownie, ale jeden jest nadal tam i działa.

Formuła dla kolumny obliczeniowej "Dni w stanie"? 2012-05-02 07:39 Justyna — jaka jest formuła użyta do kolumny obliczeniowej "Dni w stanie" (kolumna zastępcza)? Czy to było "=dzisiaj"?

SharePoint 2007 2011-12-02 11:29 Obecnie nie próbuję stosować tego rozwiązania do programu SharePoint 2007, jednak szukam go. Niestety nie ma właściwości XslLink dostępnej w składniku Web Part za pośrednictwem interfejsu użytkownika.

Świetny wpis 30.11.2011 09:53 Witam Świetny post.Korzystam z programu SharePoint 2007.Nie mam sekcji Misc, jak wspomniano powyżej.Czy masz kroki konfiguracji dodatku SP2007? Dziękuję.

Od: Rozwiązanie bez kodu: Wyświetlanie dni od ostatniej zmiany elementu listy programu SharePoint 10.11.2011 08:24 Cześć Chris.wielki znaleźć! I'm going to take a look at what you posted hopefully later on today and see if i can make this solution a little more robust.Cieszę się, że podobał Ci się post, i bardzo się cieszę, że udało ci się znaleźć rozwiązanie europejskiego formatu daty. :) -Justin

Rozwiązanie dla europejskich formatów daty 10.11.2011 06:45 Witaj ponownie Justin, FYI, znalazłem rozwiązanie problemu wspomniano wcześniej na tej stronie;https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Europejskie formaty dat 2011-10-07 03:59 Cześć Justin, Jest to naprawdę dobre rozwiązanie dzięki, a tylko tego rodzaju rzeczy spędziłem ostatnie dwa dni szuka! Jednak mam trochę problemu z tym i miałem nadzieję, że możesz mi pomóc.Zmieniłem nieco kod, aby obliczyć liczbę dni, aż coś się stanie, a nie od tego czasu, przełączając zmienne w ostatnim wierszu funkcji "DateDiff"; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> Jednak jestem w stanie tylko dostać go do caclulate różnicę poprawnie połowę czasu. Na przykład z tą datą (format dd/MM/rrrr); 30.12.2011 r. Obliczenia są obliczane poprawnie, ale z tą datą (w tym samym formacie) 12.10.2011 r. Oblicza się tak, jakby 10-gru-2011, a nie 12-paź-2011.Próbowałem po prostu przełączać pozycje wartości dnia i miesiąca w zmiennej "JulianStartDate", w ten sposób; <xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd');7;2)"/> <xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),5,2)"/> I to rozwiązało problem z drugą datą, jednak wtedy był nieprawidłowy dla pierwszej daty! Próbowałem również zmienić wywołania FormatDateTime w celu używania europejskich identyfikatorów LCID i różnych zmian ostatniego parametru FormatDateTime (np. ddMMyyyyy, MMddyyyy) z odpowiednimi dostosowaniami podciągowych parametrów pozycyjnych bez powodzenia.Byłbym bardzo wdzięczny za wszelkie porady można zaoferować.Dzięki Chris

Brak kodu 21.09.2011 04:27 Nie sądzę, że XSL kwalifikuje się jako rozwiązanie "bez kodu", ponieważ zrozumienie języka XSL nie jest dla wszystkich - jednak nie obejmuje programowania. Poza tym: Miłe rozwiązanie, dziękuję!

Potrzebujesz dalszej pomocy?

Chcesz uzyskać więcej opcji?

Poznaj korzyści z subskrypcji, przeglądaj kursy szkoleniowe, dowiedz się, jak zabezpieczyć urządzenie i nie tylko.