Update Rollup 10 – powstrzymajcie się na razie w poniższych sytuacjach

Standardowo opisuję każdy Update Rollup tuż po tym, jak się pojawi. Zawsze bardzo chcę wcześniej, ale NDA zabrania :). Tym razem nie pisałem nic, bo musiałem trochę potestować potencjalne zmiany. Update Rollup 10 jest bardzo dużą paczką, więc potencjalnie może wnosić trochę zamieszania. Warto być świadomym, co dokładnie może się stać w niektórych wypadkach i ewentualnie w tych przypadkach powstrzymać się na razie przed instalacją UR10.

W szczególności chodzi o poniżej opisane przypadki – być może jest ich więcej, ale tyle udało mi się zauważyć i są to problemy potwierdzone i naprawiane przez Microsoft:

  • Twoje formatki przetwarzają w jakikolwiek sposób odpowiedź FetchXmlToQueryExpressionResult, nawet jeśli o tym nie wiesz :)? Jeśli używasz FetchXML, platforma pod spodem i tak użyje tego żądania! To, co udało mi się znaleźć dotyczy tego, w jaki sposób budowana jest odpowiedź w JSON. Otóż, od Update Rollup 10 zmienił się kontrakt żądania, tzn. do FilterExpression został dodany atrybut IsQuickFindFilter, którego nie było wcześniej. To powoduje wywalanie się DataContractJsonSerializer’a i w rezultacie nie działają skrypty od tej linii na formatkach
  • Powyższy problem może być rozwiązany po przebudowaniu WCF’a za pomocą najnowszego SDK 5.0.12
  • Twoje rozwiązanie zawiera encje zmigrowane z Dynamics CRM 4.0? Prawdopodobnie dostaniesz błąd przy próbie importu tego rozwiązania ze względu na zmianę w strukturze XML w pliku rozwiązania
  • Masz jakiekolwiek emaile w stanie Pending albo Pending Send (Oczekujący na wysłanie)? Po wgraniu UR10 możesz się zdziwić, że po przełączeniu użytkownika do używania Email Router zamiast Outlook, jest spora szansa, że stare emaile ze statusem „Oczekujący na wysłanie” zostaną nagle wysłane. Niby to takie normalne i prawidłowe, ale biznes może się nieźle wkurzyć, jak zaczną wysyłać się nagle emaile sprzed 1-2 lat… 🙂 Warto o tym pamiętać!

Każda z poniższych sytuacji została już zgłoszona do Technical Support Microsoft’u. Nie u każdego te błędy mogą wystąpić, ale uczciwie ostrzegam… 🙂 Update Rollup 10 jest ogromną zmianą, stąd lepiej nie instalować go od razu po ukazaniu się na rynku…

Reklamy

SDK 5.0.5 dla Dynamics CRM 2011

Jakiś czas temu Microsoft opublikował najnowszą wersję SDK dla CRM 2011 – 5.0.5. Powoli SDK dla CRM zaczyna przypominać rozmiarem inne SDK Microsoft’u. Aktualna wersja „waży” już ponad 140 MB. Jednocześnie zawiera coraz więcej komponentów i gotowych narzędzi. SDK 5.0.5 wprowadziło parę rewolucyjnych zmian, m.in.:

CRM 2011 Developer Toolkit Beta
SDK 5.0.5 zawiera w sobie najnowszy Developer Toolkit dla Dynamics CRM 2011. Developer Toolkit to zestaw narzędzi dla Visual Studio 2010 specyficznych dla CRM i zbudowanych z uwzględnieniem całego procesu development’u w CRM 2011. Developer Toolkit wprowadza szablony projektów do VS 2010 (np. bibliotekę plugin’ów) i pozwala budować paczki gotowe do wdrożenia. Zawiera też narzędzie CRM Explorer pozwalające bezpośrednio z Visual Studio przeglądać zasoby serwera CRM, podobnie do widoku Dostosowań w CRM.
Na razie Developer Toolkit jest w wersji Beta, ale już widać, że Microsoft UK odwalił kawał dobrej roboty. Warto się przyjrzeć bliżej!

Plugin Profiler
Plugin Profiler to zupełnie nowe narzędzie zbudowane przez Microsoft do badania wydajności plugin’ów.

Wszystkie DLL uwzględniają już Update Rollup 3
W nowym SDK biblioteki są świadome zmian, które nastąpiły po UR3.

Mnóstwo nowych przykładów kodu
Musicie ściągnąć SDK, żeby zobaczyć. Ale Microsoft dodał nawet rozdział Simple Program :). MS dodał też mnóstwo przykładów kodu w VB.net.

Rozszerzenie CrmSvcUtil
Microsoft dodał rozszerzenie do CrmSvcUtil pozwalające generować listę wszystkich opcji z Zestawów Opcji (Option Sets).

Nowa wersja SDK pokazuje, że Microsoft przykłada sporą wagę do automatyzacji pracy programistów z CRM 2011 i zwiększenia produktywności. Pakiet SDK 5.0.5 można ściągnąć stąd: http://www.microsoft.com/download/en/details.aspx?id=24004.

SDK 4.0.12 – kolejna rewolucja!

Zazwyczaj informowałem o nowych wersjach SDK za pomocą krótkiego opisu. W przypadku CRM SDK 4.0.12 opis nie może być krótki. Takie SDK u innych producentów systemów CRM nazywałoby się „major platform upgrade” i kosztowałoby tyle, co kolejna wersja systemu. SDK 4.0.12 to zmiana spojrzenia na platformę Microsoft Dynamics CRM! To również totalne przełączenie na koncepcję xRM! Ja osobiście jestem w szoku :). Nowe SDK przygotowuje nas po prostu do gładkiego przejścia do CRM 5 i daje już teraz dostęp do funkcjonalności SDK CRM 5.
David Jennaway już sporo opisał na swoim blogu, ale myślę, że można by napisać ciągle więcej o tej rewolucji po polsku. Tak więc… ;P:

SDK 4.0.12 wprowadza pojęcia „Advanced Developer Extensions” czyli „Zaawansowanych rozszerzeń programistycznych”, które technicznie nazwane są po prostu xRM’em. W skrócie polegają na tym, że możemy korzystać z platformy Dynamics CRM w zupełnie nowy sposób. I tak:

  • nowe SDK pozwala na korzystanie z danych w Dynamics CRM za pomocą LINQ!!! Niech ten piękny kod powie sam za siebie:
    var marketingListsWithCalculations =
    from marketingList in crm.lists
    select new { marketingList.listname, Cost = marketingList.cost + 100 };
  • nowe SDK pozwala na używanie natywnych typów .NET!!! W tym typów nullowalnych (o których nota bene pisałem ostatni projekt w szkole 😉 ), czyli np. short? a nie short, dzięki czemu unikamy konieczności ustawiania IsNullSpecified
  • możemy budować źródła danych za pomocą klasy DataContext
  • nowe SDK dostarcza narzędzie CrmSvcUtil, które pozwala budować lokalne i silnie typowane odzwierciedlenia bazy CRM, czyli klasy reprezentujące obiekty i DTO (Data Transfer Object). Dzięki temu można pisać kod oparty o LINQ
  • nowe SDK daje wsparcie dla WCF! poprzez generowanie klas kontekstowych za pomocą CrmSvcUtil
  • z nowym SDK możemy robić tzw. batch updates!!! To z kolei znaczy, że nie musimy już robić tysiąca wywołań Update(). Zamiast tego możemy modyfikować dane „lokalnie”, cache’ować je i dopiero za jednym wywołaniem aktualizować wszystkie na raz! Tutaj przykład:

    contact.Email emailaddress1 = "janko@x.com";
    contact.contact_customer_accountsParentCustomerAccount = account;
    contact1.Firstname firstname = "Jakub";

    crm.UpdateObject(contact);
    crm.UpdateObject(contact1);

    // zapisywanie do bazy
    crm.SaveChanges();

  • nowe SDK pozwala pobierać obiekty powiązane za pomocą gotowych metod. Dzięki temu zamiast budować QueryExpression i podawać GUID’y możemy po prostu wywołać metodę GetRelatedEntities()
  • nowe SDK daje zupełnie nowe możliwości budowania relacji między obiektami z poziomu kodu (poprzez metodę SetLink() albo aktuzalizację klucza obcego). Wystarczy zerknąć na przykłady poniżej, żeby zobaczyć dlaczego mówię o rewolucji :):
    crm.SetLink(contact, "contact_customer_accounts", account);
    crm.SaveChanges();

    albo:

    contact.contact_customer_accounts = account;
    crm.UpdateObject(contact);
    crm.SaveChanges();
  • nowe SDK zawiera informacje o budowaniu tzw. Visual Charts, czyli dynamicznych wykresów z danych w CRM. W CRM 5 wykresy te będą mogły być wyświetlane na listach rekordów, aktualnie udostępnia je w ograniczonej postaci tylko CRM Online R4.
  • nowe SDK zawiera zupełnie nowe rozdziały o uwierzytelnianiu w modelach serwer-serwer i impersonacji
  • nowe SDK zawiera mnóstwo nowych rozdziałów, w tym rozdziały opisujące dokładnie dlaczego należy korzystać z DynamicEntity, z klasy IsvReadiness i kilkunastu innych
  • nowe SDK zawiera rozdziały o dobrych praktykach w pisaniu zewnętrznych aplikacji korzystających z CRM i o sugestiach związanych z wydajnością takich aplikacji

Na razie nikt nie wie, czy ukaże się CRM SDK 4.0.13. A to dlatego, że 4.0.12 zbliża nas wielkimi krokami do CRM 5. Już teraz Microsoft przyzwyczaja programistów do rozwiązań, które w gotowej platformie zobaczymy za kilka miesięcy. SDK 4.0.12 to jest coś pięknego. To dla takich chwil warto kochać Dynamics CRM’a! I w takich chwilach wiem, czemu kocham MS a nie Google’a, który za major update uważa nowy kształt guzika „szukaj” :D.

PS. SDK 4.0.12 jest do ściągnięcia tutaj: http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en

CRM SDK 4.0.10 dla Dynamics CRM

Długo trzeba było czekać na aktualizację SDK. 2 listopada Microsoft opublikował nowe SDK w wersji 4.0.10. SDK oczywiście bazuje na systemie z Rollup’em 7. Pośród zmian są m.in. nowe rozdziały o optymalizacji kodu poprzez np. użycie predefioniwanych serializerów, poprawiony Plugin Registration Tool, rozdziały o filtrach w raportach i nowe opisy stylów CSS używanych w CRM. Niestety najwięcej zmian w SDK 4.0.10 dotyczy CRM Online. To pokazuje, że Microsoft rzeczywiście zaangażował się w rozwój platformy.
SDK 4.0.10 można ściągnąć tutaj: http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&displaylang=en.

3 spotkanie grupy DxPUG i CRM Developer Toolkit

Na ostatnim (3-cim) spotkaniu Dynamics xRM Polish User Group (http://ms-groups.pl/dxpug/3_spotkanie/) miałem okazję powiedzieć kilka słów o CRM Developer Toolkit – narzędziu (lub framework’u, jak kto woli) wspomagającym pracę z Microsoft Dynamics CRM 4.0. Dla tych których nie byo na spotkaniu, krókie podsumowanie CRM Developer Toolkit tutaj:

  • Zestaw narzędzi do rozszerzania Dynamics CRM zintegrowanych z Visual Studio
  • Zestaw szablonów projektów Visual Studio bazujących na wdrożeniach klasy Enterprise (od plugin’ów przez własne strony ASP.NET aż po usługi Windows korzystające z CRM w tle)
  • Składa się z: CRM Solution Framework i CRM Explorer
  • pozwala edytować encje i generować kod
  • dostarcza jednolitego środowiska do rozwijania wszystich komponentów (od plugin’ów po zewnętrzne strony
  • może być budowany za pomocą predefiniowanych konfigurcji MSBuild
  • można go ściągnąć stąd: http://code.msdn.microsoft.com/E2DevTkt

Więcej o CRM Developer Toolkit (w tym prezentacja) na stronie grupy. BTW, zapraszam więcej osób na kolejne spotkania!

Dokument „The Microsoft Dynamics CRM Security Model”

Sustaining Engineering Team (E2) opublikował kolejny bardzo techniczny dokument o Microsoft Dynamics CRM. Tym razem trafiło na opis bezpieczeństwa, metod autentykacji i zabezpieczeń systemu i całej platformy. Dość obszerny dokument opisuje w szczegółach jakie są dostępne metody autentykacji, której należy użyć i jak Dynamics CRM radzi sobie z zapytaniami przez web services, z zewnętrznych aplikacji i po prostu z dowolnymi odwołaniami do platformy.
Dokument dostępny jestdo ściągnięcia tutaj: https://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=fb4bb16b-586f-4aae-aa4b-790023e95b61. Polecam go każdemu, kto chce wiedzieć, dlaczego czasem RetrieveMultiple zwraca mu różne liczby rekordów ;).

Zamykanie szans sprzedaży programistycznie

Szanse sprzedaży, podobnie jak inne obiekty, mają tzw. stan i status (statecode i statuscode). Kiedy zamykamy szanse sprzedaży z poziomu interfejsu Microsoft Dynamics CRM, nie zastanawiamy się często, co tak naprawdę robi CRM „pod spodem”. Otóż, system zmienia wtedy stan i status konkretnej szansy sprzedaży.
Jeśli chcemy zamknąć szansę sprzedaży programistycznie (z poziomu kodu), nie zmieniamy jednak jej stanu, jak robilibyśmy to w przypadku innych obiektów. Aby zamknąć szansę sprzedaży, należy użyć jednej z dwóch klas: WinOpportunityRequest albo LoseOpportunityRequest. Obiekty te mają dwie właściwości, które powinniśmy ustawić: opportunityclose i status. Ten pierwszy obiekt reprezentuje działanie odzwierciedlające zamknięcie szansy sprzedaży. Działanie to ma szereg właściwości, które możemy chcieć ustawić, np. actualend czy actualrevenue.
Przykładowy kod może wyglądać tak (należy dodać właściwe wartości):

opportunityclose zamkniecie = new opportunityclose();
zamkniecie.opportunityid = new Lookup();
zamkniecie.opportunityid.Value = GUID_SZANSY_SPRZEDAZY;
zamkniecie.actualrevenue = WARTOSC_SZANSY_SPRZEDAZY;
zamkniecie.actualend = AKTUALNA_DATA;

WinOpportunityRequest winReq = new WinOpportunityRequest();
winReq.OpportunityClose = zamkniecie;
winReq.Status = -1; // -1 pozwoli systemowi ustawić domyślny status

crmService.Execute(winReq);

Analogicznie, można zamknąć szansę sprzedaży jako przegraną, używając LoseOpportunityRequest. Miłego programowania!