Błędy w SDK 4.0.5

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ą :).

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s