viernes, 31 de julio de 2009

Skills de un investigador


Todos tenemos o hemos tenido alguna vez en la mente la imagen de un investigador como un bicho raro metido en su mundo y con poca capacidad comunicativa, y sobre todo si tiene que ver con la tecnología. Nada más lejos de la realidad; esto no quiere decir que no sea verdad, sino que para bien, no debería serlo.


Sin ánimo de ser exhaustivo ni entrar en excesivo detalle, sí que me gustaría compartir aquí la información facilitada en un seminario sobre investigación y escritura de papers a la que asistí en la UPV y que fue dado por dos grandes investigadores, pero sobre todo comunicadores.


Pues bien, en una de las primeras partes del seminario se trató de los skills o competencias que debería tener un investigador, porque, a diferencia de lo que podemos pensar cuando empezamos en este mundillo: "a mi me gusta mucho tal materia, yo soy muy bueno en ella, yo voy a ser investigador en ella", casi lo que menos importa es esto, pues vamos a entrar en un proceso de comunicación, de conversación, con otras personas que están en ese mismo mundillo concreto de nuestra investigación, y con los que deberemos saber interactuar muy bien si queremos llegar a algo.


Pues bien, algunas de los skills que debemos tener como investigadores son:


  • Inglés: ¿Quién pensaba que el inglés no iba con él? En la investigación no es así. El inglés es el lenguaje estándar de comunicación en la comunidad científica, motivado quizás porque el mundo anglosajón es el que lleva la iniciativa en todo a lo que se refiere a investigación. Si no sabes inglés, primero a nivel leído, posteriormente escrito y por último en conversación, te puedes olvidar de la investigación. Las últimas novedades de tu área de interés, el punto actual del estado del arte, se encuentra en inglés, en revistas de alto prestigio escritas e indexadas en inglés. No puedes limitarte a escribir papers en revistas y congresos nacionales, debe llegar un momento en el que te dirijas a revistas internacionales, y quizás de mayor prestigio, y deberás hacerlo en inglés. Y por último, deberás asistir a congresos, relacionarte con otros investigadores, y lo vas a tener que hacer en inglés.

  • Comunicación: Debes ser un comunicador, ¿cuántas veces hemos oído que Einstein era mejor comunicador que científico? ¡Y mirad que era buen científico! No sólo valen los resultados de nuestra investigación, tenemos que comunicarlos. Pero no sólo esto, en la actualidad es difícil volver a inventar la rueda, la investigación avanza a pequeños empujones a la línea de conocimiento actual, empujones que vienen dados por pequeñas aportaciones de la comunidad científica, pequeños empujones que cada investigador da aportando su granito de arena a la conversación generada en su área de interés. ¿Si no sabemos escuchar, si no sabemos comunicar, cómo vamos a entender cuál es ese límite de conocimiento y cómo si lo traspasamos con nuestra investigación, vamos a saber comunicárselo al resto para que se empuje un poquito más?

  • Metodología: Debemos conocer la metodología científica así como las herramientas matemáticas y estadísticas que nos van a permitir sustentar de manera científica nuestra argumentación y por tanto dar validez a nuestra aportación. La frontera de conocimiento es una frontera teórica, lo que se sabe de un tema es algo teórico y lo que aportará nuestra investigación será algo teórico. Pero no olvidemos que una hipótesis para convertirse en teoría se debía ver respaldada por hechos y argumentaciones científicas, matemáticas, estadísticas...

  • Curiosidad: El mejor investigador es un niño. Los niños se asombran por todo, sienten curiosidad por todo, investigan todo, y más si les dices que no lo hagan, lo sé por propia experiencia. El investigador debe ser un niño, al menos no debe haber perdido, como la mayoría de adultos, esa capacidad de asombro, de curiosidad, de necesidad de entender y de querer saber más. La curiosidad mató al gato, ¿pero cómo lo mató? es lo que se preguntaría un investigador.

  • Capacidad de análisis: El investigador debe tener la capacidad de analizar el problema, la situación, el estado actual, los datos, los resultados... un sinfín de cosas. Y debe ser capaz de pasar de un nivel de máxima abstracción, dónde vea el problema de manera global, a un nivel de máximo detalle dónde se fije en una cosa tan concreta e invisible que para otro pasaría desapercibido.

  • Metódico: Las dos capacidades anteriores se deben complementar con esta. El investigador debe seguir un método, una guía, y documentarlo todo bien. Uno de los principios básicos del método científico es la reproductibilidad. Si hacemos un experimento debemos ser capaces de reproducirlo. Pero esto sólo lo conseguiremos si seguimos una guía para hacerlo y documentamos todo lo que hacemos, de manera ordenada y metódica.


Además de todas las anteriores seguro que si pensamos un poco se nos ocurren muchas más. Si algún investigador lo lee seguro que le pica la curiosidad de analizar lo que digo, sacarle punta, y escribir unas cuantas más.


Pero estas son básicas, si no las tenemos... dura será la investigación, y lo peor, no la disfrutaremos, y la investigación es para disfrutarla, porque es lo más bonito que hay, y porque en España con lo mal que se paga si no fuera por el disfrute no iba a investigar ni Dios!!!

Twitter, ¿dónde está...?


Twitter nace con el lema, "¿qué estás haciendo?", o su versión original, "what are you doing?"


Es una idea original e interesante, la prueba está en la cantidad de usuarios que nos hemos unido y que de manera compulsiva nos dedicamos a decir qué estamos haciendo.


Por otro lado los GIS están muy de moda, aunque llevan muchos años, con las capacidades tecnológicas actuales y la vuelta que se le ha dado a la Web hasta convertirla en Web 2.0, se están cada vez más utilizando para aplicaciones más variadas.


El seguimiento o tracking de dispositivos es uno de esos usos. Me refiero a dispositivos porque al final es al dispositivo al que se sigue, y dependiendo del dispositivo que sea, y de qué o quién lo lleve, nos podemos referir a seguimiento de flotas o seguimiento de personas.


El seguimiento básicamente consiste en un dispositivo con capacidad GPS y de transmisión GSM/GPRS... Se programa para que intermitentemente, o bajo demanda, envíe las coordenadas actuales obtenidas del GPS a un servidor Web vía conexión GSM/GPRS...


Y aquí comienza el GIS permitiendo la visualización de los puntos georeferenciados enviados por el dispositivo, lo que si se efectúa de manera que se enlaza un punto con el siguiente se genera una visualización de la ruta seguida, y si se permite la visualización en tiempo real permite ver por dónde está pasando el dispositivo en seguimiento.


Pero ¿qué sucede si queremos saber por dónde va un determinado dispositivo y sólo tenemos a mano un móvil? Pues tenemos dos opciones, tener la capacidad de visualizar en un GIS en el móvil (Google Maps Mobile, Tomtom, Nokia Maps...) el tracking, algo por otro lado un tanto difícil ya que la pantalla es limitada, o si no disponemos de GIS podemos llamar por teléfono a quién tenga un ordenador delante y nos lo cuente.


O tenemos una tercera opción, y es tener enlazado el sistema de tracking con un servidor de Twitter de manera que cada vez que se obtienen y envían las coordenadas del dispositivo, se genera una entrada en Twitter con la posición y dirección del mismo.


Esta solución la está aplicando Corex a sus clientes de tracking, tanto de flotas como de errantes, y resulta de gran interés ya que de manera sencilla y de un simple vistazo a unas líneas de texto fácil y rápidamente accesibles no sólo desde un pc, sino también desde cualquier dispositivo móvil con conexión a internet, sabes por dónde está pasando dicho dispositivo.


Un ejemplo de "Where Is...? In Twitter" lo podéis ver en http://twitter.com/corex_whereis


Innovar no sólo es inventar cosas nuevas, también es usar de manera innovadora las que ya existen.

martes, 28 de julio de 2009

Corex World: Sistemas de Información Geográfica



Corex Soluciones Informáticas viene dedicándose desde 2006 a varias líneas de investigación y desarrollo en Sistemas de Información Geográfica, como por ejemplo:


  • Investigación en estándares: OGC y OWS son los dos estándares GIS existentes. El primero de ellos, Open Geospatial Consortium, es el estándar dictado por la comunidad, y el segundo de ellos, OWS, es el estándar dictado por Google y recientemente incorporado en el OGC. Corex sigue de cerca el desarrollo y evolución de dichos estándares y los aplica en sus soluciones GIS.

  • Investigación en dispositivos e intercomunicación: Los dispositivos de seguimiento y sensorización son múltiples y muy variados, pero de todos ellos se espera lo mismo, obtener el máximo provecho. Corex mantiene un seguimiento en la evolución de los dispositivos, las funcionalidades, los medios de intercomunicación y sensorización, investigando nuevas aplicaciones de los mismos que aporten valor a nuestros clientes.

  • Investigación en medios de visualización: Además de la visualización gráfica de los GIS (en mapa bidimensional), se están poniendo de moda nuevos modos de visualización como la 3D o la visualización animada. Así mismo, Corex ha innovado enlazando sus sistemas de seguimiento con Twitter, de modo que se puede seguir un dispositivo sin necesidad de visualizarlo en mapa, y por tanto desde cualquier dispositivo que tenga acceso a internet. Una dirección de ejemplo abierta al público es: http://twitter.com/corex_whereis

  • Investigación en PLN y georeferenciación en lenguaje natural: La línea de investigación principal de Corex es la del Procesamiento del Lenguaje Natural. En GIS procuramos aplicar los resultados de investigaciones paralelas en este ámbito para georeferenciar contenidos a partir de WebMining, IR y PLN.

  • Seguimiento de flotas: Mediante su sistema Where Is...? y varios dispositivos que aunan tecnologías GPS y GSM, se efectúa el tracking en tiempo real de todo tipo de flotas (comerciales, policía, ambulancias...)

  • Control de errantes: Mediante el uso de los dispositivos más avanzados en sensorización e inteligencia medioambiental, y su enlace con el sistema Where Is...? y SIC+, Corex Soluciones Informáticas es proveedor de una solución de control de errantes que permite tener localizados en todo momento a personas con problemas de orientación y/o memoria

  • geoMarketing: Nacido de la confluencia del marketing con la geografía nace el geomarketing que aporta información para la decisión empresarial teniendo en cuenta la variable espacial. Georeferenciación de clientes, de proveedores, localización de sucursales, segmentación de mercados, localización y seguimiento de pandemias... todo lo que sea representable sobre el territorio y tenga importancia mercadotécnica, entra en esta magnífica manera de utilizar los GIS y es foco de estudio y aplicación para Corex.


Tras estos tres años de "trabajo en la sombra", llega el momento de abrirse a los lectores publicando lo que pueda ser de interés sobre los Sistemas de Información Geográfica, las líneas de investigación seguidas, los problemas y soluciones encontradas, y los productos y servicios desarrollados, esperando contar con la ayuda de nuestros lectores para evolucionar los productos y servicios hacia lo se espera de ellos.

Es por ello que hemos publicado las siguientes páginas:


Y por último, para el próximo otoño se prevee comenzar con los cursos de Introducción al GIS, certificados por la IDEC (Infraestructura de Datos Espaciales de Cataluña), que dará paso a cursos de especialización en cada uno de los temas en él contenidos.


Próximamente se hará pública su oferta.


Desde Corex esperamos que este Blog, así como todas las páginas asociadas, sean fuente de información y conocimiento de su agrado, y le invitamos a participar en las conversaciones y expresar sus dudas y sugerencias, para hacer entre todos un lugar de confluencia de los apasionados al GIS.

Jerarquía de Chomsky


Demos un breve repaso a la jerarquía de gramáticas de Chomsky:


Tipo 0: Contiene reglas que transforman un número arbitrario de símbolos no vacío en otro número arbitrario, posiblemente vacío, de símbolos.


aAB -> a

bB -> aBC


Tipo 1: Una gramática es tipo 1 monotónica si no contiene reglas donde el lado izquierdo consista en más símbolos que el lado derecho:

|A| <= |B| A ->B

AF -> ABab
S -> aAB


Una gramática es tipo 1 sensible al contexto si todas sus reglas son sensibles al contexto. Una regla es sensible al contexto si solo un símbolo no terminal en el lado izquierdo se reemplaza por otro símbolo mientras el resto permanece inalterado y en el mismo orden.

bQc -> bbcc

o la gramática que genera el mismo número de a, b, c:

Ss -> abc | aSQ

bQc -> bbcc

cQ -> Qc


Tipo 2: Son gramáticas libres de contexto cuando en su lado izquierdo siempre aparece un único no-terminal

A -> a|b|c

B -> A|CaA

C -> A,C|A


Tipo 3: Son gramáticas regulares o de estados finitos cuando en su lado derecho sóilo se contiene un no-terminal y además se encuentra al final de la producción. Esto produce dos clases de reglas:


- Un no-terminal produce cero o más terminales
- Un no-terminal produce cero o más terminales seguidos por un no-terminal.


La definición original de Chomsky lo restringe:


- Un no-terminal produce un terminal
- Un no-terminal produce un terminal seguido por un no-terminal


Por ejemplo (no-terminales empiezan en mayúsculas):

Sentence -> tom|dick|harry|List

List -> tom List Tail | dick List Tail | harry List Tail

List Tail -> ,List | and tom | and dick | and harry


El siguiente tipo no pertenece a la jerarquía oficial propuesta por Chomsky:


Tipo 4: Gramáticas de elección finita (FC), no se permite ningún no-terminal a la derecha y el símbolo inicial de la gramática tiene una lista finita de alternativas.


Un ejemplo de por qué es más restrictiva una gramática regular que una independiente del contexto viene dado por la siguiente situación equivalente al problema de determinar que en una expresión (o en un trozo de código programado) el número de elementos que abren (por ejemplo paréntesis o llaves) es igual al número de elementos que cierran:


Sea ∑ el alfabeto ∑={a,b} y L la gramática independiente del contexto (GIC) siguiente L={b, aba, aabaa, aaabaaa,...} = {anban, n≥0}


Lo más parecido con una expresión regular sería Lr={a*ba*}, dónde * no asegura coincidencia.


Conclusión: Las expresiones regulares no saben contar, con lo que podemos apreciar que tenemos una gramática más restrictiva que la anterior.

Recordemos que una gramática es tanto más restrictiva cuanto mayor es el orden de su tipo. Por lo tanto, las gramáticas más restrictivas son las regulares, lo que significa que pueden modelar un número menor de comportamientos del lenguaje, como el presentado de su incapacidad para contar.


El lenguaje natural, el utilizado por el ser humano, se podría considerar dentro de una gramática tipo 0, lo que nos permite generar un número infinito de construcciones lingüísticas correctas, incluso de manera creativa o inventiva.


El problema en el caso del Procesamiento del Lenguaje Natural está servido, cuanto menos restrictiva es una gramática, mayor dificultad para su implementación automática.


En el caso de los analizadores léxicos suele ser suficiente la implementación de una gramática tipo 3, y en el caso de los lenguajes de programación, incluso con una semántica pronunciada, se pueden implementar con una gramática tipo 2.


¿Qué pasa pues con el lenguaje natural? Pues aunque en su infinitud pertenezcan a los tipo 0, la mayoría de aplicaciones de PLN pueden ser implementadas mediante gramáticas de tipo 1, incluso apurando, en aplicaciones concretas, de tipo 2.


Pero en cualquier caso este tipo de gramáticas sigue siendo de difícil implementación sobre todo cuando su tamaño y crecimiento hacen necesario el manejo de grandes árboles conceptuales, por lo que aplicaciones actuales, como el traductor automático Google Translator, hacen uso de técnicas estadísticas, obteniendo resultados similares a otros traductores clasistas como Systran, así como otras muchas aplicaciones de recuperación de información hacen uso intenso de reconocimiento de entidades, n-gramas, expresiones regulares (gramáticas tipo 4) para y combinadas con lo anterior, hibridaciones entre gramática/estadística (o métodos de aprendizaje automático...)


Siendo simple en nuestros pensamientos, ¿por qué tenemos que imitar el funcionamiento del cerebro humano con una única y compleja teoría si podemos hacerlo mezclando millones de ellas de lo más simples? Quién sabe cuándo se nos dará una respuesta... por el momento, aquí queda un breve resumen de la jerarquía del padre de la gramática generativa transformacional.

martes, 21 de julio de 2009

Blog corporativo


¿Por qué debería un negocio contar con un blog?


Según el destacado consultor de Radiant Marketing Group, Paul Chaney, las siguientes son algunas de las razones:


  • Marketing SEO: Los blogs proporcionan una mayor presencia en los motores de búsqueda más importantes, su indexación es más rápida y su contexto se posiciona mejor.

  • Marketing relacional: Los blogs permiten crear relaciones más personales y duraderas con los clientes.

  • Medios y relaciones públicas: Internet es el mayor MassMedia de la actualidad, y los blogs tienen un nicho muy importante en ella.

  • Comunicaciones directas: Permiten hablar directamente a los clientes, personalizando la relación con la empresa.

  • Construcción de marca: Es un canal alternativo a la creación y comunicación de la imagen de marca.

  • Diferenciación competitiva: Los blogs permiten contar la misma historia más de una vez y de más de una manera posible, atendiendo por tanto a todos los puntos de vista, lo que permite y ayuda a la diferenciación respecto a la competencia.

  • Aprovechamiento de los nichos: Los blogs permiten a la empresa posicionarse y rellenar una parte de su nicho del mercado.

  • Reputación: Permiten administrar la reputación de la empresa en la red.

  • Posicionarse como experto: Son un medio excelente para articular los puntos de vista, conocimientos y pericias en los temas concernientes a la industria y mercado de la empresa

  • Administración de conocimiento: Son una herramienta excelente para la comunicación interna y externa de la empresa, permitiendo gestionar de manera clara y sencilla el conocimiento de la misma.


Tras estas indicaciones claras y concisas, ¿aún no tiene claro para qué pueden ayudar los blogs a su empresa?

sábado, 11 de julio de 2009

¿Cómo se hace...?


Estrenamos una nueva sección en el Blog de los profesionales del Grupo Fivasa, "¿Cómo se hace...?"


Tras la petición de varios de nuestros colaboradores de informar sobre los problemas diarios que encontramos en nuestras investigaciones y desarrollos, y cómo hacemos para solucionarlos, hemos decidido abrir esta sección dónde os contaremos paso a paso "Cómo se hace..." para solucionar un determinado problema que acaba volviéndonos locos por un tiempo y que tanto nos satisface su resolución, y que por supuesto, su conocimiento puede servir de gran ayuda al que lo lea.


Por supuesto, en este punto no daremos soluciones como la del post anterior de este blog (véase Refactoring), escrita por un maravilloso ingeniero anónimo que se quejaba de lo mal pagada que está la profesión de informático, sino por profesionales que día a día se esfuerzan por hacer las cosas bien.


Esperamos que sea del agrado de los lectores y sobre todo de provecho para el que nos lea.



jueves, 9 de julio de 2009

Refactoring


A veces nos preguntamos, ¿realmente es necesario el refactoring?

Vean el siguiente código de UNA ÚNICA FUNCIÓN escrito por un señor Ingeniero Superior en Informática...










private void CrearCalendarioCitas_Old()
{
moCitasAll = new OCitas();

moCitasAll.CITAS.Columns.Add("PACIENTE");
moCitasAll.CITAS.Columns.Add("TITULAR");
moCitasAll.CITAS.Columns.Add("TELEFONOS");
moCitasAll.CITAS.Columns.Add("1ª VISITA", typeof(bool));
moCitasAll.CITAS.Columns.Add("FECHA");
moCitasAll.CITAS.Columns.Add("HORA");
moCitasAll.CITAS.Columns.Add("H. Llegada");
moCitasAll.CITAS.Columns.Add("H. Entrada");
moCitasAll.CITAS.Columns.Add("H. Salida");

//Ponemos el calendario con id=1 en caso de que no haya ningún calendario seleccionado
if ((moCalendarioSala == null) && (moCalendarioEspecialista == null))
{
moCalendarioSala = new OCalendarios();
switch (NETCON)
{
case Constants.NETCON_INTERNET:
CopyDataSet(mWSCalend.GetCalendariosObject("ID=1", WSKEY, ref moConnectedUser), moCalendarioSala);
break;
case Constants.NETCON_INTRANET:
mFCalendarios = new FCalendarios(moFACConnectedUser);
mFCalendarios.GetObject("ID=1");
moCalendarioSala = mFCalendarios.ContainerObject;
break;
}
//si el calendario esta vacio lo pone a nulo para evitar fallos
if (moCalendarioSala.CALENDAR.Count == 0)
moCalendarioSala = null;
}

if (moCalendarioSala != null)
Intervalo_Minutos = Convert.ToInt16(moCalendarioSala.CALENDAR[0].CAL_INTERVALO);
if (moCalendarioEspecialista != null)
Intervalo_Minutos = Convert.ToInt16(moCalendarioEspecialista.CALENDAR[0].CAL_INTERVALO);

// Create hourly rows
DateTime oDateTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
int dias = Convert.ToInt16(dtpseleccionfin.Value.Date.Subtract(dtpseleccioninicio.Value.Date).TotalDays) + 1;
for (int dia = 0; dia < dias; dia++)
{
DateTime Fecha = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, oDateTime.Hour, oDateTime.Minute, oDateTime.Second);
//Creamos las filas dependiendo de los calendarios cargados
if (moCalendarioEspecialista != null && moCalendarioSala != null)
{
DataRow[] oRowEsp = moCalendarioEspecialista.CALENDAR_WEEK.Select("CLW_DAY=" + (int)Fecha.DayOfWeek);
DataRow[] oRowSal = moCalendarioSala.CALENDAR_WEEK.Select("CLW_DAY=" + (int)Fecha.DayOfWeek);

//Dia adicional
DataRow[] DiaAdicionalEsp = moCalendarioEspecialista.CALENDAR_DAY_IN.Select("CLN_FECHA=" + GetTimestamp(Fecha));
DataRow[] DiaAdicionalSal = moCalendarioSala.CALENDAR_DAY_IN.Select("CLN_FECHA=" + GetTimestamp(Fecha));

//Dia Festivo
DataRow[] DiaFestivoEsp = moCalendarioEspecialista.CALENDAR_DAY.Select("CLD_FECHA=" + GetTimestamp(Fecha));
DataRow[] DiaFestivoSal = moCalendarioSala.CALENDAR_DAY.Select("CLD_FECHA=" + GetTimestamp(Fecha));

int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int f = 0;

DateTime FInicio, FFin, FInicioEsp, FFinEsp, FInicioSal, FFinSal, FInicioAdicionalEsp, FFinAdicionalEsp, FInicioAdicionalSal, FFinAdicionalSal, FInicioFestivoEsp, FFinFestivoEsp, FInicioFestivoSal, FFinFestivoSal;
FInicio = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);
FFin = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);

while (((b < oRowSal.Length) || (d < DiaAdicionalSal.Length)) && ((a < oRowEsp.Length) || (c < DiaAdicionalEsp.Length)))
{
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (e < DiaFestivoEsp.Length)
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (f < DiaFestivoSal.Length)
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}

if (((a < oRowEsp.Length) && ((((FInicioEsp >= FInicioSal) && (b < oRowSal.Length)) || (b >= oRowSal.Length)) && (((FInicioEsp >= FInicioAdicionalEsp) && (c < DiaAdicionalEsp.Length)) || (c >= DiaAdicionalEsp.Length)) && (((FInicioEsp >= FInicioAdicionalSal) && (d < DiaAdicionalSal.Length)) || (d >= DiaAdicionalSal.Length)))) || ((d >= DiaAdicionalSal.Length) && (b >= oRowSal.Length)))
{
while ((FInicioEsp >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioEsp >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioEsp >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioEsp >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioEsp;

if ((FFinEsp <= FFinSal) && (FFinEsp <= FFinAdicionalEsp) && (FFinEsp <= FFinAdicionalSal))
{
FFin = FFinEsp;
a++;
}
else if ((FFinSal <= FFinAdicionalEsp) && (FFinSal <= FFinAdicionalSal))
{
FFin = FFinSal;
b++;
}
else if (FFinAdicionalEsp <= FFinAdicionalSal)
{
FFin = FFinAdicionalEsp;
c++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
else if (((b < oRowSal.Length) && ((((FInicioSal >= FInicioAdicionalEsp) && (c < DiaAdicionalEsp.Length)) || (c >= DiaAdicionalEsp.Length)) && (((FInicioSal >= FInicioAdicionalSal) && (d < DiaAdicionalSal.Length)) || (d >= DiaAdicionalSal.Length)))) || ((c >= DiaAdicionalEsp.Length) && (a >= oRowEsp.Length)))
{
while ((FInicioSal >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioSal >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioSal >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioSal >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioSal;

if ((FFinEsp <= FFinSal) && (FFinEsp <= FFinAdicionalEsp) && (FFinEsp <= FFinAdicionalSal))
{
FFin = FFinEsp;
a++;
}
else if ((FFinSal <= FFinAdicionalEsp) && (FFinSal <= FFinAdicionalSal))
{
FFin = FFinSal;
b++;
}
else if (FFinAdicionalEsp <= FFinAdicionalSal)
{
FFin = FFinAdicionalEsp;
c++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
else if (((c < DiaAdicionalEsp.Length) && (((FInicioAdicionalEsp >= FInicioAdicionalSal) && (d < DiaAdicionalSal.Length)) || (d >= DiaAdicionalSal.Length))) || ((d >= DiaAdicionalSal.Length) && (b >= oRowSal.Length)))
{
while ((FInicioAdicionalEsp >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalEsp >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalEsp >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalEsp >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioAdicionalEsp;

if ((FFinEsp <= FFinSal) && (FFinEsp <= FFinAdicionalEsp) && (FFinEsp <= FFinAdicionalSal))
{
FFin = FFinEsp;
a++;
}
else if ((FFinSal <= FFinAdicionalEsp) && (FFinSal <= FFinAdicionalSal))
{
FFin = FFinSal;
b++;
}
else if (FFinAdicionalEsp <= FFinAdicionalSal)
{
FFin = FFinAdicionalEsp;
c++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
else if (((a >= oRowEsp.Length) && (c >= DiaAdicionalEsp.Length)) || (d < DiaAdicionalSal.Length))
{
while ((FInicioAdicionalSal >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalSal >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalSal >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalSal >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioAdicionalSal;

if ((FFinEsp <= FFinSal) && (FFinEsp <= FFinAdicionalEsp) && (FFinEsp <= FFinAdicionalSal))
{
FFin = FFinEsp;
a++;
}
else if ((FFinSal <= FFinAdicionalEsp) && (FFinSal <= FFinAdicionalSal))
{
FFin = FFinSal;
b++;
}
else if (FFinAdicionalEsp <= FFinAdicionalSal)
{
FFin = FFinAdicionalEsp;
c++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
while (FInicio < FFin)
{
while ((FInicio >= FFinFestivoEsp) && (e < DiaFestivoEsp.Length))
{
e++;
if (e < DiaFestivoEsp.Length)
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicio >= FFinFestivoSal) && (f < DiaFestivoSal.Length))
{
f++;
if (f < DiaFestivoSal.Length)
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

if ((FInicio <= FInicioFestivoEsp) && (FInicio <= FInicioFestivoSal))
{
if ((FFin >= FInicioFestivoEsp) || (FFin >= FInicioFestivoSal))
{
if (FInicioFestivoEsp <= FInicioFestivoSal)
{
while (FInicio < FInicioFestivoEsp)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
FInicio = FFinFestivoEsp;
}
else
{
while (FInicio < FInicioFestivoSal)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
FInicio = FFinFestivoSal;
}
}
else
{
while (FInicio < FFin)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
}
}
if (FFinFestivoEsp <= FFinFestivoSal)
{
FInicio = FFinFestivoEsp;
e++;
}
else
{
FInicio = FFinFestivoSal;
f++;
}
}
}
}
else if (moCalendarioEspecialista != null)
{
DataRow[] oRowEsp = moCalendarioEspecialista.CALENDAR_WEEK.Select("CLW_DAY=" + (int)Fecha.DayOfWeek);

//Dia adicional
DataRow[] DiaAdicionalEsp = moCalendarioEspecialista.CALENDAR_DAY_IN.Select("CLN_FECHA=" + GetTimestamp(Fecha));

//Dia Festivo
DataRow[] DiaFestivoEsp = moCalendarioEspecialista.CALENDAR_DAY.Select("CLD_FECHA=" + GetTimestamp(Fecha));

int a = 0;
int c = 0;
int e = 0;

DateTime FInicio, FFin, FInicioEsp, FFinEsp, FInicioAdicionalEsp, FFinAdicionalEsp, FInicioFestivoEsp, FFinFestivoEsp;
FInicio = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);
FFin = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);

while ((a < oRowEsp.Length) || (c < DiaAdicionalEsp.Length))
{
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (e < DiaFestivoEsp.Length)
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}

if (((FInicioEsp >= FInicioAdicionalEsp) && (c < DiaAdicionalEsp.Length) && (a < oRowEsp.Length)) || (c >= DiaAdicionalEsp.Length))
{
while ((FInicioEsp >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioEsp >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioEsp;

if (FFinEsp <= FFinAdicionalEsp)
{
FFin = FFinEsp;
a++;
}
else
{
FFin = FFinAdicionalEsp;
c++;
}
}
else if (c < DiaAdicionalEsp.Length)
{
while ((FInicioAdicionalEsp >= FFinEsp) && (a < oRowEsp.Length))
{
a++;
if (a < oRowEsp.Length)
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowEsp[a]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalEsp >= FFinAdicionalEsp) && (c < DiaAdicionalEsp.Length))
{
c++;
if (c < DiaAdicionalEsp.Length)
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalEsp[c]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioAdicionalEsp;

if (FFinEsp <= FFinAdicionalEsp)
{
FFin = FFinEsp;
a++;
}
else
{
FFin = FFinAdicionalEsp;
c++;
}
}
while (FInicio < FFin)
{
while ((FInicio >= FFinFestivoEsp) && (e < DiaFestivoEsp.Length))
{
e++;
if (e < DiaFestivoEsp.Length)
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoEsp[e]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoEsp = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

if (FInicio <= FInicioFestivoEsp)
{
if (FFin >= FInicioFestivoEsp)
{
while (FInicio < FInicioFestivoEsp)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
FInicio = FFinFestivoEsp;
}
else
{
while (FInicio < FFin)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
}
}
FInicio = FFinFestivoEsp;
e++;
}
}
}
else if (moCalendarioSala != null)
{
DataRow[] oRowSal = moCalendarioSala.CALENDAR_WEEK.Select("CLW_DAY=" + (int)Fecha.DayOfWeek);

//Dia adicional
DataRow[] DiaAdicionalSal = moCalendarioSala.CALENDAR_DAY_IN.Select("CLN_FECHA=" + GetTimestamp(Fecha));

//Dia Festivo
DataRow[] DiaFestivoSal = moCalendarioSala.CALENDAR_DAY.Select("CLD_FECHA=" + GetTimestamp(Fecha));

int b = 0;
int d = 0;
int f = 0;

DateTime FInicio, FFin, FInicioSal, FFinSal, FInicioAdicionalSal, FFinAdicionalSal, FInicioFestivoSal, FFinFestivoSal;
FInicio = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);
FFin = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59, 59);

while ((b < oRowSal.Length) || (d < DiaAdicionalSal.Length))
{
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
if (f < DiaFestivoSal.Length)
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}

if (((FInicioSal >= FInicioAdicionalSal) && (d < DiaAdicionalSal.Length) && (b < oRowSal.Length)) || (d >= DiaAdicionalSal.Length))
{
while ((FInicioSal >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioSal >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioSal;

if (FFinSal <= FFinAdicionalSal)
{
FFin = FFinSal;
b++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
else if (d < DiaAdicionalSal.Length)
{
while ((FInicioAdicionalSal >= FFinSal) && (b < oRowSal.Length))
{
b++;
if (b < oRowSal.Length)
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(oRowSal[b]["CLW_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}
while ((FInicioAdicionalSal >= FFinAdicionalSal) && (d < DiaAdicionalSal.Length))
{
d++;
if (d < DiaAdicionalSal.Length)
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaAdicionalSal[d]["CLN_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinAdicionalSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

FInicio = FInicioAdicionalSal;

if (FFinSal <= FFinAdicionalSal)
{
FFin = FFinSal;
b++;
}
else
{
FFin = FFinAdicionalSal;
d++;
}
}
while (FInicio < FFin)
{
while ((FInicio >= FFinFestivoSal) && (f < DiaFestivoSal.Length))
{
f++;
if (f < DiaFestivoSal.Length)
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAINICIO"].ToString().Split(':')[1]), 0);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[0]), Convert.ToInt16(DiaFestivoSal[f]["CLD_HORAFIN"].ToString().Split(':')[1]), 0);
}
else
{
FInicioFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
FFinFestivoSal = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 23, 59 , 59);
}
}

if (FInicio <= FInicioFestivoSal)
{
if (FFin >= FInicioFestivoSal)
{
while (FInicio < FInicioFestivoSal)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
FInicio = FFinFestivoSal;
}
else
{
while (FInicio < FFin)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}
}
}
FInicio = FFinFestivoSal;
f++;
}
}
}
else
{
DateTime FInicio = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia).Year, dtpseleccioninicio.Value.Date.AddDays(dia).Month, dtpseleccioninicio.Value.Date.AddDays(dia).Day, 0, 0, 0);
DateTime FFin = new DateTime(dtpseleccioninicio.Value.Date.AddDays(dia + 1).Year, dtpseleccioninicio.Value.Date.AddDays(dia + 1).Month, dtpseleccioninicio.Value.Date.AddDays(dia + 1).Day, 0, 0, 0);
while (FInicio < FFin)
{
moCitasAll.CITAS.Rows.Add(CrearRow(FInicio));
FInicio = ComprobarCita(FInicio);
}

}
}
}