Search This Blog

Wednesday 9 November 2016

Error: Getting Enum Value in Container and assigning it to the Enum variable.

I just stop in one of the scenarios in which I was trying get the enum value from container and assigning it to the enum variable by converting its type from string to enum.

The code compiles well but at the run time it throws exception.


Below is the code that was causing an issue.

static void Job26(Args _args)
{
    container _bRMAccountTypes;
    BRMAccountType bRMAccountType;
    ;

    _bRMAccountTypes = [BRMAccountType::Business];

    bRMAccountType = str2Enum(bRMAccountType, conpeek(_bRMAccountTypes, 1));

    info(strfmt('%1', bRMAccountType));
}

After running it got the following exception.













To resolve this issue the simple solution is.

Do not type cast the enum value that you are getting from container and assign it directly to the enum variable.

like this.

static void Job26(Args _args)
{
    container _bRMAccountTypes;
    BRMAccountType bRMAccountType;
    ;

    _bRMAccountTypes = [BRMAccountType::Business];

    bRMAccountType = conpeek(_bRMAccountTypes, 1);

    info(strfmt('%1', bRMAccountType));
}

It will work fine and show the correct results:


















Thanks
Muhammad Zahid.

Tuesday 18 October 2016

Working with Dates in X++

Below is the link contains detail information about X++ dates conversion.

https://dynamicsaxed.wordpress.com/2015/06/04/working-with-dates-in-x/

and below is the link that contains detail information on how to use dynamics date ranges in SSRS reports dialog.

 https://blogs.msdn.microsoft.com/dpaxfeatures/2016/08/26/using-dynamic-query-values-sysqueryrangeutil-in-dynamics-ax/

inorder to see how to set start datetime of the day and end date time of the day than below is the link

https://www.tech.alirazazaidi.com/some-usefull-date-functions-in-dynamics-ax-x/

Thanks
Muhammad Zahid.


Tuesday 6 September 2016

Exists and notExists Join in Microsoft Dynamics AX 2009 and Microsoft SQL Server

Some times while creating the query to have set the criteria that select this record from table A if  the reference of table A is available in table b or not.

This criteria can be easily achieved by using the exists and not exists join.

Below is the query that is showing the Exit join in X++;

smmBusRelTable smmBusRelTable;
smmBusRelFarmActivity smmBusRelFarmActivity;

Select count(recid) from smmBusRelTable
        exists join smmBusRelFarmActivity
    where smmBusRelTable.BRMCreditlineStatus == BRMCreditlineStatus::Preapproved
    &&
    smmBusRelFarmActivity.BusRelAccount == smmBusRelTable.BusRelAccount
        && (smmBusRelFarmActivity.CodeSecondary == "Dairy sharemilker"
        ||  smmBusRelFarmActivity.CodeSecondary == "Contract milker"
        ||  smmBusRelFarmActivity.CodeSecondary == "Personal use"
        ||  smmBusRelFarmActivity.CodeSecondary == "Retired"
        ||  smmBusRelFarmActivity.CodeSecondary == "Lifestyle"
        || (smmBusRelFarmActivity.CodePrimary == "Contractor" && smmBusRelFarmActivity.IsPrimary == NoYes::Yes));

    info(strfmt('%1', smmBusRelTable.RecId));


The above query is fetching the records from table smmBusRelTable but based on the criteria that their reference should be available in smmBusRelFarmActivity table and the range that we have applied on that table.

Same thing we can achieve for the "not exist" join like if i want to fetch the records from table A based on the criteria that its reference record should not be exist in the table B.

Below is the query for the not exists join.

smmBusRelTable smmBusRelTable;
smmBusRelFarmActivity smmBusRelFarmActivity;

Select count(recid) from smmBusRelTable
    where smmBusRelTable.BRMCreditlineStatus == BRMCreditlineStatus::Preapproved
       NotExists join smmBusRelFarmActivity
    where smmBusRelTable.BusRelAccount == smmBusRelFarmActivity.BusRelAccount
        && (smmBusRelFarmActivity.CodeSecondary == "Dairy sharemilker"
        ||  smmBusRelFarmActivity.CodeSecondary == "Contract milker"
        ||  smmBusRelFarmActivity.CodeSecondary == "Personal use"
        ||  smmBusRelFarmActivity.CodeSecondary == "Retired"
        ||  smmBusRelFarmActivity.CodeSecondary == "Lifestyle"
        || (smmBusRelFarmActivity.CodePrimary == "Contractor" && smmBusRelFarmActivity.IsPrimary == NoYes::Yes));

 info(strfmt('%1', smmBusRelTable.RecId));

note: for non exist join in the above AX query I am first applying the range on parent table i.e smmBusRelTable than doing the non exist join on the child table i.e smmBusRelFarmActivity. if we apply the range on the parent table after the join than it will not fetch the correct number of records.
Previously i was applying the range on the parent table after the join and it was not showing the same result as from sql server query and when i apply the range first on parent table and than join than it shows the same results as compare to the sql server query.

If we want to run the same query in Sql Server we can also do this.

Below is the example for using the exists and not exits joins in Microsoft Sql Server.

Not Exit Join:

select count(SMMBUSRELTABLE.RECID) from SMMBUSRELTABLE
where  Not Exists (select * from SMMBUSRELFARMACTIVITY
where SMMBUSRELFARMACTIVITY.BUSRELACCOUNT = SMMBUSRELTABLE.BUSRELACCOUNT
        and (SMMBUSRELFARMACTIVITY.CodeSecondary = 'Dairy sharemilker'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Contract milker'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Personal use'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Retired'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Lifestyle'
        or (SMMBUSRELFARMACTIVITY.CodePrimary = 'Contractor' and SMMBUSRELFARMACTIVITY.IsPrimary = '1'))
)
and
SMMBUSRELTABLE.BRMCreditlineStatus = 1


Exist Join:

select count(SMMBUSRELTABLE.RECID) from SMMBUSRELTABLE
where   Exists (select * from SMMBUSRELFARMACTIVITY
where SMMBUSRELFARMACTIVITY.BUSRELACCOUNT = SMMBUSRELTABLE.BUSRELACCOUNT
        and (SMMBUSRELFARMACTIVITY.CodeSecondary = 'Dairy sharemilker'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Contract milker'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Personal use'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Retired'
        or  SMMBUSRELFARMACTIVITY.CodeSecondary = 'Lifestyle'
        or (SMMBUSRELFARMACTIVITY.CodePrimary = 'Contractor' and SMMBUSRELFARMACTIVITY.IsPrimary = '1'))
)
and
SMMBUSRELTABLE.CRTBRMCreditlineStatus = 1


This was all related to the exists and notexists joins in Microsoft Dynamics AX 2009 and Microsoft SQL Server.

Feel fry to comment or email me if you have any questions on this.

Thanks

Muhammad Zahid.


 


Thursday 1 September 2016

Sql Query Using Case (Decisions)

Like in programming we use if else check and switch cases to take decisions on run time based on the data

Same thing we can do during in Sql Query as well.

In most of the cases when we select the data from Sql Server by using Sql query we got the values 1,2,3 and so on for the columns containing data type bit.

To make this enum values usefull we have to convert enum values in to meaning full label.

Below is the example through which we can achieve this.

Select top 10
SMMBUSRELTABLE.CUSTACCOUNTNUM,
SMMBUSRELTABLE.BRMPriceLevel,
SMMBUSRELTABLE.CustGroup,
CASE SMMBUSRELTABLE.BRMAccountType
        WHEN '0' THEN 'Bushetts'
        WHEN '1' THEN 'Amnesty'
WHEN '2' THEN 'Business'
WHEN '3' THEN 'Family'
WHEN '4' THEN 'Internal'
WHEN '5' THEN 'Shareholder'
WHEN '6' THEN 'Staff'
WHEN '7' THEN 'Trade'
WHEN '8' THEN 'Standard(Corporate)'
WHEN '9' THEN 'Partnership'
WHEN '10' THEN 'Gulf'
WHEN '11' THEN 'Inter Island Card'
    END as BRMAccountType
from SMMBUSRELTABLE


Some time we have to check that for each specific row that we have fetch the column value is null or not and based on that we customize the value's in that column and show.

Below is the example to achieve this.

Select
CodePrimary,
CodeSecondary,
CASE 
        WHEN ADDRESStable.STREET IS NULL THEN 'NULL'
        ELSE 'Value Found'
    END as CustomerAddress 
from  ADDRESS as ADDRESStable


This was all related to the using of cases in Sql Query let me know if you have any issues on this.

Thanks
Muhammad Zahid.



Thursday 21 July 2016

X++ Find Legal Entities in Microsoft Dynamics AX.

Hi,

Some times while importing the cross company data in Microsoft Dynamics AX we need to check either the company define in excel column is exist in AX or not and some time we need to check either the company specified in AX is correct or not.

To check this thing below is the code snippet,

 xDataArea::exist(crtEDIInvoiceLine.Company);


Thanks
Muhammad Zahid.

Tuesday 16 February 2016

Use of Printers On The Server is not allowed (Dynamics AX 2009)

We have created a new feature in Microsoft Dynamics AX 2009 that once the invoice is posted successfully than its copy will email to the user.

When we ran the whole process in batch job it was failing,

after checking the logs of the batch job we got the error message which was causing the issue.

The Error message was:




















We have different AOS setup on that environment.After investigation we found out that the AOS server on which that batch job runs have some server configuration issue.

When we open the Server Configuration of that AOS Server we found out that the checkbox 'Allow Clients to connect to printers on this server' was un checked.













After checking that check box when we post the invoice again in batch mode it was successfully posted.

Further Details related to this issue can be seen on the below link.

http://mybhat.blogspot.co.nz/2011/05/running-batch-report-in-ax2009.html


Thanks
Muhammad Zahid.









Customize infolog in Microsoft Dynamics AX 2009

In Microsoft Dynamics AX 2009 you can customize the infolog to add some new buttons on it to open some other forms.

For example in my scenario I have to generate the word document and once the word document is generated successfully than I create a activity automatically and show the activity number on the infolog. once the user clicks on that activity number on the infolog than the show button is appears on the same infolog and when user clicks on that show button than it opens the activity form in edit mode so the user can change the values if they want.

Below is the screen shot of infolog containing activity number and show button.




















Now when i click on that show button than it will open the activity form with the same activity number already filtered in it.












Below is the code that I have use to customize the infolog.

info(strfmt('Activity Created Successfully activity number is %1', smmActivities.ActivityNumber), "", Sysinfoaction_tablefield::newBuffer(smmActivities));

note:on smmActivities table the property formRef is set to form smmActivities thats why its opens the form smmActivities.

Below is link for more information on customizing infologs.

https://community.dynamics.com/ax/b/vishalsblogonmsdynamicsax/archive/2013/05/03/sysinfoaction-class-go-to-main-table-from-infolog-message-in-ax-2009-ax-2012


Thanks

Muhammad Zahid.