using System;
using System.Data;
using System.Collections;

namespace LLNet.Model
{
	/// <summary>
	/// Interfase que deben cumplir PROXY y BLL
	/// </summary>
	/// 
	/// TODO: Agregar parametros a los metodos.

	/// <summary>
	/// Enumeration of the filter option
	/// </summary>
	public enum FilterTypes { TopNRecords, BottomNRecords, TopNPercent, BottomNPercent };
	public enum TotalOperation { AbsSum, Summary, Average, Minimum, Maximum }

	/// <summary>
	/// Range type
	/// </summary>
	public class IntRange
	{
		#region Variables
			protected long iInitial;
			protected long iFinal;
		#endregion

		#region Constructores
			public IntRange(long initial, long final)
			{
				iInitial = initial;
				iFinal = final;
			}
			public IntRange(IntRange range)
			{
				iInitial = range.a;
				iFinal = range.b;
			}
			public IntRange(string range)
			{
				string[] tmp = range.Split("|".ToCharArray());
				iInitial = Convert.ToInt32(tmp[0]);
				iFinal = Convert.ToInt32(tmp[1]);
			}
		#endregion

		#region Propiedades
			public long a 
			{  
				get { return iInitial; } 
				set { iInitial = value;}
			}
			public long b { 
				get { return iFinal;  } 
				set { iFinal = value; }
			}
			public int inta 
			{  
				get { return Convert.ToInt32(iInitial); } 
				set { iInitial = value;}
			}
			public int intb 
			{ 
				get { return Convert.ToInt32(iFinal);  } 
				set { iFinal = value; }
			}
		#endregion

		#region Metodos publicos
			public override string ToString()
			{
				return String.Format("{0}|{1}", iInitial, iFinal);

			}
		#endregion

	}

	public interface IBLL
	{
		/// <summary>
		/// En los métodos que no reciben conexion se asume esta por defecto
		/// </summary>
		string DefaultConnName{get;set;}

		/// <summary>
		/// Obtiene el nombre del módulo al que pertenece el tipo de dataset
		/// </summary>
		/// <param name="dsType">Tipo de dataset</param>
		/// <returns></returns>
		string GetModuleNameFromDataSet(Type dsType);

		/// <summary>
		/// Ejecuta un método remoto de BLL
		/// </summary>
		/// <param name="moduleName">Nombre del módulo al que pertenece el método remoto</param>
		/// <param name="methodName">Nombre del método remoto</param>
		/// <param name="param">Dataset con la información que utilizará el método remoto</param>
		/// <returns></returns>
		DataSet RemoteExecute(string moduleName, string methodName, DataSet param);

		/// <summary>
		/// Ejecuta un método remoto de BLL en una conexión específica
		/// </summary>
		/// <param name="moduleName">Nombre del módulo al que pertenece el método remoto</param>
		/// <param name="methodName">Nombre del método remoto</param>
		/// <param name="param">Dataset con la información que utilizará el método remoto</param>
		/// <param name="connName">Conexión en la que se ejecutará el método remoto</param>
		/// <returns></returns>
		DataSet RemoteExecuteConn(string moduleName, string methodName, DataSet param, string connName);

		#region LoadModules (para cargar los modulos a utilizar en GUI) 2 Overloads

		/// <summary>
		/// Permite cargar mas de un módulo por sus nombres
		/// </summary>
		/// <param name="modules">En MODEL el nombre de cada namespace (carpeta) Ej: Recibos</param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		void LoadModules(string[] modules, string connName);

		/// <summary>
		/// Permite cargar un modulo por su nombre
		/// </summary>
		/// <param name="module">En MODEL el nombre de cada namespace (carpeta) Ej: Recibos</param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		void LoadModules(string module, string connName);

		#endregion

		#region GetSingleValue (para devolver un valor en base a una consulta en la conexión default) 3 Overloads
		
		/// <summary>
		/// Obtiene un valor basado en un queryName en la conexion default
		/// </summary>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <returns>valor resultante de la consulta ejecutada</returns>
		object GetSingleValue(string queryName, string module);

		/// <summary>
		/// Obtiene un valor basado en un queryName en la conexion default
		/// </summary>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <param name="condition">Condición que se le agrega al sql</param>
		/// <returns>valor resultante de la consulta ejecutada</returns>
		object GetSingleValue(string queryName, Utils.QueryParams pList, string module);
		
		object GetSingleValue(string queryName, Utils.QueryParams pList, string module, bool hidden);

		#endregion

		#region GetConSingleValue (para devolver un valor en base a una consulta en una conexion específica) 3 Overloads
		
		/// <summary>
		/// Obtiene un valor basado en un queryName en una conexión específica
		/// </summary>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <param name="module"></param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		/// <returns>valor resultante de la consulta ejecutada</returns>
		object GetConnSingleValue(string queryName, string module, string connName);

		/// <summary>
		/// Obtiene un valor basado en un queryName con parámetros en una conexión específica 
		/// </summary>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <param name="pList"></param>
		/// <param name="module"></param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		/// <returns></returns>
		object GetConnSingleValue(string queryName, Utils.QueryParams pList, string module, string connName);

		/// <summary>
		/// Obtiene un valor basado en un queryName en una conexión específica
		/// </summary>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		/// <param name="condition">Condición que se le agrega al sql</param>
		/// <returns>valor resultante de la consulta ejecutada</returns>
		object GetConnSingleValue(string queryName, Utils.QueryParams pList, string module, string connName, bool hidden);

		#endregion

		#region ExecuteSql (para ejecutar un sql) 2 Overloads

		int ExecuteSql(string queryName, string module);
		int ExecuteSql(string queryName, Utils.QueryParams pList, string module);

		#endregion

		#region ExecuteSqlConn (para ejecutar un sql en una conexion especifica) 2 Overloads

		int ExecuteSqlConn(string queryName, string module, string connName);
		int ExecuteSqlConn(string queryName, Utils.QueryParams pList, string module, string connName);

		#endregion

		#region getDataSet (para devolver datasets no tipados) 12 overloads
			/// <summary>
			/// Devuelve un dataset a partir de un queryName
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getDataSet(string module, string queryName);

			/// <summary>
			/// Devuelve un dataset a partir de un queryName y su condicion
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="condition">Condición que se le agrega al sql</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getDataSet(string module, string queryName,  Utils.QueryParams pList);

			/// <summary>
			/// Devuelve un dataset paginado
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="startRecord">Número de registro inicial</param>
			/// <param name="endRecord">Número de registro final</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getDataSet(string module, string queryName, long startRecord, long endRecord);
			
			/// <summary>
			/// Devuelve un dataset paginado con condicion
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="startRecord">Número de registro inicial</param>
			/// <param name="endRecord">Número de registro final</param>
			/// <param name="condition">Condición que se le agrega al sql</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getDataSet(string module, string queryName, long startRecord, long endRecord,  Utils.QueryParams pList);

			/// <summary>
			///  Devuelve una tabla de un dataset rankeada con condición
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="rankType">Indica la ubicacion de donde sacar los registros</param>
			/// <param name="range">Indica el rango a recuperar en base a filterRecType</param>
			/// <param name="rankField">Indica el campo por el cual se hara el ranking</param>
			/// <param name="records">Registros a obtener (pagineo)</param>
			/// <param name="rankFilter">Filtro una vez hecho el ranking</param>
			/// <param name="rankSort">Ordenamiento una vez hecho el ranking</param>
			/// <param name="pList">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getDataSet(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region getConnDataSet (para devolver datasets no tipados con una conexion específica) 12 overloads
			/// <summary>
			/// Devuelve un dataset a partir de un queryName
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getConnDataSet(string module, string queryName, string connName);

			/// <summary>
			/// Devuelve un dataset a partir de un queryName y su condicion
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="condition">Condición que se le agrega al sql</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getConnDataSet(string module, string queryName, string connName,  Utils.QueryParams pList);

			/// <summary>
			/// Devuelve un dataset paginado
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="startRecord">Número de registro inicial</param>
			/// <param name="endRecord">Número de registro final</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getConnDataSet(string module, string queryName, string connName, long startRecord, long endRecord);
			
			/// <summary>
			/// Devuelve un dataset paginado con condicion
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="startRecord">Número de registro inicial</param>
			/// <param name="endRecord">Número de registro final</param>
			/// <param name="condition">Condición que se le agrega al sql</param>
			/// <returns>DataSet no tipado</returns>
			DataSet getConnDataSet(string module, string queryName, string connName, long startRecord, long endRecord,  Utils.QueryParams pList );

			/// <summary>
			///  Devuelve una tabla de un dataset rankeada con condición
			/// </summary>
			/// <param name="module">modulo al que pertenece</param>
			/// <param name="queryName">Identificador del query a resolver por DAL</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="rankType">Indica la ubicacion de donde sacar los registros</param>
			/// <param name="range">Indica el rango a recuperar en base a filterRecType</param>
			/// <param name="rankField">Indica el campo por el cual se hara el ranking</param>
			/// <param name="records">Registros a obtener (pagineo)</param>/// 
			/// <param name="rankFilter">Filtro una vez hecho el ranking</param>
			/// <param name="rankSort">Ordenamiento una vez hecho el ranking</param>
			/// <param name="pList">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getConnDataSet(string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);

		#endregion

		#region getTypedDataSet (para devolver datasets fuertemente tipados) 9 Overloads
			/// <summary>
			/// Devuleve un dataset fuertemente tipado
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType);

			/// <summary>
			/// Devuleve un conjunto de tablas de un dataset fuertemente tipado 
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableNames">Lista de tablas a regresar</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string[] tableNames);

			/// <summary>
			/// Devuelve una tabla de un dataset fuertemente tipado
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string tableName);

			DataSet getTypedDataSet(Type dsType, string tableName, string pQueryName);

			/// <summary>
			/// Devuelve una tabla de un dataset fuertemente tipado con condición
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="condition">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string tableName, Utils.QueryParams pList);

			DataSet getTypedDataSet(Type dsType, string tableName, Utils.QueryParams pList, string pQueryName);

			/// <summary>
			///  Devuelve una tabla de un dataset fuertemente tipado paginada
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="startRecord">Registro Inicial</param>
			/// <param name="endRecord">Registro Final</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string tableName, long startRecord, long endRecord);

			/// <summary>
			///  Devuelve una tabla de un dataset fuertemente tipado paginada con condición
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="startRecord">Registro Inicial</param>
			/// <param name="endRecord">Registro Final</param>
			/// <param name="condition">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string tableName, long startRecord, long endRecord,  Utils.QueryParams pList);

			DataSet getTypedDataSet(Type dsType, string tableName, long startRecord, long endRecord,  Utils.QueryParams pList, string pQueryName);

		/// <summary>
		///  Devuelve una tabla de un dataset fuertemente tipado rankeada con condición
		/// </summary>
		/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
		/// <param name="tableName">Tabla a regresar dentro de dataset</param>
		/// <param name="rankType">Indica la ubicacion de donde sacar los registros</param>
		/// <param name="range">Indica el rango a recuperar en base a filterRecType</param>
		/// <param name="rankField">Indica el campo por el cual se hara el ranking</param>
		/// <param name="records">Registros a obtener (pagineo)</param>
		/// <param name="rankFilter">Filtro una vez hecho el ranking</param>
		/// <param name="rankSort">Ordenamiento una vez hecho el ranking</param>
		/// <param name="pList">Condición a agregar en el sql</param>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string queryName);

			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList, string queryName);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string queryName);

			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getTypedDataSet(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region getConnTypedDataSet (para devolver datasets fuertemente tipados con una conexion específica) 9 Overloads
			/// <summary>
			/// Devuelve un dataset fuertemente tipado en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string connName);

			/// <summary>
			/// Devuelve un conjunto de tablas de un dataset fuertemente tipado en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableNames">Lista de tablas a regresar</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string[] tableNames, string connName);

			/// <summary>
			/// Devuelve una tabla de un dataset fuertemente tipado en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, string pQueryName);
			/// <summary>
			/// Devuelve una tabla de un dataset fuertemente tipado con condición en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="condition">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Utils.QueryParams pList);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Utils.QueryParams pList, string pQueryName);
			/// <summary>
			///  Devuelve una tabla de un dataset fuertemente tipado paginada en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="startRecord">Registro Inicial</param>
			/// <param name="endRecord">Registro Final</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, long startRecord, long endRecord);

			/// <summary>
			///  Devuelve una tabla de un dataset fuertemente tipado paginada con condición en una conexión específica
			/// </summary>
			/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
			/// <param name="tableName">Tabla a regresar dentro de dataset</param>
			/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
			/// <param name="startRecord">Registro Inicial</param>
			/// <param name="endRecord">Registro Final</param>
			/// <param name="condition">Condición a agregar en el sql</param>
			/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, long startRecord, long endRecord,  Utils.QueryParams pList);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, long startRecord, long endRecord,  Utils.QueryParams pList, string pQueryName);

		/// <summary>
		///  Devuelve una tabla de un dataset fuertemente tipado rankeada con condición
		/// </summary>
		/// <param name="dsType">Tipo de dataset, Ej. dsDocumentos.getType()</param>
		/// <param name="tableName">Tabla a regresar dentro de dataset</param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		/// <param name="rankType">Indica la ubicacion de donde sacar los registros</param>
		/// <param name="range">Indica el rango a recuperar en base a filterRecType</param>
		/// <param name="rankField">Indica el campo por el cual se hara el ranking</param>
		/// <param name="records">Registros a obtener (pagineo)</param>
		/// <param name="rankFilter">Filtro una vez hecho el ranking</param>
		/// <param name="rankSort">Ordenamiento una vez hecho el ranking</param>
		/// <param name="pList">Condición a agregar en el sql</param>
		/// <param name="queryName">Identificador del query a resolver por DAL</param>
		/// <returns>DataSet Fuertemente Tipado</returns>
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string queryName);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList, string queryName);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string queryName);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, string rankSort);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getConnTypedDataSet(Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region GetCount (para devolver un count de una tabla) 5 Overloads
			long GetCount(Type dsType, string tableName);
			long GetCount(Type dsType, string tableName, string pQueryName);
			long GetCount(Type dsType, string tableName, Utils.QueryParams pList);
			long GetCount(Type dsType, string tableName, Utils.QueryParams pList, string pQueryName);
			long GetCount(string module, string queryName,  Utils.QueryParams pList);

			Model.IntRange GetCount(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			Model.IntRange GetCount(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			Model.IntRange GetCount(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			Model.IntRange GetCount(Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField);

			Model.IntRange GetCount(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			Model.IntRange GetCount(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			Model.IntRange GetCount(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			Model.IntRange GetCount(string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region GetConnCount (para devolver un count de una tabla con una conexion específica) 13 Overloads
			long GetConnCount(Type dsType, string tableName, string connName);
			long GetConnCount(Type dsType, string tableName, string connName, string pQueryName);
			long GetConnCount(Type dsType, string tableName, string connName, Utils.QueryParams pList);
			long GetConnCount(Type dsType, string tableName, string connName, Utils.QueryParams pList, string pQueryName);
			long GetConnCount(string module, string queryName,  string connName, Utils.QueryParams pList);

			Model.IntRange GetConnCount(Type dsType, string tableName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			Model.IntRange GetConnCount(Type dsType, string tableName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			Model.IntRange GetConnCount(Type dsType, string tableName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			Model.IntRange GetConnCount(Type dsType, string tableName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);

			Model.IntRange GetConnCount(string module, string queryName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort, Utils.QueryParams pList);
			Model.IntRange GetConnCount(string module, string queryName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, string rankSort);
			Model.IntRange GetConnCount(string module, string queryName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			Model.IntRange GetConnCount(string module, string queryName,  string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region getTotals (para devolver los totales de los campos de una tabla)
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, long startRecord, long endRecord);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, long startRecord, long endRecord, Utils.QueryParams pList);

			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, Model.FilterTypes rankType, Model.IntRange range, string rankField);

			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, long startRecord, long endRecord);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, long startRecord, long endRecord, Utils.QueryParams pList);

			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region getConnTotals (para devolver los totales segun los parametros con una conexion específica)
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, long startRecord, long endRecord);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, long startRecord, long endRecord, Utils.QueryParams pList);

			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, Type dsType, string tableName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);

			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, long startRecord, long endRecord);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, long startRecord, long endRecord, Utils.QueryParams pList);

			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, string rankFilter);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Model.IntRange records);

			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, string rankFilter);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField, Utils.QueryParams pList);
			DataSet getConnTotals(string[] fields, Model.TotalOperation operation, string module, string queryName, string connName, Model.FilterTypes rankType, Model.IntRange range, string rankField);
		#endregion

		#region UpdateDataSet (para actualizar un dataset) 3 Overloads

		/// <summary>	
		/// Actualizar DataSet (tipado o no tipado) en la conexión default
		/// </summary>
		/// <param name="ds">DataSet</param>
		/// <returns>DataSet actualizado</returns>
		DataSet updateDataSet(DataSet ds);

		DataSet updateDataSet(DataSet ds, string tableName);

		DataSet updateDataSet(DataSet ds, string[] tablesName);

		#endregion

		#region UpdateConnDataSet (para actualizar un dataset en una conexion específica) 3 Overloads

		/// <summary>
		/// Actualizar DataSet (tipado o no tipado) en una conexión específica
		/// </summary>
		/// <param name="ds">DataSet</param>
		/// <param name="connName">El valor de conexión definido en el xml de conexiones</param>
		/// <returns>DataSet actualizado</returns>
		DataSet updateConnDataSet(DataSet ds, string connName);

		DataSet updateConnDataSet(DataSet ds, string tableName, string connName);

		DataSet updateConnDataSet(DataSet ds, string[] tablesName, string connName);

		#endregion
	}
}
