Walka trwa. Już sporo udało się uruchomić, ale pojawiają się kolejne ciekawostki do ogarnięcia. Dzień drugi jest tu potraktowany dość dowolnie, bo w rzeczywistości rozciągnął się na kilka. Razem z wujkiem Googlem rozwiązujemy kolejne problemy.
Problem 1. Nie działa wysyłka maili subskrybowanych raportów.
Błąd „Failure sending mail: The transport lost its connection to the server.”
Najprawdopodobniej próba wysłania za dużego załącznika Excela. Przy czym „za duży” może być różnie interpretowane. Znalezione rozwiązanie: „zwiększyć dopuszczalny rozmiar wiadomości na serwerze SMTP”. Pierwsza myśl – raczej tu nie ma zastosowania – w moim przypadku maksymalny rozmiar wiadomości to 25MB, załącznik ma 8MB.
Okazało się, że było blisko, ale trzeba szukać gdzie indziej. Akurat serwer SMTP, przez który wysyłamy pocztę jest tylko przekaźnikiem (relay) do właściwego serwera SMTP. Ustawienia rozmiarów wiadomości były bardzo niskie. Zwiększenie do rozmiaru dozwolonego przez główny serwer SMTP oraz zrestartowanie IISa na serwerze-przekaźniku rozwiązało problem.
Błąd „Failure sending mail: At least one of the From or Sender fields is required, and neither was found. Mail will not be resent.”
Wprowadzono alias (np. nazwę użytkownika domenowego) zamiast adresu e-mail: http://support.microsoft.com/kb/945601/pl. Sprawdź zarówno ustawienia subskrypcji jak i konta wysyłającego maile w Reporting Services Configuration Manager, sekcja E-mail settings.
Błąd „The transport error code was 0x800ccc6d. The server response was 552 4.3.1 Message size exceeds fixed maximum message size”
Rozmiar załącznika typu CSV przekracza dozwolony rozmiar ustawiony na serwerze SMTP. Co ciekawe ten błąd wystąpił tylko dla załącznika CSV – dla pozostałych zgłaszał „transport lost”.
Problem 2. Jak przychodzę do pracy i uruchamiam stronę z raportami, to strasznie długo się wczytuje. Potem już jest dobrze. No, prawie dobrze.
W SSRS istnieje pojęcie czasu recyklingu raportów (domyślnie 720 minut). Jest to związane z ogólnym pojęciem appdomain recycling w .NET, ale nie będę teraz tego zgłębiał. Generalnie objawia się to przez wyczyszczenie z pamięci wszystkich ustawień aplikacji. A po restarcie pierwsze uruchomienie wymaga ponownego ich załadowania, co powoduje dłuższy czas oczekiwania.
Rozwiązanie 1: wydłużyć czas recyklingu oraz automat odpalany w nocy, który za nas będzie udawał pierwszego użytkownika: http://www.pawlowski.cz/2011/07/solving-issue-long-starting-report-ssrs-2008/
Rozwiązanie 2: przygotować prosty raport, którego głównym zadaniem będzie uruchamianie się w krótkich odstępach czasu co pozwoli zapobiec restartowi. Patrz: http://social.msdn.microsoft.com/Forums/is/sqlreportingservices/thread/bbaafd07-2897-4b9a-920a-7dbb03047635
Problem 3. Mam w raporcie parametr, który jest listą rozwijaną wielokrotnego wyboru. Chcę, żeby domyślnie były zaznaczone wszystkie wartości (wybranie „Select All”).
Jako wartość domyślną ustaw te same wartości jakie są dostępne w liście wyboru.
Problem 4. Jak tworzę wykres, to jako wartości na nim od razu mi wrzuca albo SUM()
, albo COUNT()
. Ja nie chcę żadnego agregatu, tylko żeby pokazał mi to, co daję na osi Y.
Obok pola agregatu nacisnąć strzałkę (trójkąt), żeby pokazała się lista rozwijana. Wybrać Expression
. Zamiast wartości agregowanej, np. =Count(Fields!Pole.Value)
daj samo =Fields!Pole.Value
Problem 5. Eksport do CSV robi to co powinien, czyli oddziela przecinkami. A ja chcę średniki (jak w Excelu), albo nawet tabulator.
W pliku rsreportserver.config
odszukaj sekcję Render
. Zawiera ona serię wpisów dotyczących renderowania raportów. Zostawiamy istniejący wpis dotyczący CSV i dodajemy drugi, własny:
<Extension Name="CSV 2" Type="Microsoft.ReportingServices.Rendering.DataRenderer.CsvReport,Microsoft.ReportingServices.DataRendering"> <OverrideNames> <Name Language="en-US">CSV (oddzielany srednikiem)</Name> </OverrideNames> <Configuration> <DeviceInfo> <FieldDelimiter>;</FieldDelimiter> </DeviceInfo> </Configuration> </Extension>
Po kolei:
- Extension[@Name] – bo każde musi mieć swoją nazwę
- Type – taki sam jak dla CSV
- OverrideNames/Name[@language] – chcemy własny opis rozszerzenia renderującego; w moim przypadku język en-US, bo podajemy język systemu operacyjnego
- Configuration/DeviceInfo/FieldDelimiter – jaki ma być separator
Więcej na temat własnego rozszerzenia renderującego w BOL: Customizing Rendering Extension Parameters in RSReportServer.Config oraz parametry bezpośrednio dla CSV: CSV Device Information Settings.
W przykładzie nie ma polskich liter. Jeśli chcesz ich użyć pamiętaj, żeby zapisać plik jako UTF-8, inaczej będą krzaki.