Blog

Artículos y noticias relacionadas con el mundo AX3 group

La importancia de especificar las columnas en una query en CRM

Hace poco, os hablaba de buenas prácticas en el desarrollo de plugins en Dynamics CRM, en este caso y en relación a las buenas prácticas, vamos a hablar de la importancia que tiene seleccionar únicamente las columnas que vamos a usar a la hora de hacer una consulta.

Siempre que se haga una query a CRM bien por QueryExpression o por FetchXml es importante especificar únicamente aquellas columnas que queremos recuperar.

Para que veáis el impacto que esto puede tener, he preparado un pequeño ejemplo donde se puede apreciar la diferencia entre especificar las columnas o recuperarlas todas.

En este primer ejemplo voy a recuperar todos los registros de la entidad estándar account con todas sus columnas. En este caso concreto, la entidad tiene más de 130.000 registros, pero como sabéis solo se recuperan 5000.

1
2
3
4
5
6
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);

Vamos a añadir un Stopwatch para ver cuanto tiempo tarda en recuperar esa información con todas sus columnas. Veamos cuanto tarda…

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet(true)
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [AllColumns = true]", watch.ElapsedMilliseconds / 1000);

Ahora haremos lo mismo pero esta vez especificando algunas columnas

1
2
3
4
5
6
7
8
9
10
11
            var watch = System.Diagnostics.Stopwatch.StartNew();
 
            var qe = new QueryExpression("account")
            {
                NoLock = true,
                ColumnSet = new ColumnSet("accountid", "name", "emailaddress1", "emailaddress2")
            };
            var entityCollection = service.RetrieveMultiple(qe);
 
            watch.Stop();
            Console.WriteLine("{0} Segundos [Columns (accountid, name, emailaddress1, emailaddress2)]", watch.ElapsedMilliseconds / 1000);

Como veis, la diferencia es importante, en este caso estamos hablando de 83 segundos de diferencia. Bien es cierto que estamos ante un ejemplo muy extremo, en cualquier caso SIEMPRE se deben de especificar las columnas que vayamos a usar. Incluso, si quisiésemos obtener todas las columnas, también debemos especificarlas, ya que si en el futuro se añaden nuevas, estas se obtendrían penalizando el rendimiento.

Hasta la próxima

Expresiones de SQL en rangos de Query sobre campos de tipo datetime (AX2012)

Siguiendo como base este artículo de Axaptapedia Expresiones en rangos de Query vemos que puede ser algo tedioso el utilizar esta funcionalidad sobre campos de tipo datetime en Ax2012. Básicamente hay que utilizar la función DateTimeUtil::toStr para convertir el valor del tipo utcdatetime a un tipo str que sea entendido por la expresión.

A continuación muestro un ejemplo sencillo de uso para disponer de esta estupenda funcionalidad con este tipo de campos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Expresión en query range para campos de tipo datetime
static void AX3QueryRangeExp_DateTime(Args _args)
{
    utcDateTime             _utcDateTime = DateTimeUtil::newDateTime(mkDate(1,4,2017),0);
    Query                   query = new Query();
    QueryBuildDataSource    qst = query.addDataSource(tableNum(CustTable));
    QueryRun                queryRun;
    str                     qstr;
    int                     i;
 
    qstr = strFmt('((%1.CreatedDateTime > %2) || (%1.ModifiedDateTime > %2))', qst.name(), DateTimeUtil::toStr(_utcDateTime));
 
    qst.addRange(fieldNum(CustTable,DataAreaId)).value(qstr);
 
    query.literals(true);
 
    queryRun = new queryRun(query);
    while(queryRun.next())
    {
        i++;
    }
    print i;
    pause;
 
}

Espero os haya sido de utilidad.

Cómo reducir la tasa de abandono de carritos en ecommerce

Imagina el supuesto de que acudes a tu supermercado o centro comercial habitual y te encuentras una gran cantidad de carritos de la compra con productos dentro, pero sin nadie que los empuje. Pues eso es exactamente lo que ocurre en la mayoría de las tiendas online y no siempre es un problema de desconocimiento de uso, sino que va mucho más allá.

Se estima que entre el 60 y el 80% de los carritos de compra online acaban siendo abandonados por sus usuarios, sin importar que el ecommerce sea de una gran compañía o de una pequeña empresa. Son posibles compradores que tienen una necesidad, se han tomado la molestia de buscar una tienda online que tenga el producto que les interesa, en algunos casos incluso se han registrado pero, a la hora de realizar el pago, abandonan su carrito.

Pero, ¿por qué ocurre tan habitualmente en el comercio electrónico y apenas nunca en el físico? Fácil, porque es muy cómo hacerlo. Llegar, seleccionar los productos y compararlo es mucho más sencillo y no nos conlleva ningún tipo de compromiso ante el comercio. Para el usuario es una forma cómoda de comparar y ver precios, pero para los gestores de la tienda online puede suponer un verdadero quebradero de cabeza, sobre todo si desconoce que es una práctica habitual y no sabe muy bien cómo atajarlo.

En el 65% de los casos, según un estudio realizado por Baymard Institute, los clientes no finalizan su compra debido al coste de los gastos de envíos (en muchos casos no se informa con antelación de cuáles van a ser las tarifas), la falta de variedad en los métodos de pago o porque no está seguro de si realmente lo quiere comprar. No olvidemos que Internet nos ofrece la posibilidad de acceder a un catálogo inmenso de productos que podemos estudiar, comparar y evaluar los costes finales en diferentes tiendas.

Por eso, la clave está en conocer bien en qué punto el cliente ha abandonado el carrito, cuál o cuáles han sido los productos que ha seleccionado e, incluso, si este usuario ha visitado más de una vez nuestra tienda online. Partiendo de la información que nos ofrece nuestro e-commerce y uniéndolo a la inteligencia digital que nos ofrece el Big Data a través de plataformas como Power BI de Microsoft, tendremos todos los datos precisos para tener bajo control nuestro negocio online.

Si a ello le sumamos un plan de marketing que piense en cómo recuperar esos carritos abandonados, podríamos lanzar acciones de remarketing y recordatorios personalizadas para cada usuario. Así, a través de un sistema integrado y que se nutre de información de diversas fuentes, podemos conseguir la tasa de abandono de carritos.

¿Imaginas controlar toda la información de tu ecommerce Magento, unirlo a la inteligencia digital y a un programa que te permita automatizar y gestionar tus campañas de marketing online? Pues estás de suerte, muy pronto te daremos más información sobre en qué estamos trabajando.

¡Suscríbete a nuestro blog y mantente informado de nuestros avances!

¿Por qué conectar una tienda online con el ERP de tu negocio?

Siempre que un negocio decide adentrarse en el comercio electrónico debe plantearse un amplio abanico de temas que debe abordar. De la planificación previa, la detección de debilidades y la puesta en marcha de planes que solucionen cualquier problemática depende en gran parte la vida de un ecommerce.

La gestión de la tienda online es fundamental para lograr la satisfacción plena del cliente y alargar su ciclo de vida en nuestro negocio. De su experiencia de compra dependerá no solamente el que vuelva a comprarnos en un futuro, sino el que nos recomiende públicamente a otros posibles compradores. Cualquier error en la disposición de los productos, un incorrecto seguimiento del proceso de preparación y envío, así como una atención al cliente poco profesional es suficiente para perder a un cliente y entregárselo directamente a la competencia.

Pero siempre hay que buscar la rentabilidad

La amplia competencia, la inversión de la puesta en marcha del negocio y el escaso margen que presentan numerosos productos provoca que cualquier gasto deba ser estudiado al milímetro. Por ello, no siempre es posible añadir a más personal al cargo de la tienda online y es aquí cuando entran en juego la elección de las herramientas adecuadas que, junto a un protocolo de actuación y una estrategia clara, nos ayudarán a consolidar nuestro mercado online.

Es muy importante elegir bien las herramientas adecuadas para la tienda online. Necesitamos una base sólida que nos permita gestionar la tienda online de forma operativa, precisa y sencilla. Magento se consolida así como unas de las plataformas de e-commerce más sólidas para las medianas y grandes empresas, siendo una de las preferidas a nivel europeo.

Además, cualquier negocio que trabaje con un amplio catálogo de productos debe contar con un ERP que le permita controlar su nivel de stock, precios y almacenaje. Microsoft Dynamics AX (integrado actualmente en Microsoft Dynamics 365) es la herramienta perfecta para controlar en todo momento la situación financiera, operaciones y recursos humanos con un gran catálogo de funcionalidades, compatibles con todas las aplicaciones de Microsoft que cualquier empresa utilizada, como Microsoft Office.

¿Y si conectas tu Magento con Microsoft Dynamics AX?

Por un lado tienes una tienda online donde te entran todos los pedidos a través de Internet y donde enfocas tu campaña de marketing online. Por otro, cuentas un ERP inteligente y avanzado con el que gestionar el catálogo y la disponibilidad de tus productos. Si los conectas a través de nuestro conector Ax eCommerce Connector tendrás tienda online y ERP sincronizados y actualizados al momento.

Descripciones, precios, stocks, facturación, cartera de clientes y mucho más quedan conectados y actualizados en tus sistemas sin importar por dónde hayan entrado. De esta forma, tus ventas online y offline quedan unificadas y gestionadas al momento evitando duplicidades tanto de información como de tiempo de gestión.

¿Quieres saber más sobre las múltiples ventajas de conectar Microsoft Dynamics AX con un e-commerce Magento? ¡Lee más aquí o ponte en contacto con nosotros!

Conectar a Dynamics 365 CRM a través de su API

Dynamics 365

Una de las cosas que más me gusta de Dynamics CRM es la forma tan sencilla que tiene de conectarte a través de su API.

Una de las formas consiste en crear un connectionstring en el App.Cofig de nuestra solución y posteriormente instanciar la clase OrganizationService del espacio de nombres (Microsoft.Xrm.Client.Services) pasándole como parámetro el nombre de nuestro connectionstring. ¿Fácil verdad?

1
2
3
  <connectionStrings>
    <add name="CRM" connectionString="ServiceUri=http://HOST/ORG/; Domain=DOMINIO; Username=USUARIO; Password=PASS;" />
  </connectionStrings>
1
    var service = new OrganizationService("CRM");

A partir del servicio obtenemos el OrganizationServiceContext de la siguiente manera.

1
    var context = new OrganizationServiceContext(service );

Desde Dynamics 365 esto ha cambiado un poco y ya no existe la clase OrganizationService.

Se ha incorporado un nuevo namespace Microsoft.Xrm.Tooling.Connector donde tenemos una nueva clase llamada CrmServiceClient

Por lo que a partir de ahora se hará de la siguiente forma:

1
2
    var service = new Xrm.Tooling.Connector.CrmServiceClient("CRM");
    var context = new OrganizationServiceContext(service);

La clase OrganizationService heredaba del interface IOrganizationService el cual disponía de los métodos Associte, Create, Delete, Disassociate, Execute, Retrieve, RetrieveMultiple y Update.

IOrganizationService

Ahora, la clase CrmServiceClient hereda de IOrganizationService, como lo hacía antes de OrganizationService. Por lo que seguimos teniendo disponible los métodos Associte, Create, Delete, Disassociate, Execute, Retrieve, RetrieveMultiple y Update.

En posteriores post hablaremos un poco más sobre esta clase y sus novedades.

Hasta la próxima

Importación de datos en Dynamics CRM con varios lookup

Es bastante habitual que cuando realizamos una importación de datos con el asistente del que dispone CRM ocurran errores al resolver los lookups por motivo de dependencias. Esto requeriría tener que realizar tantas importaciones como referencias a una entidad distinta dispongamos, con la consecuente pérdida de tiempo.

Pongamos el ejemplo de los registros demográficos de ciudad, comunidad autónoma y país. En el caso de querer dar de alta una ciudad de un país que no se encuentra en CRM deberíamos en principio realizar tres importaciones independientes en orden (país, comunidad autónoma y ciudad). El estado previo a la importación es el siguiente:

Pero aquí es donde CRM es capaz de facilitarnos la labor, siguiendo los pasos siguientes:

  • Se generan todos los archivos de las entidades que queremos importar con los campos necesarios
Excels
  • Agrupamos todos los archivos de importación en un mismo .zip
Zip
  • Mapeamos cada uno de los archivos del zip con su entidad equivalente.
AsignacionFicheros
  • En cada una de las entidades, asignamos las columnas al campo que corresponda (incluyendo los lookup)
AsignacionCampos

En el ejemplo, la ciudad que queremos añadir es Turín, de la cual no tenemos cargada la comunidad autónoma (Piamonte) ni el país (Italia), por ello tenemos que agrupar los tres archivos en un mismo .zip (Cities, Counties, Countries). Entonces, el proceso de importación buscará dentro de la BBDD de CRM un campo que resuelva cada uno de los lookup (se puede ver que a mayor número de referencias, más tiempo tarda en importar). En caso de no encontrarse en la BBDD se buscará en los ficheros de las entidades relacionadas importados al mismo tiempo; pudiendo resolver las referencias y añadiendo cada registro con los lookups relacionados como se ve en la imagen.

CiudadesAfter

Esperamos que os sea de ayuda y ahorre tiempo en sus migraciones de datos.

Hasta la próxima.

AX3