CRM 2011 - KİŞİSEL VIEW OLUSTURMA VE SİLME İŞLEMİ


Bugün , kişisel viewlerimizi silme işlemini yapacagız.Bu işlemi sürekli kullanacagımızı düşünürsek bunun için basit bir yol deneyecegız.

1.) Gelişmiş Bul u acalım.(Go to Advanced Find)
2.)Look for kısmından calısacagımız entity i secelim.(Choose the entity which you have Personal View as “Look For”)
3.)Ribbon dan "Saved Views" e tıklayarak view imizi kaydedelim.(Click on “Saved Views” ribbon button)

4.)View imizi secelim  ve sil yada deaktive butonlarına tıklayarak işlemimizi gerceklestırelım.(Choose the view and you can delete or deactivate it !)



CRM 2011 - PAYLASMA (SHARING) with C#


Paylasma (Share)


public static void Share(string principalName, Guid _principalId, string targetName, Guid _targetId, IOrganizationService serv)
        {
             GrantAccessRequest grantAccessRequest = new GrantAccessRequest
                {
                    PrincipalAccess = new PrincipalAccess
                    {
                        Principal = new EntityReference(principalName, _principalId),
                        AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess | AccessRights.ShareAccess | AccessRights.AssignAccess | AccessRights.AppendAccess | AccessRights.AppendToAccess
                    },
                    Target = new EntityReference(targetName, _targetId)
                };
                GrantAccessResponse grantAccessResponse=(GrantAccessResponse)serv.Execute(grantAccessRequest);
          
            }
        }

Paylasımı Kaldırma (UnShare)


public static Result UnShare(string principalName, Guid _principalId, string targetName, Guid _targetId, IOrganizationService serv)
        {
         
                RevokeAccessRequest revokeAccessRequest = new RevokeAccessRequest
                {
                    Revokee = new EntityReference(principalName, _principalId),

                    Target = new EntityReference(targetName, _targetId)
                };

                RevokeAccessResponse revokeaccessresponse = (RevokeAccessResponse)serv.Execute(revokeAccessRequest);
          
        }

Eski Paylasımı Guncelleme(Modify)


public static void ModifyObject(EntityReference systemUser, EntityReference account, IOrganizationService service)
        {
            PrincipalAccess principalAccess = new PrincipalAccess
            {
                AccessMask = (AccessRights)852023,

                Principal = systemUser
            };

            ModifyAccessRequest modifyAcessRequest = new ModifyAccessRequest();

            modifyAcessRequest.PrincipalAccess = principalAccess;

            modifyAcessRequest.Target = account;

            service.Execute(modifyAcessRequest);
        }

CRM 2011- KULLANICIYA TAKIM EKLEME ve KALDIRMA(C #)


       // Takımın guid id
            Guid takimId= new Guid("079EE428-F515-E211-B2D9-00155D025F00");
            
            //1.Kullanıcı guid id 
            Guid kullanici1Id= new Guid("486FA7B3-4A6F-E111-AA15-00155D025F09");

            // // 2.Kullanıcı guid id
            Guid kullanici2Id= new Guid("FB9CA21D-7F72-E111-AA15-00155D025F09");

           // kullanıcı listesi
            Guid[] kullanicilar= new[] { kullanici1Id, kullanici2Id};

            KullanicilaraTakimEkle(teamId, kullanicilar, service);
            KullanicilardanTakimKaldir(teamId, kullanicilar, service);

Takım Ekleme Metodu


        public static void KullanicilaraTakimEkle(Guid teamId, Guid[] membersId, IOrganizationService service)
        {
           //Kullanıcılara takım ekleyen nesneyi olustur.
            AddMembersTeamRequest addRequest = new AddMembersTeamRequest();
      
           // eklenecek takım id sini ver.
            addRequest.TeamId = teamId;

            // kullanıcılar listesini ver
            addRequest.MemberIds = membersId;

            // nesneyi calıstır.
            service.Execute(addRequest);
        }

Takım Kaldırma Metodu


        public static void KullanicilardanTakimKaldir(Guid teamId, Guid[] membersId, IOrganizationService service)
        {
            RemoveMembersTeamRequest addRequest = new RemoveMembersTeamRequest();

            addRequest.TeamId = teamId;
            addRequest.MemberIds = membersId;

            service.Execute(addRequest);
        }

CRM 2011- Two Options Alanın Value suna Gore Textini Alma


Herhangi bir entity deki two options fieldın text degerini field ın bulundugu entity nin adı , fieldın adı ve cekılecek textın value sunu gondererek bulabılırsınız.

C# KOD:
        public static string GetBoolText(IOrganizationService service, string entityAdi, string fieldAdi, bool fieldvalue)
        {
            RetrieveAttributeRequest retrieveAttributeRequest = new RetrieveAttributeRequest
            {
                EntityLogicalName = entityAdi,
                LogicalName = fieldAdi,
                RetrieveAsIfPublished = true
            };
            RetrieveAttributeResponse retrieveAttributeResponse = (RetrieveAttributeResponse)service.Execute(retrieveAttributeRequest);
            BooleanAttributeMetadata retrievedBooleanAttributeMetadata = (BooleanAttributeMetadata)retrieveAttributeResponse.AttributeMetadata;
            string boolText = string.Empty;
            if (fieldvalue)
            {
                boolText = retrievedBooleanAttributeMetadata.OptionSet.TrueOption.Label.UserLocalizedLabel.Label;
            }
            else
            {
                boolText = retrievedBooleanAttributeMetadata.OptionSet.FalseOption.Label.UserLocalizedLabel.Label;
            }
            return boolText;
        }

CRM 2011 Javascript - XRM.UTILITY



Asagıdakı özelliği kullanabilmek için  Microsoft Dynamics CRM 2011 de Rollup 8 i güncelleyin.

Yeni bir kayıt acma

JavaScript
Xrm.Utility.openEntityForm("account");

Var olan kayıtı acma

JavaScript
Xrm.Utility.openEntityForm("account","A85C0252-DF8B-E111-997C-00155D8A8410");

Yeni acılacak kayıt ıcın ekranda bazı alanların dolu gelmesi

JavaScript
var parameters = {};
parameters["formid"] = "b053a39a-041a-4356-acef-ddf00182762b";
parameters["name"] = "Test";
parameters["telephone1"] = "(425) 555-1234";
Xrm.Utility.openEntityForm("account", null, parameters);

Acılacak Sayfa Ayarları

Javascript
var newWindow = Xrm.Utility.openEntityForm("contact");
newWindow.moveTo(0,0);
newWindow.resizeTo(800,600);

WEBRESOURCE

HTM Sayfa Acma
JavaScript
Xrm.Utility.openWebResource("acilacaksayfa.htm");
HTM Sayfa acma (Bir parametre gondererek)
JavaScript
Xrm.Utility.openWebResource("acilacaksayfa.htm","dataItemValue");

HTM Sayfa Acma (Birden fazla parametre gondererek)
var customParameters = encodeURIComponent("first=First Value&second=Second Value&third=Third Value");
Xrm.Utility.openWebResource("acilacaksayfa.htm",customParameters);

HTM Sayfa Acma(Url ile birlikte parametre gondererek)
Xrm.Utility.openWebResource("acilacaksayfa.htm?typename=account&userlcid=1033");

HTM Sayfa Acma(Sayfa Ayarları)
JavaScript
Xrm.Utility.openWebResource("acilacaksayfa.htm", null, 300,300);

CRM 2011- FORMA BUTON EKLEME


Forma crm arayuzu uzerınden buton ekleme sansımız yok.Bunun için buton ekleme olayını javascript uzerınden yapıyoruz.Bunun için forma text alan ıcerecek field alan ekleyıp o field ı form acılırken butona cevırmemız gerekecek.Field ı butona cevıren javascript asagıdadır.

new_custombutton => butona cevrilecek field ın name i
function CreateCustomButton() {
    ConvertToButton("new_custombutton", "Not Onay", "100px", OpenSearchPage, "Button Label");
   document.getElementById('new_mytxt').style.visibility = 'hidden';
}
function GetValueFromChild(myVal)
    {
        document.getElementById('new_mytxt').value = myVal;
    }
function ConvertToButton(fieldname, buttontext, buttonwidth, clickevent, title) {
    //check if object exists; else return
    if (document.getElementById(fieldname) == null) {
        return;
    }
    functiontocall = clickevent;
    crmForm.all[fieldname].DataValue = buttontext;
    crmForm.all[fieldname].readOnly = true;
    crmForm.all[fieldname].style.borderRight = "#3366cc 1px solid";
    crmForm.all[fieldname].style.paddingRight = "5px";
    crmForm.all[fieldname].style.borderTop = "#3366cc 1px solid";
    crmForm.all[fieldname].style.paddingLeft = "5px";
    crmForm.all[fieldname].style.fontSize = "11px";
    crmForm.all[fieldname].style.backgroundImage = "url(/_imgs/btn_rest.gif)";
    crmForm.all[fieldname].style.borderLeft = "#3366cc 1px solid";
    crmForm.all[fieldname].style.width = buttonwidth;
    crmForm.all[fieldname].style.cursor = "hand";
    crmForm.all[fieldname].style.lineHeight = "18px";
    crmForm.all[fieldname].style.borderBottom = "#3366cc 1px solid";
    crmForm.all[fieldname].style.backgroundRepeat = "repeat-x";
    crmForm.all[fieldname].style.fontFamily = "Tahoma";
    crmForm.all[fieldname].style.height = "20px";
    crmForm.all[fieldname].style.backgroundColor = "#cee7ff";
    crmForm.all[fieldname].style.textAlign = "center";
    crmForm.all[fieldname].style.overflow = "hidden";
    crmForm.all[fieldname].attachEvent("onmousedown", push_button);
    crmForm.all[fieldname].attachEvent("onmouseup", release_button);
    crmForm.all[fieldname].attachEvent("onclick", functiontocall);
    crmForm.all[fieldname].style.lineHeight = "14px";
    crmForm.all[fieldname + '_c'].style.visibility = 'hidden';
    crmForm.all[fieldname].title = title;
    window.focus();
}
function push_button() {
    window.event.srcElement.style.borderWidth = "2px";
    window.event.srcElement.style.borderStyle = "groove ridge ridge groove";
    window.event.srcElement.style.borderColor = "#3366cc #4080f0 #4080f0 #3366cc";
}
function release_button() {
    window.event.srcElement.style.border = "1px solid #3366cc";
}


CRM 2011-OPPORTUNITY WIN OLDUGUNDA PLUGIN YAZIMI



CRM 2011 - ASSOCIATE and DISASSOCIATE KULLANIMI


KULLANICI TAKIMLARIYLA ILGILI ÖRNEK JAVASCRİPT KOD


Asagıdakı kodda oData kullanılarak,kullanıcının takımları alınır ve ACCOUNTS isimli takım, kullanıcının takımları içerisindeyse işlem yaptırır.
Asagıdakı kodu cogunlukla butonları bellı takımlara sahıp kısılerın gormesı durumunda kullanırız.


var result;
function TakimlariGetirGokhan() {
    var formType = Xrm.Page.ui.getFormType();
    var userid = Xrm.Page.context.getUserId();
    result = false;
    if (formType == 1) {
        var url = Xrm.Page.context.prependOrgName("/xrmservices/2011/OrganizationData.svc/");
        var entity = "TeamMembershipSet";
        var oDataSelect;

        jQuery.support.cors = true;

        oDataSelect = url + entity + "?$filter=SystemUserId eq guid'" + userid + "'";
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: oDataSelect,
            async: false,
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                var teamMemberShipEntity = data.d;
                if (teamMemberShipEntity.results.length != 0) {
                    for (var i = 0; i < teamMemberShipEntity.results.length; i++) {
                        if (teamMemberShipEntity.results[i] != null) {
                            var _teamid = teamMemberShipEntity.results[i].TeamId;

                            entity = "TeamSet";
                            oDataSelect = url + entity + "?$filter=TeamId eq guid'" + _teamid + "'";
                            jQuery.support.cors = true;

                            $.ajax({
                                type: "GET",
                                contentType: "application/json; charset=utf-8",
                                datatype: "json",
                                url: oDataSelect,
                                async: false,
                                beforeSend: function (XMLHttpRequest) {
                                    //Specifying this header ensures that the results will be returned as JSON.
                                    XMLHttpRequest.setRequestHeader("Accept", "application/json");
                                },
                                success: function (data, textStatus, XmlHttpRequest) {
                                    var teamEntity = data.d;
                                    if (teamEntity.results != null && teamEntity.results.length == 1) {
                                        if ((teamEntity.results[0].Name.toUpperCase() == "ACCOUNTS")) {
                                            result =true;
                                        }
                                    }
                                },
                                error: function (XMLHttpRequest, textStatus, errorThrown) {
                                    alert("Status: " + textStatus + "; ErrorThrown: " + errorThrown);
                                }
                            });
                        }
                    }
                }
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                alert("Status: " + textStatus + "; ErrorThrown: " + errorThrown);
            }
        });
    }
    return result;
} // JScript source code

CRM 2011-KULLANIŞLI SCRİPTLER



Bir alanının değerini  alma
var value = Xrm.Page.getAttribute(“CRMFieldSchemaName”).getValue();

Bir alana değer verme
Xrm.Page.getAttribute(“CRMFieldSchemaName “).setValue(“New Value”);

OptionSet alanın değerini alma
var value = Xrm.Page.getAttribute(“CRMOptionSetSchemaName”).getValue();

OptionSet alanın Text ini Alma
var text = Xrm.Page.getAttribute(“CRMOptionSetSchemaName”).getText();

OptionSet alana değer atama
Xrm.Page.getAttribute(“CRMOptionSetSchemaName”).setValue(“1¨); // OptionSet Value

OptionSet alanın seçili değerininin textini alma
Xrm.Page.getAttribute(“CRMOptionSetSchemaName”).getSelectedOption().text;

OptionSet alanın seçili değerininin value sunu alma
Xrm.Page.getAttribute(“CRMOptionSetSchemaName”).getSelectedOption().value;

Lookup alanın id sini ve text ini alma
var lookupObject = Xrm.Page.getAttribute(“CRMLookupSchemaName”).getValue();
lookupObject[0].name; // lookup ın texti
lookupObject[0].id; // lookup ın guid id si

Lookup alana deger verme
var lookupData = new Array();
var lookupItem = new Object();
lookupItem.id = “4A2A54CB-349C-E111-8D26-1CC1DEE8DA78¨; // kayıdın guid id si
lookupItem.name = “New Contact”; // Kayıdın adı
lookupItem.entityType = “EntitySchemaName”;
lookupData[0] = lookupItem;
Xrm.Page.getAttribute(“CRMLookupSchemaName”).setValue(lookupData);

Alanı Disable Etme
Xrm.Page.ui.controls.get(“CRMFieldSchemaName”).setDisabled(true);

Alanı Gizleme
Xrm.Page.ui.controls.get(“CRMFieldSchemaName”).setVisible(false);

Tab Gizleme
Xrm.Page.ui.tabs.get(“tabName”).setVisible(false);

Section Gizleme
var tab = Xrm.Page.ui.tabs.get(“tabName”);
tab.sections.get(“sectionName”).setVisible(false);

Alanın Requirement  seviyesini belirleme
Xrm.Page.getAttribute(“CRMFieldSchemaName”).setRequiredLevel(“required”);
Xrm.Page.getAttribute(“CRMFieldSchemaName”).setRequiredLevel(“none”);
Xrm.Page.getAttribute(“CRMFieldSchemaName”).setRequiredLevel(“recommended”);

Alana focus olma
Xrm.Page.ui.controls.get(“CRMFieldSchemaName”).setFocus(true);

Kaydetmeyi engelleme
event.returnValue = false;
return false;

Alanın Değiştirilip Değiştirilmediğini Kontrol Etme
var isDirty = Xrm.Page.getAttribute(“CRMFieldSchemaName”).getIsDirty();
alert(isDirty); // returns true if the field is dirty

Entity deki alanların Değiştirilip Değiştirilmediğini Kontrol Etme
var isDirty = Xrm.Page.data.entity.getIsDirty();
alert(isDirty); //

Read only bir alanın okunması
Xrm.Page.getAttribute(“CRMFieldSchemaName”).setSubmitMode(“always”);

Preventing an attribute to be saved in CRM form
Xrm.Page.getAttribute(“CRMFieldSchemaName”).setSubmitMode(“never”);

Organizasyonun adını alma
Xrm.Page.context.getOrgUniqueName();

Organization domanin adı + Organizasyon adı
Xrm.Page.context.getServerUrl();

Kayıtın Guid id sini almna
Xrm.Page.data.entity.getId();

Kullanıcının id sini alma
Xrm.Page.context.getUserId();

Entity nin adını alma
Xrm.Page.data.entity.getEntityName();

Kullanıcı rollerini alma(Burada deger size guid doner.)
var userRoles = Xrm.Page.context.getUserRoles();
for (var i = 0; i < userRoles.length; i++)
{
var userRole = userRoles[i]; // returns the Role Id
}

Form tipinin alınması
Xrm.Page.ui.getFormType();

Crm deki Form Tipleri

Kayıt Create için acılmıssa
Xrm.Page.ui.getFormType() == “1¨

Var olan bir kayıt update edılmek ıcın acıldıgında
Xrm.Page.ui.getFormType() == “2¨

Form disabled hali
Xrm.Page.ui.getFormType() == “3¨

Form de active hali
Xrm.Page.ui.getFormType() == “4¨

Is the user using the Quick Create form?
Xrm.Page.ui.getFormType() == “5¨

Is the user using the Bulk Edit form?
Xrm.Page.ui.getFormType() == “6¨

Kayıtı Kaydetme Javascript
Xrm.Page.data.entity.save(); // kaydeder ve kayıtlı kaydı acar
Xrm.Page.data.entity.save(“saveandclose”); // kaydeder ve kapatır.
Xrm.Page.data.entity.save(“saveandnew”); // kaydeder ve yeni bir kayıt acar

Crm Formunu kapatma
Xrm.Page.ui.close();


Bir CRM Field 'ın onchange event ını çağırmak
Xrm.Page.getAttribute("new_CRMField").fireOnChange();


Formdaki tüm alanların disable edilmesi:

Formun onLoad() olayına aşağıdaki kodu yazarsanız bütün alanları disable ve ya readonly yapabilirsiniz.
for (var index in crmForm.all)
{
    var control = crmForm.all[index];  
if (control.req && (control.Disabled != null))
    {
        control.Disabled = true;  
    }
}


Formun Açılış Boyutunu Belirlemek:
Formun açılış  boyutunu belirlemek için aşağıdaki kodu formun onLoad() olayına yazarız.

window.moveTo(0,0);
window.resizeTo(screen.availWidth, screen.availHeight);
window.resizeTo(600, 400);

IFRAME de acılacak sayfayı verme
 Xrm.Page.getControl("IFRAME_projectproductpricelevel").setSrc(url);

IFRAME gizleme
  Xrm.Page.ui.tabs.get("IFRAMENAME").setVisible(false);





JQUERY ile GRİDVİEWE VERİ YÜKLEME (BIND GRIDVIEW with JQUERY)


İlk olarak datatable ımızı olusturan sınıfın kodunu yazalım.
Yeni bir class acarak adını DataTableClass verelim.
Daha sonra static bir metod yazarak datatable ımızın verilerini girelim.Bu metod cagrıldıgında da geriye datatableımızı dondurelım.Ben burada elimde veri olmadıgı ıcın verileri kendım olusturuyorum siz bir sorgu sayesınde veritabanından da alabilirsiniz.
  • Static Metodun Kodları:
public static DataTable GetDataTable() {
           
            DataTable dt=new DataTable("Names");
            DataColumn dc1=new DataColumn("Name");
            DataColumn dc2=new DataColumn("Age");
            DataColumn dc3=new DataColumn("Index");
            dt.Columns.AddRange(new DataColumn[] { dc1,dc2,dc3 });
            DataRow dr1=dt.NewRow();
            dr1[0]="Ahmed";
            dr1[1]="27";
            dr1[2]="1";
            DataRow dr2=dt.NewRow();
            dr2[0]="Peter";
            dr2[1]="30";
            dr2[2]="2";
            DataRow dr3=dt.NewRow();
            dr3[0]="John";
            dr3[1]="20";
            dr3[2]="3";
            DataRow dr4=dt.NewRow();
            dr4[0]="Ali";
            dr4[1]="30";
            dr4[2]="4";
            dt.Rows.Add(dr1);
            dt.Rows.Add(dr2);
            dt.Rows.Add(dr3);
            dt.Rows.Add(dr4);

            return dt;
        }
  • Kullanacagımız List için bir sınıf tanımlayalım ve parametrelerimizi belirleyelim.

  DataTableSatirlar.cs
public DataTableSatirlar() {
            //
            // TODO: Add constructor logic here
            //
        }
        private string _firstName;
        private string _age;
        private string index;

        public string Index {
            get {
                return index;
            }
            set {
                index=value;
            }
        }
        public string FirstName {
            set {
                _firstName=value;
            }
            get {
                return _firstName;
            }
        }
        public string Age {
            set {
                _age=value;
            }
            get {
                return _age;
            }
        }
  • Simdi de sayfamızın code behind ında  bir web metod tanımlayalım.Bu web metod da bize datatble dakı verileri kendı olusturdugumuz bir liste atasın.

Web metod olusturmamızın nedeni ajax ile bu metodu kullanabılmemızdır.
 public static DataTableSatirlar[] GetNames() {
List<DataTableSatirlar> list=new List<DataTableSatirlar>();// Kendi list dizimizi olusturduk.
            DataTable dt=DataTableClass.GetDataTable();// Verilerimzi cekiyoruz.
            foreach(DataRow row in dt.Rows) {
                DataTableSatirlar _names=new DataTableSatirlar();
                _names.FirstName=row["Name"].ToString();
                _names.Age=row["Age"].ToString();
                _names.Index=row["Index"].ToString();
                list.Add(_names);
            }
            return list.ToArray();
}
  • Sayfamızın Page_Load kısmında da verilerimizi gride yukleyen kodumuzu yazalım.
DataTable dt=new DataTable();
            dt.Columns.AddRange(new DataColumn[] { new DataColumn("Name"),new DataColumn("Age"),new DataColumn("Index") });
            NamesGridView.DataSource=dt;
            NamesGridView.DataBind();

  • Şimdi sıra geldi client tarafta verilerimzi gride yuklemeye.Buradaki javascriptimizn kodlarını asagıda veriyorum.


Sayfamızın head tagları arasına asagıdaki kodu ekleyelim.

<script type="text/javascript">
    function BindGridView() {
        $.ajax({
            type: "POST",
            url: "Default.aspx/GetNames",
            data: "{}",
            contentType: "application/json",
            dataType: "json",
            success: function (data) {
                for (var i = 0; i < data.d.length; i++) {
                    $("#GridViewAdi").append("<tr>"+
                                               "<td>" + data.d[i].FirstName +
                                               "</td><td>" + data.d[i].Age +
                                               "</td><td>"+ data.d[i].Index +"</td></tr>");
                }
            }
        })
    }
</script>
  • Jquery kodlarının calısması için sayfamıza su kutuphaneyı ekleyelım.
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
</script>
  • Bu javascripti tetikledıgımız yer body onload fonksiyonudur.

<body onload="BindGridView();">

Proje Kodları:

Default.aspx
Default.aspx.cs
DataTableSatirlar.cs
DataTableClass.cs








YENİ ARAMA MOTORU YANDEX E SİTENİZİ KAYDEDİN


Gün ve gün büyüyen yandex e sitenizi daha kayıt ettirmediyseniz işte size kayıt linki.

http://webmaster.yandex.com.tr/addurl.xml

Sitenizin URL sini girdikten sonra güvenlik doğrulamayı da girdikten sonra ekle butonuna tıklamanız yeterlidir.


CRM 2011 - Windows Service Kullanılarak Mail Atma ve Windows Service Deployment

WINDOWS SERVICE SETUP PROJECT

İlk olarak visual studio 2010 programımızda yeni bir proje acalım.

Gelen ekrandan .Net Framework 4 secerek Window sekmesi altındaki Windows Service i secelım.Name , Location ve Solution bilgileriini doldurduktan sonra OK diyerek proje dosyamızı acalım.
NOT : .Net FrameWork 4 u secmemızın nedeni Crm 2011 de  kod yazmamızdır.

İlk olarak hem windows service için hem de crm 2011 için gerekli olan kutuphaneleri projemıze referans edelim.
Windows Service için gerekli dll ler:
.Net sekmesi altında System.Configuration.Install ve System.ServiceProcess

CRM 2011 için gerekli dll ler:
.Net sekemsi altında System.Runtime.Serilization ,System.ServiceModel
Browse altından sdk nın içerisindeki microsoft.crm.sdk.proxy , microsoft.xrm.sdk

Daha sonra Solution Explorer dan Service1.cs dosyamızı acalım.Karsımıza Service1.cs[Design] ekranı gelecektir. 
Bu ekrandan to code wiew tıklanarak service.cs (kod sayfası) ye geçilmiş olunur.

Bu class dosyası yukarıda da goruldugu gibi ServiceBase sınıfından kalıtım almıstır.
OnStart ve OnStop olmak uzere 2 metodu vardır.
OnStart servis calısmaya basladıgında calısır.
OnStop işlem bittiğinde calısır.
Şimdi biz 1 saate bir email atacak programımızı yazmaya baslayalım.Bunun için kodumuzu biraz degiştirecegiz.

Projemıze timer ekleyerek işlemimizin 1 saate bir calısmasına ızın verecegız.Goruldugu gıbı OnStart metodunda timer enable ediliyor ve OnStop da disable ediliyor.Şimdi kodlarımızın calısacagı worker adında bir class acarak burada email atan metodumuzu yazalım.


Worker classımızın kurucusunda crm e baglanalım.Ama oncelıkle crm 2011 e baglanmak içinde bir class acalım ve crm e baglanmak için gerekli verileri girelim.


Daha sonra bir metot yazarak bu metot cagrılınca mail atılsın.
Buradakı mail atma crm üzerinden atılacaktır.


Metodumuzun içerisindeki kodlar:

Şimdi de service1.cs  sınıfını acarak yazdıgımız metodu calıstıralım.

Kod yazma işlemimiz bitti.Sıra geldi windows service için gerekli işlemleri yapmaya.
Service1.cs[Design] ekranını acalım.Sayfada herhangi bir yere  sag tıklanarak Add Installer secenegini secelım.

Daha sonra karsımıza cıkan ekrandan serviceInstaller1 secılerek properties tool unu acalım.(Properties tool u kapalıysa wiev altından secebilrsiniz.)

Yukarıda goruldugu gıbı ServiceName alanına servisimizin adını girelim ve Startype secenegınıde Automatic yapalım.
Daha sonra projemızın ozellıklerınden Application sekmesinden  Startup Object kısmında programızı secelım.

Projenın ozellıklerıne proje sag tıklanarak Properties secenegınden ulasılabilir.

İşlemlerimiz bittikten sonra projemizi Build edelim.(Ctrl + Shift + B)

Windows service imizi olusturduk.Sıra geldi windows a deploy etmeye.
Windows a ,Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe dosyasını calsıtırarak projemızın exe sının yolunu vererek deploy etmıs olacagız.
Bu işlemi yapmak için komut penceresını Yönetici (Run as Administor)olarak calıstıralım.

Komut penceresinde 2 kere cd.. diyerek C:\ dizinine gelelim.
Komut satırını calıstırdıgımızda kullanıcı bilgileri isteyen ekran cıkar.


Kullanıcı bilgilerini girdikten sonra OK ye tıklayalım.Asagıdakı ekran goruntusunde son satırlara dıkkat edersenız basarıyla install olundugunu yazmaktadır.

Artık servisimizi deploy ettik.Şimdi olusup olusmadıgını bakmak için Hizmetler i acalım ve servisimizi start edelim.

NOTLAR

Install Komutu

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\installutil.exe  Users\gokhanm\Downloads\WindowsServiceMailAtmaSolution\WindowsServiceMailAtma\bin\Debug\WindowsServiceMailAtma.exe

UnInstall Komutu

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\installutil.exe  /u Users\gokhanm\Downloads\WindowsServiceMailAtmaSolution\WindowsServiceMailAtma\bin\Debug\WindowsServiceMailAtma.exe

NOT:Uninstall ederken /u yu yazmayı unutmayın.
Mavi ile işaretlenmis kısım projemızın exe sinin bulundugu dizini gosterir.Sizin yapacagınız satırlardakı mavi ile işaretlenmıs kısıma kendi exe nizin yolunu vermektir.
Not:Programımızda birsey degıstırmek ıstıyorsak ılk bas uninstall edelım.İlgili kod degısıklıgını yaptıktan sonra ReBuild edelim.Daha sonra tekrardan install edelim.
NOT: Web Servisi deploy etmek için gerekli kullanıcı izinlerinizin olması gerekmektedir.Yoksa hata verecektir.
NOT: Hata almadan yukledıgınız windows servise Hizmetler (Services) altından ulasabılırsınız.
NOT:Hizmetlere komut penceresinden services.msc satırını calıstırarak ulasabilirsiniz.
Hizmetler altından servisimizi restart etmeyi unutmayalım.
Daha fazla bilgi için http://www.codeproject.com/Articles/3990/Simple-Windows-Service-Sample adresini ziyaret edebilirsiniz.