Wednesday, July 8, 2015

Installation Management Reporter 2012 for Dynamics AX 2012 Error


During the recent installation of Management Reporter, I used the wrong Service Port(8101) in my case which was 8201 I have mistakenly put 8101. Consequently, the installation failed. The error message in the log file was:


System.ServiceModel.ProtocolException: You have tried to create a channel to a service that does not support .Net Framing. It is possible that you are encountering an HTTP endpoint. ---> System.IO.InvalidDataException: Expected record type 'PreambleAck', found '72


To Solve this error please check service endpoint port by opening config file in notepad  C: \ Program Files \ Microsoft Dynamics AX \ 60 \ Server \ MicrosoftDynamicsAX \ bin \ ax32serv.exe.config


Friday, April 3, 2015

AX2012 R3 Creating product variants using X++

static void DSCreateVarientforAllproducts(Args _args)
{
EcoResProductVariantCreationMgr ecoResProductVariantCreationMgr;
EcoResProductMaster             EcoResProductMaster;
EcoResDistinctProductVariant ecoResDistinctProductVariant;
EcoResProductReleaseManagerBase releaseManager;
args                            args;
int                             i;
    while select EcoResProductMaster 
    {
        i++;
        args = new args();
        args.record(EcoResProductMaster);

        EcoResProductVariantCreationMgr = null;

        EcoResProductVariantCreationMgr =  ecoResProductVariantCreationMgr::newFromArgs(args);
        ecoResProductVariantCreationMgr.parmCalledfromjob(true); // Added in ecoResProductVariantCreationMgr class to select all varients to release
        ecoResProductVariantCreationMgr.buildVariantSuggestions();
        ecoResProductVariantCreationMgr.run();
        EcoResProductMaster::updateVariantDescriptions(EcoResProductMaster.RecId); // To Generate Varient Descritoin of all varients
        
        select ecoResDistinctProductVariant where ecoResDistinctProductVariant.ProductMaster == EcoResProductMaster.RecId;
        if (ecoResDistinctProductVariant && !ecoResDistinctProductVariant.isReleased())
        {
            releaseManager = EcoResProductReleaseManagerBase::newFromProduct(ecoResDistinctProductVariant);
            releaseManager.release();
        }

        print i;
    }
}

Tuesday, January 27, 2015

"The internal time zone version number stored in the database is higher than the version supported by the kernel (8/7). Use a newer Microsoft Dynamics AX kernel.

"The internal time zone version number stored in the database is higher than the version supported by the kernel (8/7). Use a newer Microsoft Dynamics AX kernel

After Restoration of Database from one evironment to other we found one issue in AX 2012 R3 as

"Fatal SQL condition during login. Error message: "The internal time zone version number stored in the database is higher than the version supported by the kernel (8/7). Use a newer Microsoft Dynamics AX kernel."

Solution was simple

For the resolution you need to change the value for the column value  SYSTIMEZONESVERSION  in the table "SQLSystemVariables". if you look into the event viewer you can see that it find the value 8, but you need 7 (8/7).

Hence, 
The solution is to set the value to 7.

Select SYSTIMEZONESVERSION from SQLSystemVariables

update SQLSystemVariables
set SYSTIMEZONESVERSION = 7

Thursday, July 10, 2014

Number Sequence Error in AX 2012

While creating new number sequence we may come across this error "Default scope cannot be implicitly determined by the number sequence framework for the given datatype. Please provide scope information explicitly."

This generally comes when there is a conflict in a scope which is being entered in NumberSeqModule class and later changed fix this issue by below steps

*Please try this in testing environment first this will impact currently running number sequence as well

1. Find the EDT number which is conflicting
2. Run below job with EDT number
static void delteDatatyperef(Args _args)
{
    NumberSequenceDatatypeParameterType NumberSequenceDatatypeParameterType;
    NumberSequenceDatatype      NumberSequenceDatatype,lNumberSequenceDatatype;
    
    RefRecId    RefRecId = 105035;
    
    select NumberSequenceDatatype where NumberSequenceDatatype.DatatypeId == RefRecId;
    ttsBegin;
    delete_from NumberSequenceDatatypeParameterType where NumberSequenceDatatypeParameterType.NumberSequenceDatatype == NumberSequenceDatatype.RecId;
    delete_from lNumberSequenceDatatype where lNumberSequenceDatatype.DatatypeId == RefRecId;
    ttsCommit;
    

}

3. Run NumberSeqApplicationModule.load(); in another job as per module which is conflicting 

All will be working fine after this.



Thursday, April 17, 2014

How to change the value of a default dimension of a record in AX 2012

static void changeDimensionValue(Args _args)
{
    DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
    DimensionAttribute dimensionAttribute;
    CustTable custTable = CustTable::find("US-014");
    DimensionValue oldDimensionValue;
    DimensionValue newDimensionValue = "011";
    DimensionDefault newDimensionDefault;

    #define.dimensionName("CostCenter")

    DimensionValue getDimensonValue(DimensionDefault _dimensionDefault)
    {
        DefaultDimensionView defaultDimensionView;
        select firstonly DisplayValue
        from defaultDimensionView
        where defaultDimensionView.Name == #dimensionName
            && defaultDimensionView.DefaultDimension == _dimensionDefault;

        return defaultDimensionView.DisplayValue;
    }

    // Get current value
    oldDimensionValue = getDimensonValue(custTable.DefaultDimension);

    // Build DimensionAttributeValueSetStorage
    dimensionAttributeValueSetStorage = DimensionAttributeValueSetStorage::find(custTable.DefaultDimension);

    // Remove old dimension value
    dimensionAttribute = DimensionAttribute::findByName(#dimensionName);
    dimensionAttributeValueSetStorage.removeDimensionAttributeValue(
        DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, oldDimensionValue).RecId);

    // Set new dimension value
    if(newDimensionValue != "")
    {
        dimensionAttribute = DimensionAttribute::findByName(#dimensionName);
        dimensionAttributeValueSetStorage.addItem(
            DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, newDimensionValue));
    }

    newDimensionDefault = dimensionAttributeValueSetStorage.save();

    ttsbegin;
    custTable.selectForUpdate(true);
    custTable.DefaultDimension = newDimensionDefault;
    custTable.update();
    ttscommit;

}

Wednesday, July 17, 2013

Job to get the position of an employee to print

static void GetEmplPosition(Args _args)
{
   HcmWorker hcmWorker;
   HcmPositionWorkerAssignment workerAssignment;
   HcmPosition hcmPosition;
   HcmPositionDetail   hcmPositionDetail;
 
   while select recid, person from hcmWorker
       join worker, position from workerAssignment
       where workerAssignment.Worker == hcmWorker.RecId
       join recid from hcmPosition
       where hcmPosition.RecId == workerAssignment.Position
       join position, description from hcmPositionDetail
       where hcmPositionDetail.Position == hcmPosition.RecId
   {       
       info(strFmt("%1's position is %2",hcmWorker.name(), hcmPositionDetail.Description));
   }
}




Wednesday, June 26, 2013

How to print export Dimensions

static void DAXPrintEmplDim(Args _args)
{

    HcmWorker worker;
    HcmEmployment employment;
    #AviFiles
    SysOperationProgress    progressBar = new SysOperationProgress();
    // Method to retuen dimension name
    str getDefaultDimensionValue(RecId defaultDimension, Name dimName)
    {
        str 255 ret;
        DimensionAttributeValueSetStorage dimStorage;
        dimStorage = DimensionAttributeValueSetStorage::find(defaultDimension);
        ret = dimStorage.getDisplayValueByDimensionAttribute(DimensionAttribute::findByName(dimName).RecId);
        return ret;
    }  
    // Initialising progress bar
    progressBar.setCaption("Printing in progress...");
    progressBar.setAnimation(#AviTransfer);

    while select worker
    {
        progressBar.setText(strfmt("Employee %1", worker.name()));
        employment = HcmEmployment::getActiveEmploymentsByWorker(worker.RecId);
        if(employment.DefaultDimension)
        {
            info(strFmt("%1, %2, Department Value: %3", worker.PersonnelNumber, worker.name(), getDefaultDimensionValue(employment.DefaultDimension, "Department")));
        }
    }
}