Buscar en este blog

martes, 27 de octubre de 2015

Particiones en Dynamics Ax 2012 R2

Para dynamics Ax R2 y R3 existe un termino llamado particiones, estas particiones nos permiten compartir información entre empresas que pertenezcan a la misma partición y aislar estos datos del resto de las particiones.

Estas particiones a nivel usuario podemos verlas desde Administración del sistema > Configurar > Particiones.


Nosotros como desarrolladores, lo que debemos saber acerca de las particiones es que con una sentencia de consulta de datos sobre ax no podemos accesar a los datos de otra compañia que se encuentre en distinta partición aunque sea la misma instalación de Ax y la misma base de datos, si alguna vez necesitamos datos de distintas particiones esto debería realizarse por SQL. O si es necesario hacerlo desde ax, aquí un link de cómo realizar una consulta.

En Ax, cada clave y nombre de partición esta almacenada con un identificador. Este identificador es un campo llamado RecId en una tabla y que no es otra cosa que un Int64. Con este identificador Ax guarda el identificador de la partición en todos los registros de todas las tablas para saber a cuál partición pertenece el registro que se ha insertado en la tabla.

Una descripción gráfica de cómo es posible dividir las particiones se encuentra en el siguiente diagrama:

De acuerdo al diagrama, los usuarios de una compañia A tienen cierta configuración de acceso y no podrian entrar a la compañia Z una vez que ya iniciaron Ax. Aunque de otra forma, los usuarios de la compañia A comparten datos de los productos que se comercializan con la compañia B.

Si necesitas saber mas acerca de la arquitectura, link de Microsoft.


Post que podrían interesarte:
Menu de tutorial de desarrollo
Reportes SSRS en Ax



Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo. O comenta si quieres saber sobre algún tema en específico.

No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 




jueves, 22 de octubre de 2015

Actualizar información de direcciones en clientes por código X++ en Dynamics Ax 2012

En el post anterior les compartí un código para crear clientes ya sean personas o empresas con su dirección e información de contacto, aquí les comparto cómo actualizar estos datos. Espero les sea de utilidad.

static void JobActualizaClientePersona(Args _args)
{
    CustTable                    custTable;
    NumberSeq                    numberSeq;
    Name                         name = 'Jorge Lopez';
 
    DirParty                        dirParty;
    DirPartyPostalAddressView       dirPartyPostalAddressView;
    DirPartyContactInfoView         dirPartyContactInfo;
    ;
 
    ttsBegin;
 
   try
    {
        custTable = custTable::find( "C000020695"); 
       
        select dirPartyPostalAddressView
        where dirPartyPostalAddressView.Party == custtable.Party
        && dirPartyPostalAddressView.IsPrimary == NoYes::Yes;
       
        //DirParty
        //Crea instancia de la clase DirParty a partir de dirPartyPostalAddressView
        //Actualiza dirección principal
        DirParty = DirParty::constructFromPartyRecId(dirPartyPostalAddressView.Party);
 
        dirPartyPostalAddressView.LocationName      = 'Oficina central ';
        dirPartyPostalAddressView.City              = 'Polanco Chapultepec';
        dirPartyPostalAddressView.Street            = 'Presidente Masarik';
        dirPartyPostalAddressView.StreetNumber      = '25';
        dirPartyPostalAddressView.CountryRegionId   = 'MEX'; //necesita ser un país valido
        dirPartyPostalAddressView.State             = '09' //necesita ser un estado valido
 
        // Llena dirección
        dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
 
        //Actualiza email de información de contacto
        dirPartyContactInfo.clear();
       
        select dirPartyContactInfo
        where dirPartyContactInfo.Party == custtable.Party &&
        dirPartyContactInfo.Type == LogisticsElectronicAddressMethodType::Email;
       
        DirParty = DirParty::constructFromPartyRecId(dirPartyContactInfo.Party);
       
        dirPartyContactInfo.LocationName    = 'Email Jorge Lopez';
        dirPartyContactInfo.Locator         = 'jorge.lopez222@gmail.com';
        dirPartyContactInfo.Type            = LogisticsElectronicAddressMethodType::Email;
        dirPartyContactInfo.IsPrimary       = NoYes::Yes;
 
        dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
       
        //Actualiza telefono de información de contacto
        dirPartyContactInfo.clear();
        select  dirPartyContactInfo
        where dirPartyContactInfo.Party == custtable.Party &&
        dirPartyContactInfo.Type == LogisticsElectronicAddressMethodType::Phone;
       
        DirParty = DirParty::constructFromPartyRecId(dirPartyContactInfo.Party);
       
        dirPartyContactInfo.LocationName    = 'Telefono Jorge';
        dirPartyContactInfo.Locator         = '551291165343';
        dirPartyContactInfo.Type            = LogisticsElectronicAddressMethodType::Phone;
        dirPartyContactInfo.IsPrimary       = NoYes::Yes;
 
        dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
 
        ttsCommit;
       
        info( strFmt("Cliente creado: %1" , custTable.AccountNum));
    }
    catch(Exception::Error)
    {
       ttsAbort;
       throw Exception::Error;
    }

}




Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo. O comenta si quieres saber sobre algún tema en específico.

No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma. 

martes, 20 de octubre de 2015

Crear clientes y direcciones por código x++ en Microsoft Dynamics Ax 2012

Aquí cómo crear un cliente con su dirección y un registro de información de contacto como email, mediante código X++.

static void JobCreaClientePersona(Args _args)
{
    CustTable                    custTable;
    NumberSeq                    numberSeq;
    Name                         name = 'Jorge Lopez';
 
    DirParty                        dirParty;
    DirPartyPostalAddressView       dirPartyPostalAddressView;
    DirPartyContactInfoView         dirPartyContactInfo;
    ;
 
    ttsBegin;
    custTable.initValue();
 
   try
    {
       //crea datos del cliente en la CustTable
        numberSeq               = NumberSeq::newGetNum(CustParameters::numRefCustAccount());
        custTable.AccountNum    = numberSeq.num();
        custTable.CustGroup     = '02';
        custTable.Currency      = 'MXP';
        custTable.PaymTermId    = '00';
        custTable.PaymMode      = '01';
 
        //aquí se define si es persona u organización
        custTable.insert(DirPartyType::Person, name);  
 
        //DirParty
        //Crea instancia de la clase DirParty a partir de la entidad de CustTable
        dirParty = DirParty::constructFromCommon(custTable);
 
        dirPartyPostalAddressView.LocationName      = 'Oficina central ';
        dirPartyPostalAddressView.City              = 'Polanco';
        dirPartyPostalAddressView.Street            = 'Presidente Masarik';
        dirPartyPostalAddressView.StreetNumber      = '22';
        dirPartyPostalAddressView.CountryRegionId   = 'MEX'; //necesita ser un país valido
        dirPartyPostalAddressView.State             = '09' //necesita ser un estado valido
 
        // Llena dirección
        dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
 
        dirPartyContactInfo.LocationName    = 'Email Jorge Lopez';
        dirPartyContactInfo.Locator         = 'jorge.lopez222@gmail.com';
        dirPartyContactInfo.Type            = LogisticsElectronicAddressMethodType::Email;
        dirPartyContactInfo.IsPrimary       = NoYes::Yes;
 
        // Llena dirección de contacto
        dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
 
        ttsCommit;
       
        info( strFmt("Cliente creado: %1" , custTable.AccountNum));
    }
    catch(Exception::Error)
    {
       ttsAbort;
       throw Exception::Error;
    }

}

Post que podrían interesarte:
Capturar errores del infolog mediante código x++
Crear documentos asociados a un registro por código (DocuRef)
Teclas rápidas en Microsoft Dynamics Ax 2012


Y por cierto, acuérdate de darle click a algún anuncio si el post te sirvió de algo. O comenta si quieres saber sobre algún tema en específico.

No olvides que te puedes unir a la página en Facebook Aprendiendo Dynamics Ax donde únicamente se tratan temas de desarrollo y se busca crear una comunidad de desarrollador@s de Ax en nuestro idioma.