18 Mayıs 2010 Salı

Reporting Service'le yapılmış bir raporu pdf çevirme.


Merhaba arkadaşlar bugün işinize çok yarayacak bir kod örneği vereceğim. Bugünkü konumuz Reporting service(.rdl) le yapılmış bir raporu pdf çevirmek. Bu işlemi yapmamdaki amaç Blackberry veya benzer bazı PDA’ lerle Ms crm den Reporting service’le  yapılmış bir raporu çektiğimizde bunu göstermeyecektir  Bu raporu pdf  çevirdiğimizde sorunsuz bir şekilde şeklinde çalışacaktır. Bu konuda fazla ayrıntıya girmeyeceğim. Size bu işlemi nasıl yapacağınızı kısaca anlatacağım. İlk olarak yeni bir Reports Application uygulaması açın. Bu uygulamayı ihtiyacınıza göre şekilendirin ve alacağı parameterleri  yazın. Daha sonra yeni bir .aspx  uygulaması  açın ve page’in load’una aşağıdaki kodu ekleyin. Uygulamanıza  ReportExecution2005.wsdl web service kısmına RSWebReference adıyla ekleyin. Son olarak Ms crm’e bir button ile yaptığınız aspx sayfasını  ekleyin.
using System;
using System.Data;
using System.Configuration;
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 RSWebReference;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
  string oId = Request.QueryString["oId"].ToString();

        ReportExecutionService rs = new ReportExecutionService();
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
        // Render arguments
        byte[] result = null;
        string reportPath = "/Report_Project/Yeni açtığımız raporun adı";//rapaorun bulunduğu path
        string format = "PDF";
        string historyID = null;

//rapor uygulmamıza bir parametre yollayalım. İsterseniz aynı şekilde birden fazla parametre yollayabilirsiniz.
        ParameterValue[] parameters = new ParameterValue[1];
        parameters[0] = new ParameterValue();
        parameters[0].Name = "rapordaki parametrenin adı";//
        parameters[0].Value = oId;


        string encoding;
        string mimeType;
        string extension;
        Warning[] warnings = null;
        string[] streamIDs = null;

        ExecutionInfo execInfo = new ExecutionInfo();
        ExecutionHeader execHeader = new ExecutionHeader();

        rs.ExecutionHeaderValue = execHeader;

        execInfo = rs.LoadReport(reportPath, historyID);

        String SessionId = rs.ExecutionHeaderValue.ExecutionID;
        rs.SetExecutionParameters(parameters, "tr-TR");

        result = rs.Render(format, null, out extension, out encoding, out mimeType, out warnings, out streamIDs);

        Response.ClearContent();
        Response.AppendHeader("content-length", result.Length.ToString());
        Response.ContentType = "application/pdf";
        Response.BinaryWrite(result);
        Response.Flush();
        Response.Close();
    }

}

Umarım işinize yarar. Gelecek yazımda görüşmek üzere...

Ms crm'de grid'lerde listelenen kayıtların saysını değiştirmek

Merhaba arkadaşlar bugün sizlere normalde  desteklenmeyen, fakat bazı durumlarda sizi sıkıntılardan kurtaracak bir trick den bahsedeceğim. Hepimiz biliyoruz ki Ms crm de bulunan grid'lerde gelen toplam kayıt sayısı default'da 50 dir. Fakat siz bu sayıyı ayarlardan(settings) 250 kayıda kadar çıkarabilirsiniz.
 Buraya kadar herşey normal, farzedin ki kayıt sayımız çok fazla ve keyfi olarak bu kayıtların sayısını 1500 olarak sayfalamak istiyorsak, bu islemi crm den yapamayız. Bu işlemi SQL Studio'dan Ms crm database'ini  açarak ilgili alanı update ederek yapabiliriz. Bu yöntem default yapıyı bozduğu için fazla tavsiye edilmeyen bir yöntemdir. Bu işlemde update etmeniz gereken tablo UserSettingsBase tablosudur.

                                          update usersettingsbase set paginglimit=2000

11 Mayıs 2010 Salı

CRM v4.0 Reporting Service'in print hatası "Unable to Load Client Print Control"

Merhaba arkadaşlar bugün crm de Report service kullanarak custom bir rapor sayfası yaptım ve daha sonra crm entegre ettim fakat raporu print almak istediğimde  "Unable to Load Client Print Control" diye bir hatayla karşılaştım. Biraz araştırma yaptım ama kimsenin kesin bir çözüm vermediğini veya karşılaşanların farklı yöntemlerle yada vazgeçerek raporu pdf çevirdiklerine rastladım. Biraz uğraş sonrasında hatanın Windows Security Update KB956391 hatası olduğunu buldum.

Çözümü ise aşağıda verdiğim linklerden gereken update leri yaptıkdan sonra çözdüm. Umarım işinize yarar.

CRM Server:
SQL Server:

21 Nisan 2010 Çarşamba

MSCRM 4.0 Documentation Generator (Excel Add-in)

Merhaba arkdaşlar bugün sizlere ms crm için yazılmış güzel bir tool dan bahsedeceğim. Microsoft'un açık kaynak sitesi olan Codeplex sitesinde bulabileceğiniz MSCRM 4,0 için hazırlanmış MSCRM 4.0 Documentation Generator (Excel Add-in) bir Excel 2007 eklentisidir. Tool’un amacı otomatik olarak Ms crm 4.0 daki bütün varlıkları ve varlıklara ait olan alan adlarını, picklist değerlerini ve yazılmış olan bütün javascript code’larını excel belgelerini almaktır. Böylece çok uzun sürüp sıkıcı olan dökümantasyon işini kısa sürede tamamlamamızı sağlayacaktır. Öncellikle Documentation Generator (Excel Add-in) indirip kuralım.( http://crm4documentation.codeplex.com/) ve daha sonra dökümantasyon işine başlayalım.

Kurulumu tamamladıktan sonra crm den Ayarlar -> özelleştirme-> Özelleştirmeleri ver girelim ve özelleştirmeleri ver özelliğine tıklayalım.


Tüm varlıkları seçtikden sonra seçili özelleştirmeleri ver ‘e tıklayalım ve son olarak customizations.xml belgesini istediniz bir yere alalım.


Daha sonra Excel’i başlatalım ve add-ins ‘e tıklayalım. Gördüğünüz gibi add-ins içinde CRM Documentation tool oluşmuştur.

Burada da Load Xml’e tıklayarak customizations.xml dosyasını yükleyelim.


Son olarak Forms seçeneğine tıklayarak tüm varlıkları ve alan adlarını ekleyelim. Varlıkları load ettikten sonra diğer seçenekleri de tıklayarak sırasıyla script ve picklist’ler için belgeleri oluşturalım.




Gelecek yazımda görüşmek dileğiyle......

10 Nisan 2010 Cumartesi

Ms Crm için yapılmış bir GoogleMap uygulaması


Merhaba arkadaşlar bugün sizlere  google api lerini kullanarak küçük bir  google map uygulaması yapacağım.  Ayrıca yaptığımız uygulamayı crm de firma varlığına entegre ederek database den enlem ve boylamı  çekerek marker  aracılığıyla haritada firmanın adresini ayrıntılarıyla göstereceğim.  Şimdi uygulamayı  yazmayı başlayalım. Öncelikle visual stadio açarak yeni bir web proje açalım  ve ismine GoogMapWebSite diyelim.
  
Daha sonra cs dosyasını açarak kodları yazmaya başlayalım. Comment out yaptığım yerlerde bazı açıklamalar yaptım.
using System;
using System.Data;
using System.Configuration;
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.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string id = Request.QueryString["oid"].ToString();//burada firmanın guid’ini alıyoruz
        SqlConnection conn = new SqlConnection("Data source=MSCRMDYNAMICS; initial catalog=ERCAN_MSCRM; Integrated Security=SSPI;");
        string sql = "SELECT  new_longitude,new_latitude FROM account WITH(NOLOCK) where accountId='" + id + "' and deletionstatecode<>2 ";
       //sql query’mi yazıp enlem ve boylamı çekiyorum.
        SqlDataAdapter da = new SqlDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        da.Fill(ds);

        try
        {
            Double a = Convert.ToDouble(ds.Tables[0].Rows[0]["new_latitude"]);
            Double b = Convert.ToDouble(ds.Tables[0].Rows[0]["new_longitude"]);

/*Enlem ve boylam boş değil ise aspx sayfasını source’una yazdığım initialize adlı bir fonksiyona yoluyorum, boş ise hata mesajı veriyorum.*/

            if ((ds.Tables[0].Rows[0]["new_latitude"] != DBNull.Value) && (ds.Tables[0].Rows[0]["new_longitude"] != DBNull.Value))
            {
                string javascript = "";
                RegisterStartupScript("Close", javascript);
            }
           
          
              
        }
        catch
        {
            string javascript = "";
            RegisterStartupScript("Close", javascript);
           
        }
       
    }
}
Şimdi sıra geldi aspx sayfımıza source’una  yazacağımız  kodlara

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Ercan’s Maptitle>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">script>
<script type="text/javascript">
    var geocoder;
    var map;
  
    function initialize(a,b) {
       
        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(a,b);
        var myOptions = {
            zoom: 15,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP//burada yap
        }
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
      
          var marker = new google.maps.Marker({
      position: latlng,
      map: map,
      title:"The Account Address !"
  });
  }
script>
head>
<body style="margin:0px; padding:0px;"  >
    <form id="form1" runat="server">
<div id="map_canvas" style="width:100%; height:100%">
     <asp:ScriptManager ID="ScriptManager1" runat="server">
    asp:ScriptManager>
    div>
    form>
body>
html>

Son olarak yaptığımız uygulamayı bir button aracılığıyla crm’e ekleyeceğim. İlk olarak  ISV.Config dosyasını  export ediyoruz.

 ve dosyayı visual stadio ile açıp aşağıdaki kodu ekliyoruz.
<Button JavaScript="var id= crmForm.ObjectId; window.open('/ISV/GoogMapWebSite/Default.aspx?oid='+id,'mywindow', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no,width=473,height=322');" PassParams="1" WinParams="" WinMode="0">
                         

                           <Titles>
                               <Title LCID="1033" Text="Google Map" />
                          Titles>
                          <ToolTips>
                               <ToolTip LCID="1033" Text="Google Map" />
                          ToolTips>
                    Button>
Son olarak  kodu ekleyip save edip dosyayı import  ediyorum. 

Şimdi test edelim bu arada ekranda button görünmüyorsa ayarlardan (settings) sistem ayarlarına giriyoruz daha sonra özeleştirmeyi tıklıyoruz. Ve aşağıda gösterdiğim değerleri seçip tamam a tıklıyoruz.  


Bu işlemi bitirdikden sonra altaki gibi bir görüntü ortaya çıkacaktır.



Umarım işinize yarar başka bir yazımda görüşmek dileğiyle........

14 Mart 2010 Pazar

Ms crm formlarını javascript ‘le özelleştirmek 4


Merhaba arkadaşlar bugün tekrar özelleştirmeyle ilgili scriptlere devam edeceğim. Geliştiricilerin işlerine çok yarayacak ve ayrıca hiç zorlanmadan birçok özelleştirmeyi scriptlerle nasıl yapabileceklerini  çeşitli örneklerle göstereceğim.
Global.js dosyası nasıl kullanılır ve içine nasıl javascript kodları yazılır:
Varlık  formundaki alanların içine yazdığımız javascriptlerin bazı durumlarda sonradan okunamadığını,  kayboldunu hepimiz biliriz. Bunun için javascript yazılması istenen alanlar  ve ya fomlar  için External(harici)  bir js dosyasında kullanabileceğimizi ve bunu sadece  fonksyionun adını yazarak yazdığımız scriptleri çağıracağımızı göreceksiniz.  Böylece uzun ve ya karmaşık scriptleri crm formlarına yazmamış olacağız. Bu da bize bir ide kullanarak kolay bir şekilde kod yazmamızı  ve ms crm i daha az meşgul ederek hızlı ve daha effective kullanmamızı sağlayacaktır.
Bunun için yapmamız gereken yöntem ise Ms crm’in kurulduğu yerden ( C:\inetpub\wwroot olmakla birlikte bazen Program Files’ın Microsoft CRM klasörü  altındada olabiliyor.  _static\_common\scripts\Global.js) dosyasına açarak  aşağıdaki kod satırını eklemeliyiz. Birden fazla js  dosyasıda  isteniyorsa ayrı ayrı ekleyebiliriz ve istediğimiz fonksiyonları çağırabiliriz. Aşağıda gördüğünüz kodu global.js  dosyası içine eklerseniz kendi yazdığınız js dosyasının fonksiyonlarını ms crm formları içinden fonksiyon adlarını yazarak çağırabilirsiniz.
src='../../../_static/_common/scripts/Kullanmakistediğinizjavascriptdosyaadı.js' type='text/javascript'
document.write("Yukarıdaki kodu buraya script taglarıla yazarsanız.  Kaydetiğimiz js dosayasındaki fonksiyonları Ms crm üzerinden çağırabilirsiniz.");
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 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);


formun onLoad olayına aşağıdaki kod yazılır.

function CreateEmail(emailAddress)
{
    return function()
    {
        if (emailAddress != null && emailAddress.value.length > 0)
        {
            window.navigate("mailto:" + emailAddress.value);
  }
    }
}
crmForm.all.emailaddress1.attachEvent('ondblclick', CreateEmail(crmForm.all.emailaddress1));
crmForm.all.emailaddress2.attachEvent('ondblclick', CreateEmail(crmForm.all.emailaddress2));
crmForm.all.emailaddress3.attachEvent('ondblclick', CreateEmail(crmForm.all.emailaddress3));
kodu yazdıktan sonra oluştura basıp deneyebilirsiniz. Ayrıca burada farkındaysanız  çift tıklama event’i içinde bir örnek vermiş olduk.
Crm formundan picklist alanlarından option silmek  ve ya default değer vermek , stilini değiştirmek:
Picklist option larını silmek ve ya  değer atamak için aşağıdaki kodu yazarız. 
crmForm.all.new_alanadi.DeleteOption(4);
crmForm.all.new_alanadi.DataValue=1;
Picklist option larının background ve text rengini değiştirmek.
var list = crmForm.all.new_alanadi;
var option = list.options[0];

//Set the background color to red.
option.style.backgroundColor = "#FFEEEE";

//Set the text color to white.
option.style.color = "#FF4563";


Look up’ın Guid almak:
var deger = new Array();
deger = crmForm.all.new_lookupalan.DataValue;
var Guid = deger[0].id;
Checkbox bir alanın onLoad() dan tetiklenmesi:
Bazılarınız karşılaşmışsınızdır.  Ms  crm 4.0 da checkbox yapılan bir bit alanın change olayında hiçbir event’in  tetiklenmediğiyle.  Aşağıdaki örnek kodu formuzun onload una  yazarsanız. Dinamik bir şekilde event’i tetikleyebileceksiniz.
// Bu örneğimizde checkbox tıkladığımız zaman  bilgisayaradedi adında bir alan görünür olacaktır. Unchecked olayında ise bu alan tekrar kaybolacaktır.
crmForm.all.new_checkboxalan.onclick = function()
{
if ( crmForm.all.new_ checkboxalan.checked )
{
crmForm.all.new_bilgisayaradedi.style.display='inline';
crmForm.all.new_bilgisayaradedi_c.style.display='inline';
}
else
{
crmForm.all.new_bilgisayaradedi.style.display='none';
crmForm.all.new_bilgisayaradedi_c.style.display='none';;
}
}
Ms crm 4.0 da form üzerinden istenilen section ve ya section ların gizlenmesi ve ya gösterilmesi:
Aşağıdaki kodu formun onLoad’una yazarsanız ve tab’ın indeksini,section’ın indeksini ve sectionı gizlemek için displayType nı “none” ve ya gizli bir sectionı göstermek istemek için “inline” yazarsınız.
HideSection( 0 , 3 , "none" );  // gizlemek için.
HideSection( 0 , 3 , "inline" );  // gösterme için.
function HideSection( tabIndex , sectionIndex , displayType )
{
      var tab2Hide = document.getElementById( "tab" + tabIndex );

           tab2Hide.childNodes[0].rows[ sectionIndex ].style.display = displayType;
}
Gelecek yazımda görüşmek dileğiyle......

Ercan Top | CRM Software Developer
 +90 534 335 6873

20 Şubat 2010 Cumartesi

Ms crm formlarını javascript ‘le özelleştirmek 3

Merhaba arkadaşlar geçen yazımda Ms crm’de Genel değişkenler, Genel metotlar ve Genel olaylardan bahsetmiş ve bazı örnekler vermiştim. Bu yazımda ise geçen derste ki yarım kalan konuları tamamlayıp, örnekler vereceğim.
all.: Form daki bütün alanlara all özelliğini kullanarak ulaşırız. Bu özellik form nesnelerinin kolleksiyon özelliğidir.
crmForm.all. propertyname(özellik Adı) :
DataValue:Bu özellikle alanların değerini okuyabilir ya da yazabiliriz(set/get).
Bu örneğimizde bir checkbox True ve ya False değerine göre işlem yapıyoruz:
crmForm.all.new_mybitfield.DataValue = true;
crmForm.all.new_mybitfield.DataValue = false;
if (crmForm.all.new_mybitfield.DataValue)
{
// DataValue’nun değeri true ise, Birşeyler yap.
}
else
{
// DataValue’nun değeri false ise, Birşeyler yap.
}

Disabled: Form üzerinde belirlediğiniz alana veri girişini engelleyebilirsiniz ve ya sadece okunabilir(read only) yapabilirsiniz.
Aşağıdaki iki özellikde bize aynı sonucu verir.
crmForm.all.new_alanadi.disabled = true;
crmForm.all.new_alanadi.readOnly = true;
yada bir bit alanı ve ya bir lookup alanı disable edebiliriz.
crmForm.all.new_bitalanadi.disabled = true;
crmForm.all.new_alanadilookupid.disabled = true;

IsDirty: Bize boolean bir değer döner ve alan üzerinde değişiklik yapılıp yapılmadığını kontrol eder.
ForceSubmit: Crm sadece değişen özellikleri kaydeder. Form üzerinde disabled alanlar varsa CRM kaydetmez. Bu sebeple ForceSubmit özelliği disabled olan alanların database kaydedilmesini sağlar.
Min: Bize sayısal olarak en küçük değeri verir.
Max: Bize sayısal olarak en büyük değeri verir.
RequiredLevel: Gereksinim seviyesini verir( Gereksinim düzeyi yok(No constraint)=0, Önerilen( Business Recommended)=1 , Gerekli (Business Required)=2)
Bu örneğimizde bir if else döngüsü içerisinde gereksinim değerine göre karşılaştırma yapıyoruz:
var CRM_REQUIRED_LEVEL_NORMAL = 0;
var CRM_REQUIRED_LEVEL_RECOMMENDED = 1;
var CRM_REQUIRED_LEVEL_REQUIRED = 2;
var oField = crmForm.all.new_gereksinimalan;

if(oField.RequiredLevel== CRM_REQUIRED_LEVEL_NORMAL)
{
alert("Bu alan gereksinimi olmayan bir alandır.");

}
else if(oField.RequiredLevel==CRM_REQUIRED_LEVEL_RECOMMENDED)
{
alert("Bu alan önerilen bir alandır.");
}

Else if(oField.RequiredLevel==CRM_REQUIRED_LEVEL_REQUIRED)
{
alert("Bu alan gerekli bir alandır.");

}
SetFocus: Mouse İmlecini Formadaki bir alana göndermek için kullanılır.
crmForm.all.your_field.ForceSubmit = true;
FireOnChange: Alanın onChange olayını tetiklemek için kullanılır.
Buraya kadar işlediğimiz konularda genel olarak metotlardan ve ya özelliklerden bahsetik birazda örneklere yoğunlaşalım.
Crm’de alanların gizlenmesi ve ya gizli alanların gösterilmesi:
Alanın görünmez yapmak için aşağıda gösterdiğim yolu kullanabilirsiniz.
crmForm.all..style.display = 'none';
görünür hale getirmek için ise

crmForm.all. .style.display = 'inline';
ve ya
crmForm.all. .style.display = 'block';
kullanılabilir.
Alan eğer Lookup ise Lookup’ın label kısmınında saklanması için gerekli kod aşağıdaki gibidir:
crmForm.all. .style.visibility = 'hidden';
crmForm.all. _c.style.visibility = 'hidden';
crmForm.all. _d.style.visibility = 'hidden';
NavBar’da gizlemek için ise iki entity arasındaki ilişkinin adı verilir.
var tabset=’1-N yapılan ilişkinin adı’;
var navItem = window.document.getElementById( 'nav_' + tabSet);
navItem.style.display=”none”;
Text alanın değerinin tüm harflerini büyük ve ya küçük Yapmak (Uppercase/Lowercase):
Girilen Text alanın değerinin tüm harflerini büyük ve ya küçük Yapmak için alanın onChange olayına aşağıdaki kodları yazarız.
crmForm.all.name.DataValue = crmForm.all.name.DataValue.toUpperCase(); //Girilen harfleri büyük harfe çevirir.
crmForm.all.name.DataValue = crmForm.all.name.DataValue.toLowerCase(); //Girilen harfleri küçük harfe çevirir.
Formun arka rengini değiştirmek ve ya alanların label’ların renklerini ve font’larını değiştirmek :
Formun arka rengini değiştirmek için form’un onLoad() olayına aşağıdaki kodu yazarız.
document.all.areaForm.style.backgroundColor = 'pink';
Alana ait label’ınn( varchar) font özellkleri ve rengini değiştirmek için aşağıdaki yolu izleriz.
alanının label’nın özelliklerinin değişmesi için alan adının sonuna (_c) yazarız.
crmForm.all._c.style.fontWeight = 'Arial'; // Yazı tipini değiştiririz.
crmForm.all._c.style.fontSize = '15px'; // Yazı Boyutunu değiştiriz
crmForm.all._c.style.color = '#ef0000'; //Yazı rengini değiştiririz.
Son olarak aşağıdaki JavaScript kod örneğini veriyorum. Harfleri kontrol eder ve saçma olan geçersiz karakterleri bir alt çizgi ile yer değiştirir.

// ilk önce alana saçma bir değer verelim
crmForm.all..DataValue = "Benim?adım/\ Ercan";

if (crmForm.all.!= null)
{

var replaceChar = "_";
var reg = new RegExp('[,/\:*?""<>|]', 'g');
var sonuc = crmForm.all. .DataValue.replace(reg, replaceChar);
alert(sonuc);
// Bize sonuç olarak “Benim_adım_Ercan” gibi bir değer döner.
}


Bu yazımında sonuna geldik. Gelecek yazımda sizlere faydalı olacak javascript kod örnekleri vereceğim. Gelecek yazımda görüşmek üzere.....


Ercan Top | CRM Software Developer
ercantp@gmail.com
+90 534 335 6873