Crm 2011-ProductPriceLevel (Fiyat Listesi Kalemi) Bulma


Fiyatlistesi id ve ürün id ye göre fiyatlistesi kalemi bulma


Metot geriye productpricelevel döndürür.
public static ProductPriceLevel FindProductPriceLevel(Guid pricelevelid, Guid productId, IOrganizationService ser)
        {
            try
            {
                QueryExpression sorgu = new QueryExpression()
                {
                    EntityName = "productpricelevel",
                    ColumnSet = new ColumnSet() { AllColumns = true },
                };

                FilterExpression anaFilter = new FilterExpression(LogicalOperator.And);

                ConditionExpression sart1 = new ConditionExpression("pricelevelid", ConditionOperator.Equal, pricelevelid);
                ConditionExpression sart2 = new ConditionExpression("productid", ConditionOperator.Equal, productId);

                anaFilter.AddCondition(sart1);
                anaFilter.AddCondition(sart2);

                sorgu.Criteria.AddFilter(anaFilter);

                EntityCollection ec = null;

                ec = ser.RetrieveMultiple(sorgu);

                if (ec != null)
                {
                    if (ec.Entities.Count == 1)
                    {
                        return (ProductPriceLevel)ec.Entities[0];
                    }
                    else
                    {
                        return new ProductPriceLevel();
                       /*Eger fiyat listesinde ilgili üründen bir tane varsa geriye döndürür.Ürün yoksa ve birden fazlaysa geriye bos productpricelevel döndürür.*/
                    }
                }
                else
                {
                    return new ProductPriceLevel();
                }
            }

            catch (Exception)
            {
                return new ProductPriceLevel();
            }
        }
Sorularınızı gkhnmnts@gmail adresine atabilirsiniz.

Crm de Guid Bir Değere Göre Entity nin Bulunması


Aşagıdaki metoda veriyi çekeceğimiz entity nın adını,hangi field a göre sorgunun cekilecegi ve neye göre çekilecegi degerleriyle birlikte IOrganization nesnesini göndererek verimizi cekebiliriz.

public class Metotlar{
   public static Entity GetLookUp(string entityname, Guid id, string conditionField, IOrganizationService service)
        {
            try
            {
                QueryExpression sorgu = new QueryExpression()
                {
                    EntityName = entityname,
                    ColumnSet = new ColumnSet() { AllColumns = true },/*Tum kolonlar cekilir.*/
                };

                FilterExpression anaFilter = new FilterExpression(LogicalOperator.And);

                ConditionExpression sart1 = new ConditionExpression(conditionField, ConditionOperator.Equal, id);
                anaFilter.AddCondition(sart1);

                sorgu.Criteria.AddFilter(anaFilter);

                EntityCollection ec = null;

                ec = service.RetrieveMultiple(sorgu);

                if (ec != null)
                {
                    if (ec.Entities.Count > 0)
                    {
                        return ec.Entities[0];
                    }
                    else
                    {
                        return new Entity();
                    }
                }
                else
                {
                    return new Entity();
                }
            }

            catch (Exception)
            {
                return new Entity();
            }
        }
}
Örnek:
IOrganizationService crmService=DynamicCrmBaglanma.GetCrmService();
/*Crm e baglanılır.DynamicCrmBaglanma classı blog da bulunmaktadır.*/
if(crmService !=null){
Guid _productId=guid.NewGuid();
/*Ben yeni bir guid deger olusturarak parametre olarak gönderdim.*/
Entity product=Metotlar.GetLookUp(Product.EntityLogicalName,_productId,"productid",crmService);
if(product !=null && product.Id !=Guid.Empty){
Product urun=(Product)product;/*Entity Product a cast edildi.*/
}
}

GridView de Bir Sutundaki Veriye Göre Satırı Disable Etme


Aşağıdaki metota gridview imizi gondererek satırımızı disable edebiliriz. 
public void GridViewRowDisabled(GridView gridView)
        {
            try
            {
                if (gridView != null && gridView.Rows.Count != 0)
                {//GridView de deger varmı kontrol ediliyor.
                    for (int i = 0; i < gridView.Rows.Count; i++)
                    {//GridView satır satır dolasılarak veriye gore disable ediliyor.
                        HiddenField hidden_ProductType = gridView.Rows[i].FindControl("hidden_ProductType") as HiddenField;
//GridView satırında ekranda görülmeyen ama arka tarafta saklanan deger okunuyor.
                        if (hidden_ProductType.Value.ToUpper().Trim() == "SPACE")
                        {//Okunan deger harfleri upper yapılarak SPACE mi kontrol ediliyor.Burada 
                            gridView.Rows[i].Enabled = false;
/*ProductType=SPACE se o satır disable edildi.*/
                        }
                    }
                }
            }
            catch (Exception )
            {
                throw;
            }
        }
Anektot:
HiddenField
HiddenField lar ekranda görülmezler.Sayfa üzerinde veri saklamada kullanılabilir.Value özelliginde veri saklanabilir.
ToUpper().Trim()
string bir deger hem büyük harfli haline donusur ve daha sonra başında ve sonundaki bosluk karakterleri atılır.String eşlemede kullanılması yararlıdır.

CRM 2011 - INVOICE CANCELED


Şimdi sizlere formun ribbonundan bir butona tıklanarak invoice un nasıl canceled edilecegini anlatacağım.
İlk olarak formun ribbonuna bir buton ekleyelim ve javascript yazarak bu butona tıklanınca bir aspx sayfasına yönlendirilmesini sağlayalım.(ribbona buton ekleme ve bunun calıstırılacagı javascript dosyasının nasıl verildiğini bir başka yazımda anlatmıştım. )

namespace TestCRM.InvoiceInterface
{
    public partial class InvoiceCanceled : System.Web.UI.Page
    {
        IOrganizationService crmService;
//İlk olarak bir web sayfasından aspx sayfasına veri göndermeyi ve veri alıs verişini saglamak için Render metodunu kullandık.Gonderdıgımız veriyi queryString ile okuyoruz.
Verinin javascriptle nasıl yollandıgı sayfanın en alt kısmında bulabilirsiniz.
        protected override void Render(HtmlTextWriter writer)
        {
            Response.Clear();
            Response.ContentType = "text/xml";
            string entityID = Request.QueryString["entityid"];
            Session["entityid"] = entityID;// entity id yi postback olsa da kullanabiliyoruz.Sayfa kapanana kadar session da saklayıp ,istediğimiz zaman kullanabiliriz.
            if (!string.IsNullOrEmpty(entityID))
            {
                CanceledInvoice();
            }
            else
            {
                Response.Redirect("../ErrorPage.aspx");
//entity id javascript ile gönderilemezse hata sayfasına yonlendırıyoruz.
            }
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
            }
        }
        private void CanceledInvoice()
        {
            string invoiceId = (string)Session["entityid"];
            Guid _invoiceId = Guid.Empty;

            if (!string.IsNullOrEmpty(invoiceId))
                _invoiceId = Guid.Parse(invoiceId);
            if (_invoiceId != Guid.Empty)
            {
//Crm e baglanıyoruz.
                crmService = DynamicCrmConnection.GetCrmService();
                if (crmService != null)
                {
                    Invoice invoice = (Invoice)crmService.Retrieve("invoice", invoice.Id, new ColumnSet() { AllColumns=true});
                    if (invoice != null && invoice.Id != Guid.Empty)
                    {
                        if (invoice.StateCode ==InvoiceState.Active)
                        {//invoice active se cancel edilebilir.
                            try
                            {
//SetStateRequest ile invoice un id si ve logical name ini vererek cancel edebiliyoruz.
//Statecode=3 invoice formunun canceled oldugunu gosterir.
//Status  =100003 de canceled formunun bir durumudur.
                                SetStateRequest setStateRequest = new SetStateRequest()
                                {
                                    EntityMoniker = new EntityReference
                                    {
                                        Id = invoice.Id,
                                        LogicalName = "invoice"
                                    },
                                    State = new OptionSetValue(3),// inactive
                                    Status = new OptionSetValue(100003)// qualified
                                };
                                crmService.Execute(setStateRequest); 
                            }
                            catch (Exception)
                            {
//Hata alınmazsa invoice canceled olmus demektir.  
                            }
                        }
                    }
                }
            }
        }
    }
}

Javascript

function CanceledInvoice() {

    var entityid = Xrm.Page.data.entity.getId();
/*invoice  formunun id si alınır ve XML.Dom kullanılarak aspx sayfasına veri gönderilir ve geriye veri okunur.*/
    var xmldoc_sendApp = new ActiveXObject("Microsoft.XMLDOM");
    xmldoc_sendApp.async = false;
    xmldoc_sendApp.load("http://denemehost:8989/InvoiceInterface/InvoiceCanceled.aspx?entityid=" + entityid);
/*yukarıdakı url sayfanızı host ettiğiniz sayfanın adresidir.Ben IIS teki yolunu verdim.8989 ise sayfanın bulundugu hostdakı port numarasıdır.*/
    var logMessage = xmldoc_sendApp.selectSingleNode("logmessage");
/*logmessage tagları arasında geriye veri gönderilir.*/
    if (logMessage != null) {
        if (logMessage.text != "") {
            alert(logMessage.text);
            window.location.reload();//Sayfa refresh olur.
        }
    }
}
Sorularınızı gkhnmnts@gmail adresine atabilirsiniz.

C# String Methodları – II (Replace, SubString, ToCharArray, Trim)



String method ları bizim sıkça kullanacağımız ve ihtiyaç duyacağımız methodlardır. Hepimizin şimdiye kadar aşağıdaki durumlar ile ya karşılaştık ya da karşılaşacağız;

String içerisindeki bir string i değiştirme,
String içerisinde belli bir yerden, belli bir sayı kadar karakter alma,
Bir string i karakterlerine ayırma,
String in başlangıcındaki ve/veya bitimindeki boşlukları silme,
Bu ve benzeri işlemleri yapmak için bu yazımda anlatacağım String Methodlarını kullanacağız. Bu yazımda anlatacağım Methodlar; Replace, SubString, ToCharArray, Trim

Replace
Kullanımı bazen oldukça işine yarabilir. String içerisinde bir string i başka bir string ile değiştirebilirsiniz veya string içerisinde karakteri(char) başka bir karakter ile değiştirebilirsiniz. İlk önce değiştireceğimiz stringi veya char ı daha sonrada değişlik için kullanacağımız stringi veya char ı yazıyoruz.

kelime = "Buradaki tüm a harfleri büyük";
MessageBox.Show(kelime.Replace('a', 'A')); // tek tırnak ile tanımladık, yani char türünde, çıktı olarak "BurAdAki tüm A hArflari büyük"

kelime2 = "C# %100 nesneye yönelimli bir programlama dilidir. ";
MessageBox.Show(kelime2.Replace("neseneye yönelimli", "nesne tabanlı")); // ekran çıktısı:

SubString()
 String içerisinde belli bir karakterden sonraki bölümü seçmemiz yarar. 2 türlü kullanımı vardır;

1. Kullanım

string kelime = "Gökhan Menteşe"; //Burada "G" 0.karakterdir. Bunu unutmamak gerekiyor
MessageBox.Show(kelime.Substring(6,7)); //Ekran çıktısı olarak "Menteşe" ı verecektir. 6.karakterden başlayarak 7tane seçim yapar.Sunu da hatırlamakta fayda var.Bosluk ta bir karakterdir.

2.Kullanım
string kelime = "Gökhan Menteşe";
MessageBox.Show(kelime.Substring(6)); //Ekran çıktısı olarak "Menteşe" yi verecektir. 6.karakterden başlayarak son karaktere kadar seçim yapar

ToCharArray()

String içeriğini karaktere ayırır. 2 türlü kullanımı vardır;

1.Kullanım

char[] karakterler = kelime.ToCharArray(); // Anahtar bölüm işte burası, burada karakterler adında char türünde bir dizi oluşturuluyor ve içerisine atılıyor. Yani aşağıdaki foreach yerine karakterler[sayi] diyerek ulaşabilirsiniz.
foreach (char karakter in karakterler) // Foreach bu tarz işlemler için tam anlamıyla biçilmiş kaftandır. Örnekte iyi olacağını düşünüyorum
{
listBox1.Items.Add(karakter); // Bu bölümde bulunan karakterleri listbox1 a sırayla ekliyor. Yani ekran çıktısı olarak sırasıyla alt alta;G,Ö,K,H,A,N, ,M,E,N,T,E,Ş,E dir. Boşluklarında dahil olduğunu unutmayalım. Burada bir if kontrolü ile boşlukları eklemeyebiliriz.
}

2.Kullanım

char[] karakterler = kelime.ToCharArray(3,5); //SubStringteki mantık ile çalışır yani 3.index numarasından başlar ve daha sonraki 5 karakteri alır.

Trim()

Özellikle web uygulamalarında çok yaygın şekilde kullanılan bir uygulamadır trim. Bir string in başlangcındaki ve bitişindeki boşlukları temizler ve bize sadece yazılan içeriği yani anlamlı bölümü verir. TrimEnd ve TrimStart gibi methodlardan mevcuttur. Bunları burada anlatmayacağım. Uygulamalar yaptığımda eğer gerekirse kullanırım ve bunları paylaşırım.

Kullanım

string kelime = "     Gökhan Menteşe       ";
MessageBox.Show(kelime.Trim()); //Ekran çıktısı olarak "Gökhan Menteşe" yi verecektir. Kenardaki boşluları almayacaktır. Bu örneği iyi anlamak için önce boşluklu halinin Length ile uzunluğunu alıp daha sonra bu işlem sonucunda aldığınızda aradaki farkı göreceksiniz.

Trim, TrimEnd, TrimStart : Parametre olarak verilen bir karakteri değişkenin başından ve sonundan kaldırır.Herhangi bir karakter belirtilmediği zaman boşlukları kaldırır.

Kullanım Şekli : st1.Trim(“?”) st1.TrimStart(“?”) Başından Kaldırır. st1.TrimEnd(“?”) Sonundan Kaldırır.

class Program

{ // Daha fazla bilgi için : www.gorselprogramlama.com

static void Main(string[] args)

{
string str1, str2;

Console.Write("1. stringi giriniz = ");

str1 = Console.ReadLine();

Console.Write("2. stringi giriniz = ");

str2 = Console.ReadLine(); //

if (string.Compare(str1, str2) == 0) Console.Write("Stringler aynı");

else Console.Write("Stringler farklı");

Console.ReadKey();
}

}
 örnekte ikinci kelimeden sonra bir kaç defa boşluk tuşuna bastım.Ve farklı dedi.Bunu engellemek için Trim özelliğini kullanabiliriz.

Örnek: Trim ekleyerek yapalım. 

class Program
{
static void Main(string[] args)

{
string str1, str2;
Console.Write("1. stringi giriniz = ");
str1 = Console.ReadLine();

Console.Write("2. stringi giriniz = ");
str2 = Console.ReadLine();

if (string.Compare(str1.Trim(), str2.Trim()) == 0)
       Console.Write("Stringler aynı");
else
      Console.Write("Stringler farklı");

Console.ReadKey();
}
}
ikinci kelimeden sonra bir kaç defa boşluk tuşuna bastım.Trim ile bu boşluklar alındığı için kelimeler aynı dedi.

CRM 2011 ile Email Atma


Bir önceki yazımda template kullanarak email atmayı görmüstük.Bu yazım da da template kullanmadan basit mail atmayı anlatacagım.
Not:Bir önceki yazımda bu classın nasıl kullanılacagı bulunmaktadır.

public static Boolean EmailAt(IOrganizationService service,Guid fromUserId,Guid toContactId)
        {
            try
            {
                Boolean atildiMi = false;
                // Create the 'From:' activity party for the email
                ActivityParty fromParty = new ActivityParty
                {
                    PartyId = new EntityReference(SystemUser.EntityLogicalName, fromUserId)
                };

                // Create the 'To:' activity party for the email
                ActivityParty toParty = new ActivityParty
                {
                    PartyId = new EntityReference(Contact.EntityLogicalName, toContactId)
                };
                //"Created activity parties."

                // Create an e-mail message.
                Email email = new Email
                {
                    To = new ActivityParty[] { toParty },
                    From = new ActivityParty[] { fromParty },
                    Subject = "Quote Ready",
                    Description = "SDK Sample for SendEmail Message.",
                    DirectionCode = true
                };
                Guid _emailId = service.Create(email);

                // Use the SendEmail message to send an e-mail message.
                SendEmailRequest sendEmailreq = new SendEmailRequest
                {
                    EmailId = _emailId,
                    TrackingToken = "",
                    IssueSend = true
                };

                //"Sent the e-mail message." 
                SendEmailResponse sendEmailresp = (SendEmailResponse)service.Execute(sendEmailreq);
                atildiMi = sendEmailresp !=null ? true :false;

                return atildiMi;
            }
            catch (Exception)
            {
                return false;
            }
        }

Template Kullanarak Crm 2011 ile Email Yollama


İlk önce mail atan classı paylasacagım sızlerle.Daha sonra da bu classın nasıl kullanıldıgını anlatacagım.

EmailAt Classı:
Mail atma işlemi basarılıysa geriye true,degil se false degeri dondurur.
namespace SendEmail
{
    public class EmailClass
    {
        public static Boolean EmailAt(IOrganizationService service,Guid fromUserId,Guid toContactId)
        {
            try
            {
                Boolean atildiMi = false;
                // Kimin email atılacagı tanımlanıyor.
                ActivityParty fromParty = new ActivityParty
                {
                    PartyId = new EntityReference(SystemUser.EntityLogicalName, fromUserId)
                };

                // Kime email atılacagı tanımlanıyor.
                ActivityParty toParty = new ActivityParty
                {
                    PartyId = new EntityReference(Contact.EntityLogicalName, toContactId)
                };

                // Gonderılecek  Email mesajını olusturalım
                Email email = new Email
                {
                    To = new ActivityParty[] { toParty },
                    From = new ActivityParty[] { fromParty },
                    Subject = "Quote Ready",
                    Description = "SDK Sample for SendEmail Message.",
                    DirectionCode = true
                };
                // Email mesajının sablonunu olusturalım.
                SendEmailFromTemplateRequest emailUsingTemplateReq = new SendEmailFromTemplateRequest
                {
                    Target = email,
                    //  Crm im hazır bir template ini kullanıyoruz.
                    TemplateId = new Guid("07B94C1D-C85F-492F-B120-F0A743C540E6"),

                    // Email dekı hitap içerigini tanımlıyoruz.
                    RegardingId = toContactId,
                    RegardingType = Contact.EntityLogicalName
                };
                SendEmailFromTemplateResponse emailUsingTemplateResp = (SendEmailFromTemplateResponse)service.Execute(emailUsingTemplateReq);

                //Template ile birlikte bir email id olusturup.Emaili yaratmıs oluyoruz.
                Guid _emailId = emailUsingTemplateResp.Id;

                atildiMi = !_emailId.Equals(Guid.Empty) ? true :false;
                //atildımı true ise :Basarılı bir sekılde email yollandı.

                return atildiMi;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }

Default.aspx :
Ben burada crm den javascript ile atılacak kişilerin id degerini QueryString ile aldım.Siz isterseniz direkt olarak id degerini verebilirsiniz.
namespace SendEmail
{
    public partial class Default : System.Web.UI.Page
    {
        IOrganizationService crmService;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Guid _firstApprovedId =!string.IsNullOrEmpty(Request.QueryString["firstApproved"] )? 
                                         Guid.Parse(Request.QueryString["firstApproved"]) :Guid.Empty;
                Guid _secondApprovedId =!string.IsNullOrEmpty(Request.QueryString["secondApproved"]) ? 
                                        Guid.Parse(Request.QueryString["secondApproved"]) : Guid.Empty;
                Guid _thirdApprovedId = !string.IsNullOrEmpty(Request.QueryString["thirdApproved"]) ? 
                                        Guid.Parse(Request.QueryString["thirdApproved"]) : Guid.Empty;

                EmailYolla(_firstApprovedId,_secondApprovedId,_thirdApprovedId);
            }
        }

        protected void EmailYolla(Guid firstApprovedId,Guid secondApprovedId,Guid thirdApprovedId)
        {
            crmService = DynamicCrmBaglanma.GetCrmService();
            Boolean onay1 = false;
            Boolean onay2 = false;
            Boolean onay3 = false;
            string DonusMesaji="";

            ColumnSet tumKolon = new ColumnSet() { AllColumns = true };

            WhoAmIRequest systemUserRequest = new WhoAmIRequest();
            WhoAmIResponse systemUserResponse = (WhoAmIResponse)crmService.Execute(systemUserRequest);
            Guid _userId = systemUserResponse.UserId;

            Contact firstApproved = (Contact)crmService.Retrieve("contact", firstApprovedId, tumKolon);
            Contact secondApproved = (Contact)crmService.Retrieve("contact", secondApprovedId, tumKolon);
            Contact thirdApproved = (Contact)crmService.Retrieve("contact", thirdApprovedId, tumKolon);

            if (firstApproved != null && firstApproved.Id != Guid.Empty && firstApproved.EMailAddress1 !=string.Empty)
                onay1 = EmailClass.EmailAt(crmService, _userId, firstApproved.Id);

            if (secondApproved != null && secondApproved.Id != Guid.Empty && secondApproved.EMailAddress1 != string.Empty)
                onay2 = EmailClass.EmailAt(crmService, _userId, secondApproved.Id);

            if (thirdApproved != null && thirdApproved.Id != Guid.Empty && thirdApproved.EMailAddress1 != string.Empty)
                onay3 = EmailClass.EmailAt(crmService, _userId, thirdApproved.Id);

            if (onay1 != true && onay2 !=true && onay3 != true)
            {
                DonusMesaji="Unsucceeded";
            }
            else
            {
                DonusMesaji = "Send Email.";
            }
        }
    }