Ярлыки

.Net (17) (9) 1с8 (4) 1с8.2 УП (3) документирование (1) интеграция (10) карта (1) собеседование (1) ado (1) ajax (11) ASP (1) asp.net (10) authentication (1) c# (14) coding (2) Crm Ribbon (2) csv (1) datareader (1) delegate (5) dhtml (5) exam (1) excel (10) ext (1) extjs (8) google maps (1) iis (3) javascript (33) JSON (5) linq (1) LN (5) log (1) lotus notes (5) mail (1) MS CRM (63) MS CRM 2015 (3) MS CRM 5 (48) MS CRM 6 (28) ms office (2) msi (1) MVC (1) namespace (1) oData (3) outlook (1) parent-child (2) plugin (1) program (4) Project Management (1) remote debugger (1) REST (1) SharePoint (1) SharePoint 2010 (2) Silverlight (2) soft (1) sql (13) sql reporting service (8) sql2005 (3) ssrs (2) Thread (4) tree (1) vb (6) vba (1) VSTO (1) WCF (4) wmi (1) wsc (2) xml (1) Xrm.Page (1) xslt (1)

среда, 1 ноября 2017 г.

MS CRM: план обслуживания и тормоза в системе

Тормозит CRM ежедневно в одно время.
Возможно, причина в плане обслуживания (Maintenance Jobs) CRM

Среди плана есть весьма ресурсоемкие задания - удаления, реиндекс, операции с файлами базы.
Вот весь перечень.

ObjectTypeCode
ObjectTypCode Name
1
System Event
2
Bulk Email
3
Import File Parse
4
Transform Parse Data
5
Import
6
Activity Propagation
7
Duplicate Detection Rule Publish
8
Bulk Duplicate Detection
9
SQM Data Collection
10
Workflow
11
Quick Campaign
12
Matchcode Update
13
Bulk Delete
14
Deletion Service
15
Index Management
16
Collect Organization Statistics
17
Import Subprocess
18
Calculate Organization Storage Size
19
Collect Organization Database Statistics
20
Collection Organization Size Statistics
21
Database Tuning
22
Calculate Organization Maximum Storage Size
23
Bulk Delete Subprocess
24
Update Statistic Intervals
25
Organization Full Text Catalog Index
26
Database log backup
27
Update Contract States
28
DBCC SHRINKDATABASE maintenance job
29
DBCC SHRINKFILE maintenance job
30
Reindex all indices maintenance job
31
Storage Limit Notification
32
Cleanup inactive workflow assemblies
35
Recurring Series Expansion
38
Import Sample Data
40
Goal Roll Up
41
Audit Partition Creation
42
Check For Language Pack Updates
43
Provision Language Pack
44
Update Organization Database
45
Update Solution
46
Regenerate Entity Row Count Snapshot Data
47
Regenerate Read Share Snapshot Data
50
Outgoing Activity
51
Incoming Email Processing
52
Mailbox Test Access
53
Encryption Health Check
54
Execute Async Request
49
Post to Yammer
56
Update Entitlement States
StatusCode
Description
0
Waiting For Resources
10
Waiting
20
In Progress
21
Pausing
22
Canceling
30
Succeeded
31
Failed
32
Canceled
StateCode
Description
0
Ready
1
Suspended
2
Locked
3
Completed
Задания лежат тут

select * from MSCRM_CONFIG..ScaleGroupOrganizationMaintenanceJobs

Наиболее опасные хранимые процедуры ORGNAME_MSCRM
[p_DefragIndexes]
[p_Reindex]
[p_ReindexAll]
[p_ShrinkMirroredFile]
я не уверен, что именно они используются.

select * from ORGNAME_MSCRM..AsyncOperationBase where not RecurrencePattern is null

тоже возвращает какие-то повторяемые задания.

Утилитка для управления планом CRM Maintenance Job Editor,
Мне не помогли манипуляции с планом, отключение заданий.

Скорее всего, все ломается на вызове этой инструкции.

exec sp_executesql N'  SET DEADLOCK_PRIORITY LOW  SET XACT_ABORT ON  BEGIN TRANSACTION   DECLARE @res INT   
EXEC @res = tempdb..sp_getapplock      
@Resource = ''AsyncService_app_lock-3c2e30ff-e018-e611-80ba-005056814858'',      
@LockMode = ''Exclusive''   

IF @res NOT IN (0, 1)   BEGIN    RAISERROR ( ''Unable to acquire App Lock'', 16, 1 )   END    ELSE   BEGIN   
With TopSuspendedAsyncOperations(AsyncOperationId)  AS  (  Select Top(@numberOfSuspendedOperationsToSelect) 
AsyncOperationId  from AsyncOperationBase o1  where   StateCode = @suspendedState  and ((PostponeUntil is NULL) 
or (PostponeUntil <= @modifiedOn))  and ((DependencyToken is NULL) or (not exists (   select AsyncOperationId 
from AsyncOperationBase o2   where    o2.Sequence < o1.Sequence   and o2.DependencyToken = o1.DependencyToken 
and o2.RecurrencePattern is null   and o2.StateCode in (@readyState,@lockedState,@suspendedState))))  ) 
update AsyncOperationBase  set   StateCode = @readyState,   StatusCode = @waitingStatus,   ModifiedOn = @modifiedOn, 
ModifiedBy = CreatedBy  From AsyncOperationBase join TopSuspendedAsyncOperations on 
AsyncOperationBase.AsyncOperationId = TopSuspendedAsyncOperations.AsyncOperationId 
EXEC @res = tempdb..sp_releaseapplock          @Resource = ''AsyncService_app_lock-3c2e30ff-e018-e611-80ba-005056814858'' 
END  COMMIT',
N'@readyState int,@lockedState int,@suspendedState int,@waitingStatus int,@numberOfSuspendedOperationsToSelect int,
@modifiedOn datetime',@readyState=0,@lockedState=2,@suspendedState=1,@waitingStatus=0,
@numberOfSuspendedOperationsToSelect=2000,@modifiedOn='2017-11-07 09:05:15'

Настройки, связанные со службой AsyncService, возможно, лежат тут

select ColumnName, IntColumn, BitColumn from DeploymentProperties where ColumnName like '%async%'

Их изменение существенно на проблему не повлияло. док от ms

Запись в реестр ключа
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM  AsyncDBAppLock (DWORD) = 1
повлияла положительно, но не избавила от проблемы совсем. То есть, начинает тормозить, но хотя бы не виснет совсем.


вот тут еще советы

среда, 18 мая 2016 г.

C#:Десериализация Json в dynamic

Прием с использованием сборок/классов из MVC. Там в namespace System.Web.Helpers есть класс Json, метод Decode всё делает сам.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
// System.Web.Helpers.dll 
// Это из MVC. Если не установлен, то в студии Tool-NuGet Package manager- установить MVC
// http://stackoverflow.com/questions/32342104/mvc-4-project-does-not-resolve-reference-to-system-web-helpers-in-vs-2015
using System.Web.Helpers;

namespace JsonDeserial
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnDeserial_Click(object sender, EventArgs e)
        {
            var dynObj = Json.Decode(txtJson.Text);
            var counter1 = 1;
            foreach(var o1 in dynObj)
            {
                txtResult.Text += counter1.ToString() + ": Date = " + o1.Date + Environment.NewLine;
                if (o1.Items != null)
                {
                    foreach (var o2 in o1.Items)
                    {
                        txtResult.Text += "\t" + o2.Name + " - " + o2.Price + Environment.NewLine;
                    }
                }
                counter1++;
            }
        }
    }
}


среда, 9 марта 2016 г.

MS CRM: Улучшение поиска в Homegrid

На мой взгляд, поиск в CRM сделан хорошо. Однако, когда в базе много записей, поиск по условию ИЛИ перестает нравиться. Можно воспользоваться расширенным поиском, но пользователи его на дух не переносят.
Можно сделать так:
Здесь в шапке таблицы под каждым заголовком столбца размещено поле ввода для поиска по соответствующему полю. Условия можно задать для разных колонок, оно будет обрабатываться по И. При этом штатный функционал - поиск, сортировка, фильтр продолжает работать без изменений.

Итак, на сетку вешаю кнопку, даю ей enablerule. В скрипте
1. раздвигаю высоту шапки.
2. сдвигаю вниз подсетку с результатами (данными).
3. Добавляю строку в шапку
4. в каждую ячейку рисую поле ввода, на нажатие клавиши ввода вешаю обработчик
5. обработчик собирает запрос по всем полям, устанавливает его для homegrid и обновляет

grid_form_customfilter = function(gr) {
 var crmGrid_gridBar = $("#crmGrid_gridBar");
 var tr = crmGrid_gridBar.children("tbody").children("tr");
 if(tr.length>1) return;
 //debugger;
 $("#crmGrid_gridBodyContainer").find("div.ms-crm-grid-databodycontainer").css("top",45);
 $("#crmGrid_gridBodyContainer").find("div.ms-crm-grid-BodyContainer").css("height",45);
 
 var sNewTr = "<tr id='tr324tr324'>";
 
 tr.children().each(function(index,ell){
  var el = $(ell);
  sNewTr += "<td>";
  var nobr = el.find("nobr");
  if(nobr.length>0){
   sNewTr += "<input id1='"+el.attr("field")+"' style='width:10em; box-sizing: border-box; height:16px; border: solid 1px gray; padding:0 5px 2px 5px; margin: 0 9px 2px 9px; ' value=''>";
  }
  else{
   sNewTr += el.html();
  }
  sNewTr += "</td>";
 });
 sNewTr += "</tr>";
 crmGrid_gridBar.children("tbody").append(sNewTr);
 
 $("#tr324tr324").find("input").each(function(index,ell){
  var el = $(ell);
  el.on( "click", function( e ) {
   e = e||event; 
   if (e) 
   { 
    e.returnValue = false; 
    e.cancelBubble = true;
    e.stopPropagation();
    e.preventDefault();
   }
  }).on("keyup", function(e){
   if ( e.which == 13 ) {
    e.preventDefault();
    
    var fetch = "<fetch distinct=\"false\" no-lock=\"true\" mapping=\"logical\" page=\"1\" count=\"150\" returntotalrecordcount=\"true\"><entity name=\"contact\"><filter type=\"and\"><condition attribute=\"statecode\" operator=\"eq\" value=\"0\" />";
    
    var tr1i = $(this).parent().find("input").each(function(ind,ell){
     var el = $(ell);
     var fld = el.attr("id1");
     var fldVal = el.val();
     if(fld && fldVal){
      fetch += "<condition attribute=\"" + fld + ((fld.endsWith("id") || fld.endsWith("statecode")) ? "name" : "") + "\" operator=\"like\" value=\"%"+fldVal+"%\" />";
     }
    });
    
    fetch += "</filter></entity></fetch>";
    gr.SetParameter("fetchXml", fetch);
    gr.refresh();
    
   }
  });
 });
 
 return;
}

Этот скрипт может искать записи по типам полей Текст, Число, Поиск (если имя поля заканчивается на id), statecode по названию.
Вам может потребуется доработать под типы Дата, Picklist по номеру.


Похожие записи:
как программно выбрать представление связанного списка

понедельник, 28 декабря 2015 г.

MS CRM 2015: inline диалог средствами crm

В 2015 больше не работает Xrm.Internal.openDialog.

Теперь диалоги можно делать как показано далее.

Код на загрузку формы приклеивает кнопку к полю на форме. При нажатии открывается диалог.



1. Код на загрузку формы

var Sdk = window.Sdk || {};

Sdk.fieldButton =  {
// кнопка к полю
    btn:null,
    // отрисовка кнопки
    init: function (id, defaultText, intWidth, onClickDelegate) {
        this.btn = document.createElement("BUTTON");
        var t = document.createTextNode(defaultText);
        this.btn.appendChild(t);
        this.btn.className = "ms-crm-Button";
        this.btn.id = id;

        if (intWidth) {
            this.btn.style.minWidth = "auto";
            this.btn.style.width = intWidth.toString() + "px";
        } else {
            this.btn.style.width = "100%";
        }

        this.btn.onmouseover = function () { Mscrm.ButtonUtils.hoverOn(this); }
        this.btn.onmouseout = function () { Mscrm.ButtonUtils.hoverOff(this); }

        this.btn.onclick = onClickDelegate;

        return this; // для цепочки вызовов
    },

    disableAction: null,

    //правило UI доступности
    setDisableAction: function (disableActionDelegate, attachDelegate) {
        this.disableAction = disableActionDelegate;
        this.btn.disabled = this.disableAction();
        attachDelegate();
        return this;
    }
}

// на загрузку страницы
Sdk.myOnLoad = function () {
    
    var btnDialog = Sdk.fieldButton.init("btnDialog", "Диалог", 50, function () {
        var urlParam = "&prm1="+encodeURIComponent(4)+"&prm2="+encodeURIComponent(3); // параметры в строке url
        var windowArguments = { XrmPage: Xrm.Page }; // параметры в функцию
        
        var dlg = new Mscrm.CrmDialog(Mscrm.CrmUri.create("/isv/dialog.html?" + urlParam), windowArguments, 300, 400);
        // обработчик закрытия по OK
        dlg.setCallbackReference(function (result) {
            Xrm.Page.getAttribute("new_result").setValue(result);
        });

        dlg.showInlineDialog(); // показать диалог
    }).setDisableAction(function () {
        return IsNull(Xrm.Page.getAttribute("new_simplenumber").getValue());
    },
        function () {
            Xrm.Page.getAttribute("new_simplenumber").addOnChange(function () {
                btnDialog.btn.disabled = btnDialog.disableAction();
            });
        }
    );
    var insertAfterField = document.getElementById('new_simplenumber_d');
    insertAfterField.parentElement.insertBefore(btnDialog.btn, insertAfterField.nextSibling);
    //insertAfterField.parentElement.insertBefore(btnTemplate, insertAfterField); // for complex control
};

2. Диалог

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>Простой пример диалога.</title>
    <link rel="stylesheet" type="text/css" href="/_common/styles/fonts.css.aspx" />
    <!--Достаточного только одного этого-->
    <link rel="stylesheet" type="text/css" href="/_common/styles/global.css.aspx" />
    <script type="text/javascript" src="/_static/_common/scripts/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="/_static/_common/scripts/jquery_ui_1.8.21.min.js"></script>
    <script type="text/javascript" src="/_static/_common/scripts/jquery.tmpl.min.js"></script>
    <!--Достаточного только одного этого-->
    <script type="text/javascript" src="/_common/ClientGlobalContext.js.aspx"></script> 
    <script type="text/javascript" src="/butikru/_common/ScriptResx.ashx"></script>
    <script type="text/javascript" src="/butikru/_common/global.ashx"></script>
    <script type="text/javascript" src="/_static/_common/scripts/CrmInternalUtility.js"></script>
    <script type="text/javascript" src="/_static/_common/scripts/main.js"></script>
    <script type="text/javascript" src="/_static/_controls/flyoutdialog/flyoutdialog.js"></script>

    <style>
        body, html {
        margin:0px;
        padding:0px;
        }
        #maket {
        width:100%; height: 100%;
        margin:2 auto;
        }
        #header{
        background-color:#FFFFE2; min-height:60px;
        }
        #left{
        background-color:#00C0C0;
        width:9px;
        float:left;
        }
        #content{
        background-color:#E8E8FF;
        margin-left:9px;
        line-height:22px;
        width: calc(100% - 9px); height: calc(100% - 100px); overflow: auto; /* 100 = 60+30+2*5 */
        }
        #footer{
        background-color:#FFECFF;

        line-height:30px;
        clear:both;
        padding:5px;
        text-align:right;
        vertical-align:middle;
        }
        #btnCross{
        float:right;
        }
    </style>    

    <script>
        dlgResult="0";

        onL = function () {
            var qsp = GetGlobalContext().getQueryStringParameters(); // параметры из строки URL
            document.getElementById("param1").value = qsp.prm1;
            document.getElementById("param2").value = qsp.prm2;
            var dialogArguments = getDialogArguments(); // параметры из аргументов диалога
            document.getElementById("param3").value = dialogArguments.XrmPage.getAttribute("new_simplenumber").getValue();
        }

        // обработчик кнопки OK
        oKonclick = function () {
            dlgResult = parseInt(document.getElementById("param1").value) * parseInt(document.getElementById("param2").value) *
                parseInt(document.getElementById("param3").value) * parseInt(document.getElementById("param4").value);
            dlgResult = dlgResult.toString();
        }
        
    </script>

</head>
<body onload="onL();">
    <div id="maket">
        <div id="header">
            <a title="Отмена" class="ms-crm-RefreshDialog-FirstTopButton" id="btnCross" href="#"><img style="width: 16px; height: 16px;" onclick="if(!Mscrm.Utilities.resetValidationFailedElement()) {closeWindow();}" alt="" src="/_imgs/CloseDialog.png"></a>
            <div title="Пример диалога" class="ms-crm-RefreshDialog-Header-Title ms-crm-TextAutoEllipsis" id="DlgHdTitle" style="width: calc(100% - 35px) !important;">Пример диалога</div>
            <div title="Введите следующие сведения о ...." class="ms-crm-RefreshDialog-Header-Desc" id="DlgHdDesc">Введите следующие сведения о ....</div>
        </div>
        <div id="left"></div>
        <div id="content"><i>Блочная верстка</i><p />Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы Содержимое страницы <p/>
            <span style="width:110px;display: inline-block;">Url Параметр 1 </span><input id="param1" style="width:50px" /><br />
            <span style="width:110px;display: inline-block;">Url Параметр 2 </span><input id="param2" style="width:50px" /><br />
            <span style="width:110px;display: inline-block;">dialog Параметр </span><input id="param3" style="width:50px" /><br />
            <span style="width:110px;display: inline-block;">Данные страницы </span><input id="param4" value="7" style="width:50px" />
            <p />Все перемножится и запишется в Результат.
        </div>
        
        <div id="footer">
            <button class="ms-crm-RefreshDialog-Button" id="butBegin" style="margin-left: 8px;" onkeydown="" onclick="oKonclick();Mscrm.Utilities.setReturnValue(dlgResult); closeWindow();" type="button">ОК</button>
            &nbsp;
            <button class="ms-crm-RefreshDialog-Button" id="cmdDialogCancel" style="margin-left: 8px;" onkeydown="" onclick="if(!Mscrm.Utilities.resetValidationFailedElement()) {closeWindow();}" type="button" lasttabelement="true">Отмена</button>
                
        </div>
    </div>
</body>
</html>

пятница, 18 декабря 2015 г.

MS CRM 2015: Client script



    
Xrm.Page.contextfunction _getContext() { var errorMessage = "Context is not available."; if (typeof GetGlobalContext != "undefined") { return GetGlobalContext(); } else { if (typeof Xrm != "undefined") { return Xrm.Page.context; } else { throw new Error(errorMessage); } } } <head></title>Web Resource</title> <script src="../ClientGlobalContext.js.aspx" type="text/javascript" ></script> <script src="Scripts/ContosoScript.js" type="text/javascript"></script> <link href="Styles/ContosoStyles.css" rel="stylesheet" type="text/css" /> </head>
Xrm.Page.contextclient Provides access to the getClient, getClientState and getFormFactor methods you can use to determine which client is being used, whether the client is connected to the server, and what kind of device is being used. getClientUrl getCurrentTheme getIsAutoSaveEnabled getOrgLcid getOrgUniqueName getQueryStringParameters Returns a dictionary object of key value pairs that represent the query string arguments that were passed to the page. getTimeZoneOffsetMinutes Returns the difference between the local time and Coordinated Universal Time (UTC). This method was introduced with Microsoft Dynamics CRM Online 2015 Update 1. getUserId getUserLcid getUserName getUserRoles Returns an array of strings that represent the GUID values of each of the security roles that the user is associated with or any teams that the user is associated with. prependOrgName Prepends the organization name to the specified path.
context (function param)getContext getDepth getSaveMode isDefaultPrevented preventDefault getEventSource setSharedVariable and getSharedVariable
Xrm.Page.dataXrm.Page.data.refresh(boolSave).then(successCallback, errorCallback); Xrm.Page.data.save(saveOptions).then(successCallback, errorCallback);
Xrm.Page.data.entityattributes getDataXml getEntityName getId getIsDirty addOnSave and removeOnSave getPrimaryAttributeValue save
Xrm.Page.data.entity.attributes Xrm.Page.ui.controls Xrm.Page.ui.tabs Xrm.Page.ui Tab.sections Xrm.Page.ui Section.controls Xrm.Page.ui.navigation.items Xrm.Page.ui.formSelector.items Xrm.Page Attribute.controls Xrm.Page.data.process.getActivePath Xrm.Page.data.process.getActiveProcess [].getStages [].getStages[].getSteps collection.forEach(delegate function(attribute, index)) collection.get([String][Number][delegate function(attribute, index)]) collection.getLength()
Xrm.Page.data.entity.attributes Xrm.Page.getAttribute getInitialValue, getOption, getOptions, getSelectedOption = { text:'', value:'2145' }, and getText. controls getAttributeType getFormat getIsDirty getIsPartyList getMaxLength getName getParent getUserPrivilege getMax, getMin, and getPrecision addOnChange, removeOnChange, and fireOnChange setRequiredLevel(none|required|recommended) and getRequiredLevel setSubmitMode(always|never|dirty) and getSubmitMode getValue and setValue - for lookup: [{entityType:'', id:'', name:''}]
Xrm.Page.ui.controls Xrm.Page.getControl getDisabled and setDisabled getAttribute getName getParent getControlType = standard,iframe,lookup,optionset,subgrid,webresource,notes,timercontrol,kbsearch getLabel and setLabel Lookup control methods addCustomFilter var Sdk = window.Sdk || {}; Sdk.filterCustomerAccounts = function () { //Only show accounts with the type 'Preferred Customer' var customerAccountFilter = "<filter type='and'><condition attribute='accountcategorycode' operator='eq' value='1'/></filter>"; Xrm.Page.getControl("parentaccountid").addCustomFilter(customerAccountFilter, "account"); } //set 'Sdk.setParentAccountIdFilter' in the Opportunity form onload event handler Sdk.setParentAccountIdFilter = function () { Xrm.Page.getControl("parentaccountid").addPreSearch(Sdk.filterCustomerAccounts); } addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, isDefault), getDefaultView, setDefaultView(viewGuid). You can add or remove event handlers for the PreSearch Event using the addPreSearch and removePreSearch methods. setNotification and clearNotification addOption, clearOptions and removeOption setShowTime and getShowTime getVisible and setVisible subgrid_control.refresh subgrid_control.addOnLoad, subgrid_control.removeOnLoad subgrid_control.getViewSelector ViewSelector.getCurrentView and setCurrentView GridControl.getGrid Grid.getRows Grid.getSelectedRows GridRow.getData GridRowData.getEntity, GridEntity.getEntityReference WebResource and IFrame methods: getData, setData, getInitialUrl, getObject, setSrc and getSrc
Xrm.Page.data.processgetActiveProcess and setActiveProcess getActiveStage and setActiveStage getActivePath getEnabledProcesses getSelectedStage addOnStageChange, removeOnStageChange, addOnStageSelected, and removeOnStageSelected moveNext, movePrevious to move to the previous stage Process methods getId, getName, getStages, isRendered Stage methods getCategory().getValue(), getEntityName, getId, getName, getStatus, getSteps Step methods getAttribute, getName, isRequired
Xrm.Page.uiclose controls formSelector.getCurrentItem getId, getLabel, navigate formSelector.items getCurrentControl getFormType = 0-Undefined,1-Create,2-Update,3-Read Only,4-Disabled,6-Bulk Edit navigation.items setFormNotification(message, ERROR|WARNING|INFO, uniqueId) and clearFormNotification(uniqueId) refreshRibbon tabs getViewPortHeight and getViewPortWidth
Xrm.Page.ui sectioncontrols getName getParent getLabel and setLabel getVisible and setVisible
Xrm.Page.ui tabsections getName getParent getLabel and setLabel getVisible and setVisible setFocus getDisplayState and setDisplayState(expanded|collapsed)
Xrm.Page.ui.navigationgetId setFocus getLabel and setLabel getVisible and setVisible
Xrm.Page.ui.processsetDisplayState and setDisplayState(expanded|collapsed) getVisible and setVisible
Xrm.UtilityalertDialog(message,onCloseCallback) confirmDialog(message,yesCloseCallback,noCloseCallback) isActivityType(entityName) openEntityForm var parameters = {}; parameters["formid"] = "b053a39a-041a-4356-acef-ddf00182762b"; parameters["name"] = "Test"; parameters["telephone1"] = "(425) 555-1234"; Xrm.Utility.openEntityForm("account", null|ID, parameters,{ openInNewWindow: true }); openQuickCreate(entityLogicalName,createFromEntity,parameters).then(successCallback, errorCallback); var thisAccount = { entityType: "account", id: Xrm.Page.data.entity.getId() }; var callback = function (obj) { console.log("Created new " + obj.savedEntityReference.entityType + " named '" + obj.savedEntityReference.name + "' with id:" + obj.savedEntityReference.id); } var setName = { name: "Child account of " + Xrm.Page.getAttribute("name").getValue() }; Xrm.Utility.openQuickCreate("account", thisAccount, setName).then(callback, function (error) { console.log(error.message); }); openWebResource(webResourceName,webResourceData,width, height) var customParameters = encodeURIComponent("first=First Value&second=Second Value&third=Third Value"); Xrm.Utility.openWebResource("new_webResource.htm",customParameters);
Open forms, viewshttp://mycrm/myOrg/main.aspx?etn=account&pagetype=entityrecord http://myorg.crm.dynamics.com/main.aspx?etn=account&pagetype=entityrecord&id=%7B91330924-802A-4B0D-A900-34FD9D790829%7D http://mycrm/myOrg/main.aspx?etn=&pagetype=entityrecord|entitylist&id=&viewid=&viewtype=1039|4230&navbar=on|off|entity &cmdbar=true|false&extraqs=encodeURIComponent("address1_addresstypecode=3&telephone1=9165558899") function getReportURL(action,fileName,id) { var orgUrl = GetGlobalContext().getClientUrl(); var reportUrl = orgUrl + "/crmreports/viewer/viewer.aspx?action=" + encodeURIComponent(action) + "&helpID=" + encodeURIComponent(fileName) + "&id=%7b" + encodeURIComponent(id) + "%7d"; return reportUrl; "%7d"; return reportUrl; }
OData http://crmrestbuilder.codeplex.com/ http://xrmservicetoolkit.codeplex.com /wikipage?title=Soap%20Functions var account = {}; account.Name = "Sample Account"; var jsonAccount = window.JSON.stringify(account); $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", datatype: "json", url: Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc/AccountSet", data: jsonAccount, 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) { account = data.d; }, error: function (XMLHttpRequest, textStatus, errorThrown) { errorHandler(XMLHttpRequest, textStatus, errorThrown); } });