Mostrando entradas con la etiqueta navision. Mostrar todas las entradas
Mostrando entradas con la etiqueta navision. Mostrar todas las entradas

viernes, 4 de noviembre de 2011

Comprobar numeración de tarjeta de crédito

Al igual que con los números de cuenta cada tipo de tarjeta de crédito tiene una configuración determinada, os voy a dejar un bloque de código donde se comprueban los formatos para los diferentes tipos de tarjetas de credito, Visa, MasteCard, American Express, Discover y Dinners Club. A ver si os vale


  vDigito:=COPYSTR(NumeroTarjeta,1,1);
  vDigito2:=COPYSTR(NumeroTarjeta,1,2);
  vDigito4:=COPYSTR(NumeroTarjeta,1,4);

//American express
  IF "Tipo Tarjeta"="Tipo Tarjeta"::"American Express" THEN BEGIN
    IF (vDigito2 = '34') OR (vDigito2 = '37') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 15) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,rPolizas.NumeroTarjeta,rPolizas."Tipo Tarjeta");
  END;

//Visa
  IF "Tipo Tarjeta"="Tipo Tarjeta"::Visa THEN BEGIN
    IF vDigito = '4' THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 13) AND (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//MasterCard
  IF "Tipo Tarjeta"="Tipo Tarjeta"::MasterCard THEN BEGIN
    IF (vDigito2 >= '51') AND (vDigito2 <= '55') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
         ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//Discover
  IF "Tipo Tarjeta"=."Tipo Tarjeta"::Discover THEN BEGIN
    IF vDigito4 = '6011' THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 16) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;  

//Diners club
  IF "Tipo Tarjeta"="Tipo Tarjeta"::"Diners club" THEN BEGIN
    IF (vDigito2 = '30') OR (vDigito2 = '36') OR (vDigito2 = '38') THEN BEGIN
      IF (STRLEN(NumeroTarjeta) <> 14) THEN
        ERROR(TXT1,STRLEN(NumeroTarjeta),"Tipo Tarjeta");
    END
    ELSE
      ERROR(TXT2,NumeroTarjeta,"Tipo Tarjeta");
  END;

//Comprobar numeración de tarjeta
  vNuevoNT:='';
  FOR vIndex:=1 TO STRLEN(NumeroTarjeta) DO BEGIN
     vNuevoNT:='';
     IF vIndex MOD 2 <> 0 THEN BEGIN
        EVALUATE(vNoperar,FORMAT(NumeroTarjeta[vIndex]));
        IF vNoperar * 2 > 9 THEN BEGIN
          vNuevoNT:=FORMAT((vNoperar*2)-9);
        END
        ELSE BEGIN
            vNuevoNT:=FORMAT((vNoperar*2));
        END    
     END
     ELSE BEGIN
         vNuevoNT:=FORMAT(NumeroTarjeta[vIndex]);
     END;
     EVALUATE(vConvert,vNuevoNT);
     vResultado+=vConvert;
  END;
  IF (vResultado MOD 10 <> 0) AND (vResultado > 150) THEN
    ERROR('El numero de tarjeta %1 no es correcto',NumeroTarjeta);
END;

Sacar el dígito control de numero cuenta para comprobar si es correcto

Voy a dejar un bloque de código donde se realiza la comprobación del dígito de control de un número de cuenta para saber si este es correcto.



//Comprobar longitud y numero de cuenta
Suma1Int:=0;
Suma2Int:=0;
IF vTXTNumCuenta <> '' THEN BEGIN
  FOR vIndex:=1 TO 10 DO BEGIN
     Suma1:=0;
     Suma2:=0;
     EVALUATE(Digit1,COPYSTR(vTXTNumCuenta,9,1));
     EVALUATE(Digit2,COPYSTR(vTXTNumCuenta,10,1));
     CASE vIndex  OF
       1: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,1,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,11,1));
            Suma1Int:=Suma1*4;
            Suma2Int:=Suma2*1;
          END;

       2: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,2,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,12,1));
            Suma1Int+=Suma1*8;
            Suma2Int+=Suma2*2;
          END;

       3: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,3,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,13,1));
            Suma1Int+=Suma1*5;
            Suma2Int+=Suma2*4;
          END;

       4: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,4,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,14,1));
            Suma1Int+=Suma1*10;
            Suma2Int+=Suma2*8;
          END;

       5: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,5,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,15,1));
            Suma1Int+=Suma1*9;
            Suma2Int+=Suma2*5;
          END;

       6: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,6,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,16,1));
            Suma1Int+=Suma1*7;
            Suma2Int+=Suma2*10;
          END;

       7: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,7,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,17,1));
            Suma1Int+=Suma1*3;
            Suma2Int+=Suma2*9;
          END;

       8: BEGIN
            EVALUATE(Suma1,COPYSTR(vTXTNumCuenta,8,1));
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,18,1));
            Suma1Int+=Suma1*6;
            Suma2Int+=Suma2*7;
          END;

       9: BEGIN
            EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,19,1));
            Suma2Int+=Suma2*3;
          END;

       10:  BEGIN
              EVALUATE(Suma2,COPYSTR(vTXTNumCuenta,20,1));
              Suma2Int+=Suma2*6;
            END;
     END;
  END;
//Primer dígito de control entidad+sucursal
  Parc1:=0;
  Parc1:= 11 - (Suma1Int MOD 11);
  IF Parc1 > 9 THEN
    Parc1:=11 - Parc1;

//Segundo dígito de control Numero Cuenta
  Parc2:=0;
  Parc2:=11 - (Suma2Int MOD 11);
  IF Parc2 > 9 THEN
    Parc2:=11 - Parc2;

  IF (Digit1 = Parc1) AND (Digit2 = Parc2) THEN BEGIN
  END
  ELSE BEGIN
    ERROR('Número cuenta erroneo, no corresponde el DC: %1%2',Parc1,Parc2);
  END;
END;

martes, 4 de octubre de 2011

Registro dll desde .net c sharp

voy a intentar explicar un poco como registrar una dll de c sharp en un equipo para que desde navision se le pueda llamar, ya se ha explicado como crear una dll cuyos métodos sean visibles desde navision ahora el siguiente paso es registrarla para que esta sea operativa.

yo me he inclinado por añadir un proyecto de instalación en la solución donde hemos creado la aplicación, ir al equipo donde queremos instalarlo y al ejecutarlo nos copia la dll junto con el tlb que se genera en la carpeta que queremos normalmente en c:\windows\system32 y luego con el comando regasm del framework correspondiente registraríamos estas dll.

1 Creación del proyecto de instalación.


Lo primero es agregar un nuevo proyecto a la solución. Asegurarse de seleccionar la opción del asistente para proyectos de instalación.







Se elige el nombre que se quiera y al aceptar, se lanza el Wizard. Después de la pantalla de bienvenida, pide el entorno. Lo normal es seleccionar Windows



Después pedirá que se indique lo que se quiere incluir en el paquete. Indicar que queremos el resultado principal del proyecto de la DLL.




Después hay que indicar si se quiere añadir algún archivo complementario y ya termina.
El solo ya detecta como recurso imprescindible que tiene que estar el Framework en el equipo en el que lo vayas a instalar.

IMPORTANTE:

En la parte superior del explorador de soluciones, se mostrará una serie de botones. El primero de la izquierda da acceso al sistema de archivos para que se indique dónde instalar la DLL.





Seleccionar carpeta de la aplicación, y en las propiedades que se muestran, en DefaultLocation, indicar la ruta de la carpeta System32.











2 Registro de la Dll

Abririamos una ventana de Ms-dos y ejecutaríamos algo así:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe C:\windows\System32\fichero.dll /tlb:C:\Windows\System32\Fichero.tlb /codebase /verbose

La primera parte:
{C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe} esto depende del framework con en el que hayamos realizado la aplicación

martes, 31 de mayo de 2011

Métodos C# visibles en navision

Para crear métodos de C# que resulten visibles desde navision, es necesario tener un espacio de nombres System.Runtime.InteropServices que proporcione una variedad de miembros que admiten la interoperabilidad COM .

Lo primero que vamos a hacer es crear un nuevo proyecto que en este caso va a ser una biblioteca de clases, que es la que luego al generar la aplicación nos crea el fichero dll del que vamos a obtener la funcionalidad para utilizarla desde navision (la dll se encuentra en la ruta del proyecto/bin/release).

Una vez hecho esto vamos a configurar nuestra aplicación en visual studio para que admita la interoperabilidad con COM, para ello tendremos que cambiar las propiedades del proyecto en "Proyecto--> Propiedades de...NombreProyecto"

pulsamos en el botón "Información de ensamblado" y en el cuadro de diálogo que nos aparece "Información de ensamblado" validamos el tick "Crear ensamblado visible a través de COM" a true.




Una vez hecho vamos a la pestaña "Generar" y al igual que antes seleccionamos el tick de "Registrar para interoperabilidad COM" a true.



ya en el código de la aplicación es necesario añadir el espacio de nombres System.Runtime.InteropServices

using System.Runtime.InteropServices;

luego dentro de la clase que vamos a crear la estructura describimos como va a ser la interface



y luego creamos el método para operar que se tiene que declarar y llamar igual que el método de la interface, la clase que se crea tiene que ser heredada de la clase de la interface.



una vez hecho esto, ya podríamos crear una variable automation en navision haciendo referencia a esta dll.

miércoles, 18 de mayo de 2011

Consumir Web Service / Servicio Web SOAP

Lo que vamos a hacer es realizar una conexión desde Navision a un servicio web de tipo soap.en princpio con este método se deberia de poder llamar a una función con parámetros pero a veces suele ocasionar problemas.

Creamos las siguientes variables de tipo automation.

locautSoapHttpConnector
Automation 'Microsoft Soap Type Library v3.0'.HttpConnector30

locautSoapSerializer
Automation 'Microsoft Soap Type Library v3.0'.SoapSerializer30

locautXmlDoc Automation 'Microsoft XML, v6.0'.DOMDocument



IF ISCLEAR(LocautSoapHttpConnector) THEN
CREATE(LocautSoapHttpConnector);

LocautSoapHttpConnector.Property('ProxyServer','isaserver');
LocautSoapHttpConnector.Property('ProxyPassword','proxypass');
LocautSoapHttpConnector.Property('ProxyUser','username');

LocautSoapHttpConnector.Property('EndPointURL','http://servername:7047/DynamicsNAV/ws/coduenit/');
LocautSoapHttpConnector.Connect;
LocautSoapHttpConnector.Property('SoapAction','http://servername:7047/DynamicsNAV/ws/coduenit/thefunction');
LocautSoapHttpConnector.BeginMessage;

CREATE(LocautSoapSerialize);
LocautSoapSerialize.Init(LocautSoapHttpConnector.InputStream);

LocautSoapSerialize.StartEnvelope('SOAP','STANDARD');
LocautSoapSerialize.StartBody;
LocautSoapSerialize.StartElement(Elemento o nodo);

 LocautSoapSerialize.StartElement('Elemento hijo');
 LocautSoapSerialize.WriteString('Parametro valido');
 LocautSoapSerialize.EndElement;

LocautSoapSerialize.EndElement;
LocautSoapSerialize.EndBody;
LocautSoapSerialize.EndEnvelope;

LocautSoapHttpConnector.EndMessage;

IF ISCLEAR(XMLDOM) THEN
CREATE(XMLDOM);
//Cargar la respuesta del servicio web esta es un fichero xml
XMLDOM.load(LocautSoapHttpConnector.OutputStream);
XMLNode := XMLDOM.selectSingleNode('//valid');

miércoles, 11 de mayo de 2011

Excel Buffer

El Excel buffer es una tabla del estándar de Navision que se emplea para importar o exportar datos de una hoja excell. Lo que vamos a hacer es una especificación bastante básica de esta tabla y como se puede importar o exportar información. El único problema que tiene y me parece un poco grave es la concurrencia de diferentes usuarios a la vez .

Campos tabla
Para mí los principales campos de las tablas son:

Row No. Integer
xlRowID Text 10
Column No. Integer
xlColID Text 10
Cell Value as Text Text 250

“Row no.” es el campo donde se especifica la línea del Excel que vamos a procesar y en su on validate tiene código que actualiza el xlRowID que es la referencia que se utiliza en el excell.

“Column No.” Funciona exactamente igual que el Row no. Lo único que en su campo xLColID escribe la letra de la columna en vez del número de la misma.
“Cell Value as text” es el campo donde se guarda el contenido de la celda que queremos tratar y se guarda siempre como text.


Principales funciones

CreateBook: Crea un nuevo libro Excel y usa como parámetro ruta y nombre del fichero y nombre para la hoja que compone el documento.

OpenBook: Abre un documento de Excel y como parámetro se le introduce el documento Excel y la hoja que queremos abrir.

ReadSheet: lee las hojas que contiene el documento Excel y devuelve como parámetro el nombre de las mismas, se puede utilizar como parámetro de la función “ OpenBook”. Introduce direcatamente los registros leídos en la tabla ExcelBuffer.

CreateSheet: Crea la hoja del documento Excel y al igual que la “ReadSheet” se puede utilizar como parámetro de la función “CreateBook”.

SelectSheetsName: Saca una ventana de diálogo con cada una de las hojas que componen el libro Excel y asi seleccionar cual se quiere leer.

Para importar

Vamos a importar a una tabla de Navision la información de una hoja de Excel. En la tabla solo volcaremos la información que nos interese de esa tabla.
Lo primero que hay que hacer es volcar los datos a la tabla Excel buffer y de ahí leer esos datos y pasarlos a la tabla que nos interese. Una vez bloqueada la tabla Excel buffer ya podemos trabajar con ella.

CLEAR(rExcelBuffer);
rExcelBuffer.OpenBook(“rutafichero”,rExcelBuffer.SelectSheetsName(rutafichero));
rExcelBuffer.ReadSheet();

Una vez que lo tenemos importado todos los datos en la tabla Excel buffer vamos a leerlos y utilizar los que nos interesen para volcarlos en nuestra tabla.

//sacamos el último nº de fila y columna para determinar hasta donde tenemos que leer, en este caso hemos puesto todo lo que hay volcado.

IF rExcelBuffer.FINDLAST THEN BEGIN
vUltimaFila:=rExcelBuffer."Row No.";
vUltimaCol:=rExcelBuffer."Column No.";
END;

//Recorremos los registros desde donde nos interese hasta el final que hemos determinado anteriormente y en función de la columna que sea sabemos que es un campo u otro y lo asignamos a una variable que luego utilizaremos para cargar la tabla

FOR vIndice := 3 TO vUltimaFila DO BEGIN
rExcelBuffer.SETRANGE("Row No.",vIndice);
IF rExcelBuffer.FINDFIRST THEN REPEAT
CASE rExcelBuffer."Column No." OF
2:vNtraking:=DELCHR(rExcelBuffer."Cell Value as Text",'=','.');

rTabla.init;
rTabla.”Numero traking” := vNtraking;
rTabla.Insert;

//por úlitmo se cierra el bucle y elminamos los registros ya leidos y procesados
END;
CLEAR(rExcelBuffer);
rExcelBuffer.DELETEALL;

Para Exportar
Al igual que en la exportación lo primero es meter en la tabla excell buffer lo uqe nos interesa para luego exportarlo.

//lo que hacemos es recorrer una tabla de dos campos únicamente e insertar un registro por columna la primera sería 1,1 la segunda 1,2 la siguiente 2,1…N,2, con el bucle for le dicemiso que inserte una línea por columna y fuera actualiza el numero de línea

rExcel.DELETEALL;
vFila:=1;
IF FINDSET THEN REPEAT
rExcel.INIT;
rExcel.VALIDATE("Row No.",vFila);
FOR vIndex :=1 TO 2 DO BEGIN
rExcel.VALIDATE("Column No.",vIndex);
IF vIndex = 1 THEN
rExcel."Cell Value as Text":=FORMAT("Server Name");
IF vIndex = 2 THEN
rExcel."Cell Value as Text":=FORMAT("My Server");
IF rExcel.INSERT THEN;
END;
vFila+=1;
UNTIL NEXT = 0;

//Para mostrar esto en un Excel abrimos un libro creado y creamos la hoja y finalmente mostramos el documento abierto

rExcel.OpenBook('c:\a.xls',rExcel.SelectSheetsName('c:\a.xls'));
rExcel.CreateSheet('Hoja1','Hoja1',COMPANYNAME,USERID);
rExcel.GiveUserControl();
o también


rExcelB.CreateBook;
rExcelB.CreateSheet('NombreHoja','PurchDocs',COMPANYNAME(),USERID());
rExcelB.GiveUserControl();