///*******************************************************************************************************
        ///NOMBRE_FUNCIÓN: Consultar_Existe_Serie
        ///DESCRIPCIÓN: Forma y ejecuta una consulta para buscar un acceso por número de serie, regresa
        ///             true en caso de encontrarlo
        ///PARÁMETROS:
        ///         1. Serie: cadena de caracteres con el número de serie a consultar
        ///CREO: Roberto González Oseguera
        ///FECHA_CREO: 16-oct-2013
        ///MODIFICÓ:
        ///FECHA_MODIFICÓ:
        ///CAUSA_MODIFICACIÓN:
        ///*******************************************************************************************************
        public static bool Consultar_Existe_Serie(string Serie)
        {
            String    Mi_SQL;
            DataTable Dt_Consulta = new DataTable();

            Boolean Transaccion_Activa = false;

            Conexion.Iniciar_Helper();

            if (!Conexion.HelperGenerico.Estatus_Transaccion())
            {
                Conexion.HelperGenerico.Conexion_y_Apertura();
            }
            else
            {
                Transaccion_Activa = true;
            }
            try
            {
                Conexion.HelperGenerico.Iniciar_Transaccion();
                Mi_SQL = "SELECT " + Ope_Accesos.Campo_No_Acceso
                         + ", " + Ope_Accesos.Campo_No_Venta
                         + ", " + Ope_Accesos.Campo_Producto_ID
                         + " FROM " + Ope_Accesos.Tabla_Ope_Accesos
                         + " WHERE " + Ope_Accesos.Campo_Numero_Serie + " = '" + Serie + "'";

                Dt_Consulta = Conexion.HelperGenerico.Obtener_Data_Table(Mi_SQL.ToString());
                if (!Transaccion_Activa)
                {
                    Conexion.HelperGenerico.Terminar_Transaccion();
                }
            }
            catch (Exception E)
            {
                Conexion.HelperGenerico.Abortar_Transaccion();
                throw new Exception("Alta_Pago: " + E.Message);
            }
            finally
            {
                if (!Transaccion_Activa)
                {
                    Conexion.HelperGenerico.Cerrar_Conexion();
                }
            }
            // si la tabla está vacía, regresar falso
            if (Dt_Consulta == null || Dt_Consulta.Rows.Count <= 0)
            {
                return(false);
            }
            else // si la talba contiene resultados, regresar verdadero
            {
                return(true);
            }
        }
        ///*******************************************************************************
        ///NOMBRE DE LA FUNCIÓN : Consultar_Accesos
        ///DESCRIPCIÓN          : Regresa un DataTable con los Registros encontrados.
        ///PARAMETROS           : Accesos: Instancia de Cls_Ope_Accesos_Negocio con los valores de la Consulta a ser ejecutada
        ///CREO                 : Antonio Salvador Benavides Guardado
        ///FECHA_CREO           : 03/Octubre/2013
        ///MODIFICO             :
        ///FECHA_MODIFICO       :
        ///CAUSA_MODIFICACIÓN   :
        ///*******************************************************************************
        public static System.Data.DataTable Consultar_Accesos(Cls_Ope_Accesos_Negocio Accesos)
        {
            String    Mi_SQL;
            DataTable Dt_Consulta = new DataTable();

            Conexion.Iniciar_Helper();
            Conexion.HelperGenerico.Conexion_y_Apertura();

            Mi_SQL  = "SELECT " + Ope_Accesos.Campo_No_Acceso;
            Mi_SQL += ", " + Ope_Accesos.Campo_No_Venta;
            Mi_SQL += ", " + Ope_Accesos.Campo_Producto_ID;
            // subconsulta nombre producto
            Mi_SQL += ", (SELECT " + Cat_Productos.Campo_Nombre + " FROM " + Cat_Productos.Tabla_Cat_Productos
                      + " WHERE " + Cat_Productos.Campo_Producto_Id + "=" + Ope_Accesos.Tabla_Ope_Accesos + "." + Ope_Accesos.Campo_Producto_ID + ") AS NOMBRE_PRODUCTO";
            Mi_SQL += ", " + Ope_Accesos.Campo_Terminal_ID;
            Mi_SQL += ", " + Ope_Accesos.Campo_Numero_Serie;
            Mi_SQL += ", " + Ope_Accesos.Campo_Vigencia_Inicio;
            Mi_SQL += ", " + Ope_Accesos.Campo_Vigencia_Fin;
            Mi_SQL += ", " + Ope_Accesos.Campo_Estatus;
            Mi_SQL += ", " + Ope_Accesos.Campo_Fecha_Hora_Acceso;
            Mi_SQL += ", " + Ope_Accesos.Campo_Fecha_Hora_Salida;
            Mi_SQL += ", " + Ope_Accesos.Campo_Tipo;
            Mi_SQL += ", " + Ope_Accesos.Campo_Usuario_Creo;
            Mi_SQL += ", " + Ope_Accesos.Campo_Fecha_Creo;
            Mi_SQL += ", " + Ope_Accesos.Campo_Usuario_Modifico;
            Mi_SQL += ", " + Ope_Accesos.Campo_Fecha_Modifico;
            Mi_SQL += " FROM " + Ope_Accesos.Tabla_Ope_Accesos;
            Mi_SQL += " WHERE ";
            if (Accesos.P_No_Acceso != "" && Accesos.P_No_Acceso != null)
            {
                Mi_SQL += Ope_Accesos.Campo_No_Acceso + " = '" + Accesos.P_No_Acceso + "' AND ";
            }
            if (!string.IsNullOrEmpty(Accesos.P_Numero_Serie))
            {
                Mi_SQL += Ope_Accesos.Campo_Numero_Serie + " = '" + Accesos.P_Numero_Serie + "' AND ";
            }
            if (!string.IsNullOrEmpty(Accesos.P_Estatus))
            {
                Mi_SQL += Ope_Accesos.Campo_Estatus + " = '" + Accesos.P_Estatus + "' AND ";
            }
            if (Accesos.P_No_Venta != "" && Accesos.P_No_Venta != null)
            {
                Mi_SQL += Ope_Accesos.Campo_No_Venta + " = '" + Accesos.P_No_Venta + "' AND ";
            }
            if (Accesos.P_Producto_ID != "" && Accesos.P_Producto_ID != null)
            {
                Mi_SQL += Ope_Accesos.Campo_Producto_ID + " = '" + Accesos.P_Producto_ID + "' AND ";
            }
            if (Accesos.P_Terminal_ID != "" && Accesos.P_Terminal_ID != null)
            {
                Mi_SQL += Ope_Accesos.Campo_Terminal_ID + " = '" + Accesos.P_Terminal_ID + "' AND ";
            }

            if (Mi_SQL.EndsWith(" WHERE "))
            {
                Mi_SQL = Mi_SQL.Substring(0, Mi_SQL.Length - 7);
            }

            if (Mi_SQL.EndsWith(" AND "))
            {
                Mi_SQL = Mi_SQL.Substring(0, Mi_SQL.Length - 5);
            }

            Dt_Consulta = Conexion.HelperGenerico.Obtener_Data_Table(Mi_SQL.ToString());
            Conexion.HelperGenerico.Cerrar_Conexion();
            return(Dt_Consulta);
        }
        ///*******************************************************************************************************
        /// <summary>
        /// Forma y ejecuta consultas que crean triggers en la base de datos para guardar el log
        /// </summary>
        /// <param name="Tabla">Nombre de la tabla en la que se quiere quitar el log de eventos</param>
        /// <returns>TRUE en caso de operación exitosa</returns>
        /// <creo>Roberto González Oseguera</creo>
        /// <fecha_creo>22-may-2014</fecha_creo>
        /// <modifico></modifico>
        /// <fecha_modifico></fecha_modifico>
        /// <causa_modificacion></causa_modificacion>
        ///*******************************************************************************************************
        public static bool Crear_Servicio(string Tabla)
        {
            string        Mi_SQL;
            StringBuilder Campos           = new StringBuilder();
            StringBuilder Nuevos_Campos    = new StringBuilder();
            StringBuilder Campos_Viejos    = new StringBuilder();
            StringBuilder Campos_Validados = new StringBuilder();
            string        campo;

            Boolean Transaccion_Activa = false;

            Conexion.Iniciar_Helper();

            if (!Conexion.HelperGenerico.Estatus_Transaccion())
            {
                Conexion.HelperGenerico.Conexion_y_Apertura();
            }
            else
            {
                Transaccion_Activa = true;
            }

            try
            {
                Conexion.HelperGenerico.Iniciar_Transaccion();
                // consulta para obtener los nombre de los campos en la tabla
                Mi_SQL = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '"
                         + Cls_Constantes.Nombre_Base_Datos + "' AND TABLE_NAME = '" + Tabla + "'";

                DataTable Informacion_Tabla = Conexion.HelperGenerico.Obtener_Data_Table(Mi_SQL.ToString());

                int Cont_Llave_Primario = 0;

                foreach (DataRow Fila in Informacion_Tabla.Rows)
                {
                    campo = Fila[0].ToString();
                    Campos.Append(campo + ",");
                    Nuevos_Campos.Append("NEW." + campo + ",");
                    Campos_Viejos.Append("OLD." + campo + ",");
                    // se agrega una validación para comparar el valor anterior y nuevo de cada campo
                    // de manera que solamente se inserten los valores que cambiaron
                    // si el valor nuevo es nulo o vacío, insertar un un valor especial
                    if (Cont_Llave_Primario == 0)
                    {
                        Campos_Validados.Append("OLD." + campo + ",");
                        Cont_Llave_Primario++;
                    }
                    else
                    {
                        Campos_Validados.Append(" IF (OLD." + campo + " != NEW." + campo + " || (OLD." + campo + " <=> NEW." + campo + ") = 0, IF(NEW." + campo + " IS NOT NULL && NEW." + campo + " <> '', NEW." + campo + ", '<>'), NULL),");
                    }
                }

                // generar las consultas para los triggers
                string Mi_SQL_Ins = "DROP TRIGGER IF EXISTS btc_" + Tabla + "_tgr_aftins;"
                                    + " CREATE TRIGGER btc_" + Tabla + "_tgr_aftins AFTER INSERT ON " + Tabla
                                    + " FOR EACH ROW BEGIN INSERT INTO btc_" + Tabla + "(" + Campos.ToString() + " Operacion, btc_usuario) VALUES (" + Nuevos_Campos.ToString() + " 'ALTA', USER()); END";
                string Mi_SQL_Upd = "DROP TRIGGER IF EXISTS btc_" + Tabla + "_tgr_aftupd;"
                                    + " CREATE TRIGGER btc_" + Tabla + "_tgr_aftupd AFTER UPDATE ON " + Tabla + " FOR EACH ROW BEGIN"
                                    + " INSERT INTO btc_" + Tabla + "(" + Campos.ToString() + " Operacion, btc_usuario) VALUES ("
                                    + Campos_Validados.ToString() + " 'MODIFICADO', USER()); END";
                string Mi_SQL_Del = "DROP TRIGGER IF EXISTS btc_" + Tabla + "_tgr_aftdel;"
                                    + " CREATE TRIGGER btc_" + Tabla + "_tgr_aftdel AFTER DELETE ON " + Tabla + " FOR EACH ROW BEGIN"
                                    + " INSERT INTO btc_" + Tabla + "(" + Campos.ToString() + " Operacion, btc_usuario) VALUES ("
                                    + Campos_Viejos.ToString() + " 'ELIMINADO', USER()); END";

                Conexion.HelperGenerico.Ejecutar_NonQuery(Mi_SQL_Ins.ToString());
                Conexion.HelperGenerico.Ejecutar_NonQuery(Mi_SQL_Upd.ToString());
                Conexion.HelperGenerico.Ejecutar_NonQuery(Mi_SQL_Del.ToString());

                if (!Transaccion_Activa)
                {
                    Conexion.HelperGenerico.Terminar_Transaccion();
                }
            }
            catch (Exception E)
            {
                Conexion.HelperGenerico.Abortar_Transaccion();
                throw new Exception("Crear_Servicio: " + E.Message);
            }
            finally
            {
                if (!Transaccion_Activa)
                {
                    Conexion.HelperGenerico.Cerrar_Conexion();
                }
            }
            return(true);
        }