mercoledì 11 novembre 2015

HOWTO: Turning off the Synchronize Database form on Dynamics AX 2012

It is possible that the Synchronize Database form is now showing up unexpectedly during some of your scripts, if so you can programmatically set it on or off using the SysSqlSync ShowSysSqlSync global cache setting, here is a job that will turn off the form and automatically synchronize:
static void ShowSysSqlSync(Args _args)
{
    SysGlobalCache gc;
    str owner = 'SysSqlSync';
    str key   = 'ShowSysSqlSync';
    boolean showEnabled = false; //set to true to enable.
    ;
    gc = appl.globalCache();
    gc.set(owner, key, showEnabled);
    info(strfmt('Show SqlSync: %1', gc.get(owner, key))); 
}

giovedì 1 ottobre 2015

TIP: InventSum don't update ModifiedDateTime and ModifedBy fields

On my project i need to know how InventSum are updated , but when i activate the modified datetime the field this has no be automatic updated.
Than, thanks to this post http://blogs.technet.com/b/dynamicsaxse/archive/2010/12/29/fields-modifieddatetime-and-modifiedby-on-table-inventsum.aspx, i found a good solution.

Warning:, it's a kernel solution, than use it with care.

The InventSum update is made by a class, the InventUpdateOnHand
On this classe there is a method that build a SQL statement for the UPDATE of InventSum table.
I made a customization here and add on the UPDATE statement the MODIFIED fields.
There customization are made only for SQL server database.

Here the XPO of customization:
https://drive.google.com/open?id=0B3gigtHeLE6gY1pLVEVNcUpvLTA

On the method sqlUpdateStr you can comment out the IF clause to debug it on runtime, remember to comment out on production env.

martedì 30 giugno 2015

HOWTO: Detecting default values

So I haven’t posted in a long time. I finally fixed some technical issues on the blog and upgraded to a recent version of WordPress. Let’s start with a quick tip to warm up :)
As you know X++ supports methods with default values. In Ax it’s possible to detect when such a default value was used at runtime with prmIsDefault(). To see this for yourself, create a class with a method like this:

void someMethod(int i = 1)
{
    ;
 
    if (prmIsDefault(i))
    {
        info('Default');
    }
    else
    {
        info('Value given');
    }
}
 
And call it from another method.
    o.someMethod();
    o.someMethod(1);
 
Even though the value is the same in both cases a different info message will be displayed.
Now you may be wondering how this can be useful. Some scenarios:
  • Avoiding expensive operations if the default value was used
  • Avoiding unwanted initializations
  • Dealing with customizations that require extra parameters in standard Ax classes
If you do a search for prmIsDefault() in the AOT you will see it’s used often. Classes with the Ax prefix are the most obvious example. Because getters and setters are rolled into a single method it’s necessary to know if the method was used as a getter or a setter and keep track of modified fields.

Reposted from http://sysdictcoder.com/detecting-default-values/

venerdì 5 giugno 2015

HOWTO: Get EcoResColor name by InventColorId

Step 1: Retrive ecoResProductMasterColor

select ecoResProductMasterColorwhere ecoResProductMasterColor.Color == EcoResColor::findByName(inventDim.InventColorId).RecId
&& ecoResProductMasterColor.ColorProductMaster == inventTable.Product
&& ecoResProductMasterColor.ColorProductDimensionAttribute == EcoResProductDimensionAttribute::inventDimFieldId2DimensionAttributeRecId(fieldNum(InventDim, InventColorId))
;


Step 2: Get color translation

EcoResProductMasterDimValueTranslation::findByProductMasterDimValLanguage(ecoResProductMasterColor.RecId, 'it').Name 

lunedì 4 maggio 2015

HOWTO: Check is a field is mapped to a field on a Map

If you add a new field on a Map, but you cannot map the field to all tables you need to check, on map common methods, if the field is mapped on the table you are going to update, if you don't to it the system raise an error.

For to this you can use this function:
https://msdn.microsoft.com/en-us/library/global.mappingexists.aspx

An example of use is:

if (Global::mappingExists(tableNum(SalesPurchLine), this.TableId, fieldNum(SalesPurchLine, MYFIELD)))
  this.MYFIELD = AVALUE;


Check MSDN docs for details of the mappingExists global function

martedì 7 aprile 2015

HOWTO: Merge ledger and financial dimensions using X++ code

To merge two or more financial dimensions use this script.
DimensionDefaultingService::serviceCreateLedgerDimension(ledgerDimension,customerDefaultDimension);
You can merge more  than 2 dimension, infact you case specify some default dimensions to merge

ISSUE: Standard view is displayed as table in AOT on AX2012

Today I found a strange error in the development environment, do not know what was the triggering event but a standard view become visible under table node and the syncronization failed.

From research I found this post:
http://community.dynamics.com/ax/f/33/t/118864.aspx

and then another post with a more in-depth: http://community.dynamics.com /ax/f/33/p/119471/249240.aspx?WT.mc_id=ForumPost#249240

In my case I solved using a direct SQL patch way.

The solution is to restore the table properties on model database coping it from another standard model store or as in my case the production env database.

1. Stopped the dev AOS
2. Removed from the table SQLDictionary any object references
3. Removed from the database the view refers to object (check if there are a table also)
4. Check the object properties on the model database:

SELECT m.ElementType, m.Name, m.AxId, md.LayerId, manifest.DisplayName, md.Properties as Metadata
              FROM [dbo].ModelElement AS m
              INNER JOIN [dbo].ModelElementData AS md
                             ON m.ElementHandle = md.ElementHandle
              INNER JOIN [dbo].ModelManifest AS manifest
                             ON md.ModelId = manifest.ModelId
              AND m.ElementType = 44 AND m.Name = 'DirPartyLookupGridView'

5. Check the object properties on the other model database:

SELECT m.ElementType, m.Name, m.AxId, md.LayerId, manifest.DisplayName, md.Properties as Metadata
              FROM MicrosoftDynamicsAXBaseline.[dbo].ModelElement AS m
              INNER JOIN MicrosoftDynamicsAXBaseline.[dbo].ModelElementData AS md
                             ON m.ElementHandle = md.ElementHandle
              INNER JOIN MicrosoftDynamicsAXBaseline.[dbo].ModelManifest AS manifest
                             ON md.ModelId = manifest.ModelId
              AND m.ElementType = 44 AND m.Name = 'DirPartyLookupGridView'
6. Update the object properties coping it from the other model database:

Update md Set md.Properties = md_base.Properties
FROM [dbo].ModelElement AS m
              INNER JOIN [dbo].ModelElementData AS md
                             ON m.ElementHandle = md.ElementHandle
              INNER JOIN MicrosoftDynamicsAXBaseline.[dbo].ModelElement AS m_base
                             ON m.ElementType = m_base.ElementType AND m.Name = m_base.Name
              INNER JOIN MicrosoftDynamicsAXBaseline.[dbo].ModelElementData AS md_base
                             ON m_base.ElementHandle = md_base.ElementHandle
AND m_base.ElementType = 44 AND m_base.Name = 'DirPartyLookupGridView' AND md_base.LayerId = 0

WARNING: Use the script on your own risk and evalute the impact on you env and warranty

AX 2012: The request was aborted: Could not create SSL/TLS secure channel

The error you're encountering, "The request was aborted: Could not create SSL/TLS secure channel," can occur due to various re...