Dynamics 365(CRM) Organization Update Import Failed in perform Action Install of Solution=CustomControlsCore …

We encountered the following error while updating one of our client’s organization from 8.0 to 8.2x. Other organizations got updated without any issue but this one just won’t.

Error| Failed in perform Action Install of Solution=CustomControlsCore, FileName=CustomControls.zip, Version=8.2.9.19, Action=Install for OrgId=xxx

Since other organizations are getting updated without a problem we can imagine the issue is with the organization’s database.
After a rigorous googling and getting through a lot of org. import/update issues we fixed the problem as follows:
Problem: Our CRM base language is danish but the SQL user performing org update has default language English…
Solution: change the user’s default language to danish as is of CRM.
To find user’s default language simple open SQL_Management_Studio and under Security select properties of the user and the default language will be shown in the bottom and simply change it to one which is of CRM, or run SQL:
SELECT default_language_name
FROM sys.server_principals
WHERE name = '<user>'

To find available language name in SQL server:
SELECT name,alias FROM sys.syslanguages WHERE name = '<user>'

To set the default language for the user:
Exec sp_defaultlanguage ‘<user>’,'<languageName>’

Try updating organization from Deployment Manager and it would go smooth 🙂

Dynamics 365(CRM) on-premise huge Attachments size SQL fix (Update/Delete)

While upgrading one of our client we found huge size of database where almost 75% of the DB size was taken by the Attachments table.
Her is the sql script which is actually just updating the body field to release size occupied by large attachments. Be careful while using it as it might take several hours depending on the number of records. Batch size is set to 1000 which can be modified according to the situation. Script processes emails with no activities for more than 2 years which can be adjusted as required.

DECLARE @Count INT=1, @Total INT=0
WHILE @Count>0
BEGIN
BEGIN TRANSACTION;
UPDATE dbo.Attachment
SET
Body = ‘QXR0YWNobWVudCB3YXMgYXJjaGl2ZWQgLSA5LzIwMTku’, — BASE64 for “Attachment was archived – 9/2019.”
FileSize = 34,
MimeType = ‘text/plain’,
FileName = FileName + ‘.txt’
WHERE AttachmentId in (
select TOP 1000 ATT.AttachmentId — Batchsize=1000
FROM dbo.Attachment ATT
INNER JOIN ActivityMimeAttachment AS AMA ON ATT.AttachmentId = AMA.AttachmentId
INNER JOIN Email AS EML ON EML.ActivityId = AMA.ObjectId
INNER JOIN ActivityPointer AS ACT ON EML.ActivityId = ACT.ActivityId
WHERE
AMA.ObjectTypeCode = 4202 — emails
AND ATT.FileSize > 50000
AND ACT.ModifiedOn < GETDATE() – 730 — older than 2 years
order by ATT.FileSize desc — to process larger attachments first
)
SET @Count= @@ROWCOUNT — effted rows
SET @Total = @Total + @Count
COMMIT TRANSACTION;
PRINT ‘Processed ‘ + CAST(@Total as varchar) + ‘ records.’
END

Her is the sql script to find out the top 10 tables with largest size:

select top 10 schema_name(tab.schema_id) + ‘.’ + tab.name as [table],
cast(sum(spc.used_pages * 8)/1024.00 as numeric(36, 2)) as used_mb,
cast(sum(spc.total_pages * 8)/1024.00 as numeric(36, 2)) as allocated_mb
from sys.tables tab
join sys.indexes ind
on tab.object_id = ind.object_id
join sys.partitions part
on ind.object_id = part.object_id and ind.index_id = part.index_id
join sys.allocation_units spc
on part.partition_id = spc.container_id
group by schema_name(tab.schema_id) + ‘.’ + tab.name
order by sum(spc.used_pages) desc;

Source: https://dataedo.com/kb/query/sql-server/list-10-largest-tables

Dynamics 365 (CRM) Users, Security Roles and Assign/Delete Views

Dynamics 365 CRM gives out of the box functionality to view a user’s security role but what if we want to view all users who have a particular security role? we might have to build query using advanced find or something else…
Another situation can be if a user have left company but owns som important views. How to share those to other(s) or delete them?
To answer these questions we wrote a little utility that will help:
1. View a user’s security roles.
2. View users a particular security role is assigned to.
3. View a user’s personal views
4. Delete a user’s personal views
5. Assign a user’s views to another user (keeping both source user and target user updated instantly)
6. Swap between source and target user updating their views windows.

To install simply download the managed solution from github DownloadLink and import to organization v9.1 and open configuration page.

Below is a screenshot of utility.

Scribe Insight “Error opening data object ” (solved). Security update for microsoft windows (KB4512517)

If anyone is experiencing this error then there can be one of the following 2 reasons.
(If error just started showing up without any change and integration has been working fine before then jump straight to option 2)

  1. Rights issue
    – Check accound running scribe services have permissions to collaborations folder and Message queues
    – Check scribeinternal dns or file dns is of type system dns not user dns
  2. Security update for microsoft windows (KB4512517)
    If integration has been working fine and error showed up then there might be this security update installed. You can uninstall the update or contact scribe for other solution.

BUTTON(RIBBON) TO CALL PLUGIN (PASS PARAMETERS AND RECEIVE RESULTS)

At some point on the roadmap of every Dynamics 365 (CRM) developer’s life, one must have wished to press a button to call a Plugin.
A combination of Custom Actions introduced in CRM 2013 and webapi introduced in CRM 2016 made this wish very easy. Developers have used different techniques to achieve the same goal e.g. creating records of dummy enttities or updating dummy fields of an entity to call plugins.
There is a smarter way to do so using Custom Actions and here is how we can do it:
Our solution consists of 4 main parts:

1. A CRM custom action with input/output parameters (it can be bound(on an entity) or unbound(global) depending on your requirements)
2. A plugin registered on the custom action (this will perform the task and will set the outpur parameter with results)
3. Script under the button: this will use webapi to call custom action sending input parameters if necessary and will receive the results as output paramters
4. Ribbon button to call the javascript function

Læs mere

USING CRM ACTIONS TO OVERCOME WORKFLOW LIMITATION OF ACCESS TO MAIN OR RELATED ENTITIES

Limitation:
One of the workflow limitations is; it does not support access to its next related entity. One can only access the main entity or the related entities but not next related entity.

Example:
we have 3 entities Account, Contact and CustomEntityA.
Account is related to Contact and Contact is related to CustomEntityA. Account is not directly related to CustomEntityA.

If we want to update a field e.g. description on CustomEntityA on update of the description of Account, or if we want to update Account’s description from CustomEntityA’s description, we cannot do it with OOB workflow. We can either write plugin/customWorkflowActivity or there is another option without coding anything which is combination of Action and Workflow.
Læs mere