//[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
        public string getDatosSuper(string sXml)
        {
            string           sRes = "", sPaso = "Inicio\r\n";
            string           sNomPar = "", sValPar = "";
            string           t145_idusuario = "", t145_clave = "", t314_password = "", t742_clavews = "";
            int              t314_idusuario = -1;
            bool             buser = false, bclave = false, bidUser = false, bpassw = false, bcons = false, bConsultaRealizada = false;
            StringBuilder    sb             = new StringBuilder();
            List <PARAMETRO> aListParamXML  = new List <PARAMETRO>();
            List <PARAMETRO> aListParamProc = new List <PARAMETRO>();

            try
            {
                #region Leo el XML de entrada para obtener los parámetros de la consulta
                //ArrayList aListParam = new ArrayList();
                System.Xml.XmlDocument doc = new XmlDocument();
                doc.LoadXml(sXml);
                XmlNode     oXML2  = doc.FirstChild;
                XmlNodeList lNodos = oXML2.ChildNodes;
                //sPaso += "Despues de inicializar parámetros. ";
                foreach (XmlNode oNodo in lNodos)
                {
                    //sPaso += "oNodo.Name=" + oNodo.Name + " ";
                    switch (oNodo.Name)
                    {
                    case "user":    //Código de usuario del servicio web
                        buser          = true;
                        t145_idusuario = oNodo.InnerText.Trim();
                        //sPaso += "t145_idusuario=" + t145_idusuario;
                        break;

                    case "clave":    //clave de usuario del servicio web
                        bclave     = true;
                        t145_clave = oNodo.InnerText.Trim();
                        break;

                    case "idUser":    //Usuario que pide la consulta
                        bidUser        = true;
                        t314_idusuario = Utilidades.getEntero("idUser", oNodo.InnerText);
                        break;

                    case "passw":    //clave de usuario SUPER para acceso al servicio web
                        bpassw        = true;
                        t314_password = oNodo.InnerText.Trim();
                        break;

                    case "cons":    //clave que identifica la consulta personalizada
                        bcons        = true;
                        t742_clavews = oNodo.InnerText.Trim();
                        break;

                    case "params":    //Recorro la lista de parámetros
                        int iNumParam = oNodo.ChildNodes.Count;
                        foreach (XmlNode oParams in oNodo.ChildNodes)
                        {
                            sNomPar = "";
                            sValPar = "";
                            //sPaso += "oParams.Name=" + oParams.Name + " ";
                            foreach (XmlNode oPar in oParams.ChildNodes)
                            {
                                //sPaso += "oPar.Name=" + oPar.Name + " ";
                                switch (oPar.Name)
                                {
                                case "nombre":
                                    //sPaso += "oParXML.t474_textoparametro=" + oPar.InnerText.Trim() + " ";
                                    sNomPar = oPar.InnerText.Trim();
                                    break;

                                case "valor":
                                    //sPaso += "oParXML.valor=" + oPar.InnerText.Trim() + " ";
                                    sValPar = oPar.InnerText.Trim();
                                    break;
                                }
                            }
                            if (sNomPar != "" && sValPar != "")
                            {
                                //sPaso += "Creo una instancia del objeto PARAMETRO";
                                PARAMETRO oParXML = new PARAMETRO(sNomPar, sValPar);
                                //sPaso += "Añado el parametro a la lista de parametros aListParamXML";
                                aListParamXML.Add(oParXML);
                                //sPaso += "Despues de añadir el parametro a la lista de parametros aListParamXML";
                            }
                        }
                        break;
                    }
                }
                #endregion
                //sPaso += "Despues de leer el XML de entrada.\r\n";
                #region Valido los parámetros de entrada
                #region Comprobar la existencia de parámetros de entrada
                if (!buser)
                {
                    sRes = @"<Datos><Error>-1</Error><Message>Falta el parámetro código de usuario del servicio web</Message></Datos>";
                }
                if (sRes == "")
                {
                    if (!bclave)
                    {
                        sRes = @"<Datos><Error>-1</Error><Message>Falta el parámetro código de clave del servicio web</Message></Datos>";
                    }
                }
                if (sRes == "")
                {
                    if (!bidUser)
                    {
                        sRes = @"<Datos><Error>-1</Error><Message>Falta el parámetro código de usuario de SUPER</Message></Datos>";
                    }
                }
                if (sRes == "")
                {
                    if (!bpassw)
                    {
                        sRes = @"<Datos><Error>-1</Error><Message>Falta el parámetro contraseña de usuario para acceso a servicios web de SUPER</Message></Datos>";
                    }
                }
                if (sRes == "")
                {
                    if (!bcons)
                    {
                        sRes = @"<Datos><Error>-1</Error><Message>Falta el parámetro código de consulta SUPER</Message></Datos>";
                    }
                }
                #endregion
                //sPaso += "Despues de comprobar la existencia de parametros de entrada.\r\n";
                #region Comprobar que los valores de los parámetros del XML son válidos
                CONSUMIDOR oCons = new CONSUMIDOR();
                //sPaso += "Despues de crear instancia de CONSUMIDOR.\r\n";
                if (sRes == "")
                {
                    if (t145_idusuario == "")
                    {
                        sRes = @"<Datos><Error>-2</Error><Message>Debe indicar código de usuario del servicio web</Message></Datos>";
                    }
                    else
                    {
                        //sPaso += "Antes de asignar valores a la instancia de CONSUMIDOR. t145_idusuario=" + t145_idusuario + "\r\n";
                        oCons = CONSUMIDOR.GetDatos(null, t145_idusuario);
                        if (oCons.t145_idusuario == "-1")
                        {
                            sRes = @"<Datos><Error>-1</Error><Message>Error al obtener los datos del Consumidor" + t145_idusuario + "\r\n" + oCons.t145_clave + "</Message></Datos>";
                        }
                        //sPaso += "Despues de asignar valores a la instancia de CONSUMIDOR.\r\n";
                        if (sRes == "")
                        {
                            if (oCons.t145_intentos > 10)
                            {
                                sRes = @"<Datos><Error>-3</Error><Message>El usuario de servicio web ha sobrepasado el nº de intentos de acceso erróneos</Message></Datos>";
                            }
                        }
                        if (sRes == "")
                        {
                            if (oCons.t145_idusuario != "")
                            {
                                if (DateTime.Now < oCons.t145_fiv || DateTime.Now > oCons.t145_ffv.AddDays(1))
                                {
                                    sRes = @"<Datos><Error>-5</Error><Message>Usuario de servicio web " + oCons.t145_idusuario +
                                           @" FIV: " + oCons.t145_fiv.ToString() + @"FFV: " + oCons.t145_ffv.AddDays(1).ToString() +
                                           @" fuera de vigencia</Message></Datos>";
                                }
                            }
                            else
                            {
                                sRes = @"<Datos><Error>-4</Error><Message>Usuario de servicio web no válido</Message></Datos>";
                            }
                        }
                    }
                }
                if (sRes == "")
                {
                    if (t145_clave == "")
                    {
                        sRes = @"<Datos><Error>-2</Error><Message>Debe indicar clave de usuario del servicio web</Message></Datos>";
                    }
                    else
                    {
                        if (t145_clave != oCons.t145_clave)
                        {
                            sRes = @"<Datos><Error>-6</Error><Message>Clave de usuario del servicio web no válida</Message></Datos>";
                        }
                    }
                }
                USUARIO oUser = new USUARIO();
                //sPaso += "Despues de crear instancia de USUARIO.\r\n";
                if (sRes == "")
                {
                    if (t314_idusuario == -1)
                    {
                        sRes = @"<Datos><Error>-2</Error><Message>Debe indicar código de usuario de SUPER</Message></Datos>";
                    }
                    else
                    {
                        oUser = USUARIO.GetDatos(null, t314_idusuario);
                        if (oUser.t314_idusuario != -1)
                        {
                            if (DateTime.Now < oUser.t314_falta)
                            {
                                sRes = @"<Datos><Error>-9</Error><Message>Usuario SUPER no activo. Fecha de alta: " + oUser.t314_falta.ToString() + "</Message></Datos>";
                            }
                            if (sRes == "" && oUser.t314_fbaja != null)
                            {
                                DateTime dtAux = (DateTime)oUser.t314_fbaja;
                                dtAux = dtAux.AddDays(1);
                                if (DateTime.Now > dtAux)
                                {
                                    sRes = @"<Datos><Error>-9</Error><Message>Usuario SUPER no activo. Fecha de baja: " + dtAux.ToString() + "</Message></Datos>";
                                }
                            }
                        }
                        else
                        {
                            sRes = @"<Datos><Error>-8</Error><Message>Usuario SUPER no válido</Message></Datos>";
                        }
                    }
                }
                if (sRes == "")
                {
                    if (DateTime.Now < oUser.t001_fecalta)
                    {
                        sRes = @"<Datos><Error>-10</Error><Message>Profesional FICEPI no activo</Message></Datos>";
                    }
                    if (sRes == "" && oUser.t001_fecbaja != null)
                    {
                        DateTime dtAux = (DateTime)oUser.t001_fecbaja;
                        dtAux = dtAux.AddDays(1);
                        if (DateTime.Now > dtAux)
                        {
                            sRes = @"<Datos><Error>-10</Error><Message>Profesional FICEPI no activo. Fecha de baja: " + dtAux.ToString() + "</Message></Datos>";
                        }
                    }
                }
                if (sRes == "")
                {
                    if (t314_password == "")
                    {
                        sRes = @"<Datos><Error>-2</Error><Message>Debe indicar contraseña del usuario SUPER</Message></Datos>";
                    }
                    else
                    {
                        if (t314_password != oUser.t314_password)
                        {
                            sRes = @"<Datos><Error>-11</Error><Message>Contraseña del usuario SUPER no válida</Message></Datos>";
                        }
                    }
                }
                CONSULTA oConsulta = new CONSULTA();
                //sPaso += "Despues de crear instancia de CONSULTA.\r\n";
                if (sRes == "")
                {
                    if (t742_clavews == "")
                    {
                        sRes = @"<Datos><Error>-2</Error><Message>Debe indicar la consulta a realizar</Message></Datos>";
                    }
                    else
                    {
                        oConsulta = CONSULTA.GetDatos(null, t742_clavews, t314_idusuario);
                        if (oConsulta.t472_idconsulta == -1)
                        {
                            sRes = @"<Datos><Error>-12</Error><Message>Consulta no válida. t742_clavews=" + t742_clavews +
                                   " t314_idusuario=" + t314_idusuario + " Traza: " + oConsulta.t472_procalm + "</Message></Datos>";
                        }
                        else
                        {
                            if (!oConsulta.t472_estado)
                            {
                                sRes = @"<Datos><Error>-13</Error><Message>Consulta no activa</Message></Datos>";
                            }
                        }
                    }
                }
                if (sRes == "")
                {
                    if (oConsulta.t314_idusuario == -1)
                    {
                        sRes = @"<Datos><Error>-14</Error><Message>Consulta no accesible</Message></Datos>";
                    }
                    else
                    {
                        if (!oConsulta.t473_estado)
                        {
                            sRes = @"<Datos><Error>-15</Error><Message>Consulta no vigente</Message></Datos>";
                        }
                    }
                }
                #endregion
                //sPaso += "Despues de comprobar que los valores de los parametros del XML son validos.\r\n";
                #region Comprobar parametros del procedimiento almacenado y asignales valores
                if (sRes == "")
                {
                    aListParamProc = PARAMETRO.GetParametros(null, oConsulta.t472_idconsulta);
                    foreach (PARAMETRO oParam in aListParamProc)
                    {
                        if (sRes == "")
                        {
                            //Compruebo que para cada uno de los parámetros obligatorios de la consulta se ha pasado el parámetro en el XML
                            PARAMETRO oParXML = PARAMETRO.BuscarParametro(aListParamXML, oParam.t474_textoparametro);
                            if (oParXML == null)
                            {
                                if (!oParam.t474_opcional)
                                {
                                    sRes = @"<Datos><Error>-16</Error><Message>Faltan parámetros para la consulta</Message></Datos>";
                                }
                            }
                            else
                            {
                                //Solo recogeré el valor del parametro que viene en el XML si el valor del parametro en el proc.alm.
                                //es modificable por el usuario
                                if (oParam.t474_visible == "M")
                                {
                                    #region Compruebo que el valor pasado es del tipo adecuado
                                    switch (oParam.t474_tipoparametro)
                                    {//I->Entero; V->Varchar; M->Money; D->Date; B-> Booleano; A->Añomes
                                    case "I":
                                        if (!Utilidades.isInteger(oParXML.valor))
                                        {
                                            sRes = @"<Datos><Error>-17</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es un entero correcto</Message></Datos>";
                                        }
                                        break;

                                    case "M":
                                        if (!Utilidades.isNumeric(oParXML.valor))
                                        {
                                            sRes = @"<Datos><Error>-17</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es un double correcto</Message></Datos>";
                                        }
                                        break;

                                    case "A":
                                        if (!Utilidades.isAnoMes(oParXML.valor))
                                        {
                                            sRes = @"<Datos><Error>-17</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es un AñoMes correcto</Message></Datos>";
                                        }
                                        break;

                                    case "D":
                                        if (!Utilidades.isDate(oParXML.valor))
                                        {
                                            sRes = @"<Datos><Error>-17</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es una fecha correcta</Message></Datos>";
                                        }
                                        break;

                                    case "B":
                                        if (oParXML.valor != "0" && oParXML.valor != "1")
                                        {
                                            sRes = @"<Datos><Error>-17</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es un booleano correcto</Message></Datos>";
                                        }
                                        break;
                                    }
                                    #endregion
                                    if (sRes == "")
                                    {//Asigno el valor del parametro del proc.alm. con el valor que viene en el XML
                                        oParam.valor = oParXML.valor;
                                    }
                                }
                                else
                                {//El usuario está pasando un parámetro para el que no puede indicar valor
                                    sRes = @"<Datos><Error>-18</Error><Message>El valor del parámetro " + oParam.t474_textoparametro + " no es modificable</Message></Datos>";
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                #endregion
                //sPaso += "Despues de comprobar los parametros del procedimiento almacenado.\r\n";
                #endregion
                #region Obtengo los datos
                if (sRes == "")
                {
                    //sPaso += "Antes de ejecutarConsultaDS\r\n\tt314_idusuario=" + t314_idusuario.ToString() +
                    //            "\toConsulta.t472_procalm=" + oConsulta.t472_procalm ;
                    sb.Append(@"<Datos><Error>0</Error>");
                    try
                    {
                        sb.Append(CONSULTA.ejecutarConsultaDS(t314_idusuario, oConsulta.t472_procalm, aListParamProc));
                        sb.Append(@"</Datos>");
                        sRes = sb.ToString();
                        bConsultaRealizada = true;
                    }
                    catch (Exception e)
                    {
                        //sRes = @"<Datos><Paso>" + sPaso + "</Paso><Error>-20</Error><Message>" + e.Message.ToString() + "</Message></Datos>";
                        sRes = @"<Datos><Error>-20</Error><Message>" + e.Message.ToString() + "</Message></Datos>";
                    }
                }
                #endregion
                #region Actualizar contador de intentos
                if (bConsultaRealizada)//Si el acceso a sido correcto pongo a cero el contador de accesos erróneos
                {
                    CONSUMIDOR.SetIntentos(null, oCons.t145_idusuario, (short)0);
                }
                else
                {
                    oCons.t145_intentos++;
                    CONSUMIDOR.SetIntentos(null, oCons.t145_idusuario, oCons.t145_intentos);
                }
                #endregion
            }
            catch (Exception e1)
            {
                //sRes = @"<Datos><Paso>" + sPaso + "</Paso><Error>-1</Error><Message>" + e1.Message.ToString() + "</Message></Datos>";
                sRes = @"<Datos><Error>-1</Error><Message>" + e1.Message.ToString() + "</Message></Datos>";
            }
            return(Utilidades.cabXml() + sRes);
        }