Automatisering av utrullning av lösningsfiler Dynamics CRM

För att automatisera utrullning kan man använda sig av det fina biblioteket AdxStudio ALM Toolkit.

Här kommer ett exempel på ett PowerShell-script som man kan använda för att rulla ut sina lösningar:

param (
	[string]
	$environment
)

function Get-ScriptDirectory
{
	if ($script:MyInvocation.MyCommand.Path) { Split-Path $script:MyInvocation.MyCommand.Path } else { $pwd }
}

$scriptPath = Get-ScriptDirectory
& $scriptPath\ImportAlmModule.ps1

$crmenvs = @(
	[PSCustomObject]@{ Environment = "TEST"; Url = "https://crmhostname.tst/CRMORGANIZATION" },
	[PSCustomObject]@{ Environment = "UAT"; Url = "https://crmhostname.uat/CRMORGANIZATION" },
	[PSCustomObject]@{ Environment = "PROD"; Url = "https://crmhostname.prd/CRMORGANIZATION" }
)

if (-not $environment)
{
    $crmenvs | Format-Table

    Write-Host "Usage: " $script:MyInvocation.MyCommand.Name "-environment Environment"
}
else 
{

    $ImportSolutions = @(
        "$scriptPath\Customizations\clickdimensions.zip",
        "$scriptPath\Customizations\Solution_$Env:BUILD_BUILDNUMBER.zip",
        "$scriptPath\Customizations\SolutionSilverlight_$Env:BUILD_BUILDNUMBER.zip",
        "$scriptPath\Customizations\SolutionPlugins_$Env:BUILD_BUILDNUMBER.zip"
    )

    $crmenv = $crmenvs.Where{ $_.Environment -like $environment}

    Try 
	{
        $credential = New-Object System.Management.Automation.PSCredential -ArgumentList "username", (ConvertTo-SecureString -String “password” -AsPlainText -Force)

        $srcconn = Get-CrmConnection -Url "https://crmhostname.utv/CRMORGANIZATION" -Credential $credential
        $dstconn = Get-CrmConnection -Url $crmenv.Url -Credential $credential

        Write-Host "Exporting solution:"
        $res = Export-CrmSolution -Connection $srcconn -SolutionName "Solution" -OutputPath "$scriptPath\Customizations\Solution_$Env:BUILD_BUILDNUMBER.zip" -Managed -TargetVersion "6.1.0.0" -Verbose
        $res = Export-CrmSolution -Connection $srcconn -SolutionName "SolutionSilverlight" -OutputPath "$scriptPath\Customizations\SolutionSilverlight_$Env:BUILD_BUILDNUMBER.zip" -Managed -TargetVersion "6.1.0.0" -Verbose
        $res = Export-CrmSolution -Connection $srcconn -SolutionName "SolutionPlugins" -OutputPath "$scriptPath\Customizations\SolutionPlugins_$Env:BUILD_BUILDNUMBER.zip" -Managed -TargetVersion "6.1.0.0" -Verbose

        Write-Host "Importing solution:"
        Import-CrmSolution -Connection $dstconn -CustomizationPath $ImportSolutions -OverwriteUnmanagedCustomizations -PublishWorkflows -Verbose
    }
    Catch
    {
        $errmsg = "Error: " + $_.Exception.Message # $_.Exception.ItemName " Message: "
        Write-Error -Message $errmsg
        Break
    }
}

Funktion för att filtrera bort oönskade tecken beroende på edi teckenuppsättning

Här kommer en liten kodsnutt man kan använda i Inobiz för att filtrera bort oönskade tecken i ett edifactmeddelande:

/*
  input = string to process,
  charset = charset to use (unoa, unob, unoc)
  mode = alphanumeric or numeric (an, n)
  length = length of resulting string (including decimals)
  decimals = number of decimals (only used when mode == "n")
*/
string EdiString (string input, string charset, string mode, integer length, integer decimals)
{
  string regex, schar, editmask;
  
  if (mode == "n")
  {
    if (decimals > 0)
      editmask = "-" & fill ("Z", length - (decimals + 2)) & "9P" & fill("9", decimals);
	else
      editmask = "-" & fill ("Z", length - 1) & "9";
			
    input = removechars(edit(input, editmask), "+");
  }
  else
  {	
    if (tolower(charset) == "unoa")
    { 
      regex = "[^0-9A-Z.,_()\\/=\\\\\\+:?\"!'%&*;<> ]";
      input = translate(input, "åäöÅÄÖ", "aaoAAO");
      input = toupper(input);
    }
    else if (tolower(charset) == "unob") 
    {
      regex = "[^0-9A-Z.,_()\\/=\\\\\\+:?\"!'%&*;<> a-z]";
      input = translate(input, "åäöÅÄÖ", "aaoAAO");
    }
    else /* defaulfs to unoc */
      regex = "[^0-9a-z.,_()\\/=\\\\\\+:?\"!'%&*;<> A-ZåäöÅÄÖ]";
	  
    for (integer i = 1; i <  strlen(input) ; ++i)
    {
      schar = strpos (input, i);
			
      if (regexp(schar, regex) == 1)
	  {
        input = removechars(input, schar);
      }
    }
	  
    if (strlen(input) > length)
      input = substr(input, 1, length);
  }
  return input;
}

Prestandatips för sql-integrationer i Inobiz

Tänkte dela med mig av lite lärdomar om Inobiz när det gäller prestandaoptimering som jag lärt mig genom åren.

  1. Om du har tunga select-satser mot stora (och transaktionsintensiva tabeller) som du behöver iterera igenom se då till att använda WITH (READUNCOMMITTED) om möjligt eller ännu bättre skapa en temp-tabell som du läser ifrån. Dock finns det en bugg i ODBC-drivrutinen SQL Server Native Client 11.0 ODBC som ger felmeddelande om att man inte kan slå upp kolumntypen och för att komma runt detta får man just nu använda sig av permanenta temptabeller istället för brädgårdsvarianten.
    SkapaTemptabeller
  2. För stora mappningar med många nivåer kan det vara mycket effektivare att först omvandla till ett flatfilsformat i sql som mellanformat och sedan använda flatfilen som källa istället då Inobiz kommer göra en select för varje rad.
    MellanformatFranTemptabell
    FlatfiltillPricat
  3. Undvik i största möjliga mån att göra ytterligare select-satser under en select i Inobiz då detta i vissa fall med hög belastning kan resultera att den underordnade select-satsen inte körs. Detta gäller speciellt block som repeteras.
    subselect
  4. Är mappningen mot t.ex. ett EDIFACT-format så kan man förbättra prestandan genom att inaktivera segment som man inte använder.
    InaktiveraSegment

/Danny

Hjälp…

Jag tror jag har hittat bonusbanan till Super Mario Bros… Ingången var oväntat nog inte längre bort än i mitt kök.

Så nu måste jag ringa Mario och få hjälp med att hitta den bortrövade princessan här inne och kanske locka fram lite skönhet i rördragandets ädla konst…

Någon som har koll på vart Mario (Eller annan kompetent vvs:are med referenser) håller till nuförtiden?

 

20120610-224821.jpg