Mostrando entradas con la etiqueta Código. Mostrar todas las entradas
Mostrando entradas con la etiqueta Código. Mostrar todas las entradas

lunes, 7 de marzo de 2011

Separar el nombre del fichero del resto de la ruta

Esta es una función muy útil y que siempre viene bien tener a mano. Sirve para partir el path completo de un fichero en ruta hasta la carpeta y nombre de fichero.

Var Name DataType Subtype Length
No FileName Text          250
Path Text          250
Name Text          250




Path := '';
Name := '';
FileName := DELCHR(FileName,'<>');
IF (FileName = '') THEN
  EXIT;


Pos := STRLEN(FileName);
REPEAT
  Found := (COPYSTR(FileName,Pos,1) = '\');
  IF NOT Found THEN
    Pos := Pos - 1;
UNTIL (Pos = 0) OR Found;


IF Found THEN BEGIN
  Path := COPYSTR(FileName,1,Pos);
  Name := COPYSTR(FileName,Pos+1);
END ELSE BEGIN
  Path := '';
  Name := FileName;
END;

martes, 28 de diciembre de 2010

Cómo saber los permisos que tienes sobre un objeto

Muchas veces no sabemos que objetos podemos modificar con una licencia. Os dejo un truco para saber que permisos tenemos para determinados rangos de objetos en una base de datos de Dynamics Nav.
Esta información se guarda en la tabla virtual "Permission Range", en versiones anteriores a la 2009 no podemos ver el contenido de esa tabla directamente, para ello lo que vamos a hacer es crear un formulario nuevo usando el asistente, en el campo "Table" escribimos "Permission Range"
Seleccionamos Tabular-Type Form y le damos a aceptar
Elegimos mostrar todos los campos. Podemos guardar el formulario dando a Finish o bien si solo queremos hacer una consulta de algún objeto específico damos a Preview

Vemos los permisos por objetos y rango de objetos que tiene nuestra licencia.

Esta truco sirve para mostrar el contenido de cualquier tabla virtual, por ejemplo las tablas "Object" o "Session"

lunes, 27 de diciembre de 2010

Desarrollo colaborativo en Dynamics Nav. Parte II, el repositorio


Cualquier proyecto en el que intervengan varias personas usando los mismos ficheros, no tienen porque ser código fuente, requiere de un sistema de control de versiones que gestione unos repositorios donde se almacenarán las copias comunes de esos ficheros.
Una versión, revisión o edición de un fichero, es el estado en el que se encuentra dicho fichero en un momento dado de su desarrollo o modificación. Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una configuración del mismo. Los sistemas de control de versiones facilitan la administración de las distintas versiones de cada producto desarrollado, así como las posibles especializaciones realizadas (por ejemplo, para algún cliente específico).

Existen varios sistemas de control de versiones:
  • Team foundation server de Microsoft
  • CVS
  • Source Safe de Microsoft
  • Subversion ó SVN
Para este proyecto hemos decidido usar Subversion e integrarlo con Dynamics Nav para controlarlo dentro del mismo entorno de desarrollo al que estamos tan acostumbrados.

Subversion es un sistema de control de versiones con la política copiar-modificar-mezclar con gran proyección en la actualidad. Por ejemplo, SourceForge utiliza Subversion como control de versiones, también Google Code se basa en Subversion. Gran parte del éxito de Subversion es su agilidad cuando intervienen varias personas, debido a su política, y a su flexibilidad que no lo limita a desarrollos software: es posible almacenar planos, imágenes, libros…

A la hora de instalar Subversion hay que tener en cuenta de van a estar los repositorios y como vamos a acceder a ellos. Se puede acceder  a los repositorios de Subversion a través de muchos métodos diferentes --en un disco local, o a través de varios protocolos de red. Una ubicación dentro del repositorio, sin embargo, es siempre una URL. La tabla describe cómo se corresponden diferentes esquemas de URL con los métodos de acceso disponibles. Métodos de acceso

EsquemaMétodo de acceso
file://acceso directo al repositorio (en disco local)
http://Acceso a través del protocolo WebDAV a un servidor web Apache2 con Subversion incluido
https://Igual que http://, pero con cifrado SSL
svn://Acceso al servidor svnserve mediante el protocolo predeterminado
svn+ssh://Igual que svn://, pero a través de un túnel SSH

En nuestro caso, hemos optado por acceso mediante el protocolo http. Para en lugar de instalar el paquete básico de Subversión hemos instalado Visual SVNServer que incluye el servidor web Apache.
Se puede obtener gratuitamente desde aquí http://www.visualsvn.com

No voy a meterme más en lo que es Subversion ya que se haría interminable el post, y además existe infinita documentación sobre este sistema de control de versiones.


Ya había cerrado el post, pero si quería comentar una cosa más. Subversion permite crear la estructura de repositorio que queramos, es cierto que se recomienda como mínimo tener las carpetas Trunk, Branches y Tags pero solo es una recomendación.
A la hora de decidir como queríamos gestionar el repositorio dudamos si esta recomendación, para la naturaleza de Dynamics Nav y como se afrontan los proyectos en un cliente Dynamics Nav sería adecuada, es más dudamos si no sería conveniente disponer de un repositorio para cada proyecto en lugar de una carpeta para cada proyecto dentro del mismo repositorio.
Al final, dado que nuestro interés radica en poder versionar los cambios en los objetos de Nav por proyectos, en que no necesitamos mantener una rama común, que podría nacer de los objetos estándar de Nav sin modificaciones, si no que nuestra rama común será tratada como un proyecto en sí y en que no necesitaremos mantener componentes externos (librerías de terceros por ejemplo) en los distintos proyectos hemos optado por la opción de tener un repositorio distinto para cada proyecto en lugar de todos los proyectos dentro del mismo repositorio.

Ahora si cierro el post ;)


domingo, 14 de noviembre de 2010

Integrar firma digital en Dynamics Nav

Hace unos meses realicé un proyecto para la universidad sobre firmado digital de documentos. En concreto los documentos eran actas de nacimiento para una posible automatización de neonatos en el registros civil. Tenía que presentar una pequeña maqueta funcional para exponer el ciclo del proceso.
Para crear una PKI totalmente funcional usé EJBCA (http://www.ejbca.org/), para la generación de documentos y como base de datos, Dynamics Nav y para la firma digital una aplicación de la universidad Jaume I de Valencia llamada Cryptoapplet (http://projectestic.uji.es/pr/cryptoapplet/).
Cryptoapplet es una aplicación Java que permite la firma digital en múltiples formatos (incluidos e-factura) la gestión de certificados es transparente al usuario ya que se conecta directamente al repositorio de Internet Explorer o Firefox.
Permite la verificación de certificados mediante OCSP y aunque es fácilmente configurable para cualquier PKI con la que trabajemos viene preconfigurado para las principales autoridades de certificación (FNMT, DNI-e)
También permite realizar firmas en paralelo, verificación de certificados por CRL, múltiples formatos de salida... es una herramienta de firma digital muy potente y muy sencilla, os recomiendo que la tengáis en cuenta para proyectos que requieran cualquier tipo de firma digital, ya sean facturas digitales o simplemente firma de documentos internos de una empresa.
En el vídeo podéis ver como se integra Cryptoapplet con Dynamics Nav, como se genera el fichero xml y el resultado después de firmarlo.
Por cierto el formato de la firma es XADES-X-L



sábado, 30 de octubre de 2010

Usar Google Maps desde Dynamics Nav

Os pongo un vídeo de un desarrollo que he realizado esta semana para conectar Dynamics Nav con Google Maps.

De momento es muy simple, permite localizar direcciones de clientes con Google Maps e interaccionar con el conocido gestor de mapas desde la misma ficha del cliente.
También tiene la opción para calcular la ruta desde la dirección de nuestra empresa hasta la dirección del cliente.






La API de Google Maps es muy potente, en estos días ampliaré la función con parámetros como el tipo de ruta (coche, a pie, evitar peajes...). También prepararé un módulo completo de rutas donde podamos indicar distintos tramos de ruta (por ejemplo para un reparto a varios clientes) donde se pueda analizar toda la ruta completa o bien tramo a tramo y poder salvar las indicaciones de las rutas dentro de la bbdd de Dynamics Nav.

jueves, 28 de octubre de 2010

Integración .NET en Dynamics Nav

La plataforma de desarrollo más grande del mundo, con el mayor conjunto de bibliotecas funcionales, tipos, métodos y propiedades se un a Microsoft Dynamics NAV en la versión 2009 R2.
Ahora desde el código NAV 2009 R2 se podrá referenciar y hacer uso de todos los tipos y funciones de .NET Framework y de librerías de terceros.
Hacía mucho tiempo que esto se veía venir, pero no terminaba de llegar, ahora por fin ha llegado la integración de .NET en CAL. Esto supone, para los que estamos dentro del mundo de Dynamics NAV, una gran revolución, nos permitirá crear soluciones con un alcance mucho mayor al que podíamos conseguir con el código nativo de Dynamics NAV.
Hacer referencia a un componente externo de .NET será similar a como hasta ahora se están llamando a las variables de tipo "automation", solo que ahora serán variables de tipo "DotNet".
En esta pantalla se muestra como sería su definición en el cuadro de variables y un ejemplo de código con su uso:



Si miramos el menú de variables, vemos que la variable "DotNet" declarada, además de los métodos y propiedades como un "automation", tiene los constructores necesario en toda clase hecha .NET:


Sinceramente creo que esto será un gran paso ya que se une la robustez y fibilidad de Dynamics Nav y la flexibilidad y potencial de desarrollo de .NET, abriendo muchas nuevas opciones, más de las que puedo imaginar.

Ahora más que nunca podremos hacer todo lo que imaginemos. ;)



viernes, 22 de octubre de 2010

Dynamics Nav: Seleccionar la ruta de una carpeta

En Dynamics Nav existe la code unit Common Dialog Management donde ya están implementadas una serie de funciones para poder seleccionar ficheros del equipo y capturar su ruta pero no existe nada que nos permita hacer lo mismo pero con carpetas.
Para hacer esto mismo podemos usar está función:




//------ Params
WindowTitle : Text[50]
HighestFolder : Text[500]

//------- Return Type
Text[1024]

//------- Variants
ShellControl Automation 'Microsoft Shell Controls And Automation'.Shell
Folder Automation 'Microsoft Shell Controls And Automation'.Folder3
FolderText Text 1024

IF ISCLEAR(ShellControl) THEN
CREATE(ShellControl);
Folder := ShellControl.BrowseForFolder(0,WindowTitle,0,HighestFolder);
IF NOT ISCLEAR(Folder) THEN
FolderText := Folder.Items().Item.Path;
CLEAR(ShellControl);
EXIT(FolderText);

jueves, 21 de octubre de 2010

Cómo importar más de 1000 caracteres de una Excel con Dynamics Nav

La forma que tiene Dynamics Nav de importar datos de una excel es a través de una tabla llamada Excel Buffer y de la librería Microsoft Excel 12.0 Object Library.
Va cargando en cada entrada de la tabla el valor de cada celda de la hoja de Excel y una serie de propiedades (tipo de letra, fórmula, etc..). El problema que me ha surgido es que la librería tiene un string buffer de 1000 caracteres, si una celda de la hoja tiene más de 1000 caracteres al usar el método Value para obtener el contenido de la celda y grabarlo en la tabla Excel Buffer da error de desbordamiento en el buffer de la librería. Obviamente el tamaño del buffer no se puede modificar en la dll.
Para solucionarlo he hecho lo siguiente:


XlWrkSht.Range('IV3').Formula := '=EXTRAE('+xlColID + xlRowID+';1;1000)';
XlWrkSht.Range('IV4').Formula := '=EXTRAE('+xlColID + xlRowID+';1001;1000)';
XlWrkSht.Range('IV5').Formula := '=EXTRAE('+xlColID + xlRowID+';2001;1000)';

locTextLargo1 := FORMAT(XlWrkSht.Range('IV3').Value);
locTextLargo2 := FORMAT(XlWrkSht.Range('IV4').Value);
locTextLargo3 := FORMAT(XlWrkSht.Range('IV5').Value);

Lo que hago es usar la fórmula de Excel EXTRAER para grabar bloques de mil en mil caracteres, de la celda que estoy importando (xlColID + xlRowID), en otras celdas, en este caso he usado las celdas IV3 IV4 IV5 que al ser las últimas columnas asumo estarán vacías. Después ya podemos obtener los valores de esas tres celdas por separado.

jueves, 14 de octubre de 2010

Conectar Dynamics Nav con BBDD externas

Muchas veces necesitamos conectar Dynamics Nav con bbdd externas para extraer o modificar datos. Podemos usar librerías externas o webservices. Pero si es algo sencillo podemos ejecutar directamente el código desde Dynamics Nav e interactuar con cualquier base de datos externa.

Con ADO.NET, un programa puede leer, insertar, editar, o borrar, la información contenida en diferentes tablas dentro de la base de datos. Además, se puede manipular la propia base de datos para crear nuevas tablas, como también alterar o eliminar las ya existentes, entre otras cosas.

En el siguiente link está la documentación oficial de ADO.NET:

También os pongo un ejemplo de código CAL de como conectarse a una bbdd externa:

ADOConn@1100240000 : Automation Microsoft ActiveX Data Objects 2.8 Library'.Connection";
ADOrs@1100240001 : Automation 'Microsoft ActiveX Data Objects 2.8 Library'.Recordset";
ConnStr@1100240002 : Text[200];
AnzCount@1100240003 : Text[30];
OpenMethod@1100240004 : Integer;
LockMethod@1100240005 : Integer;
Name@1100240006 : Text[200];
Str@1100240007 : Text[200];


// ODBC-Connector
CLEAR(ADOConn);
CLEAR(ADOrs);

OpenMethod := 3; // 1=adOpenKeyset; 2=adOpenDynamic; 3= adOpenStatic
LockMethod := 2; // 1=dLockreadonly; 2=adLockPessimistic; 3=adLockOptimistic; 4=adLockBatchOptimistic
CREATE(ADOConn);
ConnStr := 'PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source= c:\pruebas.mdb';

ADOConn.Open(ConnStr);
CREATE(ADOrs);

ADOrs.Open('Select * from Tabla_Prueba WHERE ID = "Id_prueba"',ADOConn,OpenMethod,LockMethod); //ejecuta la sentencia

IF NOT ADOrs.EOF THEN BEGIN //Sí no es vacío
ADOrs.MoveFirst; //Se queda apuntado al primer registro de la tabla
Name := ADOrs.Fields.Item('Referencia').Value;
Message(Name);
END;

// Close odbc connector
ADOrs.Close;
ADOConn.Close;

CLEAR(ADOrs);
CLEAR(ADOConn);