Wyszukiwanie konta (account) z C# o danej nazwie, lub e-mailu

Posted by admin | ASP NET. C# | wtorek 8 grudzień 2009 21:06

Poniższy przykład możemy wykorzystać np. w nowo utorzonym entity, np. jakieś dane teleadresowe. Przygotowujemy oprócz poniższego kodu iframe w np. głownym widoku dla nowo utworzonego entity dwa pola tekstowe i przycisk pod który podpię ty jest poniższy kod. Pola tekstowe powinny sie nazywać: txtNazwa oraz txtEmail, oczywiście poniższy przykład możemy rozbudowywać.

W przykładzie tym wpisujemy w pole tekstowe txtNazwa, nazwę firmy którą chcemy sprawdzić czy istnieje, lub w pole tekstowe txtEmail, email firmy do której ewentualnie należy a chcemy sprawdzić czy już istnieje.

 

 protected void SzukajKonto_Click(object sender, EventArgs e)
 {
  CrmService service =GetCrmService(); //pobieramy service CRM
  RetrieveMultipleRequest mrequ = new RetrieveMultipleRequest();

  ColumnSet cols = new ColumnSet();
        account scc = new account();

  // Ustawiamy właściwości które kolumny nas interesują.
  cols.Attributes = new string[] { “accountid”, “name”, “address2_primarycontactname”,”address1_city”, “address1_line1″ };

  // Tworzymy ConditionExpression obiekt.
  ConditionExpression condition = new ConditionExpression();

  

if(!String.IsNullOrEmpty(txtNazwa.Text)) //sprawdzamy czy pole tekstowe txtNazwa nie jest puste
  {
   condition.AttributeName = “name”;
   condition.Operator = ConditionOperator.Like;
   condition.Values = new string[] { “%” + txtNazwa.Text + “%” };
  }

  if (!String.IsNullOrEmpty(txtEmail.Text)) //sprawdzamy czy pole tekstowe txtEmail nie jest puste

  {
   condition.AttributeName = “emailaddress1″;
   condition.Operator = ConditionOperator.Like;
   condition.Values = new string[] { “%” + txtEmail.Text + “%” };
  }

  // Tworzymy obiekt FilterExpression.
  FilterExpression filter = new FilterExpression();

  // Ustawiamy właściwości filtra.
  filter.FilterOperator = LogicalOperator.And;
  filter.Conditions = new ConditionExpression[] { condition };
  // Tworzymy obiekt QueryExpression.
  QueryExpression query = new QueryExpression();

  // Ustawiamy właściwości obiektu QueryExpression.
  query.EntityName = EntityName.account.ToString();
  query.ColumnSet = cols;
  query.Criteria = filter;

  mrequ.Query = query;

  // Wywołujemy zapytanie webservice (Execute).
  RetrieveMultipleResponse response = (RetrieveMultipleResponse)service.Execute(mrequ);
  
  string result = String.Empty;
  if (response.BusinessEntityCollection.BusinessEntities.Length > 0)
  {
   foreach(BusinessEntity be in response.BusinessEntityCollection.BusinessEntities)
   {
     account acc = be as account;
    result += acc.name + ” ” + acc.address2_primarycontactname + ” ” + acc.address1_city + ” ” + acc.address1_line1;
   }
   Response.Write(result);
  }
  else
  {
   Response.Write(”Nie istnieje konto o takich danych”);
  } 
 }

Szybkie kasowanie wszystkich kont i kontaktów za pomocą Bulk Delete

Posted by admin | ASP NET. C# | sobota 5 grudzień 2009 20:44

Czasami zachodzi potrzeba szybkiego usunięcia np. wszystkich kont i kontaktów z MS CRM 4.0, na przykład po testach, poniżej przykład realizujący to zadanie.

Całość jest wykonywana tylko raz, nie ma potrzeby aby program ten był uruchomiony, całością zajmuje się juz sam CRM.

 

       service = GetCrmService();  //pobieramy service
        QueryExpression accountsQuery = new QueryExpression();
        accountsQuery.EntityName = EntityName.account.ToString();
        accountsQuery.ColumnSet = new AllColumns();

        //Tworzymy wyrażenie pobierające wszystkie kontakty.
        QueryExpression contactsQuery = new QueryExpression();
        contactsQuery.EntityName = EntityName.contact.ToString();
        contactsQuery.ColumnSet = new AllColumns();

        // Tworzymy request.
        BulkDeleteRequest request = new BulkDeleteRequest();
        request.JobName = “Usuwanie kont i kontaktów - to będzie widoczne w zadaniach cyklicznych w CRMIE”;
        request.QuerySet = new QueryBase[] { accountsQuery , contactsQuery };
        request.SendEmailNotification = false;
        request.ToRecipients = new Guid[0];
        request.CCRecipients = new Guid[0];
        request.RecurrencePattern = string.Empty;
        request.StartDateTime = new CrmDateTime();
        request.StartDateTime.Value = DateTime.Now.ToString();

        //Wywołujemy request, reszta dzieje się już bez naszego udziału.
        BulkDeleteResponse response = (BulkDeleteResponse)service.Execute(request);
        Guid jobId = response.JobId;

Pobranie widoków z entity zdefiniowanych przez użytkownika

Posted by admin | ASP NET. C# | piątek 6 listopad 2009 15:47

Dzisiaj pokażę przykład jak w prosty sposób wyciągnąć z poziomu C# widoki użytkownika dla danego entity i dodać do rozwijanej listy a później można to w różnoraki sposób wykorzystać, W tym przypadku jest do dla account (UserViewCollection(1) kod obiektu dla ccount to 1) dla innych entity:


Account 1
Activity 134
AppointmentActivity  142
EmailActivity  138
FaxActivity  136
LetterActivity  141
PhoneCallActivity  137
TaskActivity  134
ActivityParty 135 
Annotation 5
BusinessUnit 10
Competitor 123 
Contact 2
CustomerAddress 1071
Discount 1013
DiscountType 1080
Incident 112
Invoice 1090
InvoiceDetail 1091
Lead 4
Opportunity 3
OpportunityProduct 1083
Organization 1019
PriceLevel 1022
Product 1024
ProductPriceLevel 1026
Quote 1084
QuoteDetail 1085
SalesOrder 1088
SalesOrderDetail 1089
Subject 129
SystemUser 8
Territory 2013
UoM 1055
UoMSchedule 1056

Poniżej kod wykonujący tę operację:
BusinessEntityCollection UserViewCol = UserViewCollection(1);
            foreach (BusinessEntity s in UserViewCol.BusinessEntities)
            {
                userquery query = (userquery)s;
                DropDownList1.Items.Add(query.name); 
            }

public static BusinessEntityCollection UserViewCollection(int objectTypeCode)
    {
        CrmService service = CreateService();
        QueryExpression userQuery = new QueryExpression();
        userQuery.EntityName = EntityName.userquery.ToString();
        ColumnSet userQueryCols = new ColumnSet();
        userQueryCols.AddColumns(new string[] { “name”, “userqueryid”, “fetchxml”, “layoutxml” });
        userQuery.ColumnSet = userQueryCols;
        ConditionExpression userQueryCondition = new ConditionExpression();
        userQueryCondition.AttributeName = “returnedtypecode”;
        userQueryCondition.Operator = ConditionOperator.Equal;
        userQueryCondition.Values = new Object[] { objectTypeCode };
        ConditionExpression userQueryCondition1 = new ConditionExpression();
        userQueryCondition1.AttributeName = “querytype”;
        userQueryCondition1.Operator = ConditionOperator.Equal;
        userQueryCondition1.Values = new object[] { 0 };
        ConditionExpression userQueryCondition2 = new ConditionExpression();
        userQueryCondition2.AttributeName = “fetchxml”;
        userQueryCondition2.Operator = ConditionOperator.NotNull;
        FilterExpression feUserQuery = new FilterExpression();
        feUserQuery.FilterOperator = LogicalOperator.And;
        feUserQuery.Conditions.Add(userQueryCondition);
        feUserQuery.Conditions.Add(userQueryCondition1);
        feUserQuery.Conditions.Add(userQueryCondition2);
        userQuery.Criteria = feUserQuery;

        BusinessEntityCollection responseUserQuery = service.RetrieveMultiple(userQuery);
        return responseUserQuery;
    }
   
   
        public static CrmService CreateService()
    {
        CrmAuthenticationToken token = new CrmAuthenticationToken();
        token.AuthenticationType = 0;
        token.OrganizationName = “nazwa_organizacji”;
        CrmService service = new CrmService();
        service.CrmAuthenticationTokenValue = token;
        service.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        service.Url = @”http://192.168.1.10:5555/MSCRMServices/2007/CrmService.asmx“; //do zmiany na własny adres
        return service;
    }
   

Kilka przykładów konstruowania zapytania Fetch XML

Posted by admin | ASP NET. C# | piątek 14 sierpień 2009 16:50

Przykład 1

Zwraca wszystkie atrybuty obiektu account gdzie właścicielem jest użytkownik który posiada na imię Jan nazwisko Kowalski a nickname Janek.

<fetch mapping=’logical’>
   <entity name=’account’><all-attributes/>
      <link-entity name=’systemuser’ to=’owninguser’>
         <filter type=’and’>
            <condition attribute = ‘lastname’ operator=’eq’
                       value=’Kowalski’/>
            <condition attribute=’firstname’ operator=’eq’
                       value=’Jan’/>
            <condition attribute=’nickname’ operator=’eq’
                       value=’Janek’/>
         </filter>
      </link-entity>
   </entity>
</fetch>

Przykład 2

Zwraca wszystkie atrybuty obiektu account  dla kont utworzonych dzisiaj.

<fetch mapping=’logical’>
   <entity name=’account’><all-attributes/>
      <filter type=’and’>
         <condition attribute = ‘createdon’ operator=’today’/>
      </filter>
   </entity>
</fetch>

Przykład 3

Zwraca name i accountid ze wszystkich kont utorzonych w ostatnich siedmiu dni.

<fetch mapping=’logical’>
   <entity name=’account’>
      <attribute name = ‘name’/>
      <attribute name = ‘accountid’/>
      <filter type=’and’>
         <condition attribute = ‘createdon’ operator=’last-seven-days’/>
      </filter>
   </entity>
</fetch>”

Przykład 5

Zwraca wszystkie atrybuty z kont gdzie nazwa konta rozpoczyna się od litery a lub d.

<fetch mapping=’logical’>
   <entity name=’account’><all-attributes/>
      <filter type=’or’>
         <condition attribute = ‘name’ operator=’like’ value=’a%’/>
         <condition attribute = ‘name’ operator=’like’ value=’d%’/>
      </filter>
   </entity>
</fetch>

Przykład 6

Wyciąga nam wszystkie kontakty których imię zaczyna się od litery “A” lub nazwisko kończy na “Z”. Wyniki dodatkowo są sortowane rosnąco.

<fetch mapping=’logical’>
   <entity name=’contact’>
      <attribute name=’firstname’ />
      <attribute name=’lastname’ />
      <filter type=’or’>
         <condition attribute=’firstname’ operator=’like’ value=’A%’ />
         <condition attribute=’lastname’ operator=’like’ value=’%Z’ />
      </filter>
      <order attribute=’lastname’ descending=’false’ />
   </entity>
</fetch>

Przykład 7

Dzięki temu zapytaniu dowiemy się ilu jest wszystkich użytkowników w CRM-ie.

<fetch mapping=’logical’ aggregate=’true’>
   <entity name=’systemuser’>
      <attribute name=’systemuserid’ aggregate=’count’ alias=’number’ />
   </entity>
</fetch>

W NASTĘPNYCH WPISACH PRZEDSTAWIE BARDZIEJ ZAAWANSOWANE ZAPYTANIA DZIĘKI KTÓRYM MOŻNA WYCIĄGNĄĆ NAPRAWDĘ WIELE RÓŻNORODNYCH INFORMACJI.

Wykorzystanie FetchXML do pobierania danych z MS CRM 4.0

Posted by admin | ASP NET. C# | piątek 7 sierpień 2009 20:50

Poniższy przykład pokazuje jak pobrać dane z CRM-a za pomocą zapytań konstruowanych w XML, w kolejnych postach napisze jak robić przykładowe zapytania w XML

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using System.Xml;
namespace FetchCRM
{
    class Program
    {
        static void Main(string[] args)
        {
            GetAllContacts();
            Console.ReadKey();
        }

        private static void GetAllContacts()
        {
           try
            {
                int i = 0;
                CrmAuthenticationToken token = new CrmAuthenticationToken();
                token.AuthenticationType = 0;
                token.OrganizationName = “MicrosoftCRM”;

                CrmService myCrm = new CrmService();
                myCrm.Credentials = new System.Net.NetworkCredential(@”administrator”, “pass@word1“, “”);
                myCrm.CrmAuthenticationTokenValue = token;
                myCrm.Url = @”http://192.168.1.5:5555/MSCRMServices/2007/CrmService.asmx“;

 

                // Wybierz kontakty o nazwisku Kowalski.
                StringBuilder fetchStr = new StringBuilder();
                fetchStr.Append(@”<fetch mapping=’logical’>”);
                fetchStr.Append(@”<entity name=’contact’><all-attributes/>”);
                fetchStr.Append(@”<filter><condition attribute=’lastname’ operator=’eq’ value=’Kowalski’ /></filter>”);
                fetchStr.Append(@”</entity></fetch>”);
                String resultXML = myCrm.Fetch(fetchStr.ToString());
               
              
                System.Xml.XmlDocument myXMLDoc = new System.Xml.XmlDocument();
                myXMLDoc.LoadXml(resultXML);
                System.Xml.XmlNodeList myNodeList = myXMLDoc.GetElementsByTagName(”name”);
                Console.WriteLine(”\nZnaleziono {0} kontaktów\n”, myNodeList.Count);
                
                 foreach (System.Xml.XmlNode myNode in myNodeList)
                 {
                     Console.WriteLine(”Pełna nazwa kontaktu= {0}”, myNode.InnerText);
                     i++;
                 }
               
                   
            }
            catch (System.Web.Services.Protocols.SoapException soapEx)
            {
                Console.WriteLine(”SOAP exception: ” + soapEx.Detail.InnerText
                                 + “  ” + soapEx.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(”General exception: ” + ex.ToString());
            }
               
        }

              
    }
}

Pobieranie za pomocą C# wszystkich kontaktów o danym mieście

Posted by admin | ASP NET. C# | czwartek 6 sierpień 2009 09:51

Za pomocą poniższego kodu w C# możemy użyć CRM SDK API do pobrania kontaktów spełniającyh wybrane kryteria, w tym przypadku kontakty które mają dane miasto zdefiniowane w warunku.

// Ustawiamy połączenie do serwisu CRM-a.
CrmAuthenticationToken token = new CrmAuthenticationToken();
// Rodzaj autentykacji w tym przypadku Active Directory authentication.
token.AuthenticationType = 0;
token.OrganizationName = “AdventureWorksCycle”;
 
CrmService service = new CrmService();
service.Url = “http://<servername>:<port>/mscrmservices/2007/crmservice.asmx“;
service.CrmAuthenticationTokenValue = token;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;

// Tworzymy ColumnSet.
ColumnSet cols = new ColumnSet();

// Ustawiamy właściwości ColumnSet (pobieramy fullname oraz contactid).
cols.Attributes = new string [] {”fullname”, “contactid”};

// Ustawiamy ConditionExpression.
ConditionExpression condition = new ConditionExpression();

// Definiujemy warunek do wyciągania kontaktów w których miasto jest np. City (przykładowo).
condition.AttributeName = “address1_city”;
condition.Operator = ConditionOperator.Like;
condition.Values = new string [] {”City”};

// Tworzymy FilterExpression.
FilterExpression filter = new FilterExpression();

// Ustawiamy właściwości filtra.
filter.FilterOperator = LogicalOperator.And;
filter.Conditions = new ConditionExpression[] {condition};

// Tworzymy obiekt QueryExpression.
QueryExpression query = new QueryExpression();

// Ustawiamy właściwości obiektu QueryExpression.
query.EntityName = EntityName.contact.ToString();
query.ColumnSet = cols;
query.Criteria = filter;

// pobieramy kontakty spełniające kryteria.
BusinessEntityCollection contacts = service.RetrieveMultiple(query);

foreach (BusinessEntity b in collection.BusinessEntities)
            {
          contact cont = (contact)b;

// Tutaj wyświetlamy w konsoli
          Console.Write(cont.fullname + ” ” + cont.contactid);
     }

Programowe dodanie produktów do products z pliku csv do MS CRM

Posted by admin | ASP NET. C# | wtorek 4 sierpień 2009 20:56

Tutaj znajdziecie przykład jak za pomocą CRM SDK dodać np. dużo produktów do CRM-a z pliku CSV.

Przykład ten jest zdarzeniem podpiętym do zwykłego przycisku w Microsoft Visual Web Developer.

using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using CrmSdk;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        // łączenie się z Virtual PC MS CRM 4.0 (przykład oczywiście trzeba zmienić organizację adres IP oraz dane do logowania.
        CrmAuthenticationToken token = new CrmAuthenticationToken();
        token.AuthenticationType = 0;
        token.OrganizationName = “MicrosoftCRM”;

        CrmService service = new CrmService();
        service.Credentials = new System.Net.NetworkCredential(@”administrator”, “pass@word1“, “”);
        service.CrmAuthenticationTokenValue = token;
        service.Url = @”http://192.168.1.5:5555/MSCRMServices/2007/CrmService.asmx“;
        // koniec połączenia

        String default_euro = null;
        String default_zloty = null;
        String primary_unit = null;
        String default_unit = null;
  // Wyciągamy GUIDA Primary Unit (jest to obowiązkowa wartość dla produktu, oczywiście możemy mieć inne wartości, ta wartość to jednostka podstawowa i znajduje się w standardowej instalacji CRM-a)
        ColumnSet cols = new ColumnSet();
        cols.Attributes = new string[] { “uomid”, “name” };
        QueryExpression query = new QueryExpression();
       
        query.EntityName = EntityName.uom.ToString();
        query.ColumnSet = cols;
        BusinessEntityCollection jednostka = service.RetrieveMultiple(query);

        foreach (uom pojedynczy in jednostka.BusinessEntities)
        {
            primary_unit = pojedynczy.uomid.Value.ToString();
        }

// Wyciągamy GUIDA Default Unit (także jest to konieczne w celu prawidłowego dodania produktu, oczywiście możemy mieć inne wartości, ta wartość to jednostka podstawowa i znajduje się w standardowej instalacji CRM-a)
        ColumnSet cols2 = new ColumnSet();
        cols2.Attributes = new string[] { “uomscheduleid”, “name” };
        QueryExpression query2 = new QueryExpression();
       
        query2.EntityName = EntityName.uomschedule.ToString();
        query2.ColumnSet = cols2;
        BusinessEntityCollection grupa = service.RetrieveMultiple(query2);

        foreach (uomschedule pojedynczy_grupa in grupa.BusinessEntities)
        {
            default_unit = pojedynczy_grupa.uomscheduleid.Value.ToString();
       }

// Wyciągamy GUIDA waluty (zakładam że mamy tylko walutę PLN i EUR)
        ColumnSet cols3 = new ColumnSet();
        cols3.Attributes = new string[] { “transactioncurrencyid”, “currencyname” };
        QueryExpression query3 = new QueryExpression();

        query3.EntityName = EntityName.transactioncurrency.ToString();
        query3.ColumnSet = cols3;
        BusinessEntityCollection euro = service.RetrieveMultiple(query3);

        foreach (transactioncurrency pojedynczy_euro in euro.BusinessEntities)
        {
            if (pojedynczy_euro.currencyname == “Euro”)
            {
                default_euro = pojedynczy_euro.transactioncurrencyid.Value.ToString();
            }
            else
            {
                default_zloty = pojedynczy_euro.transactioncurrencyid.Value.ToString();
            }
       
        }

// Jeśli wszystko jest w porządku to tutaj powińniśmy mieć wyświetlone w oknie IE odpowienie guidy) 

       Response.Write(default_euro + “<br/>”);
        Response.Write(default_unit + “<br/>”);
        Response.Write(default_zloty + “<br/>”);
        Response.Write(primary_unit + “<br/>”);

      
        product prod = new product();

// Tutaj znajduje się część odpowiedzialna za odczyt pliku z produktami zakładam że plik nazywa sie produkty.csv, jego przykładowy wygląd na końcu wpisu.

        List<string> files = new List<string>();
        StreamReader sr = new StreamReader(”/produkty.csv”);

        string line;
        string[] wartosc;
        wartosc = new String[9];
        int i=0;
        while ((line = sr.ReadLine()) != null)
        {
            i = 0;
            string[] words = line.Split(’;');
            foreach (string word in words)
            {
                wartosc[i] = word;
                i++;
            }

// Poniżej już przypisujemy odpowienie wartości tj. nazwa produktu, numer produktu, cena produktu, primary unit, default unit, i tyle po utworzeniu (dodaniu) każdego produktu jest wyświetlany jego GUID

            prod.name = wartosc[0];
            prod.productnumber = wartosc[1];
            prod.price = new CrmMoney();
            if (wartosc[2].Length > 0)
            {
                prod.price.Value = decimal.Parse(wartosc[2]);
            }
            prod.transactioncurrencyid = new Lookup();

            if (wartosc[3] == “Euro”)
            {
                // GUID waluty EUR
                prod.transactioncurrencyid.Value = new Guid(default_euro);
            }
            else
            {
                // GUID waluty PLN
                prod.transactioncurrencyid.Value = new Guid(default_zloty);
            }

            prod.defaultuomid = new Lookup();
            // GUID Primary Unit
            prod.defaultuomid.Value = new Guid(primary_unit);
            prod.defaultuomscheduleid = new Lookup();
            // GUID default Unit
            prod.defaultuomscheduleid.Value = new Guid(default_unit);

            Guid prodId = service.Create(prod);
            Response.Write(”GUID utworzonego produktu: ” + prodId);
            Response.Write(”<br/>”);

            files.Add(line);
        }
        sr.Close();

    }
}

Tutaj jest przykładowy plik produkty.csv z dwoma przykładowymi produktami

Produkt nr. 1;0342;50;Złoty
Produkt nr. 2;1213;150;Euro

i chyba tyle w tym przykładzie mam nadzieję że czegoś nie pominąłem, jakby co proszę pytać:)