Información de tablas durante el desarrollo en Dynamics AX

Cuando se desarrolla para Microsoft Dynamics AX es muy común tener que consultar tipos de datos, nombres de campos, tablas, etc. para mantener la coherencia entre objetos nuevos y estándar. Esta consulta se puede hacer mediante las propiedades de los formularios (el botón Configurar del menú contextual estándar) y consultando el diseño o la query que se muestra en este formulario o yendo directamente al objeto del AOT:

Pero si esta consulta la tenemos que hacer muy a menudo, como al principio de un gran desarrollo, es molesto tener que hacer todos estos pasos cada vez y se puede consultar mucho mas fácilmente de esta manera:

Modificar la la clase SysSetupFormRun para añadir el siguiente método:

// jaestevan.com - Nuevo - Información de campos con Ctrl+Z
public int jaee_taskInfoCtrlZ(int _p1)
{
    #task
    FormDataSource      formDataSource;
    int                 ret;

    SysDictField        df;
    FormControl         fc;
    formStringControl   fsc;
    DictEnum            dictEnum = new DictEnum(enumnum(Types));
    DictEnum            dictEnums;
    ;

    // Si el usuario no tiene permisos de desarrollo, no hace nada
    if (!hasSecuritykeyAccess(securitykeynum(SysDevelopment), AccessType::Delete))
        return ret;
       
    if (_p1 == 769) // 769 = Ctrl + Z
    {
        fc = this.selectedControl();
        formDataSource =  this.objectSet();

        // Si está sobre un DataSource busca información sobre el registro
        if (fc && formDataSource)
        {
            fsc = fc;
            if (fsc.dataField() && formDataSource.table())
            {
                info(strfmt('T.Field    -> %2. %1',
                     fieldId2Name(formDataSource.table(), fsc.dataField() - 65536),
                     tableId2Name(formDataSource.table())));

                // Si es un campo de una tabla
                df = new SysDictField(formDataSource.table(), fsc.dataField() - 65536);
                if (df)
                {
                    info(strfmt('Type       -> %1', dictEnum.index2Symbol(df.baseType())));
                    if(df.baseType() == typeOf(Types::Enum))
                    {
                        dictEnums = new dictEnum(df.enumId());
                        info(strfmt('Enum Name  -> %1', dictEnums.name()));
                    }
                    info(strfmt('Extends    -> %1', extendedTypeId2name(df.typeId()) ));
                    info(strfmt('Size       -> %1', int2str(df.stringLen()) ));
                    info(strfmt('Max.Rights -> %1', df.rights()));
                    info(strfmt('Label      -> %1: %2', df.labelLabel(), df.label() ));
                    info(strfmt('Help       -> %1: %2', df.helpLabelId(), df.help() ));
                }
            }

            // Si es un mét odo (display/edit)
            if (fsc.dataMethod())
            {
                info(strfmt('METHOD %1.%2', tableId2Name(formDataSource.table()), fsc.dataMethod()));
            }
        }
    }

    return ret;
}

Y añadir el siguiente código al final del método estándar task que ya existe en esa clase:

// jaestevan.com - Modificado - Información de campos con Ctrl+Z
public int task(int _p1)
{
    ...

    // - jaestevan.com - Información de campos con Ctrl+Z
    if (!ret)
        ret = this.jaee_taskInfoCtrlZ(_p1);
    // + jaestevan.com + end

    ret = super(_p1);

    return ret;
}

El resultado es que estando encima de cualquier formulario del sistema, al hacer Ctrl+Z se mostrará la información del campo seleccionado directamente:

Y como el código esta diseñado para ignorarse si el usuario no tiene permisos de desarrollo no va a afectar a los usuarios finales. Pero en cualquier caso se puede eliminar limpiamente al pasar a producción.

NOTA: La idea de este código la obtube en otro blog pero no recuerdo en cual. Cuando lo encuentre actualizaré este post con el link original.

Descarga