Aktualna wersja SDK dla Dynamics CRM to 4.0.5 z 30 maja 2008. Jest to wersja poprawiona, ale jak się okazuje – zawiera jeszcze sporo błędów :). Mam na myśli błędy, które denerwują szczególnie, czyli fragmenty kodu, które rzekomo mają działać i dostarczają jakąś funkcjonalność, a najzwyczajniej w świecie nie działają…
Najwięcej błędów znajduje się we fragmentach kodu związanych jest z częścią systemu, która uległa zmianiom w wersji 4.0. W szczególności chodzi o obsługę DynamicEntity i różnych sposobów budowania kwerend do wywołania poszczególnych metod web service’u CrmService.asmx (np. ColumnSet, FilterExpression).
Jednym z przykładów błędnego kodu w SDK jest próba odwoływania się do właściwości obiektu klasy DynamicEntity poprzez Properties. W SDK mamy:
DynamicEntity entity = (DynamicEntity)retrieved.BusinessEntity;
string fullname;
for (int i = 0; i < entity.Properties.Length; i++)
{
if (entity.Properties[i].Name.ToLower() == „fullname”)
}
Ten kod w CRM 4.0 po prostu nie zadziała! Wynika to z faktu, że właściwość Properties jest teraz obiektem typu PropertyBag, więc np. nie ma właściwości Length, a Count. Dodatkowo nie można oczywiście odwoływać się do poszczególnych wartości w tej kolekcji poprzez indeksy liczbowe w pętli. Aby pobrać konkretne pole z encji, powinniśmy napisać:
if (entity.Properties.Contains(„fullname”))
{
fullName = entity.Properties[„fullname”]; // a nie Properties[int i] !!!
}
Kolejne błędy znajdują się we fragmentach kodu opisujących np. dodawanie kolumn do zapytania, które chcemy wysłać web service’owi. SDK pokazuje w jednym z przykładów:
// Create a column set that holds the names of the columns to be retrieved
ColumnSet colsOrganization = new ColumnSet();
colsOrganization.Attributes = new string [] {„fullname”};
i znowu! Ten kod działał w CRM 3.0, ale nie zadziała w 4.0, jeśli użyjemy tak jak powinniśmy referencji do Microsoft.Crm.Sdk.dll 🙂 Chyba, że „namieszamy” sobie w kodzie i dodamy „web reference” do web service’u oprócz referencji do wspomnianej DLL (czyniąc kod zupełnie nie-generycznym). Nie zadziała z tej prostej przyczyny, że w CRM 4.0 właściwość Attributes jest tylko do odczytu i zwraca listę ArrayList.
Prawidłowy kod dla CRM 4.0 to:
ColumnSet colsOrganization = new ColumnSet();
colsOrganization.AddColumn(„fullname”);
Niestety takich „nieścisłości” w SDK jest całkiem sporo… Jedyny sposób sprawdzenia, czy fragmenty kodu działają to ich uruchomienie. Nawet doświadczenie z wcześniejszymi wersjami CRM tu nie pomagają, a nawet chyba trochę szkodzą :).