Microsoft Dynamics CRM 3'den 4'e upgrade yaptığımız bir müşteride il / ilçe / mahalle... şeklinde birbirleriyle cascade ilişki barındıran account giriş ekranında bu ilişkinin dinamik olarak kotarılabilmesi adına haliyle javascipt yaziyor olmam gerekti.Bunun için Microsoft 'un resmi olarak desteklemediği fakat bunun dışında da malesef alternatif çözüm bulmakta zorlandığımız bir çözüm metodumuz var.
Aslında aşağıda vereceğim bilgi 2 problemin çözümünü sağlıyor.Birincisi alanlar arası bağlantısal ilişki diğeride TR probleminin çözümü..
Bunun için crm server'da yer alan lookupsingle.aspx dosyasını bulup editlememiz gerekiyor..
Öncelikle client onload'da çalışan metodu editliyoruz.
17 function window.onload()
18 {
19 /* ERALP JS 17 AGUSTOS INJECTION */
20 var xFind = document.getElementById('findValue');
21 if (xFind)
22 {
23 var xMyEraFetchValue = document.getElementById('findValue').value;
24 if (xMyEraFetchValue != null && xMyEraFetchValue.toString().length != 0)
25 {
26 for(var b = 0; b < 50; b ++ )
27 {
28 xMyEraFetchValue = xMyEraFetchValue.replace('[s]', 'ş').replace('[c]', 'ç').replace('[g]', 'ğ').replace('[-]', 'ı').
29 replace('[u]', 'ü').replace('[o]', 'ö').replace('[S]', 'Ş').replace('[C]', 'Ç').
30 replace('[G]', 'Ğ').replace('[--]', 'I').replace('[U]', 'Ü').
31 replace('[O]', 'Ö').replace('[---]', 'İ');
32 }
33 }
34 xFind.value = xMyEraFetchValue;
35 lookupSearch();
36 }
37 /* ERALP .. */
38 crmGrid.OnSelectionChange = handlePropertiesBtn;
39 crmGrid.OnBeforeFormLoad = handleDblClick;
40 crmGrid.SetParameter("disableDblClick", "0");
41
42 if (IsNull(window.dialogArguments))
43 btnRemoveValue.disabled = ! _enableRemoveButton;
44 else
45 btnRemoveValue.disabled = IsNull(window.dialogArguments.items) || (window.dialogArguments.items.length == 0);
46
47 if ( ! checkMode( _mode, LookupBrowse ) )
48 {
49 findValue.focus();
50 findValue.NotifyFocus();
51 }
52 else
53 {
54 crmGrid.focus();
55 }
56 handlePropertiesBtn();
57 }
Yukarıda belirtilen injection fonksiyon sayesinde bu formun her yüklenmesi esnasında client'da ilgili input type text elementin içerisnde gösterilecek olan karakterlerde var olan Türkçeleştirme problemi replace edilerek çözümlenmiş oluyor.Sayfa encoding'inden tutunda her bir yere kadar durumu detaylıca incelediğimi hatırlıyorum lakin en direkt bir çözüm olmadığı gibi olabilecek en efektif çözüm olarakda bunu görüyorum.Burda dikkat çekilmesi gereken bir noktada karşı taraftan verinin bize gelirken de belli bir algoritmaya göre char by char replace edilmesi gerektiği.Ters - düz mantığıyla hareket ediyoruz.JS kısmında o kodu yazarken takılırsanız lütfen yardım isteyin benden.Ek olarak field bazlı disabled / enabled durumlarını ve açılan search ekranında bu işlemden sonra artık search yapılamayacağını çünkü filterın kodla verildiğinide unutmamanızda fayda var.
17 <script language="javascript" type="text/javascript">
18 protected override void OnLoad( EventArgs e )
19 {
20 base.OnLoad(e);
21 crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
22 }
23
24 void crmgrid_PreRender( object sender , EventArgs e )
25 {
26 if (Request["search"] != null && Request["search"].StartsWith("<fetch"))
27 {
28 crmGrid.AddParameter("fetchxml", Request["search"]);
29 crmGrid.Parameters.Remove("searchvalue");
30 this._showNewButton = false;
31 }
32 }
33 </script>
Yukarıdaki iki metoduda mutlaka aynı formun onload kısmına yer almalı.Bu sayede oluşacak olan grid'in datasource u otomatik olarak filtrelenmiş oluyor.
Aşağıda yazan kod bloğu dinamik olmayan filtrelemeye güzel bir örnek.Siz bunu yukarıdaki yapıyı kullanarak herhangi bir pickist'in onchange'ine basarak ekranda yer alan bir lookup field'ı rahatlıkla filtreleyebilirsiniz.
17 crmForm.all.parentaccountid.lookupbrowse = 1;
18 crmForm.all.parentaccountid.additionalparams = "fetchXml=<fetch mapping='logical'><entity name='account'><all-attributes/><order attribute='name' descending='false'/><filter type='and'><condition attribute='parentaccountid' operator='not-null'/></filter></entity></fetch>";
19 crmForm.all.parentaccountid.additionalparams += "&selObjects=1&findValue=0";
Yeni bir Microsoft CRM Dynamics ipucunda görüşmek üzere.
Sevgiler.
E2
Not : Yukarıda yer alan for döngüsünü 50 ye kadar itere etmem yerine belli bir pattern ile tek seferde tüm aksiyonu alabilirdim.ilk fırsatta onuda yazacağım buraya.