miércoles, 14 de agosto de 2013

Obtener el Servidor y la Base de Datos actual en SQL

Cuando queremos acceder a la Base de datos y/o Servidor actual por algún motivo (Bien sea una consulta por ADO o para ver las BBDD que tenemos creadas) C/AL nos lo pone muy sencillo al tener a nuestra disposición unas tablas virtuales que nos exponen estos datos:
NameDataTypeSubtype
recServerRecordServer
recDatabaseRecordDatabase

Pero cuando accedemos por web service nos da un error porque las tablas virtuales no tienen generados los metadatos para ser utilizadas por estos.
Una de las formas de conseguirlo es mediante el archivo Config de los web services donde esta indicado el servidor y la BBDD. El archivo es CustomSettings.config y esta en la carpeta de la aplicacion. Este archivo es un XML con los parametros de configuracion que los web services desplegan al iniciar el servicio.

NameDataTypeSubtype
recServerRecordServer
recDatabaseRecordDatabase
recUsuarioSQLRecordUsuario
cu50203CodeunitCodeSQL
DomDocAutomation'Microsoft XML, v4.0'.DOMDocument
DomNodeAutomation'Microsoft XML, v4.0'.IXMLDOMNode
MyServerNameText
MyBBDDNameText
//Comprobamos si es el WEB Service o no
IF ISSERVICETIER THEN BEGIN
  //Creamos un objeto XML para tratar el archivo config  IF ISCLEAR(DomDoc) THEN
    CREATE(DomDoc);
  

  //Cargamos el archivo config
  DomDoc.load(APPLICATIONPATH + 'CustomSettings.config');

  //Leemos Los Nodos
  DomNode := DomDoc.selectSingleNode('//appSettings/add[@key='DatabaseServer']');
  MyServerName := DomNode.attributes.item(1).text;
  DomNode := DomDoc.selectSingleNode('//appSettings/add[@key='DatabaseName']');
  MyBBDDName := DomNode.attributes.item(1).text;

END ELSE BEGIN

   //Si no es WEB Service lo hacemos de la manera tradicional
   recServer.RESET;
   recServer.SETRANGE("My Server",TRUE);
   IF recServer.FINDSET THEN BEGIN
       recDatabase.RESET;
       recDatabase.SETRANGE("My Database",TRUE);
       IF recDatabase.FINDSET THEN BEGIN
          MyServerName := recServer."Server Name";

          MyBBDDName :=recDatabase."Database Name";
       END;
   END;
END;


Con esto tenemos resuelto el problema.

No hay comentarios:

Publicar un comentario