jueves, 11 de febrero de 2010

¿Cómo importar clientes y proveedores en Microsoft Dynamics AX 2009?

Este artículo describe como importar data de clientes en Microsoft Dynamics AX 2009 desde una hoja de Excel, siendo los mismos pasos para importar a proveedores.


1. En el panel de navegación, clic en Administración – Periódico – Importación/Exportación de Datos – Hojas ayuda de estilo Excel – Asistente para planillas.

2. Clic Siguiente en el asistente para plantillas.

3. En el campo Nombre de archivo, ingrese el nombre del archivo que se va a usar y clic Siguiente.

4. En la parte de selección de tablas, agregar la tabla CustTable y presionar Siguiente.

    Nota: para proveedores agregar la tabla VendTable.

5. En la parte Generar lista de campo, clic Siguiente.

6. En la parte seleccionar campos, expandir Cliente, y clic seleccionar los campos que quieres importar. Los campos requeridos para una importación de la tabla CustTable son:

  • Cuenta del Cliente
  • Grupo del Cliente
  • Moneda
  • Lenguaje
  • Tipo de Libreta de Direcciones
  • Id de Libreta de direcciones
  • Dirección
  • Condiciones de pago
  • País/Region
  • ZIP/Codigo Postal
  • Estado
  • Pais
  • Busqueda de Nombre
  • Ciudad
  • Calle
  • País/Region
  • Estado
  • Compañía
7. Clic Siguiente

8. Seguir los pasos del asistente para completar la importación.

9. En el panel de navegación, clic Base-Configuración-Libreta de direcciones global-Parámetros.

10. Clic en el tab Secuencias Numéricas, y luego verificar que el número de secuencia es seleccionado para el libro de direcciones ID.

11. Buscar el archivo que se creó en el paso 3. La hoja de cálculo de Excel que contiene los datos que desea importar debe tener data.

12. Dejar vacio el campo de ID libreta de direcciones. Este campo es llenado cuando se importe la hoja Excel usando el numero de secuencia que se ha puesto en el paso 10.

13. En el panel de navegación, clic Administración-Periodico-Importacion/Exportacion de data-Definición de grupos.

14. Seleccionar el grupo de definición que se creó usando el asistente de Excel y clic en Configuración de tablas.

15. Hacer clic en el tab Conversión y agregar el siguiente código para importar la tabla Custtable.

      Str dirId;
      ;

     //Ver que la tabla Custtable no está asociada a una entrada
     If(!custTable.PartyId // custTable.PartyId == "")
      {
            //crear una entrada de las partes para el cliente
           dirId = DirParty:: createPartyFromCommon(custTable).PartyId;
          custTable.PartyId = dirId;
     }
     else
    {
          DirParty::updatePartyFromCommonInsert(custTable.PartyId,custTable);
    }

Para importar proveedores:
    
      Str dirId;
      ;
     //Ver que la tabla Vendtable no está asociada a una entrada
     if (!vendTable.PartyId // vendTable.PartyId == "")
    {
           //crear una entrada de las partes para el cliente
          dirId = DirParty::createPartyFromCommon(vendTable).PartyId;
          vendTable.PartyId = dirId;
   }
   else
  {
         DirParty::updatePartyFromCommonInsert(vendTable.PartyId,vendTable);
  }

16. Clic en Ejecutar Conversión y clic en el botón Compilar.

17. Clic en el tab Vista Preliminar, y ver que los campos sean los correctos seleccionados en la hoja de Excel, cerrar Configuración de tablas.

18. En Importacion/Exportacion de datos, seleccionar el grupo de definición creado y clic en Import.

19. En Importación de Excel, seleccionar la hoja que se creo en el paso 3 y clic Aceptar.

20. Verificar que los clientes han sido importados a la tabla Custtable y que han sido creados los registros correspondientes en la tabla DirPartyTable.

Saludos.

martes, 2 de febrero de 2010

Importar y exportar data en formato XML usando clases Axd

Hola, en este artículo se explicará cómo utilizar AXD-clases con el fin de importar los archivos XML en Dynamics AX y Data Dynamics AX a la exportación en archivos XML. Este metodo está orientado más a los desarrolladores debido por la forma de ejecución.
Otra cosa importante es que funciona tanto en dynamics AX 4.0 como en el 2009.

Partes de configuración
Para importar o exportar data desde dynamics AX en formato XML, es necesario que existan los siguientes objetos:
a) Tabla: donde se encuentre la data que será importada o exportada.
b) Clase AxBC: que es un contenedor para la tabla y es utilizado por AXD-Framework por la data por 
    defecto en los campos de la tabla y actualizar las tablas relacionadas.
c) Query: es usado por Axd-framework para la selección de data de la tabla o del archive XML.
d) Clase Axd: representa el documento XML y es usado por Axd-framework para importar o exportar data
    desde ó hacia Dynamics AX.

Todos los objetos mencionados excepto la tabla ó el query pueden ser generados automáticamente usando el asistente Axd.

En si lo que vamos hacder es crear una tabla MiTabla, insertamos algunos registros dentro de la tabla y generamos todos los objetos mencionados arriba usando el asistente Axd. Después, en la parte de ejecución, se exportará los registros de la tabla creada (MiTabla) dentro de un archivo XML e importaremos la data de un archivo XML dentro de la tabla creada (MiTabla).
1) Crear una nueva tabla (MiTabla)
Fig.1: Nueva tabla MiTabla
2) Usando el buscador de tablas, inserter 2 registros en la table MiTabla. Después estos registros serán exportados al archivo XML.

Fig. 2: Ruta de acceso al elemento de menú del navegador de la tabla
Fig. 3: Insertando 2 nuevos registros a la tabla creada
3) Creamos un nuevo query que sera usado para exportar la data de MiTabla al archivo XML e importar la data del archivo XML a la tabla MiTabla. El nombre del query debe empezar con Axd en orden de facilitar la distinción entre los queries estandars y los queries Axd.
Fig. 4: Nuevo query AxdMiTabla
4) Ir a herramientas – Herramientas de desarrollo - Asistente – y seleccionar Axd Asistente.
Fig. 5: Ruta de acceso al elemento de menú Asistente Axd.

5) El asistente de Axd empezará. En la página de bienvenida, hacer clic en el botón siguiente.

Fig. 6: Ventana de bienvenida del asistente Axd.


6) Seleccionar el query AxdMiTabla creado en el paso 3 y dar clic en el boton continuar.

Fig. 7: Ventana de selección del query

7) Seleccionamos todas las acciones para poder importar y exportar varios registros del documento.Especifique una descripción del documento en el campo de etiqueta y haga clic en el botón Siguiente.

Fig. 8: Selección de etiqueta y métodos

8) Clic en generar clases AxBC en la parte Generación AxBC.
Fig. 9: Ventana para generar los cúdigos Axd.

9) Después de haber realizado todos los pasos anteriores, darclic en Generar.

Fig. 10: Ventana de resumen de los objetos que se van a generar


Fig. 11: Ventana final del Asistente

10) Si nos fijamos en la ventana de salida del compilador, muy probablemente encontrará varios errores en
       la clase AxMiTabla.

Fig. 12: Ventana del compilador después de que el asistente Axd se ha completado.

11) Para arreglar los errors que ha botado el compilador necesitamos ir al proyecto creado
      AxdMiTabla, borrar los 2 metodos cacheObject y cacheRecordRecord de la clase AxdMitabla y
      compilar el proyecto entero.
Fig. 13: Proyecto AxdMitabla generado por el asistente Axd.

Fig. 14: Borrando los métodos fallidos cacheObject y cacheRecordRecord.

Fig. 15: Compilando el proyecto entero
 
Ahora todos los objetos necesarios han sido creados por axd Asistente y estamos listos para exportar e importar los datos en formato XML.


Parte de ejecución:

1) Exportar data desde la table MiTabla al archive XML usando la clase AxdMiTabla
    El job exporta los registros de la tabla MiTabla en XML archivo C: \ Temp \ AxdMiTabla_Salida.xml.
    Por favor, asegúrese de que el directorio C: \ Temp existe antes de ejecutar este job.


    static void exportarAxdMiTabla(Args _args)
   {
        MiTabla miTabla;
        AxdMiTabla axdMiTabla = AxdBase::newClassId(classnum(AxdMiTabla));
        AifEntityKeyList aifEntiryKeyList = new AifEntityKeyList();
        AifDocumentXml aifDocumentXml;
        XmlDocument xmlDocument;

        // convertir un registro a la clave de entidad
        AifEntityKey getEntityKey(Common _record)
        {
              AifEntityKey aifEntityKey = AifEntityKey::construct();
              List keyFields = SysDictTable::getUniqueIndexFields(_record.TableId);
              Map keyMap = SysDictTable::mapFieldIds2Values(keyFields,_record);
              ;

              aifEntityKey.parmKeyDataMap(keyMap);
              aifEntityKey.parmTableId(_record.TableId);
              aifEntityKey.parmRecId(_record.RecId);
              return aifEntityKey;
         }
         ;
         // añadir los registros destinados a la exportación en la entidad lista de claves
         while select miTabla
         {
              aifEntiryKeyList.addEntityKey(getEntityKey(miTabla));
         }

         // creando el documento XML conteniendo los registros
         aifDocumentXml = axdMiTabla.readList(aifEntiryKeyList, null, new AifEndpointActionPolicyInfo(),
                                                                        new AifConstraintListCollection(), connull());
         xmlDocument = XMLDocument::newXML(aifDocumentXML);

         // guardando el documento XML en el disco
         xmlDocument.save('C:\\Temp\\AxdMiTabla_salida.xml');
   }
   
    Y el resultado de correr este método sería:

2) Importar data de un archivo XML a la tabla MiTabla usando la lcase AxdMiTabla.

    Para probar este metodo puedes usar el archivo XML generado AxdMitabla_Salida.xml y renombrarlo 
    como axdMitabla_Entrada.xml.

    static void importarAxdMiTabla(Args _args)
    {
         AxdMiTabla axdMiTabla;
         AifDocumentXml xml;
         XmlDocument xmlDocument;
         ;

         // crear un documento XML de un archivo
         xmlDocument = XmlDocument::newFile("C:\\Temp\\axdMiTabla_Entrada.xml");
         xml = xmlDocument.xml();
         axdMiTabla = AxdBase::newClassId(classnum(AxdMiTabla));

         // insertar datos desde el docuemnto XML dentro de Dynamics AX
         axdMiTabla.createList(xml, new AifEndpointActionPolicyInfo(), new AifConstraintListCollection());
}

Saludos.

lunes, 1 de febrero de 2010

Abrir pagina web desde desde AX

Hola, este sencillo codigo nos permite abrir cualquier pagina web desde AX.

infoLog.urlLookup('http://www.blogger.com');

Saludos.

Acceso a AX para ocupar solamente una licencia

Hola, con estas lineas de codigo se puede controlar el acceso a AX para ocupar solo una licencia por usuario y no permitirle conectarse más de una vez.


Hay que buscar en la clase "Info" el método "startupPost" y asignarle el código siguiente:
void startupPost()
{
    int cuentaSesionActiva = 0;
    UserId IdUsuario;
    SysClientSessions _SysClientSessions;
    ;
   
    IdUsuario = curuserid(); // capturamos el id del usuario
    while select RecId from _SysClientSessions order by login_time desc
               where _SysClientSessions.userId == curuserid() && _SysClientSessions.Status == 1
   {
       if (_SysClientSessions.RecId)
          cuentaSesionActiva = cuentaSesionActiva + 1; //Acumula el número de logins activos del usuario en el
                                                                                    sistema
      else
          cuentaSesionActiva = 0;
    }

    if (cuentaSesionActiva > 1)
   {
        infolog.shutDown(false);
   }

}

Bueno este codigo ya lo he probado con ax 4 y ax 2009 y funciona bien.
Este código como verán es muy simple, pero dejo a imaginación del lector todo lo que se puede hacer, por ejemplo yo hecho que el ax diferencie usuarios por empresas y cada empresa tenga un numero limitado de licencias.

Saludos.

Unir palabra con salto de linea

Hola, este metodito sirve para unir palabras en una sola línea cuando hay saltos de línea (dando ENTER después de cada palabra).
Esto nos podría servir en los formularios o reportes para presentar un valor guardado en la base de datos con varios saltos de línea en una sola línea (Como el dato Dirección de Proveedores o Clientes que permite dar un enter en el campo).
 
static void UnirPalabraConEspacios(Args _args)


{

    str palabraVertical;
    int TotalLetras;
    int contaposicion;
    str letra;
    ;

    palabraVertical = "Palabra\n";
    palabraVertical += "Unida\n";
    palabraVertical += "Con\n";
    palabraVertical += "Saltos de Línea";

    TotalLetras = strlen(palabraVertical); //Lee la cantidad de caracteres de una palabra

    for (contaposicion = 1; contaposicion <= TotalLetras; contaposicion++) //Se hace un for con el tamaño    
                                                                                                                 // total de las letras en la palabra
                                                                                                                 // con ENTER
   {

       letra += substr(palabraVertical,contaposicion,1); //Va armando nuevamente "POR LETRA" toda la
                                                                                 //palabra
   }

   print letra; //Imprime la palabra completa en una sola línea
   pause;

}