DotNetNuke DNN Modules
We have launched a new domain name for entry into our popular DNN Modules site as InteractiveWebs. You can now also use http://www.dnn-modules.net
We have launched a new domain name for entry into our popular DNN Modules site as InteractiveWebs. You can now also use http://www.dnn-modules.net
We have been working with the crew from The Stylist Finder who have a website that allows you to find a stylist near to you.
We have modified a DotNetNule module for them, to allow for the rating of Stylists and Salons to give a review.
The search page allows for listing of Hair Stylists and Salon by state across the united states. As an example, this is a listing for Stylists in Chicargo IL or Stylists in Michigan for example. You can find a professional hair salon michigan.
We look forward to improving the custom DNN Module that they original had developed by another DotNetNuke Module developer.
Much has been written about the DotNetNuke performance settings, and well frankly the is a lot of bad information running around the web about what all the settings mean and do.
I’m not about to jump into a discussion, but rather tell you what we believe are the best settings for a public facing website hosted from a Windows 2008 servers without a proxy.
First of all you will need to determine if the web server IIS settings have been configured to compress data servers from your site. This is easy.
1. Login as host and look in the Performance Settings for the “Compression Setting” and ensure it is turned off.
2. Then visit this site: http://www.seoconsultants.com/tools/compression
Enter your URL of the website you are playing with, and check compression. The result will look like this, if your content is uncompressed.
or this if it is compressed.
Take not of this for later.
3. Go back to your site settings and set them to look like this:
4. Depending on your compression test above set your site compression settings.
If you site reported: Uncompressed
If your site reported: Compressed (anyting)
The idea is that, if your IIS is already compressing content, you do not want your DNN compression settings on. It will only slow down performance, however if your IIS is not handling compression, you will find that performance is much improved with compression on.
Summary
These settings will give you good speed performance, but more importantly will not cause cache problems where users updated content but cannot see the changes that they have made. This is a big issued with CMS system that cache in the wrong way, and is a complaint of many DNN users.
You may have noticed if you connect to a MS CRM 4.0 server after installing Rollup 7 or later, (including rollup 9), that you get a message:
The cause of this problem is listed in this MS KB: http://support.microsoft.com/kb/976539
The long and the short of it is a known problem in a situation where you have an established relationship with a CRM server using the Outlook plug in. If you then connect to another CRM server that has had the Rollup 7.0 installed, you will get the error message.
Now the official Microsoft Solution to this problem is this: Note You can safely ignore this message and allow blocked content.
Go Microsoft. Yet another totally inadequate solution to a known problem!
What they should have said was this:
1. In IE click tools / Internet Options
2. Click the Security Tab / Trusted Sites
3. Click Sites then Add the url of the CRM site giving the message.
4. Click Close (not ok, or save as you might expect, but close).
6. Select Enable next tot he “Initialize and script ActiveX controls not marked as safe fro scripting.
7. OK / OK
If you refresh the browser the nasty annoying message is gone for good. This is a client side solution, and not a particularly good one, but hay; I don’t make this mess, just navigate a path around it!
I have encountered this problem while setting up Microsoft exchange 2010. After jumping through all of the appropriate hoops, the installation process stops with an area that looks something like this:
Organization Preparation
Failed
Error:
The following error was generated when “$error.Clear(); $acceptedDomains = @{}; Get-AcceptedDomain | foreach { $domainName = $_.DomainName.ToString(); if ($acceptedDomains.Contains($domainName)) { Write-ExchangeSetupLog -Warning “Duplicate AcceptedDomain found. ‘$($acceptedDomains[$domainName])’ and ‘$($_.Name)’ both reference domain ‘$domainName’”; } else { $acceptedDomains.Add($domainName, $_.Name); }; }; function getSmtpTemplates ([string]$property) { $input | Select-Object -ExpandProperty $property | Where-Object {$_.PrefixString -eq “SMTP”} | Foreach-Object {$_.AddressTemplateString -replace “.*@”, “”}; } function addDomains ([Microsoft.Exchange.Data.Directory.SystemConfiguration.AcceptedDomainType]$domainType) { $domain = $null; $input | Where-Object {-not $acceptedDomains.ContainsKey($_)} | Where-Object {[Microsoft.Exchange.Data.SmtpDomainWithSubdomains]::TryParse($_, [ref] $domain)} | Foreach-Object { $name = $domain.ToString(); if ($name.Length -gt 64) { $name = $name.Substring(0, 64) }; if ($acceptedDomains.ContainsValue($name) ) {$name = [System.Guid]::NewGuid().ToString()}; new-AcceptedDomain -Name:$name -DomainName:$domain -DomainType:$domainType; $acceptedDomains[$domain.ToString()] = $name; }; } $emailAddressPolicies = Get-EmailAddressPolicy; $emailAddressPolicies | getSmtpTemplates “NonAuthoritativeDomains” | addDomains “InternalRelay”; $emailAddressPolicies | getSmtpTemplates “EnabledEmailAddressTemplates” | addDomains “Authoritative”;” was run: “The property value is invalid. The value can’t contain leading or trailing whitespace. Property Name: Name”.
The property value is invalid. The value can’t contain leading or trailing whitespace. Property Name: Name
Now the interesting thing is that the error was repeated the exact number of recipient policies that existed in the exchange server 2003 running on the same domain. This indicated to me (now in correctly I understand) that each of the recipient policies had an invalid whitespace either before or after the policy name.
I really scratched my head a lot trying to resolve this, as I found there was not so much in the way of assistance available to the error that is given by exchange 2010.
That being: “The property value is invalid. The value can’t contain leading or trailing whitespace.”
So after exhausting all of my resources I installing exchange server 2007 service Pack 1. This area and with a slightly different error: “The Name property contains leading or trailing whitespace, which must be removed”
research on this led me fairly quickly to the following article: http://technet.microsoft.com/en-us/library/dd233089.aspx
What all of this is saying is that if you drill down to: configuration, CN services, first organisation, recipient policies. You will see a list of all of the recipient policies were the server. In the list on the far right is a column called a distinguished names. Hunt very carefully within all of the darter under the distinguished names column and look very closely for a backslash “\”
Note the recipient policy that the backslash is found on, and go to the exchange system manager and in the recipient policies edit the associated recipient policy to remove the space which the backslash represents that she found in the step above.
Once you have edited or all of the recipient policies that have a backslash in them to remove the associated whitespace or blank space you will find the exchange server 2010 will install successfully. And for that matter I expect that exchange server 2007 would install just as easily.
You really do have to love the Microsoft installation process, that can fail with an error that is completely meaningless, but still seven lines deep a completely random useless code that does everything except tell you the associated recipient policy that is in error. Microsoft I wish you could feel our pain!
Hope you find this helpful. Please see more at: http://www.interactivewebs.com
As you may be aware, there are some issues with CRM 4.0 and performance being inhibited by AsyncOperationBase table growth.
There are a few blogs on the AsyncOperationBase problem here.
2. Performance is slow if the AsyncOperationBase table becomes too large in Microsoft Dynamics CRM 4.0
3. Deadlocks, Performance issues, MSCRM database growth, AsyncOperationBase table increase
4. Managing size of AsyncOperationBase table in CRM 4.0
These great resources lead us down a path of discovery that the is no automated way in CRM to manage this problem. There is however some code examples in the SDK that allow you to place an automated process into the CRM server that can be viewed and managed from within CRM.
Only problem is that you need to be a coder to make the SDK process call and action the reoccurring job.
I thought this was a bit “Microsoft”. Not being a coder myself, but being surrounded by a bunch of really very cleaver guys, I asked one of them to whip me up a tool that I could run as an application from my desktop and make the calls into the different CRM system we manage to make the cleanup job.
What I ended up with was a tool we call CRM Automatic AsyncOperationBase Delete Tool.
The program will auto detect if you are running on a 32 or 64 bit system. Unfortunately this is necessary because the SDK code is Bit Dependent.
Once running the application will let you enter either a local CRM installation or an IFD CRM setup, and activate a deletion job to run on schedule inside CRM.
We are making this a free application, as I personally know what a challenge it is to be an Administrator of CRM 4.0 without being an asp.net coder. I do hope that it helps others. If you find it a time saver, and want to make a donation, you can do that from within the application. Otherwise if you are financially challenged, we would always love a blog post and a back link to http://www.interactivewebs.com SEO is important to us.
While installing MS CRM Rollup 8 or MS CRM rollup 9, we received an error that looked like this:
—————————
Microsoft Dynamics CRM 4.0 Update Rollup 9
—————————
Action Microsoft.Crm.Setup.Common.Update.DBUpdateAction failed.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
Invalid length parameter passed to the LEFT or SUBSTRING function.
Cannot insert the value NULL into column ‘InvoiceNumber’, table ’sdia_MSCRM.dbo.InvoiceBase’; column does not allow nulls. UPDATE fails.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
The statement has been terminated.
—————————
Retry Cancel
—————————
It turns out this error is caused by an invoice having an invalid invoice number. By default, MS CRM gives invoices numbers that look something like this: INV-06881-39HRRD
In our CRM project, we had some invoice number formats being inserted manually by a remote Events Booking system we have written for the web (cool application actually). This used slightly different format invoice numbers intentionally. The solution to the problem was to either remove or renumber in the same format the invoice records. Once your invoice numbers are all as CRM expects them, then you can install either or both updates.
This is a SQL script that may help:
Execute this SQL script to generate correct invoice number, specifying
correct length for your invoice number format
(verify in your CRM parameters Automatic Numbering for invoice):
@InvoiceNumberPref = 'INV'
@invoicePART1Len = 5
@invoicePART2Len = 6
In this case : INV-02365-6Y5TRE
-- Start Script ----------------------------------------
DECLARE @InvoiceNumberPref nvarchar(5)
SET @InvoiceNumberPref = 'INV'
DECLARE @invoicePART1Len int
SET @invoicePART1Len = 5
DECLARE @invoicePART2Len int
SET @invoicePART2Len = 6
DECLARE @i int
DECLARE @j int
DECLARE @n int
DECLARE @strnum nvarchar(10)
DECLARE @RandomChars nvarchar(10)
DECLARE @RandomInvoiceNumber nvarchar(20)
SET @j = 1
DECLARE @invoiceid nvarchar(50)
DECLARE @invoicenumber nvarchar(20)
DECLARE cursor_invoices CURSOR FOR
SELECT CONVERT(NVARCHAR(50),invoiceid), invoicenumber FROM dbo.invoice
order by createdon
OPEN cursor_invoices
FETCH cursor_invoices INTO @invoiceid, @invoicenumber
WHILE @@FETCH_STATUS = 0
BEGIN
SET @strnum = CONVERT(nvarchar(10), @j)
SET @j = @j + 1
SET @strnum = REPLICATE('0', @invoicePART1Len-LEN(@strnum)) + @strnum
SET @RandomChars = ''
SET @i = 0
WHILE @i < @invoicePART2Len
BEGIN
SET @n = ASCII(0)+CEILING(RAND()*(ASCII('Z')-ASCII(0)))
--exclude value range 58-64
IF @n>ASCII(9) AND @n<ASCII('A') SET
@n=ASCII(0)+CEILING(RAND()*(ASCII(9)-ASCII(0)))
SET @i = @i + 1
SET @RandomChars = @RandomChars + NCHAR(@n)
END
SET @RandomInvoiceNumber = @InvoiceNumberPref + '-'+@strnum+'-'+@RandomChars
PRINT @invoiceid + ' ' + @invoicenumber + ' ' + @RandomInvoiceNumber
UPDATE invoicebase
SET invoicenumber = @RandomInvoiceNumber
WHERE invoiceid = @invoiceid
FETCH cursor_invoices INTO @invoiceid, @invoicenumber
END
CLOSE cursor_invoices
DEALLOCATE cursor_invoices
Check out our website for more CRM integration into DotNetNuke.
There is a lot of information online about the MS CRM performance issues and very large database file sizes. Without going into MS CRM (you can Google that) it is by design. Can you believe that!
CRM is set to record everything that is going on, and for most people, most of the transaction logging in the AsyncOperationBase table is just junk. Now you would expect that there is a little in application sort of… clean up your junk… feature in CRM, but alas we are dreaming of some Apple product. For this reason, the database has to be manually cleared, or an auto process set to do this manually.
So the situation before me now is a massive database of 20GB with almost 17 million transactions listed.
This server I am looking at is Windows 2008, and the SQL server is also Windows 2008.
These are the steps to fix this problem in this case.
1. Log in to SQL Management Studio with an administrator account that has full access to the database in question.
2. The database will loos like ORGNAME_MSCRM and you right click and select New Query
3. Copy and paste the script below into the SQL Query window and select the Execute Button (that does not look like a button till you hover)
Select Count(*) from AsyncOperationBase
You will end up with a query result that show the number of records that will need to be addressed, this will give you a good indication of the time it will take. 17 million = a long time!
Because of this big number, I am going to take some steps to improve the performance that this query will run.
4. Backup the database to ensure you have a safe starting point.
5. Shrink the Database by right clicking and selecting tasks, shrink, database:
Then OK on the default settings.
6 Then improve performance by creating some indexes for the cleanup query. Paste this code over the Query Code in step 3, and execute.
CREATE NONCLUSTERED INDEX CRM_AsyncOperation_CleanupCompleted
ON [dbo].[AsyncOperationBase] ([StatusCode],[StateCode],[OperationType])
GO
CREATE NONCLUSTERED INDEX CRM_WorkflowLog_AsyncOperationID ON [dbo].[WorkflowLogBase] ([AsyncOperationID])
GO
CREATE NONCLUSTERED INDEX CRM_DuplicateRecord_AsyncOperationID ON [dbo].[DuplicateRecordBase] ([AsyncOperationID])
GO
CREATE NONCLUSTERED INDEX CRM_BulkDeleteOperation_AsyncOperationID ON [dbo].[BulkDeleteOperationBase]
(AsyncOperationID)
GO
This little baby may spin for some time:
7. Stop the Microsoft CRM Asynchronous Processing Service in the Server Services, found under the Administrator tools / Services
8. Set Simple Database Recovery. Right click the database and select Properties / Options / Recovery Model to simple
9. Run this command in the SQL Query, like in step 3
-- Rebuild Indexes & Update Statistics on AsyncOperationBase Table
ALTER INDEX ALL ON AsyncOperationBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
GO
-- Rebuild Indexes & Update Statistics on WorkflowLogBase Table
ALTER INDEX ALL ON WorkflowLogBase REBUILD WITH (FILLFACTOR = 80, ONLINE = OFF,SORT_IN_TEMPDB = ON, STATISTICS_NORECOMPUTE = OFF)
GO
You will probably see your database almost double in size with this one.
10. Then finally run the command that will clean up the database
declare @DeleteRowCount int
Select @DeleteRowCount = 2000
declare @DeletedAsyncRowsTable table (AsyncOperationId uniqueidentifier not null)
declare @continue int, @rowCount int
select @continue = 1
while (@continue = 1)
begin
begin tran
insert into @DeletedAsyncRowsTable(AsyncOperationId)
Select top (@DeleteRowCount) AsyncOperationId
from AsyncOperationBase
where OperationType in (1, 9, 12, 25, 27, 10) AND StateCode = 3 AND StatusCode in (30, 32)
Select @rowCount = 0
Select @rowCount = count(*) from @DeletedAsyncRowsTable
select @continue = case when @rowCount <= 0 then 0 else 1 end
if (@continue = 1)
begin
delete WorkflowLogBase from WorkflowLogBase W, @DeletedAsyncRowsTable d
where W.AsyncOperationId = d.AsyncOperationId
delete BulkDeleteFailureBase From BulkDeleteFailureBase B, @DeletedAsyncRowsTable d
where B.AsyncOperationId = d.AsyncOperationId
delete AsyncOperationBase From AsyncOperationBase A, @DeletedAsyncRowsTable d
where A.AsyncOperationId = d.AsyncOperationId
delete @DeletedAsyncRowsTable
end
commit
end
Executing just as we did in step 3.
11. Reset the database to Full Recovery Mode, reversing the step we took in step 8.
12. Shrink the database again exactly as we did in step 5.
13. Start the Service again, reversing step 7.
And you should be good to go. More information on this and DotNetNuke Modules.
Call to IT Department
Caller: Hi, our printer is not working.
Customer Service: What is wrong with it?
Caller: Mouse is jammed.
Customer Service: Mouse? Printers don’t have a mouse.
Caller: Mmmmm…….. oh really?… I will send a picture.
The Feedback Designer Module for DotNetNuke can easily have the text buttons replaced with images. These images can simulate buttons.
To make the change you simply:
1. Login as Host or Admin to your dnn site
2. Configure the module
3. from the menu, select “Modify Look and Feel”
4. From the Send / Reset Settings select “Image” from the Text of Button options
5. Select your images from your site directory
6 Save your changes
Powered by Yahoo! Answers