Reindex whole database
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
GO
EXEC sp_updatestats
GO
MS CRM blog for developers
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"
GO
EXEC sp_updatestats
GO
Posted by
Dejan Dular
at
8:46 AM
0
comments
Links to this post
My client wanted to have a button that starts a specific workflow on the form. So after analyzing some javascript I ended with this code:
var a = new Array(crmFormSubmit.crmFormSubmitId.value);
var sIds = crmFormSubmit.crmFormSubmitId.value+";";
var sEntityTypeCode = "10004"; //Replace this with your entity type code
var sWorkflowId = "{BE7E47C0-2452-4F44-8CCA-425B83A7A8FB}"; //Replace this with your actual workflow ID
var iWindowPosX = 500; //Modal dialog position X
var iWindowPosY = 200; //Modal dialog position Y
var oResult = openStdDlg(prependOrgName("/_grid/cmds/dlg_runworkflow.aspx")+"?iObjType=" + CrmEncodeDecode.CrmUrlEncode(sEntityTypeCode) + "&iTotal=" +
CrmEncodeDecode.CrmUrlEncode(a.length) + "&wfId=" + CrmEncodeDecode.CrmUrlEncode(sWorkflowId)+ "&sIds=" + CrmEncodeDecode.CrmUrlEncode(sIds) , a, iWindowPosX, iWindowPosY);
Of course this is not supported by Microsoft. You use it at your own risk.
Posted by
Dejan Dular
at
9:02 AM
0
comments
Links to this post
WOW! I'm sooooo happy when I receive such deterministic errors.
After saving an account, this message popped up. And you guessed it - it appeared just SOMETIMES!
After a little of SQL profiling i found the reason:
I extended the account's address1_line1 field from 50 to 100 characters. After saving the account, CRM automatically creates/updates also the customeraddress entity.
Solution:
Extend the customeraddress entity, extend attribute line1, match the length to length of the account address line.
Posted by
Dejan Dular
at
12:50 PM
5
comments
Links to this post
Found this on Sql Server Central:
CREATE TABLE #new(ID INT NULL, KeyValue VARCHAR(2))
INSERT INTO #new(ID, KeyValue) VALUES (1,'aa')
INSERT INTO #new(ID, KeyValue) VALUES (2,'bb')
INSERT INTO #new(ID, KeyValue) VALUES (1,'aa')
INSERT INTO #new(ID, KeyValue) VALUES (1,'aa')
SELECT * FROM #new;
Now let's delete the duplicates. The semicolon at the beginning is recommended if you are not using it after every SQL sentence. This tells the parser to begin with new statement. Without it you will probably get a syntax error.
;WITH Numbered AS (SELECT RowNo=ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID), ID, KeyValue FROM #new) DELETE FROM Numbered where RowNo>1;
SELECT * FROM #new;
Cleanup...
DROP TABLE #new;
Posted by
Dejan Dular
at
7:17 AM
0
comments
Links to this post
If you are writing custom workflow activities for workflows in CRM 4.0 you will find this snippet handy.
Copy the code below into a new file and name it CRMParameter.snippet. Save the file into Visual Studio 2005\Code Snippets\Visual C#\My Code Snippets folder. It works in VS2008 too.
The shortcut for the snippet is cwp.
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>CRM workflow property snippet</Title>
<Shortcut>cwp</Shortcut>
<Description>Code snippet for crm property </Description>
<Author>Dejan Dular</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>PropertyInputOutputType</ID>
<ToolTip>Input/output property</ToolTip>
<Default>CrmInput</Default>
</Literal>
<Literal>
<ID>PropertyDisplayName</ID>
<ToolTip>Property display name</ToolTip>
<Default>Display Name</Default>
</Literal>
<Literal>
<ID>PropertyName</ID>
<ToolTip>Property Name</ToolTip>
<Default>name</Default>
</Literal>
<Literal>
<ID>Type</ID>
<ToolTip>Property Type</ToolTip>
<Default>string</Default>
</Literal>
<Literal>
<ID>Class</ID>
<ToolTip>Class</ToolTip>
<Default>ClassName</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[#region $PropertyDisplayName$
[$PropertyInputOutputType$("$PropertyDisplayName$")]
public $Type$ $PropertyName$
{
get { return ($Type$)base.GetValue($PropertyName$Property); }
set { base.SetValue($PropertyName$Property, value); }
}
public static DependencyProperty $PropertyName$Property = DependencyProperty.Register("$PropertyName$", typeof($Type$), typeof($Class$));
#endregion
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Posted by
Dejan Dular
at
10:12 AM
0
comments
Links to this post
When upgrading a German version of CRM 3.0 to version 4.0, a strange thing happened. All decimal, float or money fields behaved very strange.
Example: User enters a value 2. After clicking save button, the number changes to 200.00 and then immediately to 20.000.00.
Then I noticed that a decimal separator and a thousands separator were the same. Therefore I checked organization settings where everything looked fine.
The problem lied in user settings where both separators were set to dot (.)
SOLUTION:
Change must be made for each user. Set the decimal separator to comma (,).
Update the CRM database to affect all users: UPDATE UserSettingsBase SET DecimalSymbol = ','
Posted by
Dejan Dular
at
9:51 AM
4
comments
Links to this post
I have a typed DataTable (called FactTable) that gets data from a table in SQL server where a Date field can be null.
So I have created a System.Nullable
Datetime? emailDate;
And a typed DataRow from my DataTable:
MyDataSet.FactRow factRow = factTable.Rows[0];
Why does this NOT WORK:
emailDate = factRow.IsEmailDateNull() ? null : factRow.EmailDate;
But this works:
if (factRow.IsEmailDateNull())
emailDate = null;
else
emailDate = factRow.EmailDate;
Compiler error is: Type of conditional expression cannot be determined because there is no implicit conversion between '
Update:
David defined this problem as a feature. But aren't both examples the same? Isn't this just a compile thing to convert from the first example to the second one?
I think it has to do something with nullable types, because with string or byte[] it works like a charm:
byte[] picture = factRow.IsPictureNull() ? null : factRow.Picutre;
Posted by
Dejan Dular
at
12:47 PM
3
comments
Links to this post
I usually don't write about third party solutions, but this one is getting its place in my blog.
A fellow CRM blogger Wolter Kreun from the Netherlands is developing a freeware plugin (Can it be true? A free and very useful plugin for CRM!!!) that fully integrates Google Maps into Microsoft CRM. Soon it will support MS Live maps.
Haven't tried it, but as far as I have seen on the videos it ROCKS!
So chop chop guys and click on this link: http://mscrmgooglemaps.blogspot.com/
Posted by
Dejan Dular
at
12:39 PM
0
comments
Links to this post
Another post that has absolutely nothing to do with CRM. I just gotta share this.
On channel 9 I found this link to the Microsoft's KB article:
http://support.microsoft.com/default.aspx?scid=kb;en-us;261186
I'm really thinking of installing Windows 95 and crashing the CUP fan. :)
Posted by
Dejan Dular
at
6:53 AM
1 comments
Links to this post
I just have to share this. There is a new type of number in .NET Framework 3.5 called BigInteger [System.Numeric.BigInteger]. What is so cool here? Now you don't have to write special code to work with really really really big numbers. This type is infinite, as big as you want (until you run out of memory).
Read more here.
Posted by
Dejan Dular
at
7:51 AM
0
comments
Links to this post