cub-e.net

just coding...

Dynamics CRM 2015-2016 Messages Ozelliklerine Takilmadan Islemlerimizi Yapmak

Dynamics CRM icerisinde ozel amacla kullanilan bircok alan bulunmaktadir ve bu alanlarin ozel tipleri vardir. Yani bu alanlara standart .Net tipleri degil de CRM siniflarini parameter olarak atamaktayiz.

Bu duruma verebilecegimiz en unlu ornek ise statecode ve statuscode alanlarinin OptionSet deger almasi ve bunlarin kendilerine ozgu ozel message yapisi ile guncellenebilmesidir. Hatta bu islem oncesi kaydet guncellenemiz gerekiyorsa bu degerleri iceren bir SetStateRequest gondermeniz daha sonra da Update etmemiz gerekmektedir.

Kod uzerinde bu durumu  incelersek; Assign yani birisine kayit atama ve SetStateRequest yani kaydin durumunu guncellemek icin ayri islemler yaptigimizi ve kodun ne kadar uzadigini gorebilirsiniz.

            using (var service = new OrganizationService(crmConnection))

            {

                Entity account = new Entity("account");

                account["accountid"] = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8");

                account["name"] = "Adventure Works Inc.";

                account["creditlimit"] = new Money(100000);

 

                // Service call 1 – standart alanlari guncellestir

                var updateRequest = new UpdateRequest() { Target = account };

                var updateResponse = (UpdateResponse)service.Execute(updateRequest);

 

                // Service call 2 – sahipligi degistir

                var assignRequest = new AssignRequest()

                {

                    Assignee = new EntityReference

                    {

                        LogicalName = "team",

                        Id = new Guid("042d5707-6fe5-e411-80e5-fc15b428fa14")

                    },

 

                    Target = new EntityReference

                    {

                        LogicalName = "account",

                        Id = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8")

                    },

                };

                var assignResponse = (AssignResponse)service.Execute(assignRequest);

 

                // Service call 3 – kaydin durumunu degistir

                var setStateRequest = new SetStateRequest()

                {

                    EntityMoniker = new EntityReference

                    {

                        LogicalName = "account",

                        Id = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8")

                    },

                    State = new OptionSetValue(1), //inactive

                    Status = new OptionSetValue(2) //inactive

                };

                var setStateResponse = (SetStateResponse)service.Execute(setStateRequest);

            }

CRM 2015 update 1’den itibaren ise artik bu durumu daha iyi yonetebilmekteyiz. Cok basit bir update kodu icerisinde bu durumu cok rahat yonetebilmekteyiz. Bu ozellik sayesinde cok daha rahat ve hizli kod yazabilmekteyiz artik.

Bu durum entegrasyon calismalarimizda da bize hiz ve daha guvenli calisan bir kod yapisi sunmaktadir.

            using (var service = new OrganizationService(crmConnection))

            {

                Entity account = new Entity("account");

                account["accountid"] = new Guid("0C2D5AC7-B7E4-E411-80E9-C4346BAC7DA8");

                account["name"] = "Adventure Works Inc.";

                account["creditlimit"] = new Money(100000);

                account["statecode"] = new OptionSetValue(1); //inactive

                account["statuscode"] = new OptionSetValue(2); //inactive

                account["ownerid"] = new EntityReference { LogicalName = "team", Id = new Guid("042d5707-6fe5-e411-80e5-fc15b428fa14") };

 

                var request = new UpdateRequest() { Target = account };

                var response = (UpdateResponse)service.Execute(request);

            }

Daha fazla detayi bu adreste bulabilirsiniz: CRM online documentation page

Dynamics CRM 2016 - Upsert

CRM yazilimcilari cok asina olmasa da bu terim DBA’ler icin yabanci bir terim degil. Upsert aslinda bizim bildigimiz Update ve Insert islemlerinin bir metodda birlestirilmis hali. Isin ozu ise siz sisteme bir nesne gonderdiginizde ilk once bu var mi diye kontrol ediyor eger varsa update ediyor yoksa yenisini olusturuyor.

            using (var service = new OrganizationService(crmConnection))

            {

                // Use alternate key (accountnumber) field to identify an account record

                var account = new Entity("account")

                {

                    KeyAttributes = new KeyAttributeCollection

                    {

                        {"accountnumber", "MWNS-123" }

                    }

                };

 

                account["name"] = "Microsoft Turkey";

                account["creditlimit"] = new Money(200000);

 

                var request = new UpsertRequest() { Target = account };

                var response = (UpsertResponse)service.Execute(request);

            }

Kod calistiginda MWNS-123 kodlu kaydi arayacak varsa update yoksa insert edecek, iste bu kadar basit.

Bu arada sunu belirtmekte fayda var Upsert islemi icin ozel bir mesaj bulunmamakta yani islem Update olursa Update mesaji, Create olursa create mesaji calismakta. Plugin yazarken lutfen bunu goz onunde bulundurun.

Daha detayli bilgiyi asagidaki adreslerde bulabilrsiniz.

CRM 2011’de Create/Update/Delete Metodlarına Farklı Bir Bakış

Dynamics CRM'in iş dünyasının parlayan yıldızı olan ve her türlü iş platfomunun temeline yerleştirebilecek bir mimaride olduğunu her fırsatta anlatmaya çalışıyorum. Bu mimari üzerinde bizim kod geliştirmemizi ve sistem ile entegre olmamızı sağlayan web servisleri ve dll'ler vasıtasıyla yazma ve okuma işlemlerimizi gerçekleştirmekteyiz. Bugün sizlere daha önceden eski versiyonlar için de bahsetmiş olduğum oluşturma,  güncelleme ve silme metodlarının yapısını tekrar anlatacağım ama sonunda bunları Process isimli bir class'da birleştirip tek bir yerden yönetilmelerini sağlayacağız.

CRM servis nesnesi bize kayıtlar üzerinde işlem yapma özelliği sağlamaktadır. Servis içinden yapmak istediğimiz harekete uygun metodu çağırmamız gerekmektedir.
  Tabii burada unutulmaması gereken konu servisi çağıran kullanıcının çağrılan metodda işlem yapmaya yetkili olması gerekmektedir.

Create Metodu CRM 2011 içerisinde bir entity içerisinde yeni bir nesne oluşturmamıza olanak tanır. Metod parametre olarak entity türünden bir nesne alır ve yeni oluşturulmuş nesnenin GUID türünden değerini geri döndürür.

Aşağıdaki örnek bu metodun late-bound sınıfla kullanımını göstermektedir.

// Entity nesnesinin yeni bir instance’ini olusturuyoruz
Entity account = new Entity("account");
// Gerekli attribute’lara atama yapiyoruz.
account["name"] = "Örnek Firma";
// Örnek Firma adında bir firma karti olusturuyoruz.
_accountId = ioService.Create(account); 

Aşağıdaki örnek bu metodun early-bound sınıfla kullanımını göstermektedir.

Contact contact = new Contact()
{
    FirstName="Deneme",
    LastName="Kisisi",
    Address1_City="İstanbul",
};
Guid contactGuid =_service.Create(contact);

Update Metodu CRM 2011 içerisinde bir entity içerisinde bir nesneyi güncellememizi sağlar. Metod parametre olarak entity türünden bir nesne alır. Güncellenecek nesnenin id’si mutlaka parametre olarak verilmelidir.

Guid gContact = new Guid("7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D");
 
Contact contact = new Contact()
{
     ContactId = gContact,
     FirstName="Test",
     LastName="Kisisi",
     Address1_City="Ankara",
};
_service.Update(contact);

Delete Metodu CRM 2011 içerisinde Id’sini verdiğiniz bir nesneyi sistemden silmeye yarar. Metod parametre olarak silinecek nesnenin Id’si yanında bu nesnenin türünü ister.

Guid gContact = "7bE545CCD3-9A3A-E011-BA8B-78E7D1623F9D";
_service.delete("contact", gContact); 

Bir programcı olarak çok standart olan bu işlemleri isterseniz bir class mantığı altında birleştirelim. Bu sayede daha yönetilebilir bir CRUD (Create, Read, Update, Delete) yapısı oluşturabiliriz. Ben bu sınıf için Process adını kullandım ve Process sınıfı içerisinde şu anda Oluşturma, Güncelleme ve Silme işlerimi yapmaktayım. İlerleyen makalelerde Okuma yapılarını incelerken onları da bu sınıfa dâhil ederiz.

Burada öncelikle açıklamalıyım ki bir önceki makalede yer alan Singleton tasarım deseniyle CRM servisini oluşturma yazımdaki class’tan faydalanarak servisi çağırma işlemini gerçekleştirdim. O yazıyı okumak isterseniz buraya tıklayınız

Ek olarak hata olaylarını kontrol etmek için Result isimli bir class kullandım bu class’ın içeriği şu şekilde;

public class Result
    {
        public string Message { get; set; }
        public bool isError { get; set; }
        public Object BusinessObject { get; set; }
 
        public Result(string _Message, bool _isError, Object _BusinessObject)
        {
            Message = _Message;
            isError = _isError;
            BusinessObject = _BusinessObject;
        }
 
        public Result(string _Message, bool _isError)
        {
            Message = _Message;
            isError = _isError;
            BusinessObject = null;
        }
    }

Görüldüğü üzere çok basit bir class bize sonucun başarılı mı başarısız mı olduğunu döndürecek o kadar.

Bunun haricinde bir de Base isimli bir class’ım var ki Process sınıfını aslında bu class’dan türetmekteyim. Şu anda bu class’ı sadece ErrorNumber ve ErrorDetail gibi hata oluştuğunda bilgi almamızı sağlayacak iki property ile kullanmaktayım ama ileride farklı propertyler de eklenecek.

public class Base
{
    public int ErrorCode { get; set; }
    public string ErrorDetail { get; set; }
} 

Bu iki class’ımı açıkladıktan sonra asıl yapıda kullanacağımız metodlara gelelim. İlk önce create metodunu inceleyelim. Hatırlayacağınız üzere CRM servisinde Create metdonun Update metodundan tek farkı id’ye ihtiyaç duymamasıydı. Çünkü bu metod id’yi üretip bize geri döndürecek. Ben de kurguyu buna göre planladım.

public Result Create(Entity EntityForCreate)
       {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
 
                Guid EntityID = service.OrganizationService.Create(EntityForCreate);
 
                DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID, 
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false, EntityID);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true);
            }
        }

Aslında yapı çok basit servis nesnemi çağırıyorum, servis oluşurken hata var mı diye bakıyorum eğer hata varsa hatayı fırlatıyorum. (bu noktada şunu belirtmeliyim ki catch bölümünde yer alan DetailLog ve ExceptionHandler benim daha önceden yazmış olduğum hata yönetimi ile ilgili class’lar catch bölümünü siz de istediğiniz gibi düzenleyebilirsiniz) Eğer hata yok ise OrganizationService metodumu kullanarak nesnemi oluşturuyorum. Bu noktada da bir hata yoksa servis bana oluşturduğu nesnenin id’sini döndürüyor yok eğer hata varsa zaten kod catch bloğuna düşüyor. İşte bu kadar.

Şimdi gelin diğer metodlara bir göz atalım;

public Result Update(Entity EntityForUpdate, Guid EntityID)
        {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
 
                service.OrganizationService.Update(EntityForUpdate);
 
                DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID,
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true);
            }
        }

Update metodu neredeyse Create metodunun aynısı tek fark daha önce de ifade ettiğim gibi güncellenecek nesnenin id’sini alması. Bunu almalı ki neyi güncellediğini bilebilsin. Aslında burada şöyle bir mantıksal kargaşa var update metodu ek olarak id’yi almamakta zaten sizin ona update edilmesi için vereceğiniz entity’nin Id alanına vermelisiniz. Benim burada ek olarak almamdaki amaç onu loglamak için.

Bir de Delete metoduna göz atalım;

public Result Delete(string EntityName, Guid EntityID)
        {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
 
                service.OrganizationService.Delete(EntityName, EntityID);
 
                DetailedLog.CreateLog("Entity Created! Type: " + EntityName + ", ID : " + EntityID,
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true, null);
            }
        }

Delete metodu entity’nin adını ve id’sini almakta. Bu iki veriyi de servise vermekteyiz.

Class’ın tamamına bakacak olursak;

public class Process : Base
    {
        public Result Create(Entity EntityForCreate)
        {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
 
                Guid EntityID = service.OrganizationService.Create(EntityForCreate);
 
                DetailedLog.CreateLog("Entity Created! Type: " + EntityForCreate.LogicalName + ", ID : " + EntityID, 
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false, EntityID);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true);
            }
        }
 
        public Result Update(Entity EntityForUpdate, Guid EntityID)
        {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
                
                service.OrganizationService.Update(EntityForUpdate);
 
                DetailedLog.CreateLog("Entity Updated! Type: " + EntityForUpdate.LogicalName + ", ID : " + EntityID,
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true);
            }
        }
 
        public Result Delete(string EntityName, Guid EntityID)
        {
            try
            {
                Service service = Service.GetService();
 
                if (service == null)
                    throw new Exception("Service is null");
                if (service != null && service.ErrorCode > 0)
                    throw new Exception(service.ErrorDetail);
 
                service.OrganizationService.Delete(EntityName, EntityID);
 
                DetailedLog.CreateLog("Entity Created! Type: " + EntityName + ", ID : " + EntityID,
                    System.Diagnostics.EventLogEntryType.Information);
 
                return new Result("", false);
            }
            catch (Exception ex)
            {
                ErrorCode = 100;
                ErrorDetail = ExceptionHandler.HandleException(ex);
                DetailedLog.CreateLog(System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
                    + " : " + System.Reflection.MethodBase.GetCurrentMethod().ToString()
                    + " : " + ErrorDetail, System.Diagnostics.EventLogEntryType.Error);
 
                return new Result(ErrorDetail, true, null);
            }
        }
    }

Class’ımızı bu şekilde oluşturduktan sonra gelin onu bir konsol uygulaması yardımıyla çağıralım ve iş başında görelim.

static void Main(string[] args)
        {
            try
            {
                Entity lead = new Entity("lead");
                lead.Attributes["subject"] = "Fuardan Gelenler";
                lead.Attributes["firstname"] = "Barış";
                lead.Attributes["lastname"] = "KANLICA";
                lead.Attributes["companyname"] = "Omerd Business Solutions";
 
                Process process = new Process();
                Result result = process.Create(lead);
                if (result.isError)
                    throw new Exception(result.Message);
 
                Console.WriteLine("Lead created : " + result.BusinessObject.ToString());
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error : " + ex.Message);
                Console.ReadLine();
            }
        }

 

Gördüğünüz üzere Entity nesnemi çağıyor ve ona lead adını veriyorum. İçerisi istediğim bilgiler ile dolduruyor ve Process class’ımın içindeki Create metodu vasıtasıyla CRM içerisinde oluşmasını sağlıyorum. İşte hepsi bu kadar :) 

Bütün bu işlemler sonunda tek bir noktadan yönetilebilir bir CRUD mimarisi yavaş yavaş ortaya çıkmakta. Sıra Okuma işlemlerinin detaylarına inmekte. Onu da artık başka bir makalede inceleyeceğiz.

Important information about supported configurations in the next release for CRM

As we ship the Microsoft Dynamics CRM 2013 Service Pack 1 and CRM Online Spring ‘14 releases, we’re looking ahead to our next release of CRM. As with other releases of CRM in the past, we find the need to add and remove items from our supported configurations list to keep current with technology, and allow us to provide you the best product possible.

Changes in supported platform software

For the next release, we’re removing the following operating systems from our Microsoft Dynamics CRM Server support matrix:

  • Windows Server 2008
  • Windows Server 2008 R2
  • Windows Small Business Server (All versions)

We’re removing the following SQL Server versions from our Microsoft Dynamics CRM Server support matrix:

  • Microsoft SQL Server 2008
  • Microsoft SQL Server 2008 R2

We’re removing Microsoft Dynamics CRM for Outlook support for:

  • Windows Vista
  • Windows Server 2008 Remote Desktop Services
  • Microsoft Office 2007

Our current plan for Microsoft Dynamics CRM Server is to target only Windows Server 2012, Windows Server 2012 R2, and SQL Server 2012 for the next release time frame.

Note that we’re exploring support for SQL Server 2014 with Microsoft Dynamics CRM Server, but we haven’t made a decision at this time.

Changes in items specific to the CRM application

Client API (JS)

We’re removing the following client SDK (JavaScript) APIs:

This means that if your customizations are using any of these API commands, your code will likely break after you upgrade CRM.

We’re modifying the possible return values from Xrm.Page.ui.getFormType to remove the Read Optimized and CRM 4.0 QuickForm Types. This means that we’re removing two values from the possible results of getFormType. However, it’s unlikely that your code will be affected by this because we removed the forms types in CRM 2013.

Please see Client-side Context Reference for CRM 2013 for alternative methods to use

Form system

We’re removing the following form items:

  • Read-optimized forms
  • CRM 2011 forms that were updated in CRM 2013

This means that you must upgrade your forms to use the new CRM 2013 form system before upgrading to the next release.

Entities

The Kit type of Product will be deprecated, which means that we’ll do base testing only and will be removing this feature in a future release. Please update your customizations to not use this entity.

Upgrade rules

We’re making database merge mandatory on upgrade. This means that you won’t be able to bypass this process during the upgrade from CRM 2013 to the next release of CRM.

Email Router

Support for Exchange 2007 connectivity to and from the CRM Email Router will be deprecated, which means that we’ll do base testing only and will be removing this capability from the CRM Email Router in a future release.

Browsers

We’re dropping support for Internet Explorer 8 and Internet Explorer 9.

Note that Internet Explorer 8 and 9 won’t route to Microsoft Dynamics CRM for phones by default, they will continue to route to the main application. However, they won’t provide an optimal experience and any issues reported will need to be validated on a supported browser.

2007 SDK SOAP Endpoint

We’ll be removing this endpoint, which was deprecated in CRM 2013. You shouldn’t use this endpoint for any new extensions.

Kaynak : http://blogs.msdn.com/b/crm/archive/2014/05/14/important-information-about-supported-configurations-in-the-next-major-release-for-crm.aspx

Microsoft Dynamics CRM 4.0 için Update Rollup 11

Microsoft Dynamics CRM için Update Rollup 11 çıkartıldı. 

Aşağıdaki linklerden detaylı bilgi alabilirsiniz.

--------

The Microsoft Dynamics CRM Sustained Engineering team will release Update Rollup 11 on Thursday, June 3, 2010.

Once the release is available the links below will take you to the necessary information about Update Rollup 11.

Microsoft Dynamics CRM için Update Rollup 8

Microsoft Dynamics CRM için Update Rollup 7 çıkartıldı. 

Aşağıdaki linklerden detaylı bilgi alabilirsiniz.

--------

The Microsoft Dynamics CRM Sustained Engineering team will release Microsoft Dynamics CRM 4.0 Update Rollup 8 on Thursday, December 17, 2009.

Once the release is available the links below will take you to the necessary information about Update Rollup 8.

Update Rollup 6 - Güncelleştirme Paketi 6

Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 6 (KB 970148)

Microsoft, Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 6 ’yi yayınladı. Güncelleştirme, kolay dağıtım için bir arada paketlenmiş hata düzeltmeleri ve performans geliştirmeleri içerir.

Güncelleştirme Paketi 6, Microsoft Dynamics CRM 4.0 tarafından desteklenen tüm diller için sunulmaktadır.

Bu sürüm hakkında daha fazla bilgi için bkz. Microsoft Bilgi Bankası makalesi 970148: Update Rollup 6 is available for Microsoft Dynamics CRM 4.0 (Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 6 yayınlandı).

----

Microsoft has released Update Rollup 6 for Microsoft Dynamics CRM 4.0 Server, Microsoft Dynamics CRM for Microsoft Office Outlook, Microsoft Dynamics CRM Data Migration Manager, Microsoft Dynamics CRM 4.0 Language Pack, and Microsoft Dynamics CRM 4.0 E-mail Router.

For more information about this release, see Microsoft Knowledge Base article 970148:

Update Rollup 6 is available for Microsoft Dynamics CRM 4.0

Microsoft Dynamics CRM SDK Güncelleştirmesi 4.0.9

Microsoft Dynamics CRM 4.0 için en son sürüm olan SDK meta veri tarayıcı sayfalarını, Visual Studio 2005 ve 2008 için Visual Studio şablonları ve BB Makaleleri ile çalışan makaleler dahil yeni bilgiler içerir. Sunucudan sunucuya kimlik doğrulaması, bağımlı seçim listeleri ve eşzamanlı olmayan kayıtların silinmesi ile, Microsoft Dynamics CRM Çevrimiçi'ne yönelik oturum açmış kullanıcının kimliğini alma özelliği gibi yeni özellikleri içerir.

Microsoft Dynamics CRM Update Rollup 5

Güncelleştirme Paketi 5
Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 5 (KB 970141)

Microsoft, Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 5 ’yi yayınladı. Güncelleştirme, kolay dağıtım için bir arada paketlenmiş hata düzeltmeleri ve performans geliştirmeleri içerir.

Güncelleştirme Paketi 5, Microsoft Dynamics CRM 4.0 tarafından desteklenen tüm diller için sunulmaktadır.

Bu sürüm hakkında daha fazla bilgi için bkz. Microsoft Bilgi Bankası makalesi 970141: Update Rollup 5 is available for Microsoft Dynamics CRM 4.0 (Microsoft Dynamics CRM 4.0 için Güncelleştirme Paketi 4 yayınlandı).
Önemli: Bu güncelleştirme, Microsoft Dynamics CRM Çevrimiçi için gerekli değildir. Tüm güncelleştirmeler otomatik olarak yüklenir.
Yazılımlarından en iyi performansı almaya devam edebilmeleri için müşterilerimize güncelleştirme paketini yüklemelerini öneriyoruz. Güncel paketi yükleyebilmek için önceki güncelleştirme paketlerinin yüklenmiş olması gerekli değildir.