I have a customer that gets a error every time the EventJobCUD-batch (Change Based Events) runs. They got the following error:

After some reseach I found out that when 2 fields are changed at the same time, you go several times through the listChangedFieldsEnumerator (location ClassesEventProcessorCUDprocessUpdate)

1
2
3
4
5
6
7
8
9

while(listChangedFieldsEnumerator.moveNext()){// In this simple case we use the new and the original changed field value as// recorded at event detection time:[thisFieldId, changedFieldValue, origChangedFieldValue]= listChangedFieldsEnumerator.current();
if(rule.AlertFieldId== thisFieldId)break;
}

while (listChangedFieldsEnumerator.moveNext())
{
// In this simple case we use the new and the original changed field value as
// recorded at event detection time:
[thisFieldId, changedFieldValue, origChangedFieldValue] = listChangedFieldsEnumerator.current();
if (rule.AlertFieldId == thisFieldId)
break;
}

The code underneed simulates the same situation in a small job:

1
2
3
4
5
6
7
8
9

staticvoid Job5(Args _args){anytype any;
;
any = ABC::A;
// next line will throw a error
any = BatchStatus::Canceled;
}

And here we get the basic same error “Error executing code: Wrong argument types in variable assignment.”

I modified the code so the anytype is assigned only when the field is correct:

1
2
3
4
5
6
7
8
9
10
11
12

while(listChangedFieldsEnumerator.moveNext()){// In this simple case we use the new and the original changed field value as// recorded at event detection time:
thisFieldId =conpeek(listChangedFieldsEnumerator.current(),1);
if(rule.AlertFieldId== thisFieldId){[thisFieldId, changedFieldValue, origChangedFieldValue]= listChangedFieldsEnumerator.current();
break;
}}

while (listChangedFieldsEnumerator.moveNext())
{
// In this simple case we use the new and the original changed field value as
// recorded at event detection time:
thisFieldId = conpeek(listChangedFieldsEnumerator.current(), 1);
if (rule.AlertFieldId == thisFieldId)
{
[thisFieldId, changedFieldValue, origChangedFieldValue] = listChangedFieldsEnumerator.current();
break;
}
}

Normally when you change your language you go to your user options, change your current language and the restart the client. This week I got the question if it was possible to do so in runtime. You can do so by just calling the infolog.language(str7 _languageCode). All labels that you load after calling this method will be translated to the new language. (more…)

This week one of my customers asked me to place the amount in words on a invoice. I couldn’t believe that sush function wasn’t availible in standard Ax. After some research I found that the Global-class contains the following methods:

While surfing the web, I came across a blog from 2 friends (Youri De Brabandere and Christof Decraene) about Enterprise Portal development. For the moment they have only a few posts, but I’m sure their will be more soon.

At one of the customers I’m currently working they took the decision to take a look at the spaghetti of security keys. We made a plan of how the new basic security-structure should look like and implemented it. After releasing this new more logical security structure we started to get the message ‘%2 %1 not initialised.‘.

After some research we discovered this issue occurred only with a few user groups and that the message only exists in the KTD-files, so it is kernel related. We checked the AccessRightsList-table for some inconsistencies but no luck. In the end we found a work-around that helped us solving this issue. When we make a export of the security and afterwards we import the export we just made, the issue disappeared by itself. Because there are a lot of user groups that could be infected with this issue, we automated this fix by running the import – export in a job.

Me and some of my colleagues are currently working with a customer on a Ax 2009 SP1 RU4. The other day we came to the conclusion that the modified methods on fields in a form suddenly disappeared. I know, you should write as less as possible code on a form, but sometimes there is no way around this.

After some research we found a reproduction how these methods suddenly disappeared:

The result is that the table will be reloaded in the form and all methods you created on the fields will be gone. So here you have another reason why you shouldn’t write lots of code on your forms. You can only lose it by accident.

I was using the postload method of the HRMBenefitType-table to fill the description-field with language-sensitive description (from LanguageTxt). This works fine when I view the record, but not when I use a lookup.

I’ve put a break-point on my postload method and noticed the recId (this.recid of the HRMBenefitType table). This is always the 101090. When I check this in the tablebrowser, this does not match the actual RecId valule.
I checked the SQL-trace-log and noticed the following instruction:

SELECT A.HRMBENEFITTYPEID,A.DESCRIPTION,A.RECVERSION,101090 FROM HRMBENEFITTYPE A WHERE (DATAAREAID=?) ORDER BY A.DATAAREAID,A.HRMBENEFITTYPEID OPTION(FAST 1)

The solution to this problem is simple. Just change the CacheLookup property to EntireTable and the strange behaviour of the RecId-field stops.

While I was checking my previous Enterprise Portal titlebar issue, me and my colleagues found a second bug. When you use a single quote (‘) in the PageTitle, the name of the Page Defenition object is displayed instead of the actual label with the singel quote. We couldn’t find a solution yet, but we’re still looking.