viernes, 4 de noviembre de 2011
Comprobar numeración de tarjeta de crédito
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
//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
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.
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
jueves, 2 de junio de 2011
Recorrer Xml en Navision
Variables a Crear
locautXmlDoc Automation 'Microsoft XML, v6.0'.DOMDocument
XMLNodeList Automation 'Microsoft XML, v3.0'.IXMLDOMNodeList
XMLNode Automation 'Microsoft XML, v3.0'.IXMLDOMNode
XMLNodeBucle Automation 'Microsoft XML, v3.0'.IXMLDOMNode
vConta Integer
Tambien es necesario crear dos funciones para tratar los ficheros. Una función es para recorrer los nodos del propio Xml (LoadNodeList) y otra que recorra todos los nodos pero de la lista que ya hemos leido(Load node)
Funcion LoadNodeList
XMLDocument : Automation "'Microsoft XML, v3.0'.IXMLDOMDocument2";VAR XMLNodeList : Automation "'Microsoft XML, v3.0'.IXML;VAR ElementName:Text
XMLNodeList := XMLDocument.getElementsByTagName(ElementName);
Funcion LoadNodelist
XMLNodeList : Automation "'Microsoft XML, v3.0'.IXMLDOMNodeList";VAR XMLNode : Automation "'Microsoft XML, v3.0'.IXMLDOMNode";VAR RecordIndex:Integer
XMLNode := XMLNodeList.item(RecordIndex);
Una vez creadas estas funciones que nos van a ayudar a reconocer los elementos del xml vamos con el cuerpo del código. Se ha hecho un aplicación que lea nodos hasta un máximo de dos niveles de jerarquía. Si existiesen más niveles unicamente sería necesario ir añadiendo código siguiendo el mismo criterio que el primero de los hijos.
Código
XMLDocument.load('C:\NewPolizaInstance.xml'); //se carga el fichero
LoadNodeList(XMLDocument,XMLNodeList,'newPolizaInstanceResponse');//se cargan los nodos a partir del descrito
TotNumbOfRecsA := XMLNodeList.length; //se sacan el numero de nodos
LoadNode(XMLNodeList,XMLNode,0); //se cargan los nodos de la lista que hemos sacado
IF TotNumbOfRecsA > 0 THEN REPEAT
//aquí empezamos a recorrer los hijos que cuelgan del metodo buscado
XMLNodeList2 :=XMLNode.childNodes;
LoadNode(XMLNodeList2,XMLNodeBucle,0);
//cargamos los nodos hijos
IF XMLNodeBucle.hasChildNodes THEN
FOR vConta:=0 TO XMLNodeList2.length DO BEGIN
//si cada nodo hijo tiene hijos se recorre
//comprobar que tiene hijos el nodo
XMLNodeList3:=XMLNodeBucle.childNodes;
//aquí el tercer nivel de jerarquia
LoadNode(XMLNodeList3,XMLNodeBucle2,0);
IF XMLNodeBucle2.hasChildNodes THEN
FOR vConta2:=0 TO XMLNodeList3.length DO BEGIN
IF UPPERCASE(XMLNodeBucle2.nodeName) = 'PR' THEN
//con esto se opera para un nodo en concreto, en este caso
XMLNodeComprobar :=XMLNodeBucle2.childNodes.item(0);
// se introduce la información en una tabla en caso de que
IF NOT ISCLEAR(XMLNodeComprobar) THEN
// el nodo se llame programa
rLecturaXml.text1:=XMLNodeComprobar.text;
END;
XMLNodeBucle := XMLNodeList2.nextNode;
END;
XMLNode := XMLNodeList.nextNode;
UNTIL ISCLEAR(XMLNode);
martes, 31 de mayo de 2011
Métodos C# visibles en navision
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
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
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();
viernes, 15 de abril de 2011
Varios Servicios Web en un unico Servidor
Creando un segundo servicio Lo primero que hay que hacer es parar los servicios instalados y hacer una copia de la carpeta Servicios que se encuentra dentro del directorio de instalación del web services de Navision: C:\Program Files (x86)\Microsoft Dynamics NAV\60\Services Y poner como nombre de la carpeta Server2 o lo que queramos. Para esto haremos lo siguiente:
- Ir a “herramientas administrativas” y elegir servicios
- Seleccionar “Microsoft Dynamics NAV Server” y darle STOP
- Como ya hemos creado la copia de la carpeta services y la hemos llamado Services2 ahora hay que crear la instancia que hace referencia al servicio de la carpeta Services2.
Primero crearemos el Microsoft Dynamics Nav Server y luego el Microsoft Dynamics Nav Web Server ya que se necesitan un par de servicios por nueva base de datos un servicio web y un servicio Navision server. Para ello en la consola de comandos hay que poner lo siguiente:
sc \\
En nuestro caso será de la siguiente manera:
sc \\Webservices03 create MicrosoftDynamicsNAVServer$NAV2 binpath= "C:\Program Files\Microsoft Dynamics NAV\60\Service2\Microsoft.Dynamics.Nav.Server.exe $NAV2" DisplayName= "Microsoft Dynamics NAV Server Instance 2" start= auto type= own
MicrosoftDynamicsNAV$NAV2 es para decir que va a ser una nueva instancia del mismo tipo de servicio y es necesaria en el nombre de servicio como al crear la nueva instancia. En el parámetro Type hay que poner Own
MicrosoftDynamicsNAVWS$NAV2 es una instancia del servicio para que cree el servicio web y así tener el par de servidores que necesitamos. La sintaxis para crear este servicio es la misma que para el anterior lo único es que
Una vez hecho esto hay que cerrar y abrir la ventana de los servicios para que aparezcan los nuevos servicios que hemos creado en este caso serian:
- Microsoft.Dynamics.Nav.Server.exe
- Microsoft.Dynamics.Nav.web.Server.exe
Configurando los servicios creados
Una vez abierta la ventana con el listado de los servicios, vamos uno de los servicios y en las propiedades en la pestaña LogOn escoger la opción this account, poner webservices@atspain, sus contraseñas y guardar. No hay que arrancar porque daría error ya que los dos MicrosoftDynamicsNavServer están tirando del mismo puerto 7046 y hay que cambiarlo junto con la instancia del servicio en el fichero CustomconfigSetting.config de la carpeta Service2. Para el servicio MicrosoftDynamicsNavWebServer no es necesario cambiar el puerto y siempre tiraremos del 7047. En el fichero CustomconfigSetting.config cambiaremos las siguientes opciones:
Add key="DatabaseServer" value="Servidor de la nueva base de datos"
Add key="DatabaseName" value="Nombre de la nueva base de datos"
Add key =”ServerInstance” value =”DynamicsNav2”
Add key="ServerPort" value="7049"
Add key="WebServicePort" value="7047"
En este caso la url sería:
http://webservices03.dominio:7047/DynamicsNAV2/ws/Services
Problemas comunes.
Error: The Microsoft Dynamics NAV Business Web Services service on Local Computer started and then stopped. Solucion: suele ocurrir cuando intentamos arrancar dos servicios que tiran contra el mismo Puerto en este caso y por configuración estándar el 7046, cambiar puerto y listo.
Error: Cuando en el explorador nos aparece lo siguiente Solución: Es un problema de acceso a la base de datos, el servicio funciona bien pero no tiene permisos de entrada a la base de datos, hay que comprobar que en la base de datos del usuario esté creado el usuario que utilizamos para conectarnos en este caso webservices y que la licencia tenga activado el granulo 91000
jueves, 14 de abril de 2011
Creación de servicios web en tres capas diferentes
- WEBSERVICES03.ATSPAIN; Windows Server 2008 R2 Standard, están instalados los servicios web.
- SERVSQL; Windows Server 2008 R2 Standard, es donde está instalada la base de datos
- Clientes de Navision.
- 2.a configuración Servicios web Para configurar los servicios web es necesario ir a los servicios (herramientas admin.-->Servicios).Los dos servicios web de Navision son: - Microsoft Dynamics Nav Business Web Services - Microsoft Dynamics Nav Server En las propiedades de cada uno de estos dos servicios es necesario cambiar el usuario de logueo (pestaña LogOn opción this account)por el usuario que hemos creado anteriormente (webservices).
- 2.b Fichero configuración de servicios web Los parámetros del servicio Web se configuran en el fichero “CustomSettings” dentro de la carpeta C:\Program Files (x86)\Microsoft Dynamics NAV\60\Service del servidor donde están los web services instalados (Webservices03). Los parámetros más importante a modificar son : -
(se indica el servidor de base de datos) - (nombre de la base de datos sobre la que consumen los web service) - (nombre de la instancia del Navision Nav Server, es decir para identificar ese servicio en concreto, por defecto es DynamicsNAV no hace falta cambiarla pero se puede cambiar por ejemplo si hay más servicios instalados y así poder identificarlos) Una vez modificados estos parámetros se arrancan los servicios web. Se recomienda arrancar primero “Microsoft Dynamics Nav Server” y luego “Microsoft Dynamics Nav Business Web Service”.
- USE MASTER CREATE LOGIN [ReplaceWithNAVServerAccount] FROM WINDOWS; GO USE [ReplaceWithYourDatabaseName]
- CREATE USER [ReplaceWithNAVServerAccount] FOR LOGIN [ReplaceWithNAVServerAccount];
- CREATE SCHEMA [$ndo$navlistener] AUTHORIZATION [ReplaceWithNAVServerAccount];
- GO ALTER USER [ReplaceWithNAVServerAccount] WITH DEFAULT_SCHEMA = [$ndo$navlistener];
- GRANT SELECT ON [Object Tracking] TO [ReplaceWithNAVServerAccount];
4 Dar permisos de cuenta de usuario de dominio al directorio del servidor Es necesario darle al directorio del servidor del de “Microsoft dynamics nav server” del equipo donde están los servicios instalados (webservices03) todos los permisos del usuario de cuenta de dominio. - Ir a la carpeta : ProgramData\Microsoft\Microsoft Dynamics NAV\60\ - Propiedades y pestaña “Seguridad” - Seleccionar el usuario de cuenta de dominio y en los permisos poner Allow junto al permiso”Control Total”. - Seleccionar la cuenta “NETWORK SERVICE” y hacer como el usuario Allow junto al permiso de “Control Total” 5 Configuración de la delegación de usuarios Creando los SPN (Service Principal Names ): Hay que crear cuatro spn para el usuario webservices la sintaxis es la siguiente:
- Setspn –a HTTP/WEBSERVICES03 webservices
- Setspn –a HTTP/WEBSERVICES03.dominio webservices
- Setspn –a DynamicsNAV/webservices03:7046 webservices
- Setspn –a DynamicsNAV/webservices03.dominio:7046 webservices
Para comprobar que se han creado bien hay que ver el listado:
- Setspn –l webservices
- HTTP/WEBSERVICES03
- HTTP/WEBSERVICES03.dominio
- DynamicsNAV/webservices03:7046
- DynamicsNAV/webservices03.ATSPAIN:7046