Search code examples
axaptax++dynamics-ax-2009

AX2009 update form field value


I want to auto-update the Format field of the NumberSequenceTable form. The purpose is to help the user while manually entering the data.

For example this field should preferably be updated with concatenated values of the fields Number sequence code and Largest.

enter image description here


Solution

  • After thinking for a while I decided to change the underlying table NumberSequenceTable. I changed its "modifiedField" method by adding another case to the already existing switch statement. I think this is the accepted best practice in such cases:

    public void modifiedField(fieldId _fieldId)
    {
        #Define.DefaultCleanInterval(24)
        #Define.DefaultCacheSize(10)
    
        str sequenceFormat;
    
    
        super(_fieldId);
    
        switch (_fieldId)
        {
            ....
    
            //BEGINING
            case fieldnum(NumberSequenceTable, NumberSequence):
                if (this.NumberSequence && this.Highest && !this.Format)
                {
    
                   sequenceFormat = System.Text.RegularExpressions.Regex::Replace(int2str(this.Highest), "[0-9]", "#");
                   this.Format = strFmt("%1_%2",this.NumberSequence, sequenceFormat);
    
                }
                break;
             //END 
    
            default :
                break;
        }
    } 
    

    My previous solution involved overriding the "enter" method on the form field. However this would not be in line with best practices. For information purposes I am pasting here the initial solution.

    public void enter()
    {
        str sequenceNode;
        str sequenceValue;
        str maxValue;
        str formatValue;
        ;
    
        super();
    
    
        //Get required fields value
        sequenceNode = numberSequenceTable_ds.object(fieldnum(NumberSequenceTable,NumberSequence)).getValue();
        maxValue = numberSequenceTable_ds.object(fieldnum(NumberSequenceTable,Highest)).getValue();
        formatValue = numberSequenceTable_ds.object(fieldnum(NumberSequenceTable,Format)).getValue();
    
        if(sequenceNode && maxValue && !formatValue) {
    
        //Match regex pattern
        maxValue =  System.Text.RegularExpressions.Regex::Replace(maxValue, "[0-9]", "#");
        sequenceValue = strFmt("%1_%2",sequenceNode,maxValue);
    
        //Change field value
        numberSequenceTable_ds.object(fieldnum(NumberSequenceTable,Format)).setValue(sequenceValue);
        this.update();
        }
    }