Błąd „Object reference not set to an instance of an object”

Błąd „Object reference not set to an instance of an object” może pojawiać się w wielu kontekstach w przypadku pisanych przez nas plug-in’ów. Wtedy jednak możemy sami poprawić napisany przez siebie kod. Niestety… błąd ten pojawia się również w plug-in’ie napisanym przez Microsoft, który jest częścią normalnego „execution flow” w szczególnych przypadkach.
Jeśli podczas zapisywania rekordu macie błąd „Object reference not set to an instance of an object„, a w pliku śledzenia (trace) znajdziecie następujące fragmenty:

AssemblyName: Microsoft.Crm.ObjectModel.MultiCurrencyPlugin, Microsoft.Crm.ObjectModel
i
Microsoft.Crm.Sdk.InvalidPluginExecutionException: Object reference not set to an instance of an object.

…to padliście ofiarą nienaprawionego do tej pory przez Microsoft błędu. Błąd ten pojawia się, kiedy utworzycie jakiekolwiek pole typu money na dowolnym obiekcie. CRM automatycznie dodaje wtedy atrybut systemowy exchangerate i od tej pory dołącza do obiektu plugin przeliczający wartość z pola walutowego do waluty bazowej.
Problem zaczyna się, kiedy usunięte zostanie pole walutowe i w obiekcie nie ma już pól typu money. CRM zapomina bowiem… odrejestrować plug-in’a i nie usuwa atrybutu exchangerate, a nadal próbuje liczyć wartość w walucie bazowej, oczekując wartości z chociaż jednego pola walutowego. I… NullPointerException gotowy :) .

Rozwiązanie:
W obiekcie, na którym pojawia się ten błąd, dodajcie jakiekolwiek pole typu money. Pole nie musi być widoczne na formatce, ważne, żeby było atrybutem tego obiektu.

Zmiana maksymalnej liczby zakładek na formularzu

Czy próbowaliście kiedyś dodać wiele zakładek do dowolnej formatki w Microsoft Dynamics CRM 4.0? Zdawaliście egzamin „Applications”? Jeśli padło choć raz TAK, to wiecie, że Dynamics CRM nakłada na nas ograniczenia na liczbę zakładek na formatkach. Maksymalna liczba zakładek to 8. Co zrobić jeśli potrzebujesz więcej zakładek? Oficjalnie nic. Ale od czego są nieoficjalne zmiany? :)
Pomijając user experience takiej formatki, możesz zwiększyć maksymalną liczbę zakładek na formatce powyżej 8. W tym celu trzeba dokonać zmiany w pliku odpowiedzialnym za ustawienia edyora formatek:

  1. Na serwerze, gdzie zainstalowany jest Dynamics CRM, wchodzimy do katalogu zawierającego pliki stron (C:\inetpub\wwwroot, C:\Microsoft Dynamics CRM\CRMWeb albo inny katalog, do którego zainstalowaliście strony)
  2. Wchodzimy do katalogu Tools
  3. Wchodzimy do katalogu FormEditor
  4. Edytujemy plik FormEditor.aspx i znajdujemy w nim linijkę:
    var _iMaxTabs = 8;
  5. Zmieniamy na większą liczbę i zapisujemy plik
  6. Restartujemy IIS’a i mamy nową funkcjonalność CRM’a :)

Uważajcie tylko z tymi zakładkami, bo… w CRM 5 nie będzie ich w ogóle! Lepiej więc nie przyzwyczajać klientów…
PS. Nie muszę chyba dodawać, że zmiana jest niewspierana i jako taka może być usunięta przez Microsoft w którymś Rollup’ie?

Problem z Blank.aspx i Dynamics CRM 4.0

Wiele osób ma ostatnio problem z dziwnym zachowaniem CRM’a, mianowicie próbą „zachowania” pliku Blank.aspx. Gdzieś na blogach ignoranci zaczęli nawet szerzyć bzdurę, że to błąd Dynamics CRM 4.0 powoduje takie zachowanie. Wszystko wygląda tak:

Dynamics CRM 4.0 Blank.aspx

PRZYCZYNA PROBLEMU:
Takie zachowanie spowodowane jest faktem, że Internet Explorer utracił znaczenie powiązania z plikami typu aspx lub inaczej – Internet Explorer nie wie, co zrobić z plikiem takiego typu. Dlaczego? Wszystkiemu winna jest poprawka do IE, którą większość użytkowników zainstalowało z Windows Update (KB953838 dostępna tutaj).

ROZWIĄZANIE PROBLEMU:
Najprostsze rozwiązanie to przywrócić IE wiedzę jak interpretować pliki aspx :) . W tym celu w okienku, które się pojawia („Czy chcesz zapisać plik Blank.aspx?”) wybieramy „OK” i zapisujemy w jakimś łatwo dostępnym miejscu. Później otwieramy plik prawym guzikiem i wybieramy „Otwórz za pomocą…”. W okienku, które się pojawi wybieramy Internet Explorer i zaznaczamy, żeby IE zawsze otwierał pliki aspx:

Dynamics CRM 4.0 Blank.aspx - Otworz

Problem rozwiązany.

Błąd „Precision must be an integer within the allowed range: 0 for integers, 0 to 4 for money, 0 to 10 for decimal, and 0 to 5 for float fields”

Ostatnio na forum CRM pojawiło się pytanie co w Dynamics CRM znaczy błąd „Precision must be an integer within the allowed range: 0 for integers, 0 to 4 for money, 0 to 10 for decimal, and 0 to 5 for float fields” podczas oglądania w CRM szans sprzedaży, ofert lub produktów na szansach sprzedaży i ofertach. Jeśli też trafiłaś/eś na taki błąd i nigdzie nie możesz znaleźć o co chodzi (google wiele na ten temat nie mówi poza linkami do pytań pozostawionych bez odpowiedzi…), odpowiedź znajdziesz poniżej. A Maciek dostał odpowiedż już wcześniej tutaj: http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/8e02cea2-bef8-45d8-b67a-6cb360ad8f2c :) .

Otóż, ten błąd nie wynika wcale z tego, że któreś pole ma źle ustawioną precyzję. Wynika raczej z faktu, że produkt, który został dodany do oferty lub szansy sprzedaży nie jest obecny w cenniku wykorzystanym przez tę szansę sprzedaży/ofertę. Rozwiązaniem jest dodanie produktu do cennika, który jest użyty w danej szansie lub ofercie. I już. Tyle :)

Błąd: „Method not found: Single Microsoft.Crm.Sdk.CrmFloat.get_Value()”

Ostatnio potrzebowałem użyć bardzo fajnego narzędzia dostępnego na CodePlex’ie, tzn. CRM 4.0 Bulk Data Export Tool (aplikacja wraz z kodem dostępna jest tu: http://www.codeplex.com/mscrmbulkdataexport, a jej krótki opis w tym poście: ). Niestety każda próba exportu danych kończy się błędem „Method not found: Single Microsoft.Crm.Sdk.CrmFloat.get_Value()”. Zainteresowałem się trochę bardziej tym błędem. W skrócie mówi on o tym, że nie znalazł metody get_Value() w klasie CrmFloat. W reflektorze widać jednak, że ta metoda jest obecna. O co więc chodzi?

Ano, o dość prostą rzecz… Sygnatura metody pokazuje, że metoda zwraca typ „Single”. A to nieprawda od niedawna :) . Bo CrmFloat zwraca w CRM 4.0 typ „Double”. I tyle :) . Dlatego błąd twierdzi, że nie ma metody get_Value(), która zwraca rezultat typu Single. I ma rację! Bo zwraca Double :).

Jak więc poradzić sobie z tym błędem w CRM 4.0 Bulk Data Export Tool’u? Wystarczy, że podmienimy programikowi używaną bibliotekę Microsoft.Crm.Sdk.dll na jej najnowszą wersję i przekompilujemy aplikację. Poniżej kroki, jak tego dokonać:

1. Ściągamy źródła CRM 4.0 Bulk Data Export Tool stąd: http://www.codeplex.com/mscrmbulkdataexport/Release/ProjectReleases.aspx?ReleaseId=12682

2. Ściągamy najnowsze CRM 4.0 SDK stąd: http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en

2. Otwieramy projekt „CrmDataExport.sln” w Visual Studio.

3. Z referencji „wyrzucamy” Microsoft.Crm.Sdk i Microsoft.Crm.Sdk.TypeProxy:

4. Dodajemy referencje do najnowszych wersji tych bibliotek. W tym celu klikamy „Add reference” i w okienku w zakładce „Browse” idziemy do folderu z SDK. Z katalogu bin, wybieramy te dwie potrzebne biblioteki: 

5. Kompilujemy projekt (w menu „Build” -> „Build solution”

6. Uruchamiamy programik i wszystko działa! :) Można eksportować dowolne rekordy z naszego CRM’a.

Jak odinstalować IE8 Beta 2… kiedy sposoby ze stron zawodzą

Jak zwykle ciekawość skusiła mnie dziś do eksperymentu z IE8 Beta 2 :) . Ściągnąłem i przekonałem się, że rzeczywiście IE8 to spory krok do przodu (czyt. pojawiły się funkcje znane w Operze i Firefox’ie). Przeglądarka działa dużo szybciej, lepiej obsługuje CSS’y i ma sporo „bajerów”, które jeszcze nie raz będą reklamowane. Więc nie o tym będzie ten post… Będzie o tym, jak odinstalować IE8 Beta 2.
Spędziłem sporo czasu, żeby znaleźć sposób deinstalacji. Nie ma po prostu „uninstall IE8″. Jak się okazuje są 2 drogi pozbycia się Bety 2 z systemu. Od razu napiszę, że ta pierwsza „podstawowa”, o której piszą prawie wszyscy, nie działa na wszystkich maszynach – mi nie zadziałała na żadnym komputerze ;)

SPOSÓB 1 (popularny, niedziałający na 3 maszynach):

1. Wchodzimy do „Panelu sterowania”
2. Otwieramy „Programy i funkcje”
3. W zadaniach Wybieramy „Wyświetl zainstalowane aktualizacje”

4. Na liście znajdujemy Internet Explorer 8 i spokojnie klikamy „Odinstaluj”

SPOSÓB 2 (mniej popularny, ale działający):

1. Jeśli na liście aktualizacji nie ma Internet Explorer 8, to deinstalacja zaczyna się robić trudniejsza
2. Musimy za pomocą managera pakietów odinstalować pakiety instalacyjne IE8. W przypadku Visty, system przywróci nam po prostu IE7. Pakiety instalacyjne znajdują się w katalogu z Windows (u mnie C:\WINDOWS) w folderze „servicing\Packages”
3. Aby odinstalować pakiety za pomocą Managera Pakietów, musimy w linii poleceń wpisać:

FORFILES /P C:\WINDOWS\servicing\Packages /M Microsoft-Windows-InternetExplorer-8*.mum /c „cmd /c start /w pkgmgr /up:@fname /norestart”

Ostatni przełącznik „/norestart” jest opcjonalny, ale bez niego system będzie chciał się zrestartować po usunięciu pakietów. Ukończenie deinstalacji odbędzie się dopiero przy restarcie systemu.

PS. Nie odinstalowałem IE8 Beta 2 dlatego, że jest zły! Póki co nie działają niestety wszystkie add-on’y, których używam w codziennej pracy i dlatego ciągle wolę „siódemkę”. Ale IE8 zapowiada się naprawdę super!

Instalacja Dynamics CRM offline i Visual C++ Redistributable Package

Instalator serwera Dynamics CRM 4.0 i klientów Dynamics CRM dla Outlook wymaga do swojego uruchomienia pewnych komponentów. Część z nich musi być zainstalowana i uruchomiona wcześniej (jak np. Usługa indeksująca – Indexing Service). Pozostała część może być zainstalowana przez instalator. Do tych drugich należą:

  • .NET Framework 2.0,
  • Application Error Reporting,
  • Reporting Services Viewer Control
  • Visual C++ Redistributable Package.

Część z nich możemy zainstalować samemu, uprzedzając tym samym instalatora. .NET Framework i Reporting Services Viewer Redistributable dostępne są tu: (odpowiednio: http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5&DisplayLang=en i http://www.microsoft.com/downloads/details.aspx?FamilyID=8a166cac-758d-45c8-b637-dd7726e61367&DisplayLang=en). Application Error Reporting znajduje się na płycie z serwerem Dynamics CRM 4.0.

Problem jest natomiast z Visual C++ Redistributable Package. Niestety ten komponent nie „może”, ale „musi” być instalowany za każdym razem, kiedy jest uruchamiany instalator. Sytuacja ta jest o tyle dziwna, że instalator nie jest w stanie wykryć zainstalowanego wcześniej Visual C++ Redistributable Package, więc na nic nie przyda się instalowanie tego pakietu samemu.

Schody zaczynają się, kiedy komputer, na którym instalujemy CRM nie jest podłączony do internetu. Instalator zwyczajnie zatrzymuje się z błędem, bo nie jest w stanie ściągnąć pakietu. Czemu tak jest, nikt nie wie :) . Pewne jest tylko, że każdemu może się przecież zdarzyć instalacja bez dostępu do internetu.

Aby przeprowadzić instalację bez dostępu do internetu, powinniśmy ściągnąć pakiet stąd: http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=en. Później zamiast go instalować, umieszczamy pliki w odpowiedniej strukturze folderów w głównym folderze instalacyjnym Dynamics CRM. Philip Richardson opisał ten proces na swoim blogu dokładniej, ja tylko pokażę gdzie jest miejsce dla plików instalacyjnych problemowego pakietu:

  • \Redist\i386\VCRedist\vcredist_x86.exe
  • \Redist\i386\VCRedist\vcredist_x64.exe
  • \Redist\amd64\VCRedist\vcredist_x64.exe

(„Redist” na tym samym poziomie co foldery „Server” i „Client”)

Mam nadzieję, że przyda się komuś ta wiedza i dzięki temu uniknie kilkugodzinnej frustracji z każdorazowym ściąganiem Visual C++ Redistributable Package :) .

Instalacja Dynamics CRM for Outlook Client w domenie różnej od domeny serwera CRM

Dynamics CRM for Outlook Client to osobna aplikacja pozwalająca na integrację Dynamics CRM 4.0 z Microsoft Outlook. Pozwala ona na synchronizację wybranych danych z CRM’em oraz umożliwia pracę w CRM bez wychodzenia z Outlook’a. Istnieją dwie wersje klienta dla Outlook, tak jak opisane w tym poście: http://www.crmblog.pl/2008/07/dynamics-crm-for-outlook-online-vs.html.

Bardzo często zdarza się, że serwer CRM znajduje się w innej domenie niż użytkownicy uruchamiający Outlook’a. Wtedy, po zainstalowaniu Dynamics CRM for Outlook Client, próba konfiguracji tego narzędzia zakończy się błędem:
Dzieję się tak, ponieważ poświadczenia wysyłane do serwera, na którym znajduje się serwer CRM nie są zgodne z tymi, których potrzebne są do autoryzacji na serwerze CRM (prawidłowego użytkownika CRM). Ten błąd świadczy o tym, że w domenie, w której jest serwer CRM nie istnieje odpowiedni użytkownik. Nie zaś o tym, że nie ma go w systemie CRM!!! (CRM używa AD do autentykacji).
Ten błąd spowodował powstanie błędnej opinii, że Dynamics CRM for Outlook Client nie da się zainstalować, jeśli serwer z CRM’em jest w innej domenie niż komputery z Outlook’iem.
Jak się okazuje, nie jest to prawda. W tym poście pokażę trick, który pozwoli zainstalować klienta CRM dla Outlook nawet będąc w innej domenie. Należy pamiętać, że jeśli użytkownicy Outlook będą się łączyć z CRM przez internet (nie w intranecie), trzeba wybrać opcję „Dostawca usług online” w pierwszym kroku Kreatora Konfiguracji.
Kroki potrzebne do instalacji klienta dla Outlook w innej domenie:
1. Ponieważ Kreator Konfiguracji podczas próby połączenia z serwerem CRM wysyła poświadczenia osoby, która go uruchomiła, musimy mieć pewność, że istnieje w domenie serwera i systemie CRM konto o takiej samej nazwie. W tym celu (zakładając, że takiego konta nie ma), musimy dodać w domenie serwera CRM odpowiednie konto:

2. Następnie musimy mieć pewność, że utworzony użytkownik znajduje się w CRM’ie:

3. Teraz z dowolnego komputera spoza domeny, na którym chcemy zainstalować Klienta Dynamics CRM for Outlook, możemy uruchomić Kreator Konfiguracji. Pamiętać należy, że musimy być zalogowani na konto o takiej nazwie, którą ma użytkownik w systemie CRM (domena jest nieważna). Po spełnieniu tych warunków, Kreator Konfiguracji poprawnie łączy się do podanego serwera CRM (w innej domenie) i kończy konfigurację z sukcesem:

Błąd "Only items in the default Microsoft Outlook store can be promoted to Microsoft Dynamics CRM"

Ostatnio podczas próby śledzenia emaila przychodzącego w Outlook za pomocą funkcji „Śledź w programie CRM”, natknąłem się na błąd „Tylko elementy z domyślnego magazynu programu Microsoft Outlook mogą być awansowane do programu Microsoft Dynamics CRM” („Only items in the default Microsoft Outlook store can be promoted to Microsoft Dynamics CRM„):

Komunikat błędu jest dość oczywisty – informuje o tym, że email nie może być śledzony w CRM, ponieważ nie znajduje się w jednym z folderów podstawowych Outlook’a. Zacząłem się zastanawiać, co wobec tego zrobić, skoro używam konta pocztowego skonfigurowanego z IMAP, a nie POP3. Okazuje się, że jedyna opcja to ręcznie skopiować konkretny email do folderu z magazynu podstawowego, tj. np. „Skrzynka odbiorcza”:


…i dopiero z tego folderu można awansować (promować) email do CRM. To znaczy, że jest jedna super zaleta i jedna dość spora wada mechanizmu promocji emaili:

ZALETA: pozwala promować do CRM nawet emaile pochodzące z kont pocztowych obsługujących IMAP
WADA: niestety aby promować email trzeba zawsze ręcznie przenieść go do jednego z domyślnych folderów Outlook’a

Nie wiem jak Wy, ale ja to traktuje jednak w kategorii super zalety :) . Do emaili wychodzących używam CRM Email Router’a, a przychodzące śledzę za pomocą Dynamics CRM for Outlook. To umożliwia mi nie tylko wybieranie emaili do śledzenia, ale śledzenie również tych emaili, które pochodzą z innych kont (po przeniesieniu ich do odpowiedniego folderu…)

Sortowanie widoków po wielu kolumnach

Podczas dostosowywania systemu (w „Ustawieniach”) możemy ustawić sortowanie widoków po określonych kolumnach. Nie możemy jednak ustawić sortowania po więcej niż jednej kolumnie.

Często zdarza się jednak, że na liście jest tak dużo rekordów, że konieczne staje się sortowanie po kilku kolumnach. Taki przykład widac poniżej (firma „ABC Consulting”):

Jak więc uzyskać sortowanie po kilku kolumnach?

Sortowanie po wielu kolumnach można uzyskać, klikając kolejne kolumny z wciśniętymi CTRL + SHIFT. Przy nagłówkach kolejnych kolumn będzie pojawiał się mały trójkącik świadczący o sortowaniu. Klikając kilka razy, możemy przestawiac sortowanie z rosnącego na malejące. Wynik widac poniżej: