Your SlideShare is downloading. ×
Programa para el cálculo de las necesidades hídricas en cultivos
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Programa para el cálculo de las necesidades hídricas en cultivos

2,926

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,926
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
230
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. ESCUELA SUPERIOR DE AGRICULTURA DE BARCELONA Ingeniería Técnica Agrícola Hortofruticultura y Jardinería Trabajo Final de Carrera Programa para el cálculo de las necesidades hídricas de los cultivos Autor: Víctor Yusta Laguna Diciembre de 1998
  • 2. ESCUELA SUPERIOR DE AGRICULTURA DE BARCELONA Ingeniería Técnica Agrícola Hortofruticultura y Jardinería Trabajo Final de Carrera Programa para el cálculo de las necesidades hídricas de los cultivos Profesor ponente: Nuria Cañameras i Riba Autor: Víctor Yusta Laguna Diciembre de 1998 2
  • 3. AGRADECIMIENTOS. A la profesora, Nuria Cañameras, por su a yuda y prestancia. A mi esposa, María Luz, por estar a mi lado. A mi hermana, Cristina, siempre está cuando la necesito. A mi sobrino, Víctor Manuel, me ha ayudado mucho en las traducciones. A mi amiga, Pilar Barceló, por su sabia crítica constructiva. A mis padres, Paco y Maruja, les quiero mucho. 3
  • 4. RESUMEN. La utilización del agua en la agricultura ha contribuido a un aumento muy importante de la producción en los últimos años. El aumento del consumo de agua para la agricultura origina un conflicto con las necesidades de consumo urbanas e industriales. Por tanto, la necesidad de realizar un consumo equilibrado es fundamental. Para ello se cuenta con métodos para estimar el agua necesaria para las plantas. Uno de los métodos de estimación que se propone es este trabajo es el descrito por la FAO, basado en el balance hídrico. Este calcula las entradas y salidas de agua en el conjunto aire-suelo-planta. Los cálculos mediante este método, sin ser complicados, son muy laboriosos y llevan a la necesidad de utilizar herramientas de ayuda para realizarlos. La informática es una herramienta que puede ayudar a realizar los cálculos de una manera rápida y eficaz. Así mismo, se convierte en un instrumento de simulación para adoptar estrategias cambiantes. El resultado ha sido un programa que realiza el cálculo del agua necesaria para un cultivo, mediante el método del balance hídrico propuesto por la FAO. Se tienen en cuenta los aspectos más importantes del balance hídrico: localización del cultivo, características del cultivo, datos meteorológicos, tipo de suelo, tipo de agua de riego, tipo de riego, y programación del riego. Palabras claves: agricultura - cultivo - regadío - necesidad hídrica - balance hídrico - informática. 4
  • 5. RESUM. La utilització de l'aigua a l'agricultura ha contribuït a un augment molt important de la producció en aquests últims anys. L'augment del consum d'aigua per a l'agricultura origina un conflicte amb les necessitats de consum urbanes i industrials. Per tant, la necessitat d'arribar a fer un consum equilibrat és fonamental. Per tal d'arribar a aconseguir-ho es poden fer servir mètodes per estimar l'aigua necessària per a les plantes. Un dels mètodes d'estimació que es proposa en aquest treball és el que descriu la FAO, basat en el balanç hídric. Aquest mètode calcula les entrades y sortides d'aigua en el conjunt aire-sòl-planta. Els càlculs mitjantçant aquest mètode, sense que siguin complicats, són molt laboriosos i comporten la necessitat de fer servir eines d'ajut per realitzar-los. La informàtica és una eina que pot ajudar a realitzar els càlculs d'una manera ràpida i eficaç. Així mateix, es converteix en un instrument de simulació per adoptar estratègies canviants. El resultat ha estat un programa que realitza el càlcul de l'aigua necessària per a un cultiu, mitjançant el mètode del balanç hídric proposat per la FAO. Es tenen en compte els aspectes més importants del balanç hídric: localització del cultiu, característiques del cultiu, dades meteorològiques, tipus de sòl, tipus d'aigua de reg, tipus de reg i programació del reg. Paraules clau: agricultura - cultiu - regadiu - necessitat hídrica - balanç hídric informàtica. 5
  • 6. SUMMARY. In recent times, water use for agricultural purposes has contributed to a dramatic increase in production. Higher water consumption in agriculture conflicts, however, with urban and industrial water needs A balanced water consumption policy is therefore crucial, methods being necessary to calculate the amount of water required by growing crops. One of the methods discussed in this work is the FAO water balance-based method, which measures water incomes and outputs for the whole system of airsoil-plant. Calculations obtained with this method are not complicated but they are really laborious. Thus, some calculating tools become necessary. Computers are useful, rapid tools to undertake these calculations. They may be also employed as simulation instruments to adopt changing strategies. The result has been a program based on the FAO water balance method to determine the quantity of water required by a crop. The major factors of this method —crop location, crop features, weather data, soil type, water type for irrigation, irrigation type and irrigation scheduling—have been considered. Key words: agriculture - crop – irrigation – water need – water balance – computers. 6
  • 7. Indice ÍNDICE. 1.Introducción 10 1.1. Superficie de regadío 11 1.2. Consumo equilibrado de agua 13 1.3. Estimación de las necesidades hídricas de los cultivos 14 1.3.1. Descripción 14 1.3.2. Punto óptimo de riego 17 1.3.2.1. Estado hídrico del suelo 18 1.3.2.2. Estado hídrico de la planta 19 1.3.2.3. Balance hídrico suelo-planta-atmósfera 19 1.3.3. Déficit hídrico 1.4. Estimación de las necesidades hídricas mediante el método FAO-24 1.4.1. Cálculo de la evapotranspiración 1.4.1.1. Cálculo de la evapotranspiración de referencia 21 23 24 24 1.4.1.1.1. Método Blaney-Criddle 25 1.4.1.1.2. Método de la Radiación 26 1.4.1.1.3. Método de Penman (FAO) 27 1.4.1.1.4. Evaporímetro de cubeta 29 1.4.1.1.5. Penman-Monteith (FAO-1990) 30 1.4.2. Coeficiente de cultivo 37 1.4.3. Evapotranspiración del cultivo 40 1.4.4. Factores locales que influyen en la evapotranspiración del cultivo 41 1.4.4.1. Clima 41 1.4.4.2. Humedad del suelo 42 1.4.4.3. Método de riego 42 1.4.4.4. Prácticas de cultivo 43 1.4.4.5. Rendimiento de los cultivos 44 1.4.5. Balance hídrico 44 1.4.5.1. Evapotranspiración del cultivo 44 1.4.5.2. Precipitación efectiva 45 7
  • 8. Indice 1.4.5.3. Aguas subterráneas 46 1.4.5.4. Percolación profunda 46 1.4.5.5. Variación de la reserva de agua en el suelo 47 1.4.6. Necesidades netas de riego 48 1.4.7. Lavado de sales 49 1.4.8. Eficiencia de la aplicación 51 1.4.9. Necesidades brutas de riego 52 1.4.10. Programación del riego 53 1.4.10.1. Períodos críticos 53 1.4.10.2. Momento de riego 54 1.4.10.3. Dosis de riego 54 1.4.10.4. Reserva de agua al inicio del cultivo 55 1.4.10.5. Duración del riego 55 1.5. Utilización de la informática para el cálculo de las necesidades hídricas 56 1.6. Programas existentes para el cálculo de las necesidades hídricas 58 1.6.1. Programa para el cálculo de la evapotranspiración de referencia 59 1.6.2. Programa para el cálculo de la evapotranspiración de cultivo 59 1.6.3. Programa para el cálculo de la textura 60 1.6.4. Programas para la adquisición de datos meteorológicos 60 1.6.5. Programas para el cálculo de las necesidades hídricas de los cultivos 61 Programas para la simulación de las necesidades hídricas 63 1.6.7. Otros programas relacionados con las necesidades hídricas 63 1.6.6. 2. Objetivos 65 3. Material y métodos 67 3.1. Material 68 3.2. Métodos 68 8
  • 9. Indice 4. Resultados y discusión 70 4.1. Flujo de datos 72 4.2. Programa 73 4.2.1. Diseño 74 4.2.2. Mantenimiento de tablas 74 4.2.3. Finca 75 4.2.4. Cultivo 76 4.2.5. Meteorología 79 4.2.6. Suelo 82 4.2.7. Agua de riego 84 4.2.8. Tipo de riego 85 4.2.9. Programación del riego 86 4.2.10. Resultados 88 5. Conclusiónes 89 6. Bibliografía 91 7. Anejos 93 7. Anejo 1. Tablas y figuras del manual FAO-24. 94 7. Anejo 2. Programas para el cálculo de las necesidades hídricas. 107 7. Anejo 3. Programa realizado. 124 7. Anejo 4. 157 Capítulo 1. Cálculo del Kc inicial. 157 Capítulo 2. Determinación indirecta de la capacidad de campo y del punto de marchitamiento. Capítulo 3. Triángulo de texturas 7. Anejo 5. Listado del programa 160 161 162 9
  • 10. 1. Introducción 1. INTRODUCCIÓN. 10
  • 11. 1. Introducción 1. INTRODUCCIÓN. 1.1. SUPERFICIE DE REGADÍO. El gran auge que ha tenido la agricultura en nuestro país en el último siglo se ha debido, entre otros factores, a una mayor utilización del agua para transformar cultivos y tierras de secano en otras de regadío más productivas. Excepto dos paréntesis históricos, el período árabe y durante el reinado de Carlos III (Nadal et alter, 1995), no es sino a partir de la Ley de Aguas de 1879 y la Ley de Grandes Regadíos de 1883, cuando aumenta la superficie de regadíos de una manera importante. Es a partir del inicio de este siglo cuando la superficie agrícola de regadío se triplica, pasando de las 1.200.000 hectáreas de 1904 a las 2.500.000 hectáreas de 1971 y llegando a las 3.400.000 hectáreas de regadío actuales. Este aumento tiene su causa en dos aspectos importantes: - El aspecto político: Las ya mencionadas “Ley de Aguas” de 1879 y la “Ley de Grandes Regadíos” de 1883 son dos leyes impulsadas por D. Joaquín Costa para el desarrollo de la agricultura de regadío (Nadal et alter, 1995) - Los avances tecnológicos: Gracias al avance tecnológico de finales del siglo pasado se pudieron empezar a realizar embalses, canales y la infraestructura necesaria para cultivar más cantidad de productos en menor espacio. Hoy en día, la productividad relativa del regadío frente al secano está entre 3, en el peor caso (zonas húmedas) y 100 (zonas áridas y soleadas) (Corominas, 1997). 11
  • 12. 1. Introducción Las 3.200.000 hectáreas de regadío que se cultivan hoy en día suponen el 60% de la producción agraria útil (Valiente et alter, 1998). Pero esta producción sólo representa alrededor del 5% del producto interior bruto (Nadal et alter, 1995) y, sin embargo, consume el 80% de la demanda total de agua (Nadal et alter, 1995 Valiente et alter, 1997). Por este motivo, no es extraño que el uso agrícola del agua produzca tensiones con los otros usos del agua: el urbano y el industrial. Estas tensiones se agudizan en periodos críticos: verano y en épocas de sequía y, sobre todo, en zonas deficitarias (zona mediterránea). Nadal expone que para una correcta utilización del agua por parte del agricultor, han de estar presentes varios aspectos: un uso eficiente en la aplicación del riego, una correcta programación del momento y de la dosis de riego y un coeficiente de uniformidad lo más alto posible (Nadal et alter, 1995). Las pérdidas de agua que se producen durante la distribución pueden suponer hasta un 50% del caudal inicial (Luján, 1992). Siendo el sector agrícola el que más agua consume, esta falta de eficiencia en la distribución representa un volumen de pérdida muy alto. Nadal indica que el ahorro de agua que se puede conseguir, aumentando la eficiencia, puede llegar a satisfacer las futuras necesidades urbanas, industriales y agrícolas (Nadal et alter, 1995). 12
  • 13. 1. Introducción 1.2. CONSUMO EQUILIBRADO DE AGUA. El agricultor ha de procurar realizar una correcta planificación en la distribución, en la dosis y en la aplicación del agua, con la finalidad de ahorrar el mayor volumen de agua posible (Valiente et alter, 1998 – Fereres, 1995 – Nadal et alter 1995). Esto quiere decir, que se ha de realizar un consumo sensato y equilibrado del agua. Las vías que permiten realizar un consumo equilibrado de agua son varias: → Los conductos de distribución del exterior de la explotación: se ha de exigir y conseguir que los conductos se construyan con las mínimas pérdidas posibles (pérdidas por filtración en embalses, falta de eficiencia en la distribución, pérdidas por evaporación, etcétera). → Mecanismos de distribución en el interior de la explotación: es válido el mismo principio que para el anterior punto. → Programación del riego: se ha de regar en el momento adecuado y con la dosis precisa (según la necesidad del cultivo). → Eficiencia en la aplicación: se ha de seleccionar el sistema de riego más eficiente posible y dotarlo de los medios necesarios para poder aumentar esa eficiencia. → Uniformidad: se ha de procurar que la uniformidad sea elevada, evitando así tener que aumentar las dosis para impedir zonas con déficit hídrico. La programación de riegos se basa en el cálculo de la necesidad hídrica de un cultivo con la finalidad de regar en el momento adecuado y con la dosis precisa. 13
  • 14. 1. Introducción 1.3. ESTIMACIÓN DE LAS NECESIDADES HÍDRICAS DE LOS CULTIVOS. 1.3.1. Descripción. La necesidad hídrica de un cultivo se ha definido como: el volumen de agua requerido para el proceso de evapotranspiración, desde la fecha de siembra o plantación hasta el día de la recolección, de un cultivo dado en una región climática específica, cuando el contenido de agua del suelo está mantenido suficientemente por las precipitaciones y/o el riego, de tal forma que ésta no limita el crecimiento de las plantas o el rendimiento de los cultivos (Martín de Santa Olalla at alter, 1993). El agua es un elemento indispensable de las plantas porque tiene una doble función: - Función constitutiva: ya que una proporción mas o menos alta de la planta está constituida por agua. - Función de transporte: porque el agua, al ser un disolvente, transporta las sales minerales y los nutrientes del suelo a la planta. Si se consideran ambas funciones como la totalidad, la función constitutiva representa un porcentaje muy bajo respecto a la función de transporte. Martín de Santa Olalla et alter(1993) cita un ejemplo esclarecedor: una hectárea de maíz, 3 que produce 20 Tm. de materia seca, a lo largo de su cultivo retiene 4 m de agua y para ello habrá absorbido unos 6.000 m3 de agua, desde el suelo hasta la planta. Una vez que el agua ha realizado la función de transporte, pasa a la atmósfera en forma de vapor a través de los estomas. A esta liberación de vapor se le llama comúnmente evapotranspiración (ET). 14
  • 15. 1. Introducción La evapotranspiración tiene, en realidad, 2 componentes: - La evaporación, que es la cantidad de agua que, por un proceso de vaporización, pasa del suelo a la atmósfera. Al inicio del cultivo el valor de la evaporación es más alto que en etapas subsiguientes. - La transpiración es la cantidad de agua que pasa, por el mismo proceso de vaporización, de la planta a la atmósfera. Al final del cultivo este valor es más alto que en etapas anteriores. A efectos prácticos, estos dos componentes se determinan conjuntamente porque representan el consumo de agua de la planta más el consumo de agua del suelo que sustenta a la planta. Los factores que influyen en la evapotranspiración son: > Factores climáticos: Radiación, temperatura, humedad del aire, velocidad del viento. > Factores edáficos: Conductivilidad hídrica, capacidad hídrica, etcétera. > Factores biológicos: Índice LAI, profundidad radical, etcétera. > Factores fitotécnicos: Laboreo, rotación, orientación, densidad, poda. > Factores geográficos: Extensión del área, efecto borde. La evapotranspiración se puede determinar por varios métodos: - Métodos directos: se utilizan unos aparatos que se denominan lisímetros. Los lisímetros son: unos recipientes grandes llenos de suelo ubicados en la parcela cultivada para recoger las condiciones naturales, de superficie desnuda o con cubierta vegetal, utilizados para determinar la ET de un cultivo o la evaporación de suelos desnudos (Aboukhaled et alter, 1986). Este es el método que sirve para verificar o calibrar los otros métodos. Por supuesto, es un método inviable en una explotación agrícola. 15
  • 16. 1. Introducción - Métodos indirectos. Aquí se engloban tres tipos diferentes: > Micrometeorológico: se basa en una combinación del balance de energía y del transporte aerodinámico del vapor de agua, utilizando diversas variables climáticas (temperatura, humedad, velocidad del viento, radiación). > Balance hídrico del suelo: mide indirectamente la ET a partir de los parámetros que intervienen en el balance hídrico (suelo, aire y planta). > Fisiológico: Son técnicas que miden la pérdida de agua de la planta o de una parte de ella. Se utilizan trazadores o termómetros que analizan el movimiento de agua en la planta. Debido a la dificultad que presenta la medida de la ET por métodos directos o indirectos, éstos han sido sustituidos por diversos modelos de estimación. El modelo más común es el que se basa en la evolución del coeficiente cultural (Kc). Este coeficiente sirve para calcular la evapotranspiración de un cultivo (ETc) con una periodicidad regular (días, semanas o meses) mediante la siguiente relación: ETc = ETo x Kc Siendo ETo, la evapotranspiración de referencia del cultivo de referencia [mm]. ETc, la evapotranspiración del cultivo [mm]. Kc, el coeficiente cultural del cultivo. Los cultivos de referencia pueden ser gramíneas o alfalfa. En algunos casos, se denominaba a la a la ETo de las gramíneas como Etrg y al Kc correspondiente Kcg; si la referencia es la alfalfa, se denominaba Etra y Kca respectivamente. El Kc de un cultivo se define experimentalmente como la relación entre la ETc del cultivo y la ETo medida. 16
  • 17. 1. Introducción El modelo más extendido en el mundo para determinar las necesidades hídricas es el de la FAO (Martín de Santa Olalla et alter, 1993). Este modelo se desarrolla en cuatro etapas: - Cálculo de la ETo mediante uno de cuatro métodos: Penman Radiación Blaney-Criddle Cubeta de evaporación clase A - Evolución de la curva del Kc a lo largo del cultivo - Cálculo de ETc mediante la relación: ETc = ETo x Kc - Factores correctores de carácter local: Advección, humedad, fertilidad del suelo, sistema de riego, salinidad, etc. 1.3.2. Punto óptimo de riego. Es el momento más idóneo para el riego, tanto desde el punto de vista agronómico como desde el punto de vista de la ingeniería del riego. Consiste en regar de tal manera que la planta no sufra disminuciones en su rendimiento actual ni futuro. Por ejemplo, si se regara sin tener en cuenta el lavado de sales, posiblemente no se disminuiría la producción actual pero sí que se podría producir una disminución en un futuro. Desde el punto de vista de la ingeniería del riego, el tema es de vital importancia porque puede determinar el sistema de riego, la dosis de riego y el intervalo de riego. Se ha de tratar de aunar los dos puntos de vista, para que el rendimiento no se altere y para que el protocolo de riego sea viable. 17
  • 18. 1. Introducción Martín Santa Olalla et alter(1993), cita tres métodos para determinar el punto óptimo de riego: 1.3.2.1. Estado hídrico del suelo. Se basa en el conocimiento del nivel de agua que hay en el suelo. La programación del riego se basa en el punto en que se haya dedicido regar. Existen 3 métodos para determinar la cantidad de agua que hay en el suelo: - Resistencia eléctrica: Debido a que el agua es una solución salina, por la cantidad de sales que lleva disueltas, la medida de la conductividad eléctrica nos dará la cantidad de agua que hay en el suelo. Para ello, se utilizan unos bloques de yeso o de nylon enterrados en el suelo. Debido a que se mide el potencial osmótico y el potencial de tensión, estos bloques resultan afectados por la salinidad. Son de poca aplicación en la agricultura y se utilizan en investigación. - Radiactividad: Se utiliza una fuente de neutrones. La energía de los neutrones se pierde al chocar con los puentes de hidrógeno del agua. De tal manera, que a una mayor cantidad de agua habrá una pérdida mayor de energía. Por su naturaleza radiactiva, es utilizado por personal autorizado. - Potencial hídrico. Se basa en la medición de la tensión que se origina en una cápsula llena de agua. Esta cápsula tiene una membrana porosa que está en contacto con otra superficie en la cual hay una cantidad distinta de agua. El utensilio se llama tensiómetro y se calibra a 0 cuando el suelo está saturado de agua. En el momento en que el suelo se seca, el agua del tensiómetro pasa al suelo y provoca un vacío en la cápsula. Este vacío se registra mediante un manómetro. Cuando la lectura llega a un valor determinado, se ha de regar. Este valor depende del suelo y del cultivo. Aunque la lectura tiene un cierto retardo se puede registrar continuamente y puede servir para activar mecanismos de riego. Se utiliza en la agricultura y en investigación. 18
  • 19. 1. Introducción 1.3.2.2. Estado hídrico de la planta. Se basa en el conocimiento del agua que se mueve en la planta. Para llegar a este conocimiento existen dos métodos: - Tensión de agua. Se mide mediante la cámara de tensión xilemática. Para ello se corta una muestra de tejido xilemático, por el que se hace pasar nitrógeno a una cierta presión. La lectura se realiza cuando aparece la savia, debido al empuje del gas nitrógeno. Es un método destructivo y sólo se utiliza en investigación - Temperatura. Cuando existe evapotranspiración, la temperatura en el exterior de la planta es menor que la del aire que la circunda. A mayor evapotranspiración, menor temperatura exterior habrá. Se utilizan unos termómetros de infrarrojos de onda media que pueden medir a una cierta distancia. Sirven para grandes extensiones de terreno. 1.3.2.3. Balance hídrico: suelo-planta-atmósfera. Se basa en la medición del balance hídrico que resulta de sumar las entradas de agua y de restar las salidas de ésta. Al resultado del balance se le llama variación de la reserva de agua en el suelo y es su valor el que determina el riego. Las entradas de agua se deben a las precipitaciones (Pe), a la ascensión capilar (Ge) y a la escorrentía superficial de salida (EsS) Las salidas de agua se deben a la evapotranspiración (ET), a la percolación profunda (Pp) y a la escorrentía superficial de entrada (EsE). (Pe + Ge + EsS ) - (ET+Pp+EsE) + ∆w El objetivo es mantener la variación de reserva de agua en el suelo (∆w) igual a 0. Pero como no se riega a cada instante, la ∆w variará de 0 a un nivel que no produzca la marchitez inviable de la planta. Este nivel es el que corresponde al agua útil. 19
  • 20. 1. Introducción El agua útil (AU) es la cantidad de agua que existe entre la capacidad de campo (CC) y el punto de marchitez (PM). AU = CC – PM En la práctica agronómica, el hecho de que el margen de ∆w esté situado entre la capacidad de campo y el punto de marchitamiento, no es sinónimo de que no haya habido reducción del rendimiento en el cultivo; se ha de buscar un valor en el que no haya reducción del rendimiento. A este valor se le llama nivel de agotamiento permisible (NAP) y es el que corresponde al comienzo de la disminución de la tasa de evapotranspiración. Quedando el intervalo de humedad disponible en un punto que hay entre la capacidad de campo y el punto de marchitamiento: NAP = f * AU Siendo f el factor de agotamiento permisible en el cual no se produce una reducción en el rendimiento de la planta, dependiendo del tipo de cultivo y de la evapotranspiración diaria que exista (Doorenbos, 1973). Como la planta sólo puede extraer el agua mediante sus raíces, se define el concepto de profundidad efectiva de las raíces (z1). Este valor depende de la profundidad radical y de la profundidad del suelo cultivado. Siendo z1 el menor valor de los dos. A menudo, el valor que resulta de multiplicar NAP y z1 es denominado como reserva fácilmente utilizable (RFU). Las necesidades de riego netas (Nn) serán las siguientes: Nn = (Pe + Ge + EsS ) - (ET + Pp + EsE) + ∆w Siendo ∆w un valor que estará comprendido entre 0 y la RFU. 20
  • 21. 1. Introducción 1.3.3. Déficit hídrico. Existe otra estrategia de riego, que no es objeto de este trabajo, pero que se va a definir por considerar que tiene un futuro muy prometedor para zonas con déficits hidráulicos estacionales o incluso anuales. A esta estrategia se la denomina riego deficitario controlado (RDC) y se está aplicando puntualmente en algunas zonas de clima mediterráneo (Levante murciano, Sur de Francia, etcétera). El RDC es un conjunto de estrategias que se basan en una menor aportación de agua de riego, en las épocas de escasez de agua, y en una posible aportación suplementaria en las épocas de abundancia de agua, pero sin que exista una disminución acusada de la productividad y de la calidad de los frutos. Según cita (Segura, P., 1995) en la región murciana la infradotación hídrica oscila entre 2.000 m3/ha y 3500 m3 /ha entre los años 1991 y 1993, cifra que puede llegar a corresponder a la cantidad de agua ahorrada con el RDC. No hay que confundir el RDC con la disminución de rendimiento debida al déficit de agua. La disminución de rendimiento ha sido estudiada por Doorenbos et alter en su obra “Efecto del agua sobre el rendimiento de los cultivos”. Esta obra se basa en la disminución del rendimiento de un cultivo, debido a una evapotranspiración más baja de lo normal. Esta menor evapotranspiración está causada por una menor aportación de agua. Las estrategias sobre las que se basa el RDC son las siguientes: - Períodos críticos en el cultivo. Se centra en suministrar agua en aquellos estados fenológicos que puedan condicionar la producción y/o la calidad de la cosecha. Cada cultivo tiene sus períodos críticos. - Crecimiento vegetativo y del fruto. Se basa en evitar un exceso de vigor que pueda inducir a una mayor demanda hídrica en estados fenológicos posteriores. En estos cultivos podría ser interesante aportar al estado fenológico de crecimiento del fruto el agua ahorrada anteriormente. En algunos cultivos, el crecimiento del fruto es un periodo crítico en cuanto al déficit 21
  • 22. 1. Introducción hídrico pero a la vez responden de una manera positiva al aporte de agua (Cohen y Goell, 1984). - Características del suelo. Para el RDC se recomiendan suelos poco profundos y con poca retención hídrica, para que se puedan reponer de agua forma más rápida y precisa y para que el sistema radical sea pequeño. - Sistema de riego. El riego más aconsejable es el que se efectúa por el sistema por goteo, por ser más preciso y tener una eficiencia más alta. - Clima. Se recomienda la utilización del RDC en lugares con escasa pluviometría, para alcanzar los efectos perseguidos con el RDC. - Resistencia a la sequía. Existen diversas adaptaciones a la sequía: aumentar la profundidad radicular, el ajuste osmótico por el cual una planta es capaz de extraer agua con un potencial hídrico mas elevado del normal, el cierre estomático para evitar la deshidratación foliar y el defoliamiento foliar. En la bibliografía, constantemente se recomienda no extrapolar los resultados de una experiencia con RDC de una zona a otra y se recomienda tener en cuenta las necesidades de lixiviación de los cultivos, aportando agua suplementaria en épocas en que no se carezca de ella (Segura, P, 1995). 22
  • 23. 1. Introducción 1.4. ESTIMACIÓN DE LAS NECESIDADES HÍDRICAS MEDIANTE EL MÉTODO FAO-24 Uno de los métodos más utilizados para el cálculo de las necesidades hídricas de los cultivos es el que publicó la FAO en 1974. Se publicó con el nombre de “ Las necesidades de agua de los cultivos” (Doorenbos et alter, 1974) y en 1977 se realizó una revisión. Por ser el volumen 24 de una serie de publicaciones de la serie Riegos y Drenajes, es conocido con el nombre de FAO-24. Este método consiste en una serie de pautas de aplicación de carácter práctico. Es un método de aplicación mundial por intentar reflejar en sus datos la mayor parte de los climas, cultivos y sistemas de riego que hay en el mundo. Por ser un método generalista, sus autores admiten que hay que ser críticos con los resultados obtenidos y, en la medida de lo posible, variar los datos para adecuarlos a nuestras necesidades. El método FAO-24 consta de tres partes diferenciadas: - Cálculo de la evapotranspiración. - Cálculo de las necesidades de riego. - Cálculo del suministro de riego. Desde la publicación de FAO-24 han pasado unos 25 años. A pesar del tiempo transcurrido, este método sigue utilizándose ampliamente en todo el mundo. Lógicamente, muchos de los aspectos de FAO-24 han quedado en desuso, se han modificado o se han ampliado con nuevos datos o cálculos. 23
  • 24. 1. Introducción 1.4.1. Cálculo de la evapotranspiración del cultivo. El cálculo de la evapotranspiración de un cultivo se compone de 4 partes: - Cálculo de la evapotranspiración de referencia (ETo). - Elección del coeficiente de cultivo (Kc). - Cálculo de la evapotranspiración de cultivo (ETc). - Factores locales que influyen en la ETc. 1.4.1.1. Cálculo de la evapotranspiración de referencia (ETo) La evapotranspiración de referencia (ETo) se define como la evapotranspiración de un cultivo de gramíneas verdes de 8 a 15 cm., de altura uniforme, con crecimiento activo, que sombree el suelo y en el que no escasee el agua. Normalmente, el cálculo de la ETo utiliza o se vale de factores climáticos (temperatura, humedad, radiación, viento, etcétera). Existen 4 métodos para calcular la ETo por la vía FAO-24, aunque últimamente se ha añadido un quinto método: - Blaney-Criddle. - Radiación. - Penman. - Evaporímetro de cubeta. - Penman-Monteith combinado (publicado en 1990 por la FAO). A continuación, se exponen los datos mínimos para cada una de las cinco determinaciones: 24
  • 25. 1. Introducción Tabla 1: Datos necesarios para calcular la ETo. Método Temperatura Humedad Viento Insolación Radiación Evaporación Condiciones Locales Blaney-Criddle * 0 0 0 - - 0 Radiación * 0 0 * (*) - 0 Penman * * * * (*) - 0 Cubeta clase A - * 0 - - * * Penman-Monteith * * * * (*) - 0 * datos medidos 0 datos estimados (*) datos cuando se dispone de ellos - No se necesita Los 4 primeros métodos se utilizan para períodos de 10 o 30 días, siendo la ETo calculada, la media diaria en mm/día para el período considerado. El quinto método se añadió en 1990 y puede servir para datos diarios y mensuales. A continuación, se exponen los 5 métodos. 1.4.1.1.1. Blaney-Criddle. Este método utiliza la temperatura, el porcentaje de horas diurnas, la humedad relativa y la velocidad del viento. Primero, se determina un factor f mediante la siguiente fórmula: f = P (0,46T + 8,13) donde: P : Porcentaje medio de horas diurnas del día sobre las horas diurnas anuales, véase tabla 1 del anejo 1 [%]. f : Factor de cálculo que depende de la temperatura y del porcentaje medio de horas diurnas, véase tabla 2 del anejo 1. T : Promedio de las temperaturas máximas y mínimas diarias [ºC]. Para determinar la ETo [mm dia-1], la figura 1 del anejo 1 se presentan 9 gráficos en función de 3 tipos de humedad relativa mínima y de 3 tipos de porcentajes 25
  • 26. 1. Introducción medios de horas diurnas del día sobre las horas diurnas anuales. Cada uno de estos 9 gráficos contiene 3 rectas, correspondientes a 3 tipos de velocidad de viento diurnos. Es un método que sirve para estimaciones mensuales y que algunos autores desaconsejan porque hace una estimación de la humedad, de las horas de sol y del viento (Martín de Santa Olalla et alter, 1993 y Pizarro, 1996). 1.4.1.1.2. Radiación. Este método relaciona la ET con la radiación, la temperatura y un factor de ponderación W que depende de la humedad relativa media y del viento. Para determinar la ETo se calcula con la siguiente fórmula: ETo = función (Rs · W, humedad relativa media, viento diurno) donde: ETo : Evapotranspiración de referencia [ mm día -1] Rs : Radiación solar, véase tabla 5 del anejo 1 [ mm día -1]. W : Factor de ponderación en función de la temperatura y altitud, véase tabla 6 del anejo 1. La Radiación solar (Rs) se calcula mediante la fórmula: n  Rs =  a + b ·Ra N  donde: a : Para un clima medio a =0,24. b : Para un clima medio b =0,50 n : Horas de sol reales en el día [horas]. N : Horas de sol máximas en el día, véase tabla 4 del anejo 1 [horas]. Ra : Radiación extraterrestre, véase tabla 3 del anejo 1 [mm d -1 ]. Los valores de la radiación extraterrestre están tabulados en función del hemisferio, de la latitud y del mes. 26
  • 27. 1. Introducción Para determinar la ETo [mm d-1], se utiliza la figura 2 del anejo 1. En el que presenta1 4 gráficos en función de 4 tipos de humedad relativa media. Cada uno de los gráficos presenta 4 rectas en función de la velocidad del viento diurno. Estas rectas relacionan el cálculo W·Rs con la ETo. Pizarro (1996) desaconseja la utilización de este método; afirma que sólo tiene validez en zonas húmedas. Martín de Santa Olalla et alter(1993) afirma que este método es una simplificación del método Penman. 1.4.1.1.3. Penman. El manual FAO-24 aconseja utilizar este método cuando se disponga de datos meteorológicos completos: temperatura, humedad relativa, viento y radiación solar o insolación (1974). La ecuación de Penman (1949) se definió para determinar la evaporación de una superficie libre de agua. Se basó en el balance energético de la superficie evaporante y en el proceso de transformación turbulenta del vapor de agua. La ecuación de Penman (Eo) original consta de 2 términos: el de radiación o debido a la radiación solar (primer paréntesis) y el aerodinámico o debido al viento (segundo paréntesis).  ∆   γ  Eo =   ∆ + γ·Rn  +  γ + ∆·Ea         donde: Eo ∆ : Evapotranspiración (Penman original) [mm d -1]. : pendiente de la curva de presión de vapor en función de la temperatura [mm de Hg]. γ : constante psicrométrica [mm de Hg]. Rn : radiación neta en la superficie de evaporación [mm d -1]. Ea : Presión vapor [mm d -1]. 27
  • 28. 1. Introducción Ea = 0,35·(1 + 0,0092U2 )(e s − e a ) · donde: U2 : velocidad del viento diario a 2 metros de altura [millas h-1]. es : presión de vapor de saturación del aire [mm de Hg]. ea : presión actual de vapor del aire [mm de Hg]. El manual FAO-24 propone un método Penman modificado, para adaptar la ecuación a la predicción de la necesidad de agua de los cutivos: ETo = c[WRn + (1 − W )·f (U)(e s − e a )] · donde: ETo c : evapotranspiración de referencia [mm dia-1]. : factor de ajuste en función del viento diario y viento nocturno. Véase tabla 7 del anejo 1. 1-W : factor de ponderación en función de la temperatura y de la altitud del lugar. Véase tabla 6 del anejo 1. Rn : Radiación neta en la superficie de evaporación [mm dia-1]. es : presión de vapor de saturación del aire [mb]. Véase tabla 9 del anejo 1. ea : presión actual de vapor del aire [mb]. Véase tabla 8 del anejo 1. f(U) : función relacionada con el viento.  U  f (U) = 0,27·1 + 2   100  donde: f(U) U2 : función relacionada con el viento. : velocidad del viento diario a 2 metros de altura [km dia-1]. Rn = Rns − Rnl donde: Rn : radiación neta [mm d -1]. Rns : radiación de onda corta [mm d -1]. Véase tabla 10 del anejo 1. Rnl : radiación de onda corta [mm d -1]. 28
  • 29. 1. Introducción n  R ns = 0,75 0,25 + 0,5 Ra N  : radiación de onda corta [mm d -1]. n : horas de sol recibidas [horas]. N : horas máxima de sol [horas]. Véase tabla 4 del anejo 1. Ra : radiación extraterrestre [mm d -1]. Véase tabla 3 del anejo 1. donde: Rns n R nl = f (t )·f (ed)·f   N  donde: Rnl : radiación de onda larga [mm d -1]. f(t) : función de la temperatura. Véase tabla 11 del anejo 1. f(ed) : función de la presión de vapor. Véase tabla 12 del anejo 1. f(n/N)l : función de n/N . Véase tabla 13 del anejo 1. n : horas de sol recibidas [horas]. N : horas máxima de sol [horas]. Véase tabla 4 del anejo 1. 1.4.1.1.4. Evaporímetro de cubeta. El evaporímetro de cubeta es un tanque lleno de agua en el que se produce la evaporación. Con este método se miden los efectos integrados de la radiación, del viento, de la temperatura y de la humedad. La adecuada instalación y mantenimiento de la cubeta son fundamentales. El manual FAO-24 hace aviso de una serie de problemas si no se cumplen las condiciones de trabajo: diferencias de reflexión del agua y de la zona circundante, transferencias de calor de la zona colindante, turbulencias del aire, etcétera. 29
  • 30. 1. Introducción La evapotranspiración se calcula mediante la siguiente fórmula: ETo = Epan · Kp ETo : evapotranspiración de referencia [mm dia-1]. Epan : evaporación de la cubeta [mm dia-1]. Kp donde: : coeficiente de la cubeta de clase A. Véase cubeta de clase A en la tabla 14 del anejo 1. El coeficiente de la cubeta depende de varios factores: del tipo de cubeta, del cultivo que la rodea, de la humedad relativa media diaria, de la distancia a barlovento del tipo de cubierta vegetal. La cubeta más utilizada es la del evaporímetro de cubeta de la clase A. Y puede haber dos estrategias en cuanto al tipo de cubierta vegetal: cubierta verde baja y barbecho de secano. 1.4.1.1.5. Penman-Monteith. En un estudio efectuado por Jensen et alter (1990), con diversos métodos de cálculo de la evapotranspiración, se comprobó que el método Penman-Monteith era el que mejor se ajustaba a la medida de varios lisímetros (véase tabla 2). 30
  • 31. 1. Introducción Tabla2. Sumario de estadísticas y su ranking para varios métodos de estimación mensual de la evapotranspiración. Ranking 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Method (1) Penman-Monteith 1982 Kimberly-Penman FAO-PPP-17 Penman Penman (1963) Penman (1963), VPD #3 1972 Kimberly-Penman FAO-24 Radiation FAO-24 Blaney-Criddle FAO-24 Penman (c=1) Jansen-Haise Hargreaves et al. (1985) Businger-van Bavel FAO-24 Corrected Penman FAO-24 Pan SCS Blaney-Criddle Christiansen pan Pan evaporation Turc Priestley-Taylor Thornthwaite All Months % (2) 101 107 111 106 113 112 114 108 121 85 108 121 127 100 101 92 118 90 85 79 SEE (3) 0.36 0.53 0.66 0.57 0.67 0.74 0.73 0.68 0.91 0.84 0.88 1.10 1.16 0.92 1.16 0.95 1.34 1.30 1.29 1.68 b (4) 1.00 0.95 0.93 0.99 0.93 0.93 0.91 0.95 0.88 1.11 1.00 0.87 0.82 0.94 0.99 1.03 0.82 1.20 1.22 1.24 r (5) 0.99 0.98 0.97 0.97 0.97 0.96 0.97 0.96 0.96 0.95 0.93 0.92 0.96 0.92 0.87 0.91 0.92 0.89 0.90 0.78 Peak Month ASEE (6) 0.36 0.49 0.56 0.57 0.57 0.67 0.59 0.64 0.65 0.71 0.88 0.90 0.65 0.88 1.15 0.94 0.87 1.07 1.02 1.47 % 97 107 105 99 105 102 110 106 111 83 101 110 122 95 103 88 113 85 86 79 SEE 0.52 0.79 0.72 0.95 0.77 0.72 0.88 0.98 0.84 1.44 1.47 1.19 1.53 1.58 1.31 1.88 1.82 2.26 2.34 2.69 B 1.03 0.96 0.99 1.07 1.00 1.03 0.95 0.98 0.95 1.15 1.07 0.97 0.86 1.03 1.05 1.11 0.88 1.31 1.28 1.41 R 0.99 0.96 0.97 0.96 0.96 0.97 0.96 0.94 0.96 0.92 0.87 0.91 0.93 0.82 0.89 0.78 0.83 0.84 0.78 0.79 Weigh ted SEE (7) ASEE 0.47 0.73 0.72 0.81 0.77 0.70 0.78 0.97 0.76 1.06 1.39 1.16 1.00 1.57 1.26 1.73 1.56 1.49 1.72 1.70 0.40 0.59 0.66 0.67 0.68 0.72 0.73 0.76 0.82 0.95 1.05 1.08 1.10 1.11 1.20 1.21 1.35 1.46 1.48 1.84 NOTES (1) All equation estimates have been adjusted for the reference crop of the lysimeter. (2) Average percentage of lysimeter measurements. (3) Standard error of estimate for ET estimates in mm d-1 that have not been adjusted by regression. (4) Regression coefficient (slope) for regression through the origin of lysimeter versus equation estimates. (5) Correlation coefficient for regression through the origin of lysimeter versus equation estimates. (6) Standard error of estimate for ET estimates in mm d-1 that have been adjusted by regression through the origin. (7) Weighted standard error of estimate calculated as 0.7(0.67(Col. 4)+0.33(Col. 7) + 0.3(0.67(Col.9)+0.33(Col. 12). Al método Penman-Monteith se le llama de “un paso” porque no maneja los conceptos de evapotranspiración de referencia y de coeficiente de cultivo, frente a los cuatro métodos tradicionales de FAO-24 que son de “dos pasos”. 31
  • 32. 1. Introducción El método Penman-Monteith se basa en la valoración de la resistencia de la cubierta vegetal y, para ello, se vale de la siguiente relación: rc = R1 0,5·LAI rc : resistencia de la cubierta vegetal [s m-1]. R1 donde: : Resistencia media diaria (24 horas) de los estomas de una simple hoja [s m-1]. LAI : índice de área foliar . En una reunión que realizaron los expertos de la FAO en 1990 adoptaron el método Penman-Monteith como nuevo estándar en la determinación de la evapotranspiración. Estos expertos determinaron que, ante la falta de datos sobre la resistencia de los cultivos, se podía calcular la ETo por el método Penman-Monteith suponiendo los siguientes valores: Altura del cultivo igual a 12 cm (hc=0,12 m). Resistencia de la cubierta vegetal igual a 70 s/m (rc =70s/m). Albedo igual a 0,23 (α=0,23). Estas características, coinciden con la definición de la evapotranspiración de un cultivo de gramíneas, es decir, con la definición de evapotranspiración de referencia (ETo). Como se ha asimilado la ecuación de Penman-Monteith a un proceso de “dos pasos”, es necesario seguir utilizando el coeficiente de cultivo para relacionarlo con la evapotranspiración de referencia. La reunión de los expertos aconsejó seguir utilizando los Kc que se detallaban en FAO-24. 32
  • 33. 1. Introducción A continuación se expone la fórmula de Penman-Monteith para un cultivo con las características anteriormente mencionadas: ETo = 900 U2 (e a − e d ) T + 273 ∆ + γ(1+ 0.34 U2 ) 0,408∆Rn + γ : evapotranspiración de referencia [mm d -1 ]. Rn : radiación neta en la superficie del cultivo [MJ m-2 d-1 ]. G : flujo del calor del sol [MJ m-2 d-1 ]. T : temperatura media [ºC]. U2 : velocidad del viento a 2 metros de altura [m s-1 ]. donde: ETo (ea-ed) : déficit de la presión de vapor [kPa]. : pendiente de la curva de presión de vapor [kPa ºC-1 ]. : constante psicrométrica [kPa ºC -1 ]. R n = R ns − R nl : radiación neta en la superficie del cultivo [MJ m-2 d-1 ]. Rns : radiación percibida de onda corta [MJ m-2 d-1 ]. Rnl : radiación neta de onda larga [MJ m-2 d-1 ]. donde: Rn n Rns = 0,77(0.25 + 0.50 ) Ra N : radiación percibida de onda corta [MJ m-2 d-1 ]. n : horas de sol percibidas [h]. N : horas máximas de sol [h]. Ra : radiación extraterrestre [MJ m-2 d-1 ]. donde: Rns 33
  • 34. 1. Introducción N = 7,64ϖ s donde: N ws : horas máximas de sol [h]. : ángulo horario de puesta de sol [rad]. Ra = 37,6dr (ϖ s sen( d) sen( l) + cos(l) cos( d) sen( ϖ s ) ) donde: Ra : radiación extraterrestre [MJ m-2 d-1 ]. dr : distancia relativa Sol-Tierra . ws : ángulo horario de puesta de sol [rad]. d : declinación solar [rad]. l : latitud [rad]. ϖ s = cos − 1 (− tg( l) tg( d) ) donde: ws : ángulo horario de puesta de sol [rad]. l : latitud [rad]. d : declinación solar [rad]. d = 0,409 sen( 0,0172J − 1,39) donde: d : declinación solar [rad]. J : número de día del año . dr = 1 + 0,033 cos(0,0172J) donde: dr J : distancia relativa Sol-Tierra . : número de día del año . 34
  • 35. 1. Introducción Mes   JDIA =  275 − 30 + Dia − 2 9   donde: JDIA : Número de día del año para estimación diaria . Mes : Número de mes del año en curso . Dia : Número de día del mes del año en curso . JMES = 30,42Mes − 15,23 donde: JMES : Número de día del año para estimación mensual . Mes : Número de mes del año en curso . 9 Rnl = 2.45 . 10- (0.9 n 4 + 0.1) (0.34 - 0.14 ed ) ( T4 maxima + Tminima ) N : radiación neta de onda larga [MJ m-2 d-1 ]. n : horas de sol percibidas [h]. N : horas máximas de sol [h]. ed : presión actual de vapor [kPa]. donde: Rnl Tmaxima : temperatura máxima del aire [ºK]. Tminima : temperatura mínima del aire [ºK]. e d HR = 50 e donde: ed : a ( tmin media + ) 50 e a ( tmax ) presión actual de vapor [kPa]. ea(tmin) : presión de vapor saturante en la temperatura mínima [kPa]. ea(tmin) : presión de vapor saturante en la temperatura máxima [kPa]. HRdmedia: humedad relativa media [%]. 35
  • 36. 1. Introducción e a = 0,6108·e donde: ea  17 ,27 T     T + 237 ,3  : presión de vapor de saturación a la temperatura T [kPa]. : temperatura [ºC]. donde: y : P Cl constante psicrométrica [kPa ºC -1]. P : presión atmosférica [kPa]. Cl : calor latente de vaporización [MJ kg-1]. donde: P :  ( 273 + T ) − 0. 0065alt  P = 1013 ,  273 + T   presión atmosférica en la altitud alt [kPa]. T : temperatura del aire [ºC]. alt : altitud [m]. : Cl = 2,501− (2,36110 −3 T) · calor latente de vaporización [MJ kg-1]. : temperatura del aire [ºC]. T γ = 0,00163 5, 26 donde: Cl T ∆= donde: A : 4098e a (T + 273,3 )2 pendiente de la curva de presión de vapor en saturación [kPaºC-1]. ea : presión de vapor de saturación a la temperatura T [kPa]. T : temperatura del aire [ºC]. 36
  • 37. 1. Introducción 1.4.2. Coeficiente de cultivo (Kc). El coeficiente de cultivo relaciona la evapotranspiración de referencia con la evapotranspiración del cultivo: Kc = ETo ETc Los factores que pueden influir en el coeficiente de cultivo son: las características del cultivo, la fecha de siembra o plantación, el ritmo de desarrollo del cultivo, la duración del período vegetativo, la humedad relativa, el viento, etcétera. El manual FAO-24 resume los factores que influyen en el coeficiente de cultivo, en una agrupación de cultivos. Tabla 3. Factores que influyen en diversos tipos de cultivo. FACTORES Cubierta vegetal Heladas Humedad Viento Edad Frecuencia riegos o lluvias Textura del suelo TIPO DE CULTIVO A B D E F G H L P P P P P P P P P P P P P P P P P P P P P P Tipos de cultivo Leyenda: A = Cultivos extensivos y de hortalizas B = Arroz C = Caña de Azúcar D = Alfalfa E = Arboles caducifolios y de nuez F = Cítricos G = Uva H = Banana I = Hierbas acuáticas J = Café K = Té L = Suelos desnudos 37
  • 38. 1. Introducción Los cultivos de caña de azúcar [c], hierbas acuáticas (I), café (J) y té (K) se han omitido por no tener mucho interés en España. Cada uno de estos 12 tipos de cultivos puede agrupar uno o más cultivos y corresponden a criterios comunes en la aplicación del coeficiente de cultivo. a) cultivos extensivos y de huerta Los cultivos extensivos y de huerta se presentan con 4 fases de desarrollo: fase inicial, fase de desarrollo, fase media y fase final. Cada una de estas fases tiene su duración y tiene asignado un coeficiente de cultivo. El coeficiente de cultivo de la fase inicial de estos cultivos se determina a partir de unos gráficos que relacionan la frecuencia de riego/lluvias más la ETo diaria con el coeficiente de cultivo. En cálculo del Kc inicial del anejo 4 se puede ver el gráfico y la forma de estimar el Kc inicial. El coeficiente de cultivo de la fase media y de la fase final se determina a partir de uno gráficos que relacionan cada uno de los cultivos con la humedad relativa mínima y con el viento diario. La fase inicial tiene un Kc constante, la fase de desarrollo tiene un Kc que aumenta linealmente a lo largo de los días, la fase media tiene un Kc constante y la fase final tiene un Kc que disminuye linealmente a lo largo de los días. Para determinar el Kc de la fase de desarrollo se realiza una estimación a partir del Kc inicial y del Kc medio y se multiplica por el número de días transcurridos de la fase. Para determinar el Kc de la fase final se realiza una estimación a partir del Kc medio y del Kc final y se multiplica por el número de días transcurridos de la fase. 38
  • 39. 1. Introducción b) arroz. Para nuestro país se considera que el cultivo del arroz se desarrolla en la estación seca, aunque en otros lugares del mundo puede ser en la estación húmeda. Los valores de Kc se dividen en función del viento y se agrupan en 4 fases: primer mes de cultivo, segundo mes de cultivo, mediados del período y 3-4 últimas semanas de cultivo. d) alfalfa, trébol, leguminosas herbáceas y pastos. Se desarrolla de forma similar a los cultivos extensivos, aunque las 4 fases se desarrollan de 2 a 8 veces al año. En la práctica, se define un Kc medio para todo el cultivo en función de los vientos y de la humedad. e) árboles caducifolios frutales y de nuez. En este tipo de cultivo, se presentan valores de Kc para cada mes, excepto en los meses de menos necesidad hídrica. Los valores de Kc se definen en función de: el tipo de cultivo, el mes de cultivo, el tipo de cubierta vegetal, el tipo de viento, la humedad relativa, el tipo de invierno y la edad de las plantaciones. En algunos casos, se aplica el coeficiente de cultivo de la fase inicial de los cultivos extensivos. f) cítricos. Los cítricos se presentan con valores de Kc mensual. Los valores de Kc dependen de: tipo de cítrico, mes de cultivo, tipo de cubierta vegetal y edad de la plantación. 39
  • 40. 1. Introducción g) uva. La uva se presenta con valores de Kc mensual. Los valores de Kc dependen de: mes de cultivo, tipo de helada, tipo de viento y humedad relativa. h) plátano El plátano se presenta con valores de Kc mensual. En el plátano se diferencian dos estaciones: la primera que corresponde a las plantas originales y la segunda que corresponde al hijo que sale. Hay un momento en que la planta original es cortada, quedando en el cultivo el hijo. Los valores de Kc dependen de: tipo de estación, mes de cultivo, tipo de viento y humedad relativa. l) suelos no cultivados o desnudos. En los suelos desnudos se produce una pérdida de agua que está en función de la evaporación (E) que tienen. El valor de Kc depende de la textura del suelo y de la frecuencia de riego. Para ello, se utilizan los gráficos de la fase inicial de los cultivos extensivos, para después realizar un ajuste en función del tipo de suelo. 1.4.3. Determinación de la evapotranspiración del cultivo (ETc). La evapotranspiración del cultivo se determina mediante la fórmula: ETc = ETo · Kc El valor de la ETc se suele expresar en mm por período; el periodo se puede expresar en mes, semana, días, etcétera. 40
  • 41. 1. Introducción Cuando la ETo se mide con un tanque evaporimétrico la ETc se halla mediante la relación: ETc = ETo · Kc · Kp Siendo Kp, el coeficiente de la cubeta. 1.4.4. Factores locales que influyen en la ETc. Existen una serie de factores, generalmente locales, que pueden variar la evapotranspiración de un cultivo. El manual FAO-24 los divide en 5 grupos: Clima Humedad del suelo Método de riego Prácticas de cultivo Rendimiento de los cultivos 1.4.4.1. Clima. Dentro de las variaciones debidas al clima se encuentran los siguientes factores: - Tiempo: Es la variación de ETc que se puede producir temporalmente por el tipo de clima. - Distancia: Es la variación ocasionada por la distancia a la que se encuentra la estación meteorológica. Las variaciones de la estimación de la ETC en zonas con climas extremos son más acusadas que en los climas suaves. - Advección: Son las variaciones que se producen cuando el lugar de medición micrometeorológico tiene unas características distintas a la zona de cultivo. Estas variaciones pueden cambiar la ETo en una proporción que va desde la mitad a la vez y media del valor inicial estimado. Se calcula en función del tamaño del cultivo puesto en regadío. 41
  • 42. 1. Introducción - Altitud: La ETc de un cultivo varía con la altitud. La fórmula de Penman-Monteith lo contempla al tener en cuenta la constante psicrométrica. La constante psicrométrica depende de la presión y por tanto de la altitud. 1.4.4.2. Humedad del suelo. - Nivel de humedad: Son las variaciones de evapotranspiración que se producen en un cultivo cuando disminuye la tensión de humedad del suelo. Normalmente, la ET corresponderá a la ETc máxima, mientras la tensión de humedad esté próxima a la capacidad de campo (0,2-5 atmósferas), pero a medida que aumente la tensión de humedad irá disminuyendo la ETc del cultivo. - Absorción de agua por el suelo: El tipo y profundidad de las raíces serán factores determinantes para la absorción de agua por el suelo y, por tanto, la evapotranspiración del cultivo - Niveles freáticos: Los niveles freáticos cercanos pueden disminuir la ETc del cultivo al causar déficits de oxígeno para las raíces. - Salinidad: La salinidad aumenta la presión osmótica y puede reducir la absorción de agua del suelo, provocando una alteración de la ETc del cultivo. 1.4.4.3. Método de riego. El sistema de riego puede afectar a la evapotranspiración del cultivo, en tanto en cuanto varía las condiciones del microclima. Los riegos a voleo (aspersión) provocan una modificación temporal de la evaporación al variar la temperatura y la humedad de la zona de riego. En los riegos por goteo puede haber una disminución de la ETc al aplicarse el agua localmente. Esta disminución ocurre en campos con cultivos espaciados, suelos arenosos y con gran evaporación. En riegos localizados, Pizarro (1996) propone calcular un coeficiente de localización en función del área sombreada y de las relaciones estudiadas por 42
  • 43. 1. Introducción diversos autores entre el área sombreada y el coeficiente de localización. Este factor provoca una menor evapotranspiración porque el riego se aplica a zonas puntuales, generalmente a la sombra del cultivo. La fracción del área sombreada es la relación que existe entre la superficie proyectada por un cultivo y la superficie total donde está asentado el cultivo. La relación entre la fracción de área sombreada y el coeficiente de localización ha sido estudiada por diversos autores y es la siguiente: Aljibury Kl = 1,34·A Decroix Kl = 0,1 +A Hoare Kl = 0,5·A + 0,5 Keller Kl = 0,85·A + 0,15 Siendo; Kl : coeficiente de localización A : fracción área sombreada Pizarro propone realizar la media de los 2 coeficientes de localización más próximos a la media y rechazar los valores que son más extremos. 1.4.4.4. Prácticas de cultivo. La fertilización inadecuada puede provocar variaciones en la ETc al haber alteraciones en el desarrollo de las raíces. La densidad de plantación tiene unos efectos sobre la ETc similares a los de la cubierta sombreada. Los paravientos artificiales pueden variar la ETc de un cultivo en zonas ventosas. 43
  • 44. 1. Introducción 1.4.4.5. Rendimiento de los cultivos. La evapotranspiración tiene una estrecha relación con el rendimiento del cultivo. En algunos casos, al igual que en la RDC, se adopta como estrategia un menor rendimiento del cultivo mediante una menor evapotranspiración. Esta menor transpiración se produce al regar menos la zona del cultivo. 1.4.5. Balance hídrico. El balance hídrico es una metodología de cálculo de las necesidades hídricas que se base en controlar las entradas y salidas de agua y la variación que se produce en la reserva de agua del suelo. El balance hídrico engloba una serie de variables y es el paso previo al cálculo de las necesidades netas de riego. Las variables que integran el balance hídrico son: Evapotranspiración del cultivo Precipitaciones efectivas Contribución de aguas subterráneas Percolación profunda Variación del agua almacenada en el suelo. 1.4.5.1. Evapotranspiración del cultivo. Se aplicará el dato obtenido por uno de los cinco métodos de cálculo de la evapotranspiración de referencia, más el correspondiente coeficiente de cultivo. Si se dispone de datos climáticos medios, se aplicará el valor que corresponda a las máximas necesidades de riego. 44
  • 45. 1. Introducción En los casos de riego localizado se aplicará el coeficiente de localización en función del área sombreada por el cultivo. Para proyectos grandes se aplicará el coeficiente corrector de advección. 1.4.5.2. Lluvia efectiva. El conocimiento de la lluvia es indispensable para poder planificar el riego. Se pueden aplicar métodos de cálculo de precipitación para un período deseado, pero estos datos tienen que venir apoyados de un gran número de años. La lluvia efectiva es la parte de agua de lluvia que llega a la zona de las raíces; el resto se pierde por evaporación en la zona aérea, por percolación o por escorrentía. Existen diversos métodos para calcular la precipitación efectiva: - Porcentaje de la lluvia. Se aplica un coeficiente a la precipitación Pe=A·P siendo: Pe : precipitación efectiva [mm/mes] P : precipitación [mm/mes] A : porcentaje [%] - Método FAO/AGWL (climas áridos o subáridos) Pe = 0,6·P –10 à P < 60 mm/mes Pe = 0,8·P –25 à P > 60 mm/mes siendo: Pe : precipitación efectiva [mm/mes] P : precipitación [mm/mes] - Método de la USDA Soil conservation Service: Pe = P(125 –0,2P)/125 à P < 250 mm/mes Pe =125+ 0,1P à P > 250 mm/mes siendo: Pe : precipitación efectiva [mm/mes] P : precipitación [mm/mes] 45
  • 46. 1. Introducción - Método empírico (con datos locales): Pe = A1·P – B1 -> P<C1 mm/mes Pe = A2·P – B2 -> P<C2 mm/mes siendo: Pe : precipitación efectiva [mm/mes] P : precipitación [mm/mes] A1 : valor empírico para la zona B1 : valor empírico para la zona C1 : valor empírico para la zona A2 : valor empírico para la zona B2 : valor empírico para la zona C2 : valor empírico para la zona - No se considera. En algunos casos no se considera por ser cultivos en invernadero o porque no interesa tener en cuenta la precipitación. 1.4.5.3. Contribución de aguas subterráneas (Ge). Se han de considerar los casos en que existan aguas subterráneas a una profundidad menor de 4 metros. El manual FAO-24 relaciona la Ge con el tipo de suelo y con la profundidad de las aguas subterráneas. En la práctica, no se considera, por ser un fenómeno minoritario de carácter local. 1.4.5.4. Percolación profunda (F). Es el agua que pasa a los horizontes profundos y no está al abasto de las raíces. Depende del tipo de suelo. Los suelos ligeros (arenosos) tendrán una mayor percolación que los suelos pesados (arcillosos). No hay que confundir la percolación profunda con la percolación debida a la eficiencia de la aplicación o con la percolación provocada para evitar acúmulos 46
  • 47. 1. Introducción de sales en la rizosfera. Son fenómenos separados que no han de contabilizarse como percolación profunda. En la práctica, el fenómeno de la percolación se ha de determinar experimentalmente en el campo de cultivo. 1.4.5.5. Variación del agua almacenada en el suelo (∆w). La reserva de agua en el suelo puede variar desde prácticamente cero hasta un nivel llamado capacidad de campo. La capacidad de campo (CC) es cuando la reserva de agua en el suelo está en su máximo nivel de capacidad. Existe un nivel superior a este, pero termina por desaparecer en forma de escorrentía. El valor cero en la CC supondría la extinción total de cualquier forma de vida. En la práctica agrícola se suele considerar un nivel mínimo, a partir del cual se produce el marchitamiento de la planta. Este nivel se llama punto de marchitamiento (PM). El agua contenida desde el punto de marchitamiento hasta el nivel de capacidad de campo se llama agua útil (AU). Por seguridad, se considera un nivel más cercano al de la capacidad de campo, a partir del cual no se produce disminución de rendimiento en la producción del cultivo. Este nivel se llama nivel de agotamiento permisible. El agua contenida desde este nivel hasta la capacidad de campo se llama reserva fácilmente utilizable (RFU). La medida de la variación de agua en el suelo tiene por objeto que un cultivo no agote el agua que hay en la RFU o en el AU. El valor de la variación de agua en el suelo determinará el momento y la dosis de riego. 47
  • 48. 1. Introducción Hay autores que indican una cierta relación entre la textura del suelo y los valores de CC y PM. Yagüe (1996) cita dos fórmulas que relacionan la textura con la CC y el PM, pero aconseja utilizarlas cuando no se disponga de análisis. En el capítulo 2 del anejo 4 se exponen las dos fórmulas. FAO-24 relaciona las clases texturales con la tensión de humedad del suelo y con el porcentaje de humedad del suelo, a la vez que dice que el punto de marchitamiento corresponde a una tensión de humedad de 16 atm. y la CC a una tensión de humedad de 0,2-0,3 atm. 1.4.6. Necesidades netas de riego (Nn). La necesidad neta de riego de un cultivo es la cantidad de agua que resulta de considerar las entradas de agua, las salidas de agua y la variación de agua en la reserva del suelo. Las necesidad neta de riego se expresa mediante la siguiente fórmula: Nn = ( ETc + F + R ) – ( Pe + Ge + N ) + )W Siendo: ETc=Evapotranspiración Cultivo [mm] Pe = Lluvia Efectiva [mm] F = pérdidas por percolación [mm] Ge = Aportación Capilar [mm] R = Escorrentía de salida [mm] N = Escorrentía de entrada [mm] )w = variación de la reserva de agua [mm] A menudo, se considera F, R, Ge y N igual a cero, por su pequeña aportación. De esta manera, la fórmula quedaría así: Nn = Pe – ET + )W Las necesidades netas de agua quedan compensadas con el déficit del balance hídrico. 48
  • 49. 1. Introducción El riego se efectuará cuando la variación de agua en el suelo ()w) llegue a una tensión superficial de unas 16 atmósferas. En este punto, si no se riega, la planta se marchitará irreversiblemente. El riego sin disminución de rendimiento se realizará cuando la variación de agua en el suelo coincida con el nivel de agotamiento permisible. La tensión superficial en este nivel es variable en función del cultivo. Para que no haya reducción de la ET, y por tanto, reducción del rendimiento en el cultivo, es necesario regar antes de que se llegue al punto de marchitamiento. Este punto se ha estimado para cada cultivo y proporciona un valor que corresponde a la reserva fácilmente utilizable (RFU). El agua que se contiene en la RFU es la siguiente: RFU = ( CC-PM ) · z · NAP Siendo: RFU : Reserva fácilmente utilizable [mm] CC : Humedad en la capacidad de campo [mm/cm] PM : Humedad en el punto de marchitez permanente [mm/cm] z : Profundidad efectiva de las raíces [cm] NAP : Nivel de agotamiento permisible [tanto por uno] En ciertas ocasiones se expresa CC y PM como porcentaje en peso. Para convertir estos valores en mm por centímetro de suelo, se ha de multiplicar por la densidad aparente del suelo en gramos por centímetro cúbico. 1.4.7. Lavado de sales. El efecto osmótico de las sales disueltas en el agua sobre las raíces, hace que las plantas tengan que hacer un esfuerzo adicional para absorber agua. Además del potencial hídrico han de vencer el potencial osmótico. 49
  • 50. 1. Introducción Si el agua en el suelo no es un factor limitante, la planta podrá vencer la suma de los dos potenciales. Pero, a menudo, el potencial osmótico aumenta por un efecto acumulativo y llega un momento en que la planta no es capaz de absorber agua. El efecto que se produce en la planta es, primero una disminución paulatina del rendimiento, para después morir. Para evitar la salinización de un terreno se aplica una dosis suplementaria de agua. Esta dosis suplementaria ha de evitar la acumulación de sales en el suelo y realizar un lavado del suelo. La necesidad de lixiviación depende del sistema de riego, de la concentración máxima permisible de sal en el suelo y de la concentración de sal en el agua. La concentración de sal se relaciona eléctricamente mediante la conductividad eléctrica. En las siguientes fórmulas se puede ver las necesidades de lixiviación para dos método de riego: -riego por gravedad y aspersión a baja frecuencia: LR = siendo LR CEa 5CEs − CEa : Requerimiento de lavado . CEa : Conductividad eléctrica del agua de riego [dS/m] Ces : Conductividad eléctrica del extracto de saturación del suelo para la producción deseada [dS/m]. -riego por goteo y aspersión de alta frecuencia: LR = siendo CEa 2·MaxCEs LR : Requerimiento de lavado . CEa : Conductividad eléctrica del agua de riego [dS/m] MaxCe : Conductividad eléctrica del extracto de saturación del suelo para un descenso en la producción del 100% [dS/m]. 50
  • 51. 1. Introducción Como puede verse, existe una relación entre la concentración de sal en el suelo y la producción obtenida. En el manejo del riego es necesario determinar el descenso de la producción deseada, en función de la concentración de sal en el agua. De lo contrario, con aguas salinizadas sería necesario regar con un volumen muy elevado de agua. La relación entre la producción deseada y el grado de tolerancia del cultivo debido a la sal del suelo es lineal. Para determinar la conductividad eléctrica del suelo con la producción deseada se aplica la siguiente fórmula:  CE − CE100 %  CES =  o %  ⋅ P + CEo% 100   donde CEs : Conductividad eléctrica máxima permisible para la producción deseada [dS/m]. CE0% : Conductividad eléctrica para una producción del 0 % [dS/m]. CE100% : Conductividad eléctrica para una producción del 100 % [dS/m]. P : Producción deseada [%]. La fracción de lavado (Fl) es la relación que se aplicará a la necesidad neta de agua y es igual a 1-LR. 1.4.8. Eficiencia de la aplicación. La eficiencia es un factor corrector que se ha de tener en cuenta por la propia naturaleza del sistema de riego, que no se comporta de una manera perfecta en la distribución del agua. La eficiencia en la aplicación suele ser muy baja en los riegos por gravedad y muy buena en los riegos localizados. 51
  • 52. 1. Introducción Existe otro factor corrector que depende de algunos sistemas de riego: el coeficiente de uniformidad (CU). El CU es la variación que se produce en la aplicación del agua entre un elemento y otro (aspersor, gotero, etc.). El CU es un factor de carácter hidráulico. En algunos casos, se considera el CU como un factor incluido en la eficiencia de la aplicación. 1.4.9. Necesidades brutas de riego. Es la necesidad adicional de agua que se aplica a la necesidad neta, para realizar el lavado de sales del suelo o para solventar las carencias de agua en la eficiencia de la aplicación. Entre la fracción de lavado(Fl) y la eficiencia en la aplicación(Ea), se escoge el de corrección que implique mayor gasto de agua. Cuando Ea < Fl, se aplicará la Ea. Siendo la necesidad bruta de riego la siguiente (Nb): Nb = siendo Nn Ea Nb : Necesidad bruta de riego [mm]. Nn : Necesidad neta de riego [mm]. Ea : Eficiencia en la aplicación . Cuando Ea > Fl, se aplicará la Fl. Siendo la necesidad bruta de riego la siguiente (Nb): Nb = siendo Nn Fl Nb : Necesidad bruta de riego [mm]. Nn : Necesidad neta de riego [mm]. Fl : Fracción de lavado . 52
  • 53. 1. Introducción 1.4.10. Programación del riego. La programación del riego es una práctica que depende de multitud de factores: - Períodos críticos. - Momento de la aplicación. - Dosis a aplicar. - Reserva de agua al inicio del cultivo. - Duración del riego. 1.4.10.1. Períodos críticos. Cada cultivo tiene unos períodos críticos con respecto a la tensión de humedad del suelo; éstos son debidos a las propias características de los cultivos. En algunos casos, la falta de agua puede comportar una mejora en la calidad de la producción. En otros casos, el cultivo prefiere suelos húmedos. Pero, en la mayoría de los casos, existen unos períodos críticos en la falta de agua que pueden afectar a la calidad y cantidad de la producción. Estos períodos críticos pueden coincidir con uno o más estados fenológicos; por ejemplo, en el maíz existen diversos períodos críticos: en la inflorescencia, en la polinización y en la fructificación. La disminución en la producción es una estrategia que se adopta en la programación del riego cuando existen carencias de agua. La relación que existe entre la producción obtenida y la cantidad evaporada es cuasi lineal, a menor evapotranspiración menor será la producción de un cultivo. Esta relación depende del cultivo y de la fase en que se encuentre. 53
  • 54. 1. Introducción La relación es la siguiente: 1− donde Ya : Producción Ya ETa   = Ky 1 −  Ym  ETm  obtenida en función de la cantidad evapotranspirada con carencia de agua . Ym : Producción obtenida cuando no existe carencia de agua . Km : Factor de respuesta del cultivo . ETa : Evapotranspiración que se produce cuando existe carencia de agua [mm/fase-s]. ETm : Evapotranspiración que se produce cuando no existe carencia de agua [mm/fase-s]. La relación se puede aplicar para una o más fases del cultivo. 1.4.10.2.Momento de riego. El momento de riego vendrá dado por la elección de diversas estrategias: - Nivel de humedad en la RFU: El momento de riego se producirá cuando la RFU llegue a un nivel determinado (cuando se agote la RFU, cuando se agote un porcentaje determinado de la RFU, etcétera). - Intervalo de riego: Se puede fijar el intervalo de riego para regar en períodos constantes. Es una estrategia muy utilizada en riegos localizados o en comunidades de regantes. - Períodos concretos: Consiste en regar en unos periodos concretos. Se puede utilizar en el riego deficitario controlado (RDC), en comunidades de regantes. 1.4.10.3. Dosis a aplicar. La dosis a aplicar depende del gasto que haya hecho el cultivo en un período concreto y de la variación de la reserva de agua en el suelo. La dosis variará en función del porcentaje de agua que tenga la RFU al inicio del riego y del porcentaje de agua que tenga al final del mismo. 54
  • 55. 1. Introducción 1.4.10.4.Reserva de agua al inicio del cultivo. Todo cultivo tiene una reserva inicial de agua en el suelo en función de lo que ha llovido anteriormente, de un prerriego inicial. En los cultivos plurianuales, la reserva inicial de agua en la programación ha de ser la misma que tenía en la anterior programación. Una forma de referir la reserva inicial es con un porcentaje determinado de RFU. 1.4.10.5.Duración del riego. La duración del riego depende de diversos factores: del volumen de agua a aportar, de la infiltración del terreno y del caudal de la instalación. La velocidad de infiltración depende de las propiedades físicas y químicas del suelo. Las propiedades físicas que afectan a la infiltración son: la textura del suelo, la pendiente del suelo y la humedad del suelo. Las propiedades químicas que afectan a la infiltración son concentraciones de determinadas sales o la calidad del agua de riego. Para conocer la tasa de infiltración real es necesario realizar pruebas periódicas en el campo, ya que puede variar en el tiempo. 55
  • 56. 1. Introducción 1.5. Utilización de la informática para el cálculo de las necesidades hídricas. La informática es una disciplina que realiza el tratamiento automático de la información por medio de ordenadores. Así pues, la informática es una herramienta que puede simplificar la complejidad del tratamiento de la información para el cálculo de las necesidades hídricas. Normalmente, se pueden escoger dos estrategias para realizar este cálculo: - Tiempo real: Se basa en datos meteorológicos diarios reales. - Previsión: Se basa en datos meteorológicos medios para el periodo considerado (mes, quincena, semana). Para realizar el tratamiento de la información se utilizan tres ejes fundamentales: - Análisis: Es el conjunto de procedimientos mediante los cuales se analiza cómo se han de recoger y procesar los datos para que tengan una entidad inteligible. - Programa. Es el conjunto de instrucciones mediante las cuales se realiza el tratamiento de los datos. - Ordenador. Es el aparato a través del cual se realiza el tratamiento del conjunto de datos. El análisis es una tarea que requiere a técnicos en informática pero que también implica a técnicos de otras disciplinas. El analista, como su nombre indica, ha de analizar cómo le llegará la información, cómo tratar esta información, cómo se envía la información procesada, de qué herramientas dispone, etcétera. El conjunto de instrucciones que forman parte de un programa está escrito con un lenguaje determinado. El lenguaje traduce el programa escrito a otro conjunto de instrucciones (lenguaje máquina) más inteligible para el ordenador. El lenguaje ha de tener instrucciones capaces de recibir, tratar y enviar la información. En la actualidad, existen lenguajes de tipo visual, que liberan al programador de la necesidad de describir la apariencia y el lugar de inserción de la información que 56
  • 57. 1. Introducción se ofrece, tanto por el monitor como por la impresora. Uno de los lenguajes visuales más extendidos es el lenguaje Visual-Basic. La palabra BASIC hace referencia a que en su origen partía de las instrucciones del lenguaje BASIC (Beginens All-Purpuse Symbolic Instrucions Code) que resultaba ser un lenguaje muy popular por facilidad de uso. Normalmente, el lenguaje y el programa traducido funcionan sobre otro lenguaje que se llama sistema operativo. El sistema operativo, por si solo, no realiza nada, pero es el punto de unión entre los programas y el ordenador. El ordenador es una herramienta que contiene una serie de dispositivos para recibir, tratar y enviar la información. Estos dispositivos pueden llegar a ser numerosos, pero el más esencial es la unidad central de proceso de datos, o procesador, porque realiza el tratamiento de la información que le llega a través de un canal de información y la envía tratada. La información se puede recibir de múltiples maneras: a través del teclado, del ratón, de dispositivos de almacenamiento de datos, de dispositivos de comunicación de datos (línea telefónica, redes de datos, etc.). La información tratada se puede enviar por pantalla, por impresora, por dispositivos de almacenamiento de datos, por dispositivos de comunicación de datos, etc. Una forma de almacenar la información es en unos ficheros electrónicos que se denominan base de datos. Las bases de datos suelen ser dispositivos de almacenamiento de datos en los que la información se guarda de una forma lógica. Sirven para facilitar al ordenador y al usuario la recepción, el tratamiento, el almacenamiento y el envío de datos. 57
  • 58. 1. Introducción 1.6. PROGRAMAS EXISTENTES PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. En el mercado existen diversos programas para el cálculo de las necesidades hídricas de los cultivos, basados en datos meteorológicos medios o en datos en tiempo real. Se hará mención de algunos programas que pueden servir de ayuda para el cálculo de las necesidades hídricas: cálculo de la evapotranspiración, textura de suelos y simuladores. Los programas analizados son, en su mayoría, de adquisición gratuita y el medio más rápido de obtenerlos es a través de Internet. El hecho de que sean gratuitos no significa que se puedan utilizar comercialmente sino que lo son para el aprendizaje, para la prueba durante un tiempo o como referencia. Al final de la descripción de algunos de los programas probados se proporciona la dirección de un servidor de la Universidad de Kassel (Alemania) donde se pueden obtener los programas gratuitamente o comprarlos directamente a sus desarrolladores. Los programas se dividen, según su función, en: -Cálculo de la evapotranspiración de referencia. -Cálculo de la evapotranspiración de cultivo. -Cálculo de la textura. -Adquisición de datos meteorológicos. -Cálculo de las necesidades hídricas de los cultivos. -Simuladores. -Otros programas relacionados con las necesidades hídricas. 58
  • 59. 1. Introducción 1.6.1. Programa para el cálculo de la evapotranspiración de referencia. Se describirá un programa que puede realizar el cálculo de la evapotranspiración de referencia (ETo). Daylet. Realizado por la Universidad de Cranfield (UK). Está editado en inglés. Y es de libre distribución en: “www.cranfield.ac.uk/SAFE” Este programa sirve para el cálculo de la evapotranspiración de referencia mediante algunos de estos métodos: Penman, FAO-Penman y Penman-Monteith. Existe una variante del programa, publicado por la misma universidad, que realiza el cálculo de la ETo para una serie de datos meteorológicos. Esta variante del programa se llama ET. Véase figura 1 en el anejo 2. 1.6.2. Programa para el cálculo de la evapotranspiración del cultivo. La FAO publicó un programa en forma de hoja de cálculo para estimar la ETo. Fao.Pmon.xls Es una hoja de cálculo que sirve para evaluar mensualmente la evapotranspiración de referencia mediante el método Penman-Monteith. Ha sido realizado por la FAO y está editado en inglés y es de libre distribución, pudiéndose encontrar en “www.fao.org”. Es un programa altamente didáctico y un excelente simulador: Fácil de entender. Los cálculos se actualizan en el momento en que se cambia algún dato. En una hoja adyacente se dibuja la ETo del cultivo. Véase figuras 2, 3, 4, y 5 del anejo 2. 59
  • 60. 1. Introducción 1.6.3. Programa para el cálculo de la textura. Existe un programa para el cálculo de la textura de un suelo: SW_ES Es un programa que sirve para el cálculo de la textura de un suelo y que proporciona los datos que se pueden ver en la imagen, de acuerdo a cada porcentaje textural. El programa ha sido realizado por el Dr. Saxton y existe una edición en castellano. Es de libre distribución en la dirección: "http://www.wiz.uni-kassel.de/kww/irrisoft/manage/manage_i.html". Véase figura 6 del anejo 2. 1.6.4. Programas para la adquisición de datos meteorológicos. Existen diversos programas y servicios meteorológicos que se ocupan de suministrar datos referentes a la meteorología: FAO La FAO suministra datos meteorológicos medios para diversas zonas del mundo. Para España distribuye 58 estaciones meteorológicas, que suelen coincidir con capitales provinciales. Los datos se estraen de una secuencia de 20 a 30 años. Se pude encontrar en la dirección de Internet: www.fao.org INM El Instituto Nacional de Meteorología suministra datos meteorológicos a la carta. Son datos con el correspondiente cargo económico. PACCOM La Generalitat de Catalunya, a través de su "Departament d'Agricultura", distribuye datos agrometeorológicos de 40 estaciones, repartidas por la geografía catalana, mediante línea telefónica. 60
  • 61. 1. Introducción Los datos que se pueden extraer son: horarios, diarios y mensuales. El servicio es gratuito y se pude obtener a través del “Departament d’Agricultura, Ramaderia i Pesca”. Constituye el referente más cercano a nivel de cultivo por ser estaciones repartidas por todas las comarcas de Catalunya. Véase figura 7 del anejo 2. 1.6.5. Programas para el cálculo de las necesidades hídricas de los cultivos. Para la el cálculo de las necesidades hídricas de los cultivos existe diversos programas. Se mostrará una hoja de cálculo, el programa suministrado por la FAO y el programa que suministra la Generalitat de Catalunya: ReqRiego.xls Es un programa en forma de hoja de cálculo para evaluar las necesidades hídricas mensuales de los cultivos mediante el método Penman. Está realizado por el profesor Gonzalo Freites del Departamento de Hidrología de la Universidad Central de Caracas (Venezuela). Su presentación está hecha en castellano. Se puede obtener a través de la red Irrisoft (véase bibliografía). Es un programa altamente didáctico y un excelente simulador: Fácil de entender. Los cálculos se actualizan cuando se modifica algún dato. Realiza el dibujo del Kc. Véase figuras 8, 9, 10 y 11 del anejo 2. 61
  • 62. 1. Introducción CROPWAT Es un programa para el cálculo de las necesidades hídricas de los cultivos por el método Penman-Monteith combinado (FAO, 1990) que se nutre de datos meteorológicos medios mensuales y de los datos de cultivo que tiene almacenados. En todo momento es posible modificar los datos a través de su menú. Ha sido realizado por la FAO. Existe una versión antigua (5.7) en castellano y dos versiones en ingles: la versión 7.0 y la versión Windows. La versión de Windows está en fase de prueba y algunas de sus opciones no están disponibles. Se puede obtener gratuitamente en www.fao.org. La versión en castellano (5.7) va incorporada en el volumen 46 de Riegos y Drenajes. La versión 7.0 simplifica el manejo y proporciona un aspecto más gráfico. Véase figura 12 del anejo 2. PACREG Es un programa para el cálculo de las necesidades hídricas de los cultivos pero presume calculada la ETo del cultivo. El programa puede recoger los datos meteorológicos obtenidos a través del programa PACREG. Lo ha realizado la Generalitat de Catalunya y está editado en catalán. Se puede obtener gratuitamente a través del “Departament d’Agricultura, Ramaderia i Pesca”. Es un programa que abarca el cálculo de las necesidades hídricas. Realiza algún cálculo correspondiente al diseño hidráulico al tener en cuenta el caudal de la instalación, el caudal de emisores y el coeficiente de uniformidad. La entrada manual de datos meteorológicos es algo engorrosa y presume calculada la ETo. Véase figura 13 del anejo 2. 62
  • 63. 1. Introducción 1.6.6. Programas para la simulación de las necesidades hídricas. Los anteriores programas podrían servir como simuladores, en la medida en que se pueden introducir datos supuestos para realizar sus correspondientes cálculos. Pero existen diversos programas que entran dentro de la categoría de la simulación, por ser herramientas destinadas a investigadores o técnicos. Sólo se mencionará la existencia de alguno de ellos por no ser el objetivo primordial de este trabajo: Bigsim, CropSyst y WaterMod. Véase figuras 14, 15, y 16 del anejo 2. 1.6.7. Otros programas relacionados con las necesidades hídricas. En la dirección http://www.wiz.uni-kassel.de/kww/irrisoft/manage/manage_i.html se pueden encontrar programas destinados a la irrigación. Alguno de los programas son de libre distribución pero otros son comerciales. Alguno de los programas comerciales se puede probar por un período determinado. Véase figura 17 del anejo 2. A continuación, se detallan los programas disponibles en la dirección arriba indicada: AWSET (Potential Evapotranspiration for Automatic Weather Stations) BALANCE ( Soil Water BALANCE) BIGSIM (Balanced Irrigation schedule with Groundwater contribution SIMulation model) CITRUS IRRIGATION SCHEDULING (Citrus irrigation, scheduling, moisture level, stress) CLIMWAT ( A Climatic Database for Irrigation Planning and Management) CROPWAT (Crop Water Requirements and Irrigation Scheduling) CWR-VB (Crop Water Requirements for Windows) DAILYET ( Daily Evapotranspiration) ENWATBAL (Evaporation from the soil and plant canopy) ETPOT 1.0 (Module for the calculation of potential transpiration and evaporation ) EVAP (Program to calculate Evapotransipration using one of 5 metrics) HFAM (Watershed Resource Analysis, Reservoir Management, irrigation, hydropower, water supplies) HOURLYET (Hourly Evapotranspiration for Automatic Weather Stations) HOWWET ? (Estimating the storage of water and mineralised nitrogen in your soil using rainfall records ) HYDRA (Modelling and Decision Support Systems to irrigation) I M S ( Irrigation Scheduling) 63
  • 64. 1. Introducción INCA (Irrigation Network Control & Analysis) I W R ( Irrigation Water Requirements LANDSCAPE WATER MANAGEMENT SOFTWARE (Auditing & Budgeting) Mac PET (potential evapotranspiration, Macintosh) Microweather 94 (Evapotranspiration, crop microclimate simulation, climate, soil) P E T (Potential Evapotranspiration) POT._EVAPO. (Potential Evapotranspiration) PRORIEGO (Available only in Spanish - sorry) REF-ET (Reference evapotranspiration) REQRIEGO (Reference evapotranspiration and crop water requirements) SPACTEACH (Soil/plant water dynamics) THE WATER AND PLANT RELATIONSHIP (Relationship, water in plants, photosynthesis ) UCA ( Unit Command Area Simulation Model ) WATER MANAGEMENT UTILITIES (Water management - irrigation system design) WATERMGT (Water Management - CD Rom) WATROP ( Irrigation Sytem Uniformity on Crop Yield ) 64
  • 65. 2. Objetivos 2. OBJETIVOS. 65
  • 66. 2. Objetivos 2. OBJETIVOS. Realizar un programa para el cálculo de las necesidades de riego de los cultivos, considerando para el cálculo de la evapotranspiración de referencia el método Penman-Monteith de dos pasos descrito por la FAO en 1990. 66
  • 67. 3. Material y métodos 3. MATERIAL Y MÉTODO 67
  • 68. 3. Material y métodos 3.1. MATERIAL. Se ha empleado el material informático que a continuación se detalla: - Lenguaje de programación Visual-Basic 5.0 ® . - Base de datos Microsoft Access-97®. - Sistema operativo de trabajo Windows-98®. - Ordenador personal con las siguientes características: Procesador Pentium, 64 megabytes de memoria de solo lectura (RAM) y 2 gigabytes de disco duro. 3.2. MÉTODO. El método utilizado para la realizar el programa programación se ha basado en una programación clásica, apoyada en módulos que coinciden con las entradas de datos (clima, suelo, etc.) pero con un aspecto visual para el usuario. Método para realizar el cálculo de las necesidades hídricas: - Metodología expuesta por Doorenbos-Prutt en el cuaderno FAO-24. - Cálculo de la ETo por el método Penman-Monteith de dos pasos publicado por la FAO en 1990. - Los coeficientes de cultivo estarán divididos en cuatro fases, exceptuando los cultivos plurianuales que lo estarán en doce fases correspondientes a 12 meses. Como datos opcionales, recogerá los coeficientes de cultivo (Kc) propuestos por FAO-24, se exceptuarán los cultivos menos interesantes para la nuestro país (café, té...). Dichos coeficientes han de ser susceptibles de ser modificados. El Kc inicial de los cultivos de 4 fases con el valor en blanco o asterisco se calculará mediante una estimación de las 5 gráficas. - La entrada de datos climáticos será: mensual para calcular la previsión de riego o diaria para calcular el riego en tiempo real (día a día). 68
  • 69. 3. Material y métodos - La precipitación Efectiva se calculará por alguno de los métodos expuestos en la introducción. - No se tendrán en cuenta los fenómenos de Percolación profunda, escorrentía, aportación capilar y el fenómeno de advección. - Se tendrá en cuenta la velocidad de infiltración. - Se contemplará el efecto de localización debido al porcentaje de terreno sombreado para los riegos localizados. - Cuando sea necesario, se efectuará el lavado de sales para una productividad mínima deseada. - La programación del riego estará comprendida dentro de la reserva fácilmente utilizable, suponiendo que no hay limitaciones de agua. El momento de riego será cuando se agote un porcentaje de la RFU, o en un intervalo de días de riego. Cuando se introduzca el intervalo de riego, el momento de riego será el primero que cumpla la condición: agotamiento de un porcentaje de la RFU o intervalo de riego. - La dosis de riego vendrá marcada por el porcentaje de llenado de la RFU. - Se contemplará el porcentaje inicial de agua de la RFU. - Para calcular las necesidades brutas se tendrá en cuenta la eficiencia de la aplicación y la fracción de lavado. Aplicándose, el que suponga mayor dosis de lavado. - No se tendrá en cuenta el diseño hidráulico, exceptuando el caudal de la instalación. - Se realizará una estimación del tiempo mínimo de riego debido a la infiltración y al caudal de la instalación. - Los cálculo que se obtendrán serán: balance hídrico y riegos a efectuar 69
  • 70. 4. Resultados y discusión 4. RESULTADOS Y DISCUSIÓN 70
  • 71. 4. Resultados y discusión 4. RESULTADOS Y DISCUSION. El resultado ha sido un programa con funcionamiento modular, que calcula las necesidades hídricas cuando detecta que todos los datos están introducidos. El diseño comienza con un nombre que identifica el grupo de datos que se van a introducir. A continuación, se puede introducir la información que corresponde a cada una de las áreas (descripción de la finca, suelo, clima, agua de riego, tipo de riego y programación). Por último, se encuentra el módulo de cálculo que realiza las operaciones y las muestra por pantalla. Además, se dispone de un programa de mantenimiento para entrar datos correspondientes a cada tabla. El listado del programa se puede ver en el anejo 5. 71
  • 72. 4. Resultados y discusión 4.1. FLUJO DE DATOS. Como se puede apreciar en la figura 1 del anejo 3, existen siete módulos de entrada de datos para poder realizar el cálculo. En realidad, serían 2 módulos más si se incluye la entrada del diseño y el módulo de cálculos. El flujo de información converge hacia el proceso de cálculo, pero, en ocasiones, se pueden ver flechas con ambos sentidos. Este doble sentido en el flujo de la información indica que la información se puede visualizar en cualquier momento para corregirla o ampliarla. Por ejemplo, el módulo de entrada de datos envía la información a la tabla “Programación Clima”; esta información se ha de poder corregir y ampliar con nuevos datos climáticos. La información necesaria para realizar la estimación puede proceder del soporte magnético o se pude introducir a través del teclado; por ejemplo, el módulo de datos del cultivo puede recoger información entrada por teclado o puede realizar una lectura a las siguientes tablas: Cultivos, Kc, profundidad raíces, fracción agotamiento, días cultivo, y tolerancia a sales. El nexo de unión entre cada uno de los ficheros suele ser el nombre del diseño, excepto en los ficheros que se encuentran en la parte superior. Estos ficheros están unidos por el tipo de información. Cada vez que se realiza una modificación o ampliación de datos, el proceso de cálculo rellena con los datos oportunos el fichero de balance hídrico; de tal manera que el fichero de balance hídrico contendrá información referente a los datos entrados por cada uno de los módulos. 72
  • 73. 4. Resultados y discusión 4.2. PROGRAMA. Los módulos disponibles en el programa son: - Diseño. - Mantenimiento de tablas. - Finca. - Cultivo. - Clima. - Suelo. - Agua de riego. - Tipo de riego. - Programación del riego. - Resultados. Todas las pantallas que aparecen en el programa informan en su parte superior del nombre de diseño agronómico que está activo. Exceptuando el menú, cada uno de los programas tiene tres partes diferenciadas: 1) Parte superior: es la barra donde van alojadas las funciones de grabación y salida del módulo. 2) Parte media: Es donde se introducen o visualizan los datos. En algunos módulos se encuentra la figura [...], que sirve para buscar datos en las tablas. 3) Parte inferior: Contiene una línea de mensajes para informar de las acciones que se han de realizar. El menú, como se puede apreciar en la figura 2 del anejo 3, es el lugar de acceso a cada uno de los módulos. Si la aplicación no está conforme con algún dato entrado, surge una pantalla de formato pequeño que informa de la acción incorrecta. 73
  • 74. 4. Resultados y discusión A continuación, se expondrán con detalle la función de cada uno de los módulos: 4. 2. 1. Diseño. El diseño está contenido en el menú DISEÑO AGRONÓMICO. Consta de dos carpetas con funciones distintas: - Carpeta Nuevo Diseño. Es el lugar por el cual se introducirá el nombre del nuevo diseño. Si el nombre de diseño existiera, el programa dará aviso. Véase figura 3 del anejo 3. - Carpeta Abrir Diseño. Esta carpeta tiene dos funciones: escoger un diseño existente o eliminarlo. Para seleccionar un diseño se tendrá que apuntar con el ratón en la zona donde aparecen todos los diseños y pulsar Aceptar. Para borrar un diseño, primero se apuntará a la zona donde aparecen todos los diseños y después se pulsará Eliminar. El programa pedirá confirmación para eliminar el diseño. Cuando se pulsa en alguno de los diseños, aparece una pequeña descripción de las características que servirá de orientación sobre el diseño. Véase figura 4 del anejo 3. 4.2.2.Mantenimiento de tablas. El mantenimiento de tablas está contenido en el menú Diseño Agronómico. Sirve para dar de alta, modificar o eliminar datos correspondientes a las tablas del programa. Véase figura 5 del anejo 3. Los datos que se entren por este módulo pasarán a estar disponibles para la toda aplicación 74
  • 75. 4. Resultados y discusión Estas tablas son: nombre de cultivo, Kc del cultivo, días de cultivo, raíz del cultivo, fracción de agotamiento permisible del cultivo, meteorología, tipo de textura y sistemas de riego. En la figura 6 del anejo 3 se puede ver el acceso a la tabla de sistemas de riego. 4.2. 3. Finca. El módulo Finca está en el menú de Entrada de Datos. Por este módulo se introducirán los datos referentes a la finca y el tipo de datos meteorológicos. Algunos de los datos no tienen relevancia para el cálculo de las necesidades hídricas, pero es necesario disponer de una pequeña referencia. Véase figura 7 del anejo 3. Los datos que se solicitan son: Descripción: Una pequeña descripción de la finca y del usufructuario de la misma. Nombre de la finca: Nombre con el que es conocida la finca. Población. Entrar la población Provincia. Entrar la provincia y el país. Latitud: Es una de las coordenadas que sitúan a la finca dentro de la Tierra. Además, tiene utilidad para el cálculo de la radiación neta cuando sólo se disponga del número de horas de sol (Smith, M., 1990). Longitud: Es la otra coordenada que ubica a la finca dentro de la Tierra. Altitud: Tiene utilidad para estimar la evapotranspiración de referencia (Smith, 1990). Datos meteorológicos: Por esta entrada se definen qué datos meteorológicos se van a suministrar. Se introducirá D en el caso de disponer de datos climáticos diarios y M para datos climáticos mensuales. Superficie de la finca: Se introducirá en metros cuadrados. Servirá para calcular la dosis bruta de riego de la finca. 75
  • 76. 4. Resultados y discusión Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. Para realizar alguna modificación, se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 4. 2. 4. Cultivo. El módulo Cultivo está en el menú de Entrada de Datos. En este módulo se introducirán los datos referentes al cultivo: coeficiente de cultivo (Kc), fracción de agua disponible en el suelo, días de cultivo, profundidad de las raíces, tolerancia a la sal y fecha de plantación. En este módulo se pueden seleccionar los datos publicados por al FAO en el manual FAO-24 o se pueden variar de acuerdo a las necesidades. Si se seleccionan todas las opciones disponibles en los iconos [...] presentará los datos publicados por la FAO (Doorenbos et alter, 1977). Se ha intentado respetar la entrada de los coeficientes de cultivo: en el caso de cultivos leñosos el Kc está dividido en 12 meses y en el resto de los cultivos está divido en 4 fases (inicial, desarrollo, media y final). Véase figuras 8 y 9 del anejo 3. Los datos que se solicitan son: Nombre del cultivo: Se puede entrar el nombre del cultivo o se puede seleccionar de una lista pulsando en el icono de la derecha. 76
  • 77. 4. Resultados y discusión Grupo: Pulsando en el icono de la derecha aparecen 7 grupos de cultivos: cultivos extensivos y hortalizas, arroz, alfalfa, árboles caducifolios (y de nuez), cítricos, uva y plátano. Se seleccionará el más adecuado a nuestras necesidades. Cada grupo de cultivos determina que la entrada del Kc sea mensual o en 4 fases; si se escogen árboles caducifolios, cítricos, uva o plátano, el Kc será mensual; si se escoge el resto estará dividido en 4 fases. Además, para poder recoger los valores publicados en FAO-24 (Doorenbos et alter, 1977), cada grupo de cultivos activará las opciones de: cubierta vegetal, heladas, humedad relativa, viento y edad de plantación. Por ejemplo, el grupo de cítricos activará las opciones de cubierta vegetal y edad de plantación. En este caso, si el usuario rellena las opciones de heladas y edad de plantación, aparecerá el valor publicado en FAO-24. Si no se está interesado en los valores de FAO-24, se continuará por la entrada de los coeficientes de cultivo. Cubierta vegetal. Es una de las opciones del manual FAO-24. Está disponible para árboles caducifolios y cítricos. Heladas. Es una de las opciones del manual FAO-24. Está disponible para árboles caducifolios y uva. Humedad relativa. Es una de las opciones del manual FAO-24. Está disponible para cultivos extensivos y hortalizas, arroz, alfalfa, árboles caducifolios y uva. Viento. Es una de las opciones del manual FAO-24. Está disponible para cultivos extensivos y hortalizas, arroz, alfalfa, árboles caducifolios, plátano y uva. Edad plantación. Es una de las opciones del manual FAO-24. Está disponible para árboles caducifolios, cítricos y plátano. En el caso concreto del plátano, se refiere a plátanos de primer cultivo o plátanos de los siguientes cultivos. En la figura 8 del anejo 3, se puede observar un ejemplo de selección de los valores publicados en FAO-24 para un cultivo de cítricos sin cubierta vegetal y para árboles adultos; se puede ver que los coeficientes están divididos en 12 meses. Si el usuario no está conforme con los valores propuestos puede modificarlos como considere oportuno. Si no se hubieran rellenado las opciones del grupo de cultivo, se tendrán que introducir los valores manualmente. 77
  • 78. 4. Resultados y discusión Kc. Por este campo se introducen los valores correspondientes de coeficiente de cultivo. Está divido en 4 fases para los cultivos extensivos y huerta, arroz y alfalfa; y está divido en 12 fases para los cultivos de árboles caducifolios, cítricos, uva y plátano. En los cultivos de 4 fases, el valor correspondiente a la fase de desarrollo no se introduce porque el programa realiza una estimación proporcional entre el valor de la fase inicial y el valor de la fase final por el número de días que tiene la fase de desarrollo. Si el valor de la fase inicial de los cultivos divididos en 4 fases está en blanco o en asterisco, el programa realizará una estimación de acuerdo a la ETo y al intervalo de riegos. Si el valor de intervalo de riegos está en blanco, el programa presupone un intervalo de riegos de 7 días. Días. Es el número de días que tiene la fase del cultivo. Es una opción disponible en los cultivos divididos en 4 fases. Este valor servirá para calcular el valor de Kc de la fase de desarrollo, la profundidad de la raíz en la fase de desarrollo y la fecha de final de cultivo. Es una opción no disponible para los cultivos de 12 fases. Profundidad de Raíces. Es la profundidad efectiva de las raíces. En los cultivos de 4 fases se divide en 4 partes, realizándose una estimación en la fase de desarrollo. En los cultivos de 12 fases se supone un único valor de profundidad radicular. El valor de la profundidad radicular servirá para conocer la cantidad de agua que es capaz de absorber un cultivo. Se deberá entrar el valor de la profundidad del terreno, si el valor de éste es menor que la profundidad radicular. Fracción de agua disponible en el suelo. Es el valor en el que no se produce una reducción del rendimiento del cultivo debido a la carencia de agua. Este valor, multiplicado por la diferencia entre la capacidad de campo y el punto de marchitamiento, determinará la reserva de agua fácilmente utilizable (RFU). Tolerancia a las sales. Este valor determinará la cantidad agua suplementaria que se deberá aportar para tener un rendimiento determinado. 78
  • 79. 4. Resultados y discusión Fecha de plantación. En los cultivos anuales se introducirá la fecha (mes-diaaño) correspondiente y se introducirá el primer día del año para el resto de cultivos (01-01-xxxx), siendo xxxx el valor del año correspondiente. Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. Para realizar alguna modificación se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 4.2.5. Meteorología. El módulo Meteorología está en el menú de Entrada de Datos. En este módulo se introducirán los datos referentes a los valores micrometeorológicos para calcular la evapotranspiración de referencia (Smith, 1990). La pantalla inicial dispone de dos opciones (véase figura 10 anejo 3): Entrada de datos Obtener datos externos. La opción de entrada de datos sirve para entrar manualmente los datos climáticos o para modificarlos. La opción obtener datos externos realiza una lectura de los datos climáticos disponibles en un fichero externo que se puede grabar por mantenimiento de tablas Cuando se realiza una entrada de datos o se obtiene un fichero externo, el programa trabaja sobre la base del tipo de datos meteorológicos introducidos por la pantalla de datos de la finca. Si el fichero es diario (D) creará unos registros diarios para los datos meteorológicos. Si el fichero es mensual (M) creará unos registros mensuales para los datos meteorológicos. 79
  • 80. 4. Resultados y discusión Primero se explicará la obtención de datos externos. Obtención de datos externos. Como se puede ver en la figura 11 del anejo 3, en el momento en que se pulsa Obtener datos externos aparece una lista con los datos disponibles. En el caso de datos mensuales, se puede decir que los datos servirán para cualquier año. En el caso de datos diarios, esta lista no estará actualizada. Entrada de datos. Esta opción tendrá un calendario mensual para datos meteorológicos mensuales (véase figura 13 del anejo 3) y un calendario diario para datos meteorológicos diarios (véase figura 12 del anejo 3). El calendario mensual dispone de los doce meses del año. De tal manera, que al pulsar sobre cualquier mes se activará la pantalla de entrada de datos. El calendario diario dispone de los días que hay en el mes y año consultados. Se puede ir de un mes a otro y de un año a otro pulsando sobre las teclas [< ], [<<], [>>] y [>]. En la figura 14 del anejo 3, se puede ver la entrada de datos meteorológicos. La entrada de datos meteorológicos es común para los dos tipos de datos (mensuales y diarios) e informa, en su parte superior, de la fecha que se ha pulsado. Dispone de las siguientes entradas: Temperatura máxima. Se introducirá la temperatura máxima en grados centígrados. Se dispone de una precisión de un decimal. Si sólo se tiene la temperatura media, se introducirá el mismo valor en temperatura máxima y en temperatura mínima. 80
  • 81. 4. Resultados y discusión Temperatura mínima. Se introducirá la temperatura mínima en grados centígrados. Se dispone de una precisión de un decimal. Si sólo se dispone de la temperatura media, se introducirá el mismo valor en temperatura máxima y en temperatura mínima. Humedad máxima y mínima. Si se activa este cuadro, las entradas de humedad máxima i humedad mínima estarán disponibles. Humedad máxima. Se introducirá el calor porcentual de la humedad máxima. Sólo está disponible si el cuadro de Humedad máxima y mínima está activado. Humedad mínima. Se introducirá el calor porcentual de la humedad mínima. Sólo está disponible si el cuadro de Humedad máxima y mínima está activado. Humedad media. Se introducirá el calor porcentual de la humedad media. Sólo está disponible si el cuadro de Humedad máxima y mínima NO está activado. Viento. Se introducirá la velocidad del viento diario en kilómetros por segundo. Radiación. Si se activa el cuadro de Radiación, estará disponible la entrada de la radiación neta. Si no está activado el cuadro de Radiación, estará disponible la entrada del número de horas de sol. Radiación Neta. Se introducirá el valor de la radiación neta diario en megajulios por metro cuadrado y día. Se dispone de una precisión de un decimal. Esta entrada estará activada cuando el cuadro de radiación tenga la marca ü. Horas sol. Se introducirá el valor del número de horas de sol diarias en horas día. Se dispone de una precisión de un decimal. Esta entrada estará activada cuando el cuadro de radiación NO tenga la marca ü. Precipitación. Se introducirá el valor de la precipitación caída en milímetros por metro cuadrado y período. Siendo el período diario si la entrada de datos meteorológicos es diario y mensual cuando la entrada de datos meteorológicos sea mensual. Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben y esté disponible el calendario. 81
  • 82. 4. Resultados y discusión 4. 2. 6. Suelo. El módulo Suelo está en el menú de Entrada de Datos. En este módulo se introducirán los datos referentes a las características físicas del suelo (véase figura 15 del anejo 3). Existen tres vías para entrar los datos: - Se dispone de la clase textural. - Se dispone del porcentaje textural. - Se dispone de la analítica física de suelos. Es conveniente disponer de un análisis de suelos para tener constancia de la realidad del suelo donde se asienta el cultivo. Entrar la clase textural o el porcentaje textural supone una estimación física del suelo que puede llevar a obtener datos erróneos. En la tabla 4 se puede ver los datos asignados a cada clase textural (Yagüe, 1996): Tabla 4. Datos asignados por defecto. Textura Arena Arcilla [%] [%] Limo Densidad [%] Aparente [g/cm3] Infiltración Eficiencia [mm/hora] Lavado [%] Fuente ARCILLOSO 18 65 17 1,19 3,8 30 YAGÜE ARCILLOSO-ARENOSO 50 45 5 1,34 8 70 ESTIMADA ARCILLOSO-LIMOSO 6 48 46 1,30 5 50 YAGÜE ARENOSO 94 4 2 1,70 19 100 YAGÜE ARENOSO-FRANCO 83 7 10 1,66 17 90 YAGÜE FRANCO 41 19 40 1,51 8,9 70 YAGÜE FRANCO-ARCILLOSO 33 35 32 1,40 6,4 60 YAGÜE FRANCO-ARCILLOSO-ARENOSO 60 28 12 1,45 12 80 ESTIMADA FRANCO-ARCILLOSO-LIMOSO 10 35 55 1,40 12 60 ESTIMADA FRANCO-ARENOSO 65 10 25 1,60 16 80 YAGÜE FRANCO-LIMOSO 20 15 65 1,51 7,6 60 YAGÜE LIMOSO 7 7 86 1,51 8 60 YAGÜE 82
  • 83. 4. Resultados y discusión A continuación se verán los datos a entrar según la vía escogida: - Clase textural: Pulsando en opciones del tipo de suelo aparecen las 12 clases texturales de la USDA, véase capítulo 3 del anejo 4. Al pulsar en una de ellas aparece el valor estimado del porcentaje de arena, limo y arcilla (sólo es informativo), la capacidad de campo, el punto de marchitamiento, la densidad aparente estimada, la tasa de infiltración y la eficiencia de lavado de sales estimada. Hay que volver a avisar que estos datos son meramente informativos. - Porcentaje textural: Introduciendo los valores porcentuales de arena, arcilla y limo calcula la clase textural y los valores estimados de capacidad de campo, punto de marchitamiento, densidad aparente, la tasa de infiltración y la eficiencia en el lavado de las sales. - Análisis de suelos: Se introducirá el valor de la analítica de suelos. Es la entrada más recomendada. Se aconseja disponer de análisis de suelos. Las entradas en esta pantalla son: Arena. Se introducirá el porcentaje de arena. Arcilla. Se introducirá el porcentaje de arcilla. Limo. Se introducirá el porcentaje de limo. Tipo de suelo. Se escogerá la clase textural de las opciones o se calculará automáticamente, de acuerdo a los valores entrados para cada textura. Capacidad de campo. Se introducirá la capacidad de campo en porcentaje de suelo seco, o el programa lo calculará automáticamente (Yagüe, 1996). Punto de marchitamiento . Se introducirá el porcentaje de suelo seco en el punto de marchitamiento, o el programa lo calculará automáticamente (Yagüe, 1996). Densidad aparente. Se introducirá la densidad aparente en gramos por centímetro cúbico, o el programa propondrá un valor. Infiltración. Se introducirá la tasa de infiltración en milímetros por hora, o el programa propondrá un valor. 83
  • 84. 4. Resultados y discusión Eficiencia Lavado. Se introducirá el porcentaje de la eficiencia en el lavado de sales. Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. Para realizar alguna modificación se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 4. 2. 7. Agua de riego. El módulo Agua de riego está en el menú de Entrada de Datos. En este módulo se introducirán los datos referentes a la conductividad eléctrica del agua de riego (véase figura 16 del anejo 3). Este valor determinará el aporte suplementario de agua para realizar el lavado de sales (Yagüe, 1996). El único valor a entrar es el siguiente: Conductividad eléctrica Agua. Se introducirá el valor de la conductividad eléctrica del agua de riego en dS/m. Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. Para realizar alguna modificación se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 84
  • 85. 4. Resultados y discusión 4. 2. 8. Tipo de riego. El módulo Tipo de riego está en el menú de Entrada de Datos. En este módulo se introducirán los datos referentes al sistema de riego, eficiencia de la aplicación y caudal de la instalación (véase figura 17 del anejo 17). En un diseño total (agronómico + hidráulico) esta pantalla tendría un valor importante. Sería el lugar para entrar las características del sistema de riego: caudal de los emisores, disposición de los emisores, laterales de riego, etcétera. Los datos a entrar son los siguientes. Sistema de Riego. Se ha de introducir el nombre del sistema de riego o se escogerá el disponible en la lista de opciones. Si se escoge de la lista de opciones, los valores de tipo de riego y eficiencia en la aplicación del riego serán proporcionados automáticamente. Tipo de Riego. Se introducirá L en el caso de riego localizado y S para el resto. Este valor determina la forma de cálculo en el lavado de sales. Eficiencia de Riego. Se introducirá el porcentaje de la eficiencia en la aplicación de agua de riego. Este valor, junto con el tipo de riego y con la dosis neta, servirá para calcular la dosis bruta de riego. Caudal Instalación. Se introducirá el caudal de agua de la instalación, considerado en metros cúbicos/hora. El caudal de la instalación, la superficie de la instalación y la tasa de infiltración del suelo determinarán el tiempo mínimo de riego en horas. Área sombreada. Se introducirá el porcentaje de sombra que da el cultivo sobre el campo. Servirá para calcular el coeficiente de localización en cultivos regados por goteo. Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. 85
  • 86. 4. Resultados y discusión Para realizar alguna modificación se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 4. 2. 9. Programación del Riego. El módulo Programación del riego está en el menú de Entrada de Datos. En este módulo se introducirán los datos relativos a la programación del riego y al tipo de lluvia efectiva (véase figura 18 del anejo 3). Para la programación del riego se ha de establecer el momento de riego, el volumen de riego y la reserva inicial de agua en el suelo. El momento de riego determina en qué instante se debe regar. Existen diversos métodos: cuando se agota la RFU, a intervalos regulares de días, en períodos concretos, etcétera. En este programa se contemplan los dos primeros métodos. De manera que, si los valores de agotamiento de la RFU y de intervalo de días se han rellenado, el momento de riego será el primer día que cumpla alguna de las dos condiciones. El volumen o dosis de riego establece la cantidad de agua que se suministrará en el momento de riego. También existen diversos métodos: recarga de la RFU, volumen constante, volumen variable en función de la época del año, etcétera. En este programa, se ha contemplado el primer concepto. La reserva inicial es el volumen de agua que tiene la RFU. En la programación de riegos es muy habitual empezar con la capacidad de campo al 100%. Esto equivale al 100% de la RFU. La precipitación efectiva se pude determinar por cuatro métodos, explicados en la introducción. Cada método se adaptará mejor a un clima. Para utilizar el método 86
  • 87. 4. Resultados y discusión empírico, se deberían calcular los valores de las ecuaciones para la zona de cultivo. En la precipitación efectiva sólo se pude activar uno de los cuatro métodos. Las entradas en la programación del riego son las siguientes: Agotamiento de la RFU. Es el porcentaje de la RFU en el cual se establece el momento de riego. Puede ir combinado con el intervalo de riego. Intervalo de riego. Es la frecuencia con que se desea establecer el riego. Puede ir combinado con el valor de agotamiento de la RFU. Recarga de la RFU. Es el porcentaje con el que quedará la RFU una vez que se ha terminado el riego. El valor de recarga de RFU no puede ser igual o inferior al porcentaje de agotamiento de la RFU. Porcentaje RFU (reserva inicial). Es el porcentaje de agua que tendrá la RFU al inicio de la programación del riego. Porcentaje precipitación: Representa el porcentaje de precipitación caída que será efectiva. FAO/AGWL. Son dos ecuaciones que fijarán el volumen de precipitación efectiva. El programa utilizará una fórmula u otra en función de la precipitación mensual (70 mm/mes). USDA. Son dos ecuaciones que fijarán el volumen de precipitación efectiva. El programa utilizará una fórmula u otra en función de la precipitación mensual (250 mm/mes). Empírico: Son dos ecuaciones variables en las que se han de introducir las constantes de las mismas. El programa utilizará una fórmula u otra en función de la de la constante. Esta constante representa la precipitación mensual (250 mm/mes). Una vez que se hayan introducido estos datos se podrá pulsar Aceptar para que los datos se graben. 87
  • 88. 4. Resultados y discusión Para realizar alguna modificación se cambiará el valor del campo deseado y después se pasará por cada uno de los campos hasta que aparezca Aceptar. 4. 2. 10. Resultados. El módulo Resultados está en el menú de Resultados. En este módulo se realizan los cálculos y se visualizan los datos (véase figura 19 del anejo 3). Al acceder al módulo se efectúan los cálculos, apareciendo un mensaje en rojo que invita a esperar un momento. Cuando se han efectuado los cálculos, se activan dos iconos: Balance hídrico, Riegos a efectuar. Al pulsar sobre alguno de estos dos iconos se activa la información correspondiente. Balance Hídrico. Se abre una pantalla en un tratamiento de textos que nos informa del balance hídrico a lo largo del cultivo. Se puede ver un ejemplo en la figura 20 del anejo 3. Al final del balance hídrico se hace un resumen. Riegos a efectuar. Se abre una pantalla en un tratamiento de textos que nos informa de los riegos a efectuar a lo largo del cultivo. Se puede ver un ejemplo en la figura 21 del anejo 3. Al final del balance hídrico se hace un resumen. 88
  • 89. 5. Conclusiones 5. CONCLUSIONES. 89
  • 90. 5. Conclusiones 5. CONCLUSIONES . • Se ha realizado un programa que permite calcular las necesidades hídricas de los cultivos, mediante el método del balance hídrico propuesto por la FAO. • El éxito en la obtención de resultados depende de la calidad de los datos que caracterizan el cultivo. Éste es el aspecto más difícil para conseguir una estimación ajustada. • Será necesario disponer de unos coeficientes de cultivo que se ajusten el máximo posible al cultivo considerado. • Es necesario realizar pruebas periódicas de evaluación del sistema de riego para conocer la eficiencia en la aplicación del agua. • La elección de una buena estrategia en la programación del riego puede mejorar las condiciones del cultivo y del personal que realiza el riego. 90
  • 91. 6. Bibliografía 6. BIBLIOGRAFÍA 91
  • 92. 6. Bibliografía 6. BIBLIOGRAFÍA. COROMINAS, J. 1997. El regadío en el umbral del siglo XXI: Plan Nacional de Regadíos y Plan de Regadíos de Andalucía. Número: 90. Páginas: 22-37. Riegos y Drenajes XXI. COROMINAS, J. 1997. El regadío en el umbral del siglo XXI: Plan Nacional de Regadíos y Plan de Regadíos de Andalucía. Número: 91. Páginas: 46-55. Riegos y Drenajes XXI. DOORENBOS, J. y PRUITT, W.O. . 1977. Las necesidades de agua de los cultivos. FAO-24. F.A.O. 194 pp. FUENTES YAGÜE, J.L. . 1996. Técnicas de riego. M.A.P.A. 471 pp. GENERALITAT DE CATALUNYA. 1997. PACCOM. Manual de l'usuari.Generalitat de Catalunya . D.A.R.P. 19 pp. GENERALITAT DE CATALUNYA.1997.PACREG. Programa de reg localizat i per superficie (versio 3.0). Manual de l'usuari. Generalitat de Catalunya. D.A.R.P. 48 pp. M. STEIN, THOMAS. 1998. Irrisoft. http://www.wiz.uni-kassel.de/kww/irrisoft/manage/manage_i.html MARTIN DE SANTA OLALLA, F. y DE JUAN VALERO, J.A. . 1993. Agronomía del riego. Ediciones Mundi-Prensa. 730 pp. NADAL, E. Y LACASA, M. 1995. El agua y el regadío en el futuro del mundo rural. M.A.P.A. . 130 pp. PIZARRO, F. . 1996. Riegos localizados de alta frecuencia (RLAF) goteo, microaspersión, exudacion. Ediciones Mundi-Prensa. 513 pp. SEGURA, P. Y ZAPATA, M. . 1995. Riego deficitario controlado. Ediciones MundiPrensa. 188 pp. SMITH, M. . 1993. CROPWAT. Programa de ordenador para planificar y manejar el riego. FAO-46. F.A.O. 133 pp. SMITH, M. .1990. Revised FAO Methodology for Crop Water Requirements. http://www.fao.org/ag/agl/aglw/webpub/REVPUB.htm. 70 pp. VALIENTE, M., MONTERO, J., ORTEGA, J.F y TARJUELO, J.M. . 1998 . Recomendaciones para un eficiente diseño y manejo del riego. Número: 97. Páginas: 39-47. Riegos y Drenajes XXI. 92
  • 93. 7. Anejos 7. ANEJOS. 93
  • 94. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla1. Porcentaje diario medio de horas diurnas anuales a diferentes latitudes. 94
  • 95. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 2. Valores del factor f de Blaney-Criddle para diferentes temperaturas y porcentaje diario medio horas diurnas anuales. 95
  • 96. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Figura 1. Predicción de la ETo a partir del factor f de Blaney-Criddle. 96
  • 97. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 3. Radiación extraterrestre. 97
  • 98. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 4. Duración máxima de las horas fuertes de insolación. 98
  • 99. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 5. Coeficiente de corrección de radiación extraterrestre (Ra) en radiación solar (Rs). 99
  • 100. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 6. Factor de ponderación W. 100
  • 101. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Figura 2. Gráficos para determinar la ETo por el método de radiación. 101
  • 102. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 7. Factor de corrección c en la ecuación de Penman. 102
  • 103. 7. Anejo 1 7. ANEJO1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 8. Presión saturante del vapor ea. 103
  • 104. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 9. Presión del vapor ed. 104
  • 105. 7. Anejo 1 7.ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 10. Factor de conversión de la radiación extraterrestre en radiación solar neta. Tabla 11. Corrección para la temperatura f(t) con respecto a la radiación de onda larga. Tabla 12. Corrección para la presión de vapor f(ed) con respecto a la radiación de onda larga. Tabla 13. Corrección para la relación n/N f(n/N) con respecto a la radiación de onda larga. 105
  • 106. 7. Anejo 1 7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24. Tabla 14. Coeficiente Kp para una cubeta de clase A. 106
  • 107. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 1. Programa DAYLET. 107
  • 108. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 2. Programa FAO-PMAN.XLS (continuación). 108
  • 109. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 3. Programa FAO-PMAN.XLS (continuación). 109
  • 110. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 4. Programa-FAO PMAN.XLS (continuación) Leyenda de la hoja de cálculo FAO-PMON.XLS Tmax Tmin RHmean RHmin Wind (km/d) Sunhours ET fao Avg Temp n/N Wind (m/s) Ea(Tmax) Ea(Tmin) Edew RH(max-min) Dlt(ETx-ETn) P-atm. lambda gamma rc ra gamma* Temperatura máxima [ºC] Temperatura mínima [ºC] Humedad relativa media [%] Humedad relativa mínima [%] Humedad relativa máxima [%] Horas de sol ETo FAO [mm] Temperatura media [ºC] Relación horas Sol y horas máximas de Sol Viento diario [m/s] Presión de vapor en saturación a temp. Máxima [kPa] Presión de vapor en saturación a temp. Mínima [kPa] Presión actual de vapor [kPa] Humedad relativa media [%] Pendiente de la curva de presión de vapor [kPA] Presión atmosférica [kPa] -1 Calor latente de vaporización [MJ kg ] -1 Constante psicrométrica [kPa ºC ] Resistencia aerodinámica del cultivo -1 Resistencia aerodinámica [ s m ] Constante psicrométrica modificada [kPa ºC-1] Aeroterm Month Dayno Soldeclin Omega Dr Ra N Rns f(n/N) sigma(Tx_Tn) emissivity Rbo LWR Rn (Rns-Rl) G Rn-G Rad Term Rad Term(-G) ETcomb ET (-G) -1 Término aerodinámico [mm d ] Mes Día del año Declinación solar [rad] Angulo horario [rad] Distancia relativa Sol-Tierra -2 -1 Radiación extraterrestre [MJ m d ] Horas de sol máximas -2 -1 Radiación neta de onda corta [MJ m d ] Factor de nubes bajas -2 -4 -1 Constante de Stefan-Boltzman [MJ K d ] Emisividad -2 -1 Radiación neta de onda larga [MJ m d ] Radiación neta de onda larga [MJ m -2 d -1] -2 -1 Radiación Neta [MJ m d ] -2 -1 Flujo de calor del suelo [MJ m d ] -2 -1 Radiación neta - Flujo de calor del suelo [MJ m d ] -2 -1 Término debido a la radiación [MJ m d ] -2 -1 Término radiación - Flujo calor suelo [MJ m d ] ETo [mm] Evapotranspiración - Flujo de calor del suelo [mm] 110
  • 111. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 5. Programa FAO-PMAN.XLS (continuación). FAO Penman-Monteith - ETo Ref. Evapotranspiration Rome 7,00 6,00 ETo mm/day 5,00 4,00 3,00 2,00 1,00 0,00 JAN FEB MAR APR MAY JUN ETo (-G) JUL AUG SEP OCT NOV DEC ETo 111
  • 112. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 6. Programa SW. 112
  • 113. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 7. Programa PACCOM. ____ Menú general __________________________________________________________ ____ ------------ ___________________+----------------------------------+___ _____________________________________¦ 0 ¦Fi ¦___ ____ Estacions automàtiques _________¦ 1 ¦Dades diàries (resum) ¦___ ____ ---------------------- _________¦ 2 ¦Dades diàries (totes les est.)¦___ _____________________________________¦ 3 ¦Temperatures ¦___ _____________________________________¦ 4 ¦Humitat relativa ¦___ ____ Dades diàries __________________¦ 5 ¦ETo ¦___ ____ ------------- __________________¦ 6 ¦Radiacions ¦___ _____________________________________¦ 7 ¦Velocitat i direcció de vent ¦___ _____________________________________¦ 8 ¦Pluviometria ¦___ _____________________________________¦ 9 ¦Balanç hídric ¦___ _____________________________________¦ A ¦Exportar dades diàries ¦___ _____________________________________¦ B ¦FINALITZAR I PENJAR MODEM ¦___ _____________________________________+----------------------------------+___ DARP (GENERALITAT CATALUNYA) Dia : 21/11/98 113
  • 114. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 8. Programa REQRIEGO.XLS. 114
  • 115. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 9. Programa REQRIEGO.XLS (continuación). 115
  • 116. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 10. Programa REQRI EGO.X LS (continuación) Leyenda de la hoja de cálculo REQRIEGO.XLS ea HR ea-ed Uo f(n) Delta Gamma W T. Suelo CC PMP Da Pr K DEC N Ra n Rns Rnl ETo Kc ETc Precip.efect. BALANCE Presión de vapor saturante [kPa] Humedad relativa [%] Déficit de presión de vapor [kPa] -1 Velocidad viento diario [m s ] -1 Función de viento [mm kPa ] Pendiente de la curva de presión de vapor [kPa] -1 Constante psicrométrica [kPa ºC ] Función de peso Tipo de suelo (textura) Capacidad de campo [%] Punto de marchitamiento permanente [%] -3 Densidad aparente [g cm ] Profundidad raíces [cm] Factor agotamiento permisible Declinación solar [rad] Horas de sola máxima [h] -2 -1 Radiación extraterrestre [MJ m d ] Horas de sol percibidas [h] -2 -1 Radiación neta de onda corta [MJ m d ] -2 -1 Radiación neta de onda larga [MJ m d ] -1 Evapotranspiración de referencia [mm periodo ] Coeficiente de cultivo -1 Evapotranspiración de cultivo [mm dia ] -1 precipitación efectiva [mm periodo ] -1 Balance hídrico [mm mes ] 116
  • 117. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 11. Programa REQRIEGO.XLS (continuación). Kc vs meses del año 1,400 1,200 1,000 Kc 0,800 0,600 Serie1 0,400 0,200 0,000 0 1 2 3 4 5 6 7 8 9 10 11 12 -0,200 meses del año 117
  • 118. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 12. Programa CROPWAT 5.7 en español. i----------------------------------------------------------© ¦ MENU PRINCIPAL DE CROPWAT (5.7) ¦ ã----------------------------------------------------------Á ¦ ¦ ¦ OPCIONES DEL PROGRAMA: ¦ +----------------------------------------------------------¦ ¦ 1. Cálculos de ETo Penman-Monteith ¦ ¦ 2. Necesidades de agua de los cultivos ¦ ¦ 3. Programación del riego ¦ ¦ 4. Necesidades de agua del sistema de riego ¦ ¦ ¦ ¦ 5. Regulación de la impresora ¦ ¦ 6. Selección de directorios ¦ +----------------------------------------------------------¦ ¦ 9. Salida del CROPWAT ¦ +----------------------------------------------------------+ Su opción ? 118
  • 119. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 13. Programa PACREG 3.0. ____________________________________________________________________________ ____________________________________________________________________________ ____ Menú general ___________________+----------------------------------+___ ____ ------------ ___________________¦ 0 ¦Fi ¦___ _____________________________________¦ 1 ¦Fitxer de cultius ¦___ _____________________________________¦ 2 ¦Dades de la parcel·la ¦___ _____________________________________¦ 3 ¦Reg per superfície ¦___ _____________________________________¦ 4 ¦Reg localitzat ¦___ _____________________________________¦ 5 ¦Fitxer climàtic dades reals ¦___ _____________________________________¦ 6 ¦Fitxer climàtic dades mitjanes¦___ _____________________________________¦ 7 ¦Opcions especials ¦___ _____________________________________+----------------------------------+___ ____________________________________________________________________________ DARP (GENERALITAT CATALUNYA) Dia : 17/10/98 119
  • 120. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 14. Programa BIGSIM. 120
  • 121. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 15. Programa CROPSYST. 121
  • 122. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 16. Programa WATERMOD. 122
  • 123. 7. Anejo 2 7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS. Figura 17. RED IRRISOFT 123
  • 124. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 1. Flujo de datos Kc Fracción Agotami. Cultivos Datos Finca Prof. Raíces Datos Cultivo Tolerancia Sal Días Cultivo Datos Climáticos Datos Suelo Texturas Suelo Clima Datos Agua Riego PROGRAMACIÓN Sistemas Riego Tipo Riego Programación Riego LEYENDA Entrada/Visualización de datos Cálculos Fichero BALANCE HÍDRICO Proceso Decisión Decisión Listado BALANCE HÍDRICO RIEGOS 124
  • 125. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 2. Menú del programa. 125
  • 126. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 3. Nuevo diseño en diseño agronómico. 126
  • 127. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 4. Abrir diseño en diseño agronómico. 127
  • 128. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 5. Mantenimiento de tablas. 128
  • 129. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 6. Sistemas de riego en mantenimiento de tablas. 129
  • 130. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 7. Datos de la finca. 130
  • 131. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 8. Datos del cultivo (cultivo con Kc en 12 fases). 131
  • 132. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 9. Datos del cultivo (cultivo con Kc en 4 fases). 132
  • 133. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 10. Datos meteorológicos (formato de entrada). 133
  • 134. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 11. Datos meteorológicos (obtención de un fichero meteorológico). 134
  • 135. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 12. Datos meteorológicos (calendario diario). 135
  • 136. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 13. Datos meteorológicos (calendario mensual). 136
  • 137. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 14. Datos meteorológicos (entrada de datos meteorológicos). 137
  • 138. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 15. Datos del suelo. 138
  • 139. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 16. Datos del agua de riego. 139
  • 140. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 17. Datos del tipo de riego. 140
  • 141. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 18. Datos de la programación de riego. 141
  • 142. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 19. Resultados. 142
  • 143. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 20. Resultados. Listado del balance hídrico. BALANCE HÍDRICO 28/11/98 19:23:55 Programación........................................: Finca...............................................: Población...........................................: Provincia...........................................: Latitud [g,m,s].....................................: Longitud [g,m,s]....................................: Altitud [m].........................................: Superficie [m2].....................................: Cultivo.............................................: Fracción agua disponible en el suelo................: Clase textural......................................: Densidad aparente [g/cm3]...........................: Capacidad de Campo [% peso].........................: Punto de Marchitamiento [%peso].....................: Sistema Riego.......................................: Eficiencia en la aplicación [%].....................: Caudal instalación riego [m3/parcela]...............: Conductividad agua de riego [dS/m)..................: Eficiencia en el lavado de sales [%]................: Rendimiento mínimo deseado debido a salinidad [%]...: Fecha Plantación/Inicio.............................: Momento de Riego. Agotamiento de la RFU [%].........: Intervalo de riego [días]...........................: Dosis de riego. Recarga de la RFU [%]...............: Nivel de agua de la RFU al inicio [%]...............: Fecha ---------01-01-1998 02-01-1998 03-01-1998 04-01-1998 05-01-1998 06-01-1998 07-01-1998 08-01-1998 ETo [mm] ----0,97 0,85 1,75 2,03 0,50 0,49 1,13 0,32 Kc Kl ---0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 NARANJAS (CLIMA DIARIO, AÑO 1998, VICENTE MAS) La Taronjera Alcanar Tarragona 40º 3' 33'' Nº 0º 31' 28'' Eº 35 10000 NARANJO 0,35 FRANCO 1,51 19 10 GOTEO (ZONAS ARIDAS) 90 12 1 70 100 01-01-1998 100 2 100 0 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------0,57 6,24 60 0,35 28,5 5,67 0,00 0,00 0,0 0,0 0,0 0,51 6,08 60 0,35 28,5 11,24 0,00 0,00 0,0 0,0 0,0 1,04 24,10 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 1,20 0,00 60 0,35 28,5 27,33 0,00 0,00 0,0 0,0 0,0 0,30 4,06 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,29 31,20 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,67 0,93 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,19 7,80 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 143
  • 144. 7. Anejo 3 Fecha ---------09-01-1998 10-01-1998 11-01-1998 12-01-1998 13-01-1998 14-01-1998 15-01-1998 16-01-1998 17-01-1998 18-01-1998 19-01-1998 20-01-1998 21-01-1998 22-01-1998 23-01-1998 24-01-1998 25-01-1998 26-01-1998 27-01-1998 28-01-1998 29-01-1998 30-01-1998 31-01-1998 01-02-1998 02-02-1998 03-02-1998 04-02-1998 05-02-1998 06-02-1998 07-02-1998 08-02-1998 09-02-1998 10-02-1998 11-02-1998 12-02-1998 13-02-1998 14-02-1998 15-02-1998 16-02-1998 17-02-1998 18-02-1998 19-02-1998 ETo [mm] ----1,16 2,03 1,05 1,21 0,50 1,07 1,41 1,13 0,79 1,29 0,60 1,32 1,10 1,19 0,97 0,91 1,03 1,18 0,72 1,32 0,75 1,41 0,79 1,32 0,97 1,65 1,39 1,32 1,75 1,63 1,48 1,50 1,38 1,68 1,92 2,79 2,04 4,48 1,85 1,65 1,42 1,71 Kc Kl ---0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------0,69 0,31 60 0,35 28,5 28,53 0,38 0,57 5,7 6,5 0,5 1,20 0,00 60 0,35 28,5 27,34 0,00 0,00 0,0 0,0 0,0 0,62 0,00 60 0,35 28,5 28,53 1,82 2,78 27,8 0,3 2,3 0,72 0,16 60 0,35 28,5 27,98 0,00 0,00 0,0 0,0 0,0 0,30 0,16 60 0,35 28,5 28,53 0,69 1,05 10,5 0,1 0,9 0,63 0,16 60 0,35 28,5 28,06 0,00 0,00 0,0 0,0 0,0 0,83 0,00 60 0,35 28,5 28,53 1,31 1,99 19,9 0,2 1,7 0,67 0,00 60 0,35 28,5 27,86 0,00 0,00 0,0 0,0 0,0 0,47 6,56 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,76 0,16 60 0,35 28,5 27,93 0,00 0,00 0,0 0,0 0,0 0,36 2,96 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,78 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,65 0,16 60 0,35 28,5 28,53 0,49 0,75 7,5 8,5 0,6 0,70 0,62 60 0,35 28,5 28,45 0,00 0,00 0,0 0,0 0,0 0,58 4,21 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,54 3,28 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,61 5,46 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,70 0,00 60 0,35 28,5 27,83 0,00 0,00 0,0 0,0 0,0 0,42 0,16 60 0,35 28,5 28,53 0,96 1,47 14,7 0,2 1,2 0,78 0,16 60 0,35 28,5 27,91 0,00 0,00 0,0 0,0 0,0 0,44 9,04 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,83 0,16 60 0,35 28,5 27,86 0,00 0,00 0,0 0,0 0,0 0,47 0,16 60 0,35 28,5 28,53 0,98 1,50 15,0 0,2 1,2 0,78 0,00 60 0,35 28,5 27,75 0,00 0,00 0,0 0,0 0,0 0,57 0,16 60 0,35 28,5 28,53 1,20 1,82 18,2 0,2 1,5 0,98 1,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,82 0,00 60 0,35 28,5 28,53 0,82 1,26 12,6 0,1 1,0 0,78 0,16 60 0,35 28,5 27,91 0,00 0,00 0,0 0,0 0,0 1,03 0,00 60 0,35 28,5 28,53 1,66 2,53 25,3 0,3 2,1 0,97 0,16 60 0,35 28,5 27,73 0,00 0,00 0,0 0,0 0,0 0,88 0,16 60 0,35 28,5 28,53 1,53 2,33 23,3 0,3 1,9 0,89 0,16 60 0,35 28,5 27,80 0,00 0,00 0,0 0,0 0,0 0,82 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,8 0,99 0,16 60 0,35 28,5 27,70 0,00 0,00 0,0 0,0 0,0 1,14 0,00 60 0,35 28,5 28,53 1,97 3,00 30,0 0,3 2,5 1,65 0,00 60 0,35 28,5 26,88 0,00 0,00 0,0 0,0 0,0 1,21 0,00 60 0,35 28,5 28,53 2,86 4,36 43,6 0,5 3,6 2,66 2,34 60 0,35 28,5 28,22 0,00 0,00 0,0 0,0 0,0 1,09 0,00 60 0,35 28,5 28,53 1,41 2,15 21,5 0,2 1,8 0,98 0,00 60 0,35 28,5 27,56 0,00 0,00 0,0 0,0 0,0 0,84 0,00 60 0,35 28,5 28,53 1,82 2,77 27,7 0,3 2,3 1,01 0,00 60 0,35 28,5 27,52 0,00 0,00 0,0 0,0 0,0 144
  • 145. 7. Anejo 3 Fecha ---------20-02-1998 21-02-1998 22-02-1998 23-02-1998 24-02-1998 25-02-1998 26-02-1998 27-02-1998 28-02-1998 01-03-1998 02-03-1998 03-03-1998 04-03-1998 05-03-1998 06-03-1998 07-03-1998 08-03-1998 09-03-1998 10-03-1998 11-03-1998 12-03-1998 13-03-1998 14-03-1998 15-03-1998 16-03-1998 17-03-1998 18-03-1998 19-03-1998 20-03-1998 21-03-1998 22-03-1998 23-03-1998 24-03-1998 25-03-1998 26-03-1998 27-03-1998 28-03-1998 29-03-1998 30-03-1998 31-03-1998 01-04-1998 02-04-1998 ETo [mm] ----1,85 1,35 1,18 1,12 1,58 2,00 3,63 2,33 1,73 1,26 1,52 1,20 1,45 1,43 1,53 2,00 2,70 2,60 2,54 3,03 2,52 2,48 2,45 2,46 2,46 2,37 3,15 6,14 2,96 2,40 2,29 2,26 3,22 1,65 2,83 2,81 2,94 2,30 2,78 2,17 2,43 2,81 Kc Kl ---0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,75 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------1,09 0,00 60 0,35 28,5 28,53 2,11 3,21 32,1 0,4 2,7 0,80 0,16 60 0,35 28,5 27,90 0,00 0,00 0,0 0,0 0,0 0,70 0,00 60 0,35 28,5 28,53 1,34 2,04 20,4 0,2 1,7 0,66 0,00 60 0,35 28,5 27,87 0,00 0,00 0,0 0,0 0,0 0,94 0,16 60 0,35 28,5 28,53 1,44 2,19 21,9 0,2 1,8 1,18 0,00 60 0,35 28,5 27,35 0,00 0,00 0,0 0,0 0,0 2,15 0,00 60 0,35 28,5 28,53 3,34 5,08 50,8 0,6 4,2 1,38 0,00 60 0,35 28,5 27,16 0,00 0,00 0,0 0,0 0,0 1,03 0,00 60 0,35 28,5 28,53 2,41 3,66 36,6 0,4 3,1 0,79 0,00 60 0,35 28,5 27,74 0,00 0,00 0,0 0,0 0,0 0,96 0,16 60 0,35 28,5 28,53 1,59 2,43 24,3 0,3 2,0 0,76 0,16 60 0,35 28,5 27,94 0,00 0,00 0,0 0,0 0,0 0,92 0,00 60 0,35 28,5 28,53 1,52 2,31 23,1 0,3 1,9 0,90 0,00 60 0,35 28,5 27,63 0,00 0,00 0,0 0,0 0,0 0,97 0,00 60 0,35 28,5 28,53 1,87 2,84 28,4 0,3 2,4 1,27 0,00 60 0,35 28,5 27,27 0,00 0,00 0,0 0,0 0,0 1,71 0,16 60 0,35 28,5 28,53 2,81 4,28 42,8 0,5 3,6 1,64 0,00 60 0,35 28,5 26,89 0,00 0,00 0,0 0,0 0,0 1,60 0,00 60 0,35 28,5 28,53 3,25 4,94 49,4 0,6 4,1 1,91 0,00 60 0,35 28,5 26,62 0,00 0,00 0,0 0,0 0,0 1,59 0,00 60 0,35 28,5 28,53 3,51 5,34 53,4 0,6 4,5 1,57 0,00 60 0,35 28,5 26,97 0,00 0,00 0,0 0,0 0,0 1,55 0,00 60 0,35 28,5 28,53 3,12 4,75 47,5 0,5 4,0 1,55 0,00 60 0,35 28,5 26,98 0,00 0,00 0,0 0,0 0,0 1,55 0,00 60 0,35 28,5 28,53 3,11 4,74 47,4 0,5 3,9 1,49 0,00 60 0,35 28,5 27,04 0,00 0,00 0,0 0,0 0,0 1,99 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,4 3,88 0,00 60 0,35 28,5 24,65 0,00 0,00 0,0 0,0 0,0 1,87 0,00 60 0,35 28,5 28,53 5,75 8,77 87,7 1,0 7,3 1,52 0,00 60 0,35 28,5 27,02 0,00 0,00 0,0 0,0 0,0 1,45 0,00 60 0,35 28,5 28,53 2,97 4,52 45,2 0,5 3,8 1,43 0,00 60 0,35 28,5 27,10 0,00 0,00 0,0 0,0 0,0 2,03 0,62 60 0,35 28,5 28,53 2,84 4,33 43,3 0,5 3,6 1,04 0,00 60 0,35 28,5 27,50 0,00 0,00 0,0 0,0 0,0 1,79 0,00 60 0,35 28,5 28,53 2,83 4,31 43,1 0,5 3,6 1,78 0,00 60 0,35 28,5 26,76 0,00 0,00 0,0 0,0 0,0 1,86 0,00 60 0,35 28,5 28,53 3,63 5,53 55,3 0,6 4,6 1,45 0,00 60 0,35 28,5 27,08 0,00 0,00 0,0 0,0 0,0 1,75 0,00 60 0,35 28,5 28,53 3,21 4,89 48,9 0,5 4,1 1,37 0,00 60 0,35 28,5 27,16 0,00 0,00 0,0 0,0 0,0 1,54 0,00 60 0,35 28,5 28,53 2,91 4,43 44,3 0,5 3,7 1,78 0,00 60 0,35 28,5 26,76 0,00 0,00 0,0 0,0 0,0 145
  • 146. 7. Anejo 3 Fecha ---------03-04-1998 04-04-1998 05-04-1998 06-04-1998 07-04-1998 08-04-1998 09-04-1998 10-04-1998 11-04-1998 12-04-1998 13-04-1998 14-04-1998 15-04-1998 16-04-1998 17-04-1998 18-04-1998 19-04-1998 20-04-1998 21-04-1998 22-04-1998 23-04-1998 24-04-1998 25-04-1998 26-04-1998 27-04-1998 28-04-1998 29-04-1998 30-04-1998 01-05-1998 02-05-1998 03-05-1998 04-05-1998 05-05-1998 06-05-1998 07-05-1998 08-05-1998 09-05-1998 10-05-1998 11-05-1998 12-05-1998 13-05-1998 14-05-1998 ETo [mm] ----3,01 3,92 3,52 3,40 2,51 1,88 3,17 3,48 3,38 3,99 3,08 3,32 3,14 3,07 1,13 1,05 1,74 0,48 3,49 3,65 3,58 2,79 3,42 2,91 3,34 4,81 6,14 4,37 4,20 3,81 3,25 3,84 4,88 6,98 3,02 4,02 4,08 3,04 2,56 2,36 3,27 3,75 Kc Kl ---0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. [mm] [mm] [cm] [mm] [mm] [mm] ----- ------ ------ ---- ------ ------- ----1,90 0,00 60 0,35 28,5 28,53 3,68 2,48 0,00 60 0,35 28,5 26,06 0,00 2,23 0,00 60 0,35 28,5 28,53 4,70 2,15 0,00 60 0,35 28,5 26,38 0,00 1,59 0,00 60 0,35 28,5 28,53 3,74 1,19 0,00 60 0,35 28,5 27,35 0,00 2,00 0,00 60 0,35 28,5 28,53 3,19 2,20 0,16 60 0,35 28,5 26,50 0,00 2,14 0,00 60 0,35 28,5 28,53 4,18 2,52 0,00 60 0,35 28,5 26,01 0,00 1,94 0,00 60 0,35 28,5 28,53 4,47 2,10 0,00 60 0,35 28,5 26,44 0,00 1,99 0,16 60 0,35 28,5 28,53 3,92 1,94 0,00 60 0,35 28,5 26,60 0,00 0,71 2,80 60 0,35 28,5 28,53 0,00 0,67 7,64 60 0,35 28,5 28,53 0,00 1,10 0,78 60 0,35 28,5 28,53 0,32 0,30 24,60 60 0,35 28,5 28,53 0,00 2,20 0,00 60 0,35 28,5 28,53 2,20 2,30 0,00 60 0,35 28,5 26,23 0,00 2,26 0,00 60 0,35 28,5 28,53 4,57 1,76 0,00 60 0,35 28,5 26,77 0,00 2,16 0,00 60 0,35 28,5 28,53 3,92 1,84 0,16 60 0,35 28,5 26,86 0,00 2,11 0,00 60 0,35 28,5 28,53 3,79 3,04 0,00 60 0,35 28,5 25,50 0,00 3,88 0,00 60 0,35 28,5 28,53 6,92 2,76 0,00 60 0,35 28,5 25,77 0,00 2,65 0,00 60 0,35 28,5 28,53 5,41 2,40 0,00 60 0,35 28,5 26,13 0,00 2,05 0,00 60 0,35 28,5 28,53 4,46 2,43 0,16 60 0,35 28,5 26,27 0,00 3,08 0,00 60 0,35 28,5 28,53 5,35 4,41 0,00 60 0,35 28,5 24,12 0,00 1,91 0,62 60 0,35 28,5 28,53 5,70 2,54 0,00 60 0,35 28,5 25,99 0,00 2,58 0,00 60 0,35 28,5 28,53 5,12 1,92 0,00 60 0,35 28,5 26,61 0,00 1,62 0,00 60 0,35 28,5 28,53 3,54 1,49 0,00 60 0,35 28,5 27,04 0,00 2,06 0,00 60 0,35 28,5 28,53 3,56 2,37 0,31 60 0,35 28,5 26,48 0,00 d.b. D.B. tiempoI tiempoC [mm] [m3/par] [horas] [hora] ----- -------- ------- ------5,61 56,1 0,6 4,7 0,00 0,0 0,0 0,0 7,16 71,6 0,8 6,0 0,00 0,0 0,0 0,0 5,69 56,9 0,6 4,7 0,00 0,0 0,0 0,0 4,85 48,5 0,5 4,0 0,00 0,0 0,0 0,0 6,36 63,6 0,7 5,3 0,00 0,0 0,0 0,0 6,81 68,1 0,8 5,7 0,00 0,0 0,0 0,0 5,98 59,8 0,7 5,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,49 4,9 5,5 0,4 0,00 0,0 0,0 0,0 3,36 33,6 0,4 2,8 0,00 0,0 0,0 0,0 6,96 69,6 0,8 5,8 0,00 0,0 0,0 0,0 5,98 59,8 0,7 5,0 0,00 0,0 0,0 0,0 5,78 57,8 0,6 4,8 0,00 0,0 0,0 0,0 10,54 105,4 1,2 8,8 0,00 0,0 0,0 0,0 8,25 82,5 0,9 6,9 0,00 0,0 0,0 0,0 6,79 67,9 0,8 5,7 0,00 0,0 0,0 0,0 8,15 81,5 0,9 6,8 0,00 0,0 0,0 0,0 8,68 86,8 1,0 7,2 0,00 0,0 0,0 0,0 7,80 78,0 0,9 6,5 0,00 0,0 0,0 0,0 5,39 53,9 0,6 4,5 0,00 0,0 0,0 0,0 5,42 54,2 0,6 4,5 0,00 0,0 0,0 0,0 146
  • 147. 7. Anejo 3 Fecha ---------15-05-1998 16-05-1998 17-05-1998 18-05-1998 19-05-1998 20-05-1998 21-05-1998 22-05-1998 23-05-1998 24-05-1998 25-05-1998 26-05-1998 27-05-1998 28-05-1998 29-05-1998 30-05-1998 31-05-1998 01-06-1998 02-06-1998 03-06-1998 04-06-1998 05-06-1998 06-06-1998 07-06-1998 08-06-1998 09-06-1998 10-06-1998 11-06-1998 12-06-1998 13-06-1998 14-06-1998 15-06-1998 16-06-1998 17-06-1998 18-06-1998 19-06-1998 20-06-1998 21-06-1998 22-06-1998 23-06-1998 24-06-1998 25-06-1998 ETo [mm] ----1,76 3,65 3,87 3,69 3,12 5,84 3,91 4,12 4,33 1,69 5,21 6,20 5,18 5,01 5,35 3,07 2,23 2,34 3,78 5,04 2,00 5,07 5,56 2,32 5,34 5,21 4,61 5,32 4,66 4,82 6,51 5,30 3,17 2,81 3,56 4,30 5,16 4,83 3,85 6,17 5,37 4,24 Kc Kl ---0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. [mm] [mm] [cm] [mm] [mm] [mm] ----- ------ ------ ---- ------ ------- ----1,11 0,93 60 0,35 28,5 28,53 2,24 2,31 0,00 60 0,35 28,5 26,23 0,00 2,45 1,24 60 0,35 28,5 28,53 3,51 2,33 0,00 60 0,35 28,5 26,20 0,00 1,97 0,00 60 0,35 28,5 28,53 4,30 3,69 0,00 60 0,35 28,5 24,84 0,00 2,47 1,87 60 0,35 28,5 28,53 4,29 2,60 0,00 60 0,35 28,5 25,93 0,00 2,74 0,00 60 0,35 28,5 28,53 5,34 1,07 0,16 60 0,35 28,5 27,63 0,00 3,29 6,40 60 0,35 28,5 28,53 0,00 3,92 0,00 60 0,35 28,5 24,62 0,00 3,28 0,00 60 0,35 28,5 28,53 7,19 3,16 0,00 60 0,35 28,5 25,37 0,00 3,38 0,00 60 0,35 28,5 28,53 6,54 1,94 0,00 60 0,35 28,5 26,60 0,00 1,41 5,93 60 0,35 28,5 28,53 0,00 1,57 1,40 60 0,35 28,5 28,36 0,00 2,54 0,00 60 0,35 28,5 28,53 2,71 3,38 0,00 60 0,35 28,5 25,15 0,00 1,34 3,75 60 0,35 28,5 28,53 0,98 3,40 0,00 60 0,35 28,5 25,13 0,00 3,73 0,00 60 0,35 28,5 28,53 7,13 1,55 0,93 60 0,35 28,5 27,91 0,00 3,58 0,00 60 0,35 28,5 28,53 4,21 3,50 0,00 60 0,35 28,5 25,04 0,00 3,09 0,00 60 0,35 28,5 28,53 6,59 3,57 0,00 60 0,35 28,5 24,96 0,00 3,13 0,00 60 0,35 28,5 28,53 6,70 3,23 0,00 60 0,35 28,5 25,30 0,00 4,37 0,00 60 0,35 28,5 28,53 7,60 3,56 0,00 60 0,35 28,5 24,98 0,00 2,13 0,00 60 0,35 28,5 28,53 5,69 1,88 0,00 60 0,35 28,5 26,65 0,00 2,39 0,62 60 0,35 28,5 28,53 3,65 2,88 0,00 60 0,35 28,5 25,65 0,00 3,46 0,00 60 0,35 28,5 28,53 6,35 3,24 0,00 60 0,35 28,5 25,29 0,00 2,58 0,00 60 0,35 28,5 28,53 5,82 4,14 0,00 60 0,35 28,5 24,39 0,00 3,61 0,00 60 0,35 28,5 28,53 7,75 2,84 0,00 60 0,35 28,5 25,69 0,00 d.b. D.B. tiempoI tiempoC [mm] [m3/par] [horas] [hora] ----- -------- ------- ------3,41 34,1 0,4 2,8 0,00 0,0 0,0 0,0 5,35 53,5 0,6 4,5 0,00 0,0 0,0 0,0 6,56 65,6 0,7 5,5 0,00 0,0 0,0 0,0 6,54 65,4 0,7 5,4 0,00 0,0 0,0 0,0 8,14 81,4 0,9 6,8 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 10,95 109,6 1,2 9,1 0,00 0,0 0,0 0,0 9,97 99,7 1,1 8,3 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 4,13 41,3 0,5 3,4 0,00 0,0 0,0 0,0 1,49 14,9 0,2 1,2 0,00 0,0 0,0 0,0 10,86 108,7 1,2 9,1 0,00 0,0 0,0 0,0 6,41 64,1 0,7 5,3 0,00 0,0 0,0 0,0 10,04 100,4 1,1 8,4 0,00 0,0 0,0 0,0 10,20 102,1 1,1 8,5 0,00 0,0 0,0 0,0 11,58 115,8 1,3 9,7 0,00 0,0 0,0 0,0 8,67 86,7 1,0 7,2 0,00 0,0 0,0 0,0 5,56 55,6 0,6 4,6 0,00 0,0 0,0 0,0 9,67 96,7 1,1 8,1 0,00 0,0 0,0 0,0 8,87 88,7 1,0 7,4 0,00 0,0 0,0 0,0 11,80 118,0 1,3 9,8 0,00 0,0 0,0 0,0 147
  • 148. 7. Anejo 3 Fecha ---------26-06-1998 27-06-1998 28-06-1998 29-06-1998 30-06-1998 01-07-1998 02-07-1998 03-07-1998 04-07-1998 05-07-1998 06-07-1998 07-07-1998 08-07-1998 09-07-1998 10-07-1998 11-07-1998 12-07-1998 13-07-1998 14-07-1998 15-07-1998 16-07-1998 17-07-1998 18-07-1998 19-07-1998 20-07-1998 21-07-1998 22-07-1998 23-07-1998 24-07-1998 25-07-1998 26-07-1998 27-07-1998 28-07-1998 29-07-1998 30-07-1998 31-07-1998 01-08-1998 02-08-1998 03-08-1998 04-08-1998 05-08-1998 06-08-1998 ETo [mm] ----4,68 2,77 1,60 3,74 4,44 4,49 4,29 4,67 2,45 6,20 5,27 5,59 6,03 3,46 3,97 5,41 4,70 4,94 4,33 5,80 5,02 5,90 5,42 5,58 3,71 4,63 5,39 4,18 5,26 5,74 5,44 4,40 4,62 4,67 4,89 5,78 4,79 4,81 4,84 3,86 3,14 3,60 Kc Kl ---0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. [mm] [mm] [cm] [mm] [mm] [mm] ----- ------ ------ ---- ------ ------- ----3,14 0,78 60 0,35 28,5 28,53 5,20 1,86 0,00 60 0,35 28,5 26,68 0,00 1,07 28,20 60 0,35 28,5 28,53 0,00 2,51 0,00 60 0,35 28,5 26,02 0,00 2,98 0,00 60 0,35 28,5 28,53 5,49 3,02 0,00 60 0,35 28,5 25,52 0,00 2,88 0,16 60 0,35 28,5 28,53 5,74 3,13 0,16 60 0,35 28,5 25,56 0,00 1,64 6,40 60 0,35 28,5 28,53 0,00 4,16 0,00 60 0,35 28,5 24,37 0,00 3,54 0,00 60 0,35 28,5 28,53 7,71 3,75 0,00 60 0,35 28,5 24,78 0,00 4,05 0,00 60 0,35 28,5 28,53 7,80 2,32 1,40 60 0,35 28,5 27,61 0,00 2,67 0,31 60 0,35 28,5 28,53 3,28 3,63 0,00 60 0,35 28,5 24,90 0,00 3,16 0,00 60 0,35 28,5 28,53 6,79 3,31 0,00 60 0,35 28,5 25,22 0,00 2,91 0,00 60 0,35 28,5 28,53 6,22 3,90 0,00 60 0,35 28,5 24,64 0,00 3,37 0,00 60 0,35 28,5 28,53 7,26 3,96 0,00 60 0,35 28,5 24,58 0,00 3,64 0,00 60 0,35 28,5 28,53 7,60 3,74 0,00 60 0,35 28,5 24,79 0,00 2,49 0,00 60 0,35 28,5 28,53 6,23 3,11 0,00 60 0,35 28,5 25,43 0,00 3,62 0,00 60 0,35 28,5 28,53 6,73 2,81 0,16 60 0,35 28,5 25,89 0,00 3,53 0,00 60 0,35 28,5 28,53 6,18 3,85 0,00 60 0,35 28,5 24,68 0,00 3,65 0,00 60 0,35 28,5 28,53 7,51 2,96 0,00 60 0,35 28,5 25,58 0,00 3,11 0,00 60 0,35 28,5 28,53 6,06 3,13 0,00 60 0,35 28,5 25,40 0,00 3,28 0,00 60 0,35 28,5 28,53 6,42 3,88 0,00 60 0,35 28,5 24,65 0,00 3,22 0,00 60 0,35 28,5 28,53 7,10 3,23 0,00 60 0,35 28,5 25,30 0,00 3,25 0,00 60 0,35 28,5 28,53 6,48 2,59 0,93 60 0,35 28,5 26,87 0,00 2,11 1,87 60 0,35 28,5 28,53 1,90 2,42 0,31 60 0,35 28,5 26,43 0,00 d.b. D.B. tiempoI tiempoC [mm] [m3/par] [horas] [hora] ----- -------- ------- ------7,93 79,3 0,9 6,6 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 8,37 83,7 0,9 7,0 0,00 0,0 0,0 0,0 8,74 87,4 1,0 7,3 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 0,00 0,0 0,0 0,0 11,74 117,4 1,3 9,8 0,00 0,0 0,0 0,0 11,88 118,8 1,3 9,9 0,00 0,0 0,0 0,0 4,99 49,9 0,6 4,2 0,00 0,0 0,0 0,0 10,34 103,5 1,2 8,6 0,00 0,0 0,0 0,0 9,48 94,8 1,1 7,9 0,00 0,0 0,0 0,0 11,06 110,7 1,2 9,2 0,00 0,0 0,0 0,0 11,57 115,7 1,3 9,6 0,00 0,0 0,0 0,0 9,50 95,0 1,1 7,9 0,00 0,0 0,0 0,0 10,24 102,5 1,2 8,5 0,00 0,0 0,0 0,0 9,41 94,1 1,1 7,8 0,00 0,0 0,0 0,0 11,44 114,4 1,3 9,5 0,00 0,0 0,0 0,0 9,24 92,4 1,0 7,7 0,00 0,0 0,0 0,0 9,78 97,8 1,1 8,1 0,00 0,0 0,0 0,0 10,81 108,2 1,2 9,0 0,00 0,0 0,0 0,0 9,88 98,8 1,1 8,2 0,00 0,0 0,0 0,0 2,89 28,9 0,3 2,4 0,00 0,0 0,0 0,0 148
  • 149. 7. Anejo 3 Fecha ---------07-08-1998 08-08-1998 09-08-1998 10-08-1998 11-08-1998 12-08-1998 13-08-1998 14-08-1998 15-08-1998 16-08-1998 17-08-1998 18-08-1998 19-08-1998 20-08-1998 21-08-1998 22-08-1998 23-08-1998 24-08-1998 25-08-1998 26-08-1998 27-08-1998 28-08-1998 29-08-1998 30-08-1998 31-08-1998 01-09-1998 02-09-1998 03-09-1998 04-09-1998 05-09-1998 06-09-1998 07-09-1998 08-09-1998 09-09-1998 10-09-1998 11-09-1998 12-09-1998 13-09-1998 14-09-1998 15-09-1998 16-09-1998 17-09-1998 ETo [mm] ----4,43 4,56 4,88 3,15 4,95 4,94 4,74 4,69 4,86 3,71 4,19 3,27 4,40 4,62 4,65 4,94 4,76 4,76 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 4,62 Kc Kl ---0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------2,97 0,78 60 0,35 28,5 28,53 4,30 6,55 65,5 0,7 5,5 3,06 0,00 60 0,35 28,5 25,48 0,00 0,00 0,0 0,0 0,0 3,28 0,00 60 0,35 28,5 28,53 6,34 9,65 96,5 1,1 8,0 2,12 18,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 3,32 0,16 60 0,35 28,5 28,53 3,16 4,82 48,2 0,5 4,0 3,32 0,00 60 0,35 28,5 25,22 0,00 0,00 0,0 0,0 0,0 3,18 0,00 60 0,35 28,5 28,53 6,50 9,90 99,0 1,1 8,3 3,15 0,00 60 0,35 28,5 25,39 0,00 0,00 0,0 0,0 0,0 3,26 0,00 60 0,35 28,5 28,53 6,41 9,77 97,7 1,1 8,1 2,49 0,16 60 0,35 28,5 26,20 0,00 0,00 0,0 0,0 0,0 2,81 0,00 60 0,35 28,5 28,53 5,14 7,83 78,3 0,9 6,5 2,19 0,00 60 0,35 28,5 26,34 0,00 0,00 0,0 0,0 0,0 2,96 0,00 60 0,35 28,5 28,53 5,15 7,85 78,5 0,9 6,5 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,12 0,00 60 0,35 28,5 28,53 6,22 9,48 94,8 1,1 7,9 3,32 0,00 60 0,35 28,5 25,22 0,00 0,00 0,0 0,0 0,0 3,20 0,00 60 0,35 28,5 28,53 6,52 9,93 99,3 1,1 8,3 3,20 0,00 60 0,35 28,5 25,34 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,30 9,60 96,0 1,1 8,0 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,9 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0 149
  • 150. 7. Anejo 3 Fecha ---------18-09-1998 19-09-1998 20-09-1998 21-09-1998 22-09-1998 23-09-1998 24-09-1998 25-09-1998 26-09-1998 27-09-1998 28-09-1998 29-09-1998 30-09-1998 01-10-1998 02-10-1998 03-10-1998 04-10-1998 05-10-1998 06-10-1998 07-10-1998 08-10-1998 09-10-1998 10-10-1998 11-10-1998 12-10-1998 13-10-1998 14-10-1998 15-10-1998 16-10-1998 17-10-1998 18-10-1998 19-10-1998 20-10-1998 21-10-1998 22-10-1998 23-10-1998 24-10-1998 25-10-1998 26-10-1998 27-10-1998 28-10-1998 29-10-1998 ETo [mm] ----2,59 3,32 3,10 3,23 3,15 3,07 1,91 0,56 3,15 3,10 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 1,07 2,59 2,59 2,59 2,59 2,59 2,59 2,59 2,59 2,59 2,43 1,64 1,61 0,34 1,67 Kc Kl ---0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 0,85 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------1,74 0,00 60 0,35 28,5 28,53 4,84 7,37 73,7 0,8 6,1 2,23 0,00 60 0,35 28,5 26,31 0,00 0,00 0,0 0,0 0,0 2,08 0,00 60 0,35 28,5 28,53 4,30 6,56 65,6 0,7 5,5 2,17 0,00 60 0,35 28,5 26,37 0,00 0,00 0,0 0,0 0,0 2,11 0,93 60 0,35 28,5 28,53 3,35 5,10 51,0 0,6 4,3 2,06 0,00 60 0,35 28,5 26,47 0,00 0,00 0,0 0,0 0,0 1,28 0,47 60 0,35 28,5 28,53 2,87 4,37 43,7 0,5 3,6 0,38 13,00 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 2,12 0,00 60 0,35 28,5 28,53 2,12 3,22 32,2 0,4 2,7 2,08 0,00 60 0,35 28,5 26,45 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 2,80 4,26 42,6 0,5 3,6 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,8 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,0 1,74 0,00 60 0,35 28,5 28,53 2,46 3,74 37,4 0,4 3,1 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,0 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,4 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,0 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,4 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,0 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,4 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,0 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,4 1,63 0,00 60 0,35 28,5 26,91 0,00 0,00 0,0 0,0 0,0 1,10 0,00 60 0,35 28,5 28,53 2,73 4,16 41,6 0,5 3,5 1,08 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,23 42,30 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 1,12 0,00 60 0,35 28,5 27,41 0,00 0,00 0,0 0,0 0,0 150
  • 151. 7. Anejo 3 Fecha ---------30-10-1998 31-10-1998 01-11-1998 02-11-1998 03-11-1998 04-11-1998 05-11-1998 06-11-1998 07-11-1998 08-11-1998 09-11-1998 10-11-1998 11-11-1998 12-11-1998 13-11-1998 14-11-1998 15-11-1998 16-11-1998 17-11-1998 18-11-1998 19-11-1998 20-11-1998 21-11-1998 22-11-1998 23-11-1998 24-11-1998 25-11-1998 26-11-1998 27-11-1998 28-11-1998 29-11-1998 30-11-1998 01-12-1998 02-12-1998 03-12-1998 04-12-1998 05-12-1998 06-12-1998 07-12-1998 08-12-1998 09-12-1998 10-12-1998 ETo [mm] ----1,69 1,76 1,57 0,92 0,25 1,35 0,87 2,31 1,97 2,36 2,36 1,98 1,85 1,86 0,77 1,25 1,20 1,19 1,06 0,51 1,99 1,77 0,37 2,02 1,62 1,02 0,76 0,72 1,25 0,71 2,15 4,04 1,17 2,15 1,58 0,81 1,81 1,18 0,72 0,88 0,89 0,72 Kc Kl ---0,85 0,85 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------1,13 0,00 60 0,35 28,5 28,53 2,25 3,43 34,3 0,4 2,9 1,18 0,00 60 0,35 28,5 27,36 0,00 0,00 0,0 0,0 0,0 0,99 0,00 60 0,35 28,5 28,53 2,17 3,31 33,1 0,4 2,8 0,58 2,34 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,16 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,85 0,16 60 0,35 28,5 27,84 0,00 0,00 0,0 0,0 0,0 0,55 0,00 60 0,35 28,5 28,53 1,24 1,89 18,9 0,2 1,6 1,46 0,47 60 0,35 28,5 27,55 0,00 0,00 0,0 0,0 0,0 1,25 0,00 60 0,35 28,5 28,53 2,23 3,40 34,0 0,4 2,8 1,49 0,00 60 0,35 28,5 27,04 0,00 0,00 0,0 0,0 0,0 1,49 0,00 60 0,35 28,5 28,53 2,98 4,54 45,4 0,5 3,8 1,25 0,00 60 0,35 28,5 27,29 0,00 0,00 0,0 0,0 0,0 1,17 0,93 60 0,35 28,5 28,53 1,48 2,26 22,6 0,3 1,9 1,18 0,00 60 0,35 28,5 27,36 0,00 0,00 0,0 0,0 0,0 0,49 0,00 60 0,35 28,5 28,53 1,66 2,54 25,4 0,3 2,1 0,79 0,00 60 0,35 28,5 27,74 0,00 0,00 0,0 0,0 0,0 0,76 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,8 0,75 0,00 60 0,35 28,5 27,78 0,00 0,00 0,0 0,0 0,0 0,67 0,00 60 0,35 28,5 28,53 1,42 2,17 21,7 0,2 1,8 0,32 0,16 60 0,35 28,5 28,37 0,00 0,00 0,0 0,0 0,0 1,26 0,00 60 0,35 28,5 28,53 1,42 2,16 21,6 0,2 1,8 1,12 0,00 60 0,35 28,5 27,41 0,00 0,00 0,0 0,0 0,0 0,23 3,90 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 1,28 0,16 60 0,35 28,5 27,42 0,00 0,00 0,0 0,0 0,0 1,02 0,00 60 0,35 28,5 28,53 2,14 3,26 32,6 0,4 2,7 0,64 0,00 60 0,35 28,5 27,89 0,00 0,00 0,0 0,0 0,0 0,48 6,24 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,45 13,60 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,79 0,78 60 0,35 28,5 28,53 1,00 1,52 0,2 1,7 1,3 0,45 0,16 60 0,35 28,5 28,24 0,00 0,00 0,0 0,0 0,0 1,36 0,31 60 0,35 28,5 28,53 1,34 2,04 20,4 0,2 1,7 2,55 0,62 60 0,35 28,5 26,60 0,00 0,00 0,0 0,0 0,0 0,74 0,00 60 0,35 28,5 28,53 2,67 4,07 40,7 0,5 3,4 1,36 0,00 60 0,35 28,5 27,18 0,00 0,00 0,0 0,0 0,0 1,00 0,00 60 0,35 28,5 28,53 2,36 3,59 35,9 0,4 3,0 0,51 7,80 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 1,14 12,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,74 0,00 60 0,35 28,5 27,79 0,00 0,00 0,0 0,0 0,0 0,45 0,00 60 0,35 28,5 28,53 1,20 1,82 18,2 0,2 1,5 0,56 0,00 60 0,35 28,5 27,98 0,00 0,00 0,0 0,0 0,0 0,56 0,00 60 0,35 28,5 28,53 1,12 1,70 17,0 0,2 1,4 0,46 0,00 60 0,35 28,5 28,08 0,00 0,00 0,0 0,0 0,0 151
  • 152. 7. Anejo 3 Fecha ---------11-12-1998 12-12-1998 13-12-1998 14-12-1998 15-12-1998 16-12-1998 17-12-1998 18-12-1998 19-12-1998 20-12-1998 21-12-1998 22-12-1998 23-12-1998 24-12-1998 25-12-1998 26-12-1998 27-12-1998 28-12-1998 29-12-1998 30-12-1998 31-12-1998 ETo [mm] ----0,58 0,63 1,22 0,61 1,15 0,20 5,10 0,17 0,45 1,41 0,99 0,69 2,41 0,65 0,89 1,12 2,31 1,49 0,70 0,38 0,52 Kc Kl ---0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 0,80 ---0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 0,79 ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora] ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- ------0,36 0,00 60 0,35 28,5 28,53 0,82 1,25 12,5 0,1 1,0 0,40 3,90 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,77 0,00 60 0,35 28,5 28,53 0,77 1,18 11,8 0,1 1,0 0,39 0,00 60 0,35 28,5 28,15 0,00 0,00 0,0 0,0 0,0 0,73 0,00 60 0,35 28,5 28,53 1,11 1,70 17,0 0,2 1,4 0,13 9,84 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 3,22 6,24 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,10 2,65 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,28 0,00 60 0,35 28,5 28,53 0,28 0,43 4,3 4,8 0,4 0,89 0,31 60 0,35 28,5 27,96 0,00 0,00 0,0 0,0 0,0 0,63 0,00 60 0,35 28,5 28,53 1,20 1,83 18,3 0,2 1,5 0,44 0,00 60 0,35 28,5 28,10 0,00 0,00 0,0 0,0 0,0 1,53 0,16 60 0,35 28,5 28,53 1,80 2,75 27,5 0,3 2,3 0,41 0,00 60 0,35 28,5 28,12 0,00 0,00 0,0 0,0 0,0 0,56 0,00 60 0,35 28,5 28,53 0,97 1,48 14,8 0,2 1,2 0,71 0,62 60 0,35 28,5 28,45 0,00 0,00 0,0 0,0 0,0 1,46 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,8 0,94 0,00 60 0,35 28,5 27,60 0,00 0,00 0,0 0,0 0,0 0,44 0,00 60 0,35 28,5 28,53 1,38 2,10 21,0 0,2 1,8 0,24 0,31 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 0,33 9,20 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0 Total ETc·Kl [mm]..................: Total P.E. [mm]....................: Número de Riegos...................: Total dosis neta [mm]..............: Total dosis bruta [mm].............: Total dosis bruta [m3/parcela].....: 671 384 162 594 905 9038 152
  • 153. 7. Anejo 3 ---------------------------------------------------------------------------------NOTAS: - Cuando el intervalo de riego está en blanco, no se tiene en cuenta. - ETo [mm] = Evapotranspiración de referencia. - Kc = Constante de cultivo. - Kl = Coeficiente de localización. Sólo en riego localizado. - ETcKl [mm]= Evapotranspiración de cultivo por coeficiente de localización - P.E. [cm]= Lluvia efectiva (véase método aplicado) - Raíces [cm] = Profundidad efectiva de las raíces - R.F.U. [mm] = Volumen de agua máximo de la Reserva Fácilmente Utilizable (RFU) - Reserva [mm] = Volumen de agua existente en la RFU al final del día - d.n. [mm] = Dosis neta de riego - d.b. [mm] = Dosis bruta de riego - D.B. [m3/parcela] = Dosis bruta de riego a aplicar en la parcela - tiempoI [horas] = Tiempo mínimo previsto de riego debido a la infiltración - tiempoC [horas] = Tiempo mínimo previsto de riego debido al Caudal - De las dos cifras anteriores, la mayor de ellas será el tiempo mínimo de riego ---------------------------------------------------------------------------------- 153
  • 154. 7. Anejo 3 7. ANEJO 3. PROGRAMA REALIZADO. Figura 21. Resultados. Listado de riegos a efectuar. RIEGOS A EFECTUAR 28/11/98 19:28:13 Programación........................................: Finca...............................................: Población...........................................: Provincia...........................................: Latitud [g,m,s].....................................: Longitud [g,m,s]....................................: Altitud [m].........................................: Superficie [m2].....................................: Cultivo.............................................: Fracción agua disponible en el suelo................: Clase textural......................................: Densidad aparente [g/cm3]...........................: Capacidad de Campo [% peso].........................: Punto de Marchitamiento [%peso].....................: Sistema Riego.......................................: Eficiencia en la aplicación [%].....................: Caudal instalación riego [m3/parcela]...............: Conductividad agua de riego [dS/m]..................: Eficiencia en el lavado de sales [%]................: Rendimiento mínimo deseado debido a salinidad [%]...: Fecha Plantación/Inicio.............................: Momento de Riego. Agotamiento de la RFU [%].........: Intervalo de riego [días]...........................: Dosis de riego. Recarga de la RFU [%]...............: Nivel de agua de la RFU al inicio [%]...............: Fecha ---------01-04-1998 25-04-1998 04-05-1998 08-05-1998 12-05-1998 16-05-1998 20-05-1998 24-05-1998 d.n. [mm] ----5,67 5,52 6,60 6,62 7,80 8,93 10,10 11,27 d.b. D.B. tiempoI tiempoF [mm] [m3/par] [horas] [hora] ----- -------- ------- ------17,80 178,1 1,2 1,8 17,34 173,5 1,2 1,7 20,72 207,3 1,4 2,1 20,81 208,1 1,4 2,1 24,50 245,1 1,6 2,5 28,06 280,6 1,9 2,8 31,75 317,5 2,1 3,2 35,45 354,5 2,4 3,5 MAIZ (LLEIDA,MENSUAL) El maizal Lleida Lleida 41º 37' 49'' Nº 0º 35' 50'' Eº 190 10000 MAIZ (GRANO) 0,4 FRANCO 1,51 19 10 ASPERSION (CLIMA SECO) 67 100 3 70 100 01-04-1998 100 100 0 Notas --------------------------Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. 154
  • 155. 7. Anejo 3 Fecha ---------27-05-1998 30-05-1998 02-06-1998 05-06-1998 08-06-1998 11-06-1998 14-06-1998 17-06-1998 20-06-1998 23-06-1998 26-06-1998 29-06-1998 01-07-1998 03-07-1998 05-07-1998 07-07-1998 09-07-1998 11-07-1998 13-07-1998 15-07-1998 17-07-1998 19-07-1998 21-07-1998 23-07-1998 25-07-1998 27-07-1998 29-07-1998 31-07-1998 03-08-1998 07-08-1998 12-08-1998 18-08-1998 27-08-1998 d.n. [mm] ----8,81 10,02 11,74 12,97 13,32 14,46 13,92 13,92 13,92 13,92 13,92 13,92 11,17 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,05 13,81 15,52 19,37 22,10 23,41 28,74 d.b. D.B. tiempoI tiempoF [mm] [m3/par] [horas] [hora] ----- -------- ------- ------27,68 276,8 1,8 2,8 31,49 315,0 2,1 3,1 36,91 369,1 2,5 3,7 40,77 407,7 2,7 4,1 41,87 418,8 2,8 4,2 45,46 454,7 3,0 4,5 43,75 437,6 2,9 4,4 43,75 437,6 2,9 4,4 43,75 437,6 2,9 4,4 43,75 437,6 2,9 4,4 43,75 437,6 2,9 4,4 43,75 437,6 2,9 4,4 35,10 351,1 2,3 3,5 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 41,03 410,4 2,7 4,1 43,40 434,0 2,9 4,3 48,79 487,9 3,3 4,9 60,90 609,1 4,1 6,1 69,46 694,7 4,6 6,9 73,57 735,8 4,9 7,4 90,35 903,5 6,0 9,0 Número de Riegos...................: Total dosis neta [mm]..............: Total dosis bruta [mm].............: Total dosis bruta [m3/parcela].....: Notas --------------------------Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. Se aplica lavado de sales. 41 534 1679 16793 ---------------------------------------------------------------------------------- 155
  • 156. 7. Anejo 3 NOTAS: - Cuando el intervalo de riego está en blanco, no se tiene en cuenta. - d.n. [mm] = Dosis neta de riego - d.b. [mm] = Dosis bruta de riego - D.B. [m3/parcela] = Dosis bruta de riego a aplicar en la parcela - tiempoI [horas] = Tiempo mínimo previsto de riego debido a la infiltración - tiempoC [horas] = Tiempo mínimo previsto de riego debido al Caudal - De las dos cifras anteriores, la mayor de ellas será el tiempo mínimo de riego ---------------------------------------------------------------------------------- 156
  • 157. 7. Anejo 4 7. ANEJO 4. 1. CÁLCULO DEL Kc INICIAL Para calcular el Kc inicial en los cultivos extensivos y de huerta se dispone de 5 curvas que relacionan la ETo y la frecuencia re riegos (o lluvias) con el KC. Se ha extraído los valores de Kc a partir de datos de ETo de 0,5 en 0,5 mm para las cinco curva. En la tabla 1, se puede ver los valores de Kc. Tabla 1. Valores de Kc para distintas frecuencias de riegos/lluvias y ETo. Frecuencia de riegos ó lluvias (4 días) (7 días) (10 días) ETo [mm] (2 días) 0,50 1,08 0,98 0,81 0,65 (20 días) 0,49 1,00 1,05 0,95 0,76 0,61 0,44 1,50 1,03 0,91 0,71 0,56 0,41 2,00 1,00 0,86 0,66 0,51 0,37 2,50 0,97 0,83 0,62 0,46 0,34 3,00 0,95 0,79 0,57 0,43 0,31 3,50 0,93 0,76 0,54 0,40 0,27 4,00 0,91 0,72 0,51 0,36 0,26 4,50 0,90 0,70 0,48 0,34 0,24 5,00 0,88 0,66 0,46 0,32 0,23 5,50 0,86 0,63 0,43 0,30 0,21 6,00 0,84 0,61 0,42 0,28 0,20 6,50 0,83 0,58 0,40 0,26 0,18 7,00 0,82 0,57 0,38 0,25 0,18 7,50 0,81 0,56 0,37 0,24 0,17 8,00 0,80 0,54 0,36 0,23 0,16 8,50 0,79 0,53 0,34 0,22 0,16 9,00 0,78 0,52 0,34 0,22 0,16 9,50 0,77 0,51 0,33 0,21 0,15 10,00 0,77 0,50 0,32 0,20 0,15 157
  • 158. 7. Anejo 4 Se ha calculado las regresiones polinomiales en grado 2 de las cinco frecuencias de riego o de lluvia y se ha obtenidos las siguientes regresiones: Kc(2) = (0,0025*ETo*ETo ) - (0,0588*ETo) + 1,1068 R2 = 0,9988 Kc(4) = (0,0043*ETo*ETo ) - (0,097*ETo) + 1,0403 R2 = 0,9989 Kc(7) = (0,0053*ETo*ETo ) - (0,1049*ETo) + 0,8502 R2 = 0,9985 Kc(10)= (0,0053*ETo*ETo ) - (0,1009*ETo) + 0,6915 R2 = 0,9972 Kc(20)= (0,0046*ETo*ETo ) - (0,0824*ETo) + 0,52 R2 = 0,9958 Kc es la constante de cultivo en la fase inicial para cultivos A (FAO 24). ETo es la evapotranspiración de referencia [mm]. R2 valor R cuadrado. Para calcular el Kc entre 2 y 20 días de riego se realizará la siguiente operación: ¿La frecuencia de riego corresponde a una de las 5 curvas? -SI: Utilizamos la tabla. -NO: Se seleccionará las dos ecuaciones que la abarcan (por ejemplo, para 6 días de frecuencia de riego se cogerá las ecuaciones Kc(4) y Kc(7). A continuación, se calcula los Kc correspondientes para la Eto que se dispone. Posteriormente se realiza una interpolación lineal entre los dos valores con la siguiente fórmula:  Kc = Kc MAYOR +  (DiasRiego − DiasKc MENOR    )  Kc MAYOR − Kc MENOR  DiasKc MAYOR − DiasKc MENOR      siendo: Kc : Kc que se busca. KcMAYOR : Kc de la frecuencia de riego superior. KcMENOR : Kc de la frecuencia de riego inferior. DiasKcMAYOR : días de la frecuencia de riego superior. DiasKcMENOR : días de la frecuencia de riego inferior. DiasRiego : días de riego. 158
  • 159. 7. Anejo 4 A continuación, se pone un ejemplo para clarificar el cálculo. Ejemplo: Frecuencia de riego = 6 días Eto = 5 mm/día Hallar Kc [0,67 - 0,46] Kc = 0,46 + [ [6 - 4] * [-------------] ] = 0,60 [7 - 4] 159
  • 160. 7. Anejo 4 2. DETERMINACIÓN INDIRECTA DE LA CAPACIDAD DE CAMPO DEL PUNTO DE MARCHITAMIENTO. Yagüe (1996), cita dos fórmulas que relacionan el porcentaje de humedad gravimétrica de las texturas con el contenido de humedad en la capacidad de campo y el punto de marchitamiento. Aconseja su utilización cuando no se disponga de análisis. La fórmula de la capacidad de campo (CC) la denomina fórmula de Peele y a la fórmula de capacidad de campo la denomina fórmula de Briggs. Las fórmulas son las siguientes: CC=0,48Ac + 0,162Li + 0,023 Ar + 2,62 PM = 0,302Ac + 0,102Li + 0,0147 Ar Siendo: CC : Humedad gravimétrica en la capacidad de campo [%]. PM : Humedad gravimétrica en el punto de marchitamiento [%]. Ac : Contenido en arcilla expresado como humedad gravimétrica [%]. Li : Contenido en limo expresado como humedad gravimétrica [%]. Ac : Contenido en arena expresado como humedad gravimétrica [%]. 160
  • 161. 7. Anejo 4 3. TRIÁNGULO DE TEXTURA DE LA U.S.D.A. Figura 1. Triángulo de texturas y clases texturales. 161
  • 162. 7. Anejo 5 7. ANEJO 5. LISTADO DEL PROGRAMA. RIEGOS.VBP ' Víctor Yusta. Dicembre-1998 Type=Exe Reference=DAO350 ' para gobernar Access Object=TABCTL32.OCX Object=THREED32.OCX Object=DBLIST32.OCX Form=Riegos.frm Module=Riegos1; Riegos1.bas Module=Riegos2; Riegos2.bas Form=Riegos12.frm Form=Riegos21.frm Form=Riegos25.frm Form=Riegos22.frm Form=Riegos23.frm Form=Riegos31.frm Form=Riegos27.frm Form=Riegos26.frm Form=Riegos24.frm Object=DBGRID32.OCX Form=Riegos00.frm Form=Riegos11.frm IconForm="Riegos" Startup="Riegos" HelpFile="" Title="RIEGOS" ExeName32="Riegos.exe" Command32="" Name="Riego" HelpContextID="0" CompatibleMode="0" MajorVer=1 MinorVer=0 RevisionVer=0 AutoIncrementVer=0 ServerSupportFiles=0 CompilationType=0 OptimizationType=0 FavorPentiumPro(tm)=0 CodeViewDebugInfo=0 NoAliasing=0 BoundsCheck=0 OverflowCheck=0 FlPointCheck=0 FDIVCheck=0 UnroundedFP=0 StartMode=0 Unattended=0 ThreadPerObject=0 MaxNumberOfThreads=1 162
  • 163. 7. Anejo 5 RIEGOS1.BAS ' Víctor Yusta. Dicembre-1998 Attribute VB_Name = "Riegos1" Option Explicit Global gsDatabase As String Global gsConnect As String Global gsRecordsource As String Global NombreProgramacion As String * 50 Public MenuInicial As String Public ValorControl As Control Public ValorTabla As String Public BaseDeDatos As Database Public fMenu As Recordset Public fProgramacion As Recordset Public fProgramacionClima As Recordset Public fCultivos As Recordset Public fCultivosKc As Recordset Public fCultivosRaices As Recordset Public fCultivosSal As Recordset Public fCultivosFraccion As Recordset Public fCultivosDias As Recordset Public fBalanceHidrico As Recordset Public fTexturas As Recordset Public Const NBaseDeDatos As String = "C:RiegosRiegos.mdb" Public Const NProgramacion As String = "Programacion" Public Const NProgramacionClima As String = "ProgramacionClima" Public Const NMenu As String = "Menu" Public Const NCultivosKc As String = "CultivosKc" Public Const NCultivosRaices As String = "CultivosRaices" Public Const NCultivosSal As String = "CultivosSal" Public Const NCultivosFraccion As String = "CultivosFraccion" Public Const NCultivosDias As String = "CultivosDias" Public Const NCultivosNombre As String = "CultivosNombre" Public Const NBalanceHidrico As String = "BalanceHidrico" Public Const NTexturas As String = "Texturas" Public Sub BaseDatos() Set BaseDeDatos = OpenDatabase(NBaseDeDatos) Set fMenu = BaseDeDatos.OpenRecordset(NMenu, dbOpenTable) Set fProgramacion = BaseDeDatos.OpenRecordset(NProgramacion, dbOpenTable) Set fProgramacionClima = BaseDeDatos.OpenRecordset(NProgramacionClima, dbOpenTable) Set fCultivosKc = BaseDeDatos.OpenRecordset(NCultivosKc, dbOpenTable) Set fCultivosRaices = BaseDeDatos.OpenRecordset(NCultivosRaices, dbOpenTable) Set fCultivosSal = BaseDeDatos.OpenRecordset(NCultivosSal, dbOpenTable) Set fCultivosFraccion = BaseDeDatos.OpenRecordset(NCultivosFraccion, dbOpenTable) Set fCultivosDias = BaseDeDatos.OpenRecordset(NCultivosDias, dbOpenTable) Set fBalanceHidrico = BaseDeDatos.OpenRecordset(NBalanceHidrico, dbOpenTable) Set fTexturas = BaseDeDatos.OpenRecordset(NTexturas, dbOpenTable) End Sub Public Function LeerFichero(nTabla As String, nIndice As String, nBusca As String, nCampo As String) As String ' Esta funcion lee ficheros de una base de datos indexada ' Pide: Nombre de la tabla, Nombre del indice,Valor buscado y Nombre del campo del cual devolverá su valor Dim BaseTablas As Database Dim Tabla As Recordset Set BaseTablas = OpenDatabase(NBaseDeDatos) Set Tabla = BaseTablas.OpenRecordset(nTabla, dbOpenTable) Tabla.Index = nIndice Tabla.MoveFirst Tabla.Seek "=", nBusca If Tabla.NoMatch = False Then 'Registro encontrado LeerFichero = IIf(IsNull(Tabla(nCampo)), "", Tabla(nCampo)) 'LeerFichero = Tabla(nCampo) Else LeerFichero = "?" End If End Function Public Function NoNulo(Dato) ' Sustituye el dato Null por Cadena Vacia NoNulo = IIf(IsNull(Dato), "", Dato) End Function Public Function LeerMSJ(Valor As String) ' Lee mensajes en la tabla (TablaMensajes) If Idioma = "CS" Then LeerMSJ = LeerFichero("TablaMensajes", "Orden", Valor, "TextoMensaje") 163
  • 164. 7. Anejo 5 Else LeerMSJ = LeerFichero("TablaMensajes", "Orden", Valor, "TexteMissatge") End If End Function Public Function CargaPantalla(NombreForm As Form) NombreForm.Top = 0 NombreForm.Left = 0 NombreForm.Height = 8600 NombreForm.Width = 12000 End Function Public Function Numeros(tp As Integer) As Integer If (tp < 48 Or tp > 57) And tp <> 8 Then Numeros = 0 Else Numeros = tp End If End Function Public Function Numerico(Valor As String) As Integer Numerico = Val(Trim(Valor)) End Function Public Sub DibujaMensaje(NomForm) NomForm.Mensaje.Height = 330 NomForm.Mensaje.Left = 105 NomForm.Mensaje.Top = 7980 NomForm.Mensaje.Width = 11775 End Sub Public Sub DibujaPanelComandos(NomForm) NomForm.PanelComandos.Height = 960 NomForm.PanelComandos.Left = 0 NomForm.PanelComandos.Top = 0 NomForm.PanelComandos.Width = 11985 End Sub Public Function CursorOcupado(NombreForm As Form) NombreForm.MousePointer = 11 End Function Public Function CursorLibre(NombreForm As Form) NombreForm.MousePointer = 0 End Function Function CarNum(Variable As String) As Double ' entrada "4,21323" y sale 4.21323 Dim Frase Frase = "" Dim num For num = 1 To Len(Trim(Variable)) Dim a a = Mid$(Variable, num, 1) If a = "," Then a = "." Frase = Frase + a Next num CarNum = Val(Frase) End Function Function NumCar(Variable As Double) As String Dim Inter Inter = Trim(Str(Variable)) If (Variable > 0 And Variable < 1) Then Inter = "0" + Trim(Str(Variable)) End If If (Variable > -1 And Variable < 0) Then Variable = Variable * -1 Inter = "-0" + Trim(Str(Variable)) End If Dim Frase Frase = "" Dim num For num = 1 To Len(Trim(Inter)) Dim a a = Mid$(Inter, num, 1) If a = "." Then a = "," Frase = Frase + a Next num NumCar = Frase End Function 164
  • 165. 7. Anejo 5 RIEGOS2.BAS ' Víctor Yusta. Dicembre-1998 Attribute VB_Name = "Riegos2" Option Explicit Public Const Pi As Double = 3.14159265358979 Public Function CalculaNumeroDias(DesdeFecha As Date, HastaFecha As Date) As Double ''DiaAno = DateDiff("d", Fecha1, Fecha2) + 1 CalculaNumeroDias = DateSerial(Year(HastaFecha), Month(HastaFecha), Day(HastaFecha)) DateSerial(Year(DesdeFecha), Month(DesdeFecha), Day(DesdeFecha)) '+ 1 End Function Public Function GraRad() As Double GraRad = Pi / 180 End Function Public Function RadGra() As Double RadGra = 180 / Pi End Function Public Function Seno(Valor As Double) As Double Seno = Sin(Valor * GraRad()) End Function Public Function Coseno(Valor As Double) As Double Coseno = Cos(Valor * GraRad()) End Function Public Function Tangente(Valor As Double) As Double Tangente = Tan(Valor * GraRad()) End Function Public Function ArcoSeno(Valor As Double) As Double If (-Valor * Valor + 1) = 0 Then ArcoSeno = Int(Atn(1E+99) * RadGra()) Else ArcoSeno = Atn(Valor / Sqr(-Valor * Valor + 1)) * RadGra() End If End Function Public Function ArcoCoseno(Valor As Double) As Double If (-Valor * Valor + 1) = 0 Then ArcoCoseno = 0 Else ArcoCoseno = Atn(-Valor / Sqr(-Valor * Valor + 1)) * RadGra() + 2 * Atn(1) * RadGra() End If If Valor = 0 Then ArcoCoseno = 90 End If End Function Public Function ArcoCosenoRad(Valor As Double) As Double If Valor = 1 Then ArcoCosenoRad = 0 Else ArcoCosenoRad = Atn(-Valor / Sqr(-Valor * Valor + 1)) + 2 * Atn(1) End If End Function Public Function ArcCosRad(Valor As Double) As Double ArcCosRad = Atn(-Valor / Sqr(-Valor * Valor + 1)) + 2 * Atn(1) End Function Public Function SexCen(Valor As String) As Double SexCen = Val(Mid(Valor, 1, 2)) + (Val(Mid(Valor, 4, 2)) / 60) End Function Public Function CenSex(Valor As Double) As String CenSex = Str(Int(Valor)) & "º" + Str((Valor - Int(Valor)) * 60) & "'" End Function Public Function LOG10(Valor As Double) As Double LOG10 = Log(Valor) / Log(10#) End Function 165
  • 166. 7. Anejo 5 RIEGOS.FRM ' Víctor Yusta. Dicembre-1998 Option Explicit Private Sub Form_Load() Call CargaPantalla(Me) BaseDatos Call CargaMenu Show DoEvents End Sub Private Sub Form_Terminate() SalirProyecto End Sub Private Sub Form_Unload(Cancel As Integer) Cancel = SalirProyecto End Sub Function SalirProyecto() Dim Pregunta Pregunta = MsgBox("¿ Quieres salir del programa? ", vbYesNo, "Salida") If Pregunta = vbYes Then Cls End End If SalirProyecto = 1 End Function Private Function CargaMenu() Dim MenuCaption(9) Dim FormaCaption(99) Dim Num1 Dim Num2 fMenu.MoveFirst Do While Not fMenu.EOF() If fMenu("Numero") < 10 Then MenuCaption(fMenu("Numero")) = fMenu("Menu") Else FormaCaption(fMenu("Numero")) = fMenu("Menu") End If fMenu.MoveNext Loop For Num1 = 1 To 9 If Trim(MenuCaption(Num1)) = "" Then Me.Menu(Num1).Visible = False Else Me.Menu(Num1).Caption = MenuCaption(Num1) For Num2 = 1 To 9 If Trim(FormaCaption((Num1 * 10) + Num2)) = "" Then Me.Forma((Num1 * 10) + Num2).Visible = False Else Me.Forma((Num1 * 10) + Num2).Caption = FormaCaption((Num1 * 10) + Num2) + " " + NombreProgramacion If LeerFichero("Menu", "Orden", ((Num1 * 10) + Num2), "Existe") <> "SI" Then Me.Forma((Num1 * 10) + Num2).Enabled = False If ((Num1 * 10) + Num2) > 20 And ((Num1 * 10) + Num2) < 39 Then Me.Forma((Num1 * 10) + Num2).Enabled = False End If End If Next Num2 End If Next Num1 End Function Private Sub Forma_Click(Index As Integer) fMenu.Index = "Orden" fMenu.MoveFirst fMenu.Seek "=", Index If fMenu.NoMatch = True Then 'Registro NO encontrado MsgBox ("Este programa no existe") Else If NoNulo(fMenu("Existe")) <> "SI" Then MsgBox ("Este programa no existe") Else CargarPrograma (Index) Index = 0 End If End If 166
  • 167. 7. Anejo 5 End Sub Private Sub CargarPrograma(Numero) On Error Resume Next If Numero = 11 Then Load Riegos11 If Numero = 12 Then Load Riegos12 If Numero = 19 Then SalirProyecto If Numero = 21 Then Load Riegos21 If Numero = 22 Then Load Riegos22 If Numero = 23 Then Load Riegos23 If Numero = 24 Then Load Riegos24 If Numero = 25 Then Load Riegos25 If Numero = 26 Then Load Riegos26 If Numero = 27 Then Load Riegos27 If Numero = 31 Then Load Riegos31 End Sub 167
  • 168. 7. Anejo 5 RIEGOS00.FRM ' Víctor Yusta. Dicembre-1998 VERSION 5.00 Object = "DBGRID32.OCX" Option Explicit Dim msSortCol As String Dim mbCtrlKey As Integer Private Sub Form_Load() Dim bParmQry As Integer Dim qdfTmp As QueryDef On Error GoTo LoadErr 'Para hacer 'gsDatabase es una cadena global que necesita 'establecerse en el procedimiento startup de la aplicación Data1.DatabaseName = gsDatabase 'gsRecordSource es una cadena global que necesita 'en el procedimiento que carga este formulario Data1.RecordSource = gsRecordsource Data1.Connect = gsConnect Data1.RecordsetType = 1 'dynaset Data1.Options = 0 Data1.Refresh If Len(Data1.RecordSource) > 50 Then Me.Caption = "SQL Statement" Else Me.Caption = Data1.RecordSource End If Exit Sub LoadErr: MsgBox "Error:" & Err & " " & Err.Description Unload Me End Sub Sub cmdClose_Click() Unload Me End Sub Private Sub cmdFilter_Click() On Error GoTo FilterErr Dim recRecordset1 As Recordset, recRecordset2 As Recordset Dim sFilterStr As String If Data1.RecordsetType = vbRSTypeTable Then Beep MsgBox "Imposible filtrar un recordset de tipo Table", 48 Exit Sub End If Set recRecordset1 = Data1.Recordset 'Copia el conjunto de resultados sFilterStr = InputBox("Escriba la expresión de filtro:") If Len(sFilterStr) = 0 Then Exit Sub Screen.MousePointer = vbHourglass recRecordset1.Filter = sFilterStr Set recRecordset2 = recRecordset1.OpenRecordset(recRecordset1.Type) 'Establece el filtro Set Data1.Recordset = recRecordset2 'Asigna de nuevo al objeto Recordset original Screen.MousePointer = vbDefault Exit Sub FilterErr: Screen.MousePointer = vbDefault MsgBox "Error:" & Err & " " & Err.Description Exit Sub End Sub Private Sub cmdRefresh_Click() On Error GoTo RefErr Data1.Recordset.Requery Exit Sub RefErr: MsgBox "Error:" & Err & " " & Err.Description Exit Sub End Sub Private Sub cmdSort_Click() On Error GoTo SortErr Dim recRecordset1 As Recordset, recRecordset2 As Recordset Dim SortStr As String If Data1.RecordsetType = vbRSTypeTable Then Beep MsgBox "Imposible ordenar un recordset de tipo Table", 48 168
  • 169. 7. Anejo 5 Exit Sub End If Set recRecordset1 = Data1.Recordset 'Copia el recordset If Len(msSortCol) = 0 Then SortStr = InputBox("Escriba la cadena de orden:") If Len(SortStr) = 0 Then Exit Sub Else SortStr = msSortCol End If Screen.MousePointer = vbHourglass recRecordset1.Sort = SortStr 'Establece el orden Set recRecordset2 = recRecordset1.OpenRecordset(recRecordset1.Type) Set Data1.Recordset = recRecordset2 Screen.MousePointer = vbDefault Exit Sub SortErr: Screen.MousePointer = vbDefault MsgBox "Error:" & Err & " " & Err.Description Exit Sub End Sub Private Sub Form_Resize() On Error Resume Next If Me.WindowState <> 1 Then grdDataGrid.Height = Me.Height - (425 + picButtons.Height) End If End Sub Private Sub grdDataGrid_BeforeDelete(Cancel As Integer) If MsgBox("¿Desea eliminar la fila actual?", vbYesNo + vbQuestion) <> vbYes Then Cancel = True End If End Sub Private Sub grdDataGrid_BeforeUpdate(Cancel As Integer) If MsgBox("¿Desea realizar los cambios?", vbYesNo + vbQuestion) <> vbYes Then Cancel = True End If End Sub Private Sub grdDataGrid_HeadClick(ByVal ColIndex As Integer) 'Ahora se ordena por esta columna If Data1.RecordsetType = vbRSTypeTable Then Exit Sub 'Comprueba el uso de la tecla Ctrl para sentido descendente If mbCtrlKey Then msSortCol = "[" & Data1.Recordset(ColIndex).Name & "] desc" mbCtrlKey = 0 'reset it Else msSortCol = "[" & Data1.Recordset(ColIndex).Name & "]" End If cmdSort_Click msSortCol = vbNullString 'Lo restablece End Sub Private Sub grdDataGrid_MouseUp(Button As Integer, Shift As Integer, x As Single, Y As Single) mbCtrlKey = Shift End Sub 169
  • 170. 7. Anejo 5 RIEGOS11.FRM ' Víctor Yusta. Dicembre-1998 Object ="TABCTL32.OCX" Object ="THREED32.OCX" Object ="DBLIST32.OCX" Option Explicit Dim num Private Sub Form_Load() 'Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 11, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Tabla.Tab = 0 Posiciona (0) Mensaje.Caption = "Escoge una de las tres opciones" End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 SalirForm Case 2 AnalizaTabla Case 4 Dim Pregunta Pregunta = MsgBox("¿Quieres borrar la programación: " + RTrim(NombreProgramacion), 1, "BORRANDO PROGRAMACIÓN") If Pregunta = vbOK Then BorrarProgramacion (NombreProgramacion) End If Comando(2).Visible = False Comando(4).Visible = False End Select End Sub Function BorrarProgramacion(vNombre As String) BaseDeDatos.Execute "DELETE * FROM BalanceHidrico WHERE NombreProgramacion = '" & vNombre & "' ;" BaseDeDatos.Execute "DELETE * FROM ProgramacionClima WHERE NombreProgramacion = '" & vNombre & "' ;" BaseDeDatos.Execute "DELETE * FROM Programacion WHERE NombreProgramacion = '" & vNombre & "' ;" Call MostrarInformacion Data1.Refresh DBList1.Refresh DBList1.SetFocus End Function Private Sub AnalizaTabla() Select Case Tabla.Tab Case 0 If Trim(UCase(Entrada(0).Text)) = "" Then Posiciona (0) MsgBox ("Has de entrar algún nombre de diseño agronómico") Else If Trim(LeerFichero("Programacion", "Programacion", Trim(UCase(Entrada(0).Text)), "NombreProgramacion")) = UCase(Entrada(0).Text) Then Posiciona (0) MsgBox ("Este diseño ya existe") Else NombreProgramacion = UCase(Entrada(0).Text) fProgramacion.AddNew fProgramacion("NombreProgramacion") = NombreProgramacion fProgramacion.Update Riegos.Caption = "Programación de riegos" + " " + NombreProgramacion For num = 21 To 29 Riegos.Forma(num).Enabled = True Next num Riegos.Forma(31).Enabled = True Riegos.Forma(32).Enabled = True SalirForm End If End If Case 1 NombreProgramacion = DBList1.Text Riegos.Caption = "Programación de riegos" + " " + NombreProgramacion For num = 21 To 29 170
  • 171. 7. Anejo 5 Riegos.Forma(num).Enabled = True Next num Riegos.Forma(31).Enabled = True Riegos.Forma(32).Enabled = True SalirForm End Select End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 0 If Len(Trim(Entrada(Index))) > 0 Then Comando(2).Visible = True End If Case 1 If Len(Trim(Entrada(Index))) > 0 Then Comando(2).Visible = True End If Case 2 Print "Aqui ponemos la rutina de guardar como" End Select End Sub Private Sub SalirForm() Unload Me Load Riegos End Sub Private Sub DBList1_Click() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", DBList1.Text NombreProgramacion = DBList1.Text Mensaje.Caption = "Cliquea en las opciones de arriba" If fProgramacion.NoMatch = False Then 'Registro encontrado Muestra1.Caption = NoNulo(fProgramacion("Descripcion")) Muestra2.Caption = NoNulo(fProgramacion("NombreFinca")) Muestra3.Caption = NoNulo(fProgramacion("Poblacion")) Muestra4.Caption = NoNulo(fProgramacion("Provincia")) Muestra5.Caption = NoNulo(fProgramacion("Clima")) Muestra6.Caption = NoNulo(fProgramacion("SuperficieFinca")) End If If RTrim(NombreProgramacion) <> "." Then Comando(2).Visible = True Comando(4).Visible = True End If End Sub Private Sub DBList1_DblClick() NombreProgramacion = DBList1.Text Riegos.Caption = Riegos.Caption Dim num For num = 21 To 29 Riegos.Forma(num).Enabled = True Next num Riegos.Forma(31).Enabled = True Riegos.Forma(32).Enabled = True Riegos.Caption = "Programación de riegos" + " " + NombreProgramacion SalirForm End Sub Private Sub Tabla_Click(PreviousTab As Integer) If Tabla.Tab = 0 Then Comando(2).Visible = False Comando(4).Visible = False Mensaje.Caption = "Entra un nombre nuevo" End If Posiciona (0) If Tabla.Tab = 1 Then Call MostrarInformacion Mensaje.Caption = "Escoge algún diseño, cliqueando con el ratón" DBList1.SetFocus End If 'If Tabla.Tab = 2 Then Entrada(1).SetFocus End Sub Private Sub MostrarInformacion() Dim Busca Busca = "" 171
  • 172. 7. Anejo 5 Busca = Busca + "SELECT * " Busca = Busca + "FROM Programacion " Busca = Busca + "WHERE " Busca = Busca + "NombreProgramacion <> '.' " Busca = Busca + "ORDER BY " Busca = Busca + "NombreProgramacion ;" Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset(Busca) If Consulta.RecordCount <> 0 Then Data1.DatabaseName = "C:RiegosRiegos.mdb" 'NombreBaseDeDatos Data1.RecordsetType = 1 Data1.RecordSource = Busca Data1.Refresh Else MsgBox ("No hay información") SalirForm End If End Sub Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 172
  • 173. 7. Anejo 5 RIEGOS12.FRM ' Víctor Yusta. Dicembre-1998 Object = "THREED32.OCX" Option Explicit Dim num Dim Tablas(20) As String Private Sub Form_Load() Tablas(0) = "CultivosNombre" Tablas(1) = "CultivosKc" Tablas(2) = "CultivosDias" Tablas(3) = "CultivosRaices" Tablas(4) = "CultivosFraccion" Tablas(5) = "Sal" Tablas(6) = "Meteorologia" Tablas(7) = "Texturas" Tablas(8) = "SistemasRiego" BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 12, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Frame1.Visible = True Show Mensaje.Caption = "Pulsa sobre cualquier tabla" End Sub Private Sub Ficheros_Click(Index As Integer) Dim NombreTabla: NombreTabla = Tablas(Index) ' Select Case Index ' Case 0 ' NombreTabla = "CultivosNombre" ' Case 1 ' NombreTabla = "CultivosSal" ' Case 2 ' NombreTabla = "CultivosSal" ' Case 3 ' NombreTabla = "CultivosSal" ' Case 4 ' NombreTabla = "CultivosSal" ' Case 5 ' NombreTabla = "CultivosSal" ' Case 6 ' NombreTabla = "CultivosSal" ' Case 7 ' NombreTabla = "CultivosSal" ' End Select Dim Busca: Busca = "" Dim Consulta As Recordset Busca = Busca + "SELECT * " Busca = Busca + "FROM " & NombreTabla & " " Busca = Busca + " ;" Set Consulta = BaseDeDatos.OpenRecordset(Busca) If Consulta.RecordCount <> 0 Then Data2.DatabaseName = "C:RiegosRiegos.mdb" 'NombreBaseDeDatos Data2.RecordsetType = 1 Data2.RecordSource = Busca Data2.Refresh Dim F As New Riegos00 Set F.Data1.Recordset = Data2.Recordset F.Caption = Me.Caption & " Grid" F.Show End If End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 SalirForm End Select End Sub Private Sub SalirForm() Unload Me Load Riegos End Sub Private Sub MostrarInformacion() Dim Busca 173
  • 174. 7. Anejo 5 Busca = "" Busca = Busca + "SELECT * " Busca = Busca + "FROM Programacion " Busca = Busca + "WHERE " Busca = Busca + "NombreProgramacion <> '.' " Busca = Busca + "ORDER BY " Busca = Busca + "NombreProgramacion ;" Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset(Busca) If Consulta.RecordCount <> 0 Then Data1.DatabaseName = "C:RiegosRiegos.mdb" 'NombreBaseDeDatos Data1.RecordsetType = 1 Data1.RecordSource = Busca Data1.Refresh Else MsgBox ("No hay información") SalirForm End If End Sub 174
  • 175. 7. Anejo 5 RIEGOS21.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Option Explicit Dim Atras Dim Mensajes(20) As String Dim Alertas(20) As String Dim Campos(20) As String Dim ExisteFichero As String Private Sub Form_Load() Campos(0) = "A030" Mensajes(1) = "Entra una pequeña descripción de la finca" Mensajes(2) = "Entra el nombre de la finca" Mensajes(3) = "Entra el nombre de la población" Mensajes(4) = "Entra el nombre de la provincia" Mensajes(5) = "Entra los grados de latitud del lugar" Mensajes(6) = "Entra los minutos de latitud del lugar" Mensajes(7) = "Entra los segundos de latitud del lugar" Mensajes(8) = "Entra la latitud del lugar" Mensajes(9) = "Entra los grados de longitud del lugar" Mensajes(10) = "Entra los minutos de longitud del lugar" Mensajes(11) = "Entra los segundos de longitud del lugar" Mensajes(12) = "Entra la longitud del lugar" Mensajes(13) = "Entra la altitud" Mensajes(14) = "Clima: (M)ensual estimado ó (D)iario real" Mensajes(15) = "Entra la superficie de la finca en m2" Alertas(0) = "" Alertas(1) = "Entra la descripción" Alertas(2) = "Entra el nombre" Alertas(3) = "Entra la población" Alertas(4) = "Entra la provincia" Alertas(5) = "El valor de los grados de latitud van de 0 a 180" Alertas(6) = "El valor de los minutos de latitud van de 0 a 59" Alertas(7) = "El valor de los segundos de latitud van de 0 a 59" Alertas(8) = "El valor de la latitud es N o S" Alertas(9) = "El valor de los grados de longitud van de 0 a 180" Alertas(10) = "El valor de los minutos de longitud van de 0 a 59" Alertas(11) = "El valor de los segundos de longitud van de 0 a 59" Alertas(12) = "El valor de la longitud es E u O" Alertas(13) = "La altitud va de 0 a 3000 metros" Alertas(14) = "Ha de ser M o D" Alertas(15) = "Entra la superficie de la finca" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", Val(Right(Me.Name, 2)), "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Comando(0).Visible = True Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) 'Print KeyAscii Dim Pregunta Dim Tecla Dim tp As Integer Dim Cadena As String tp = KeyAscii If KeyAscii = 13 Or KeyAscii = 9 And Atras = 0 Then Tecla = 1 Atras = 0 Cadena = Trim(Entrada(Index).Text) Select Case Index Case 1 ' Nombre de la Finca 175
  • 176. 7. Anejo 5 If Tecla = 1 Then If Cadena = "" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 2 ' Nombre de la Finca If Tecla = 1 Then If Cadena = "" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1): Posiciona (Index + 1) End If End If Case 3 ' Nombre de la Finca If Tecla = 1 Then If Cadena = "" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 4 ' Nombre de la Finca If Tecla = 1 Then If Cadena = "" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 5 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 180 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 6 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 59 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 7 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 59 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 8 ' grados latitud 176
  • 177. 7. Anejo 5 Cadena = UCase(Cadena) Entrada(Index).Text = Cadena If Tecla = 1 Then If Cadena <> "N" And Cadena <> "S" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 9 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 180 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 10 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 59 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 11 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 59 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 12 ' grados latitud Cadena = UCase(Cadena) Entrada(Index).Text = Cadena If Tecla = 1 Then If Cadena <> "E" And Cadena <> "O" Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 13 ' grados latitud KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Numerico(Cadena) > 3000 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 14 ' datos climaticos Cadena = UCase(Cadena) Entrada(Index).Text = Cadena If Tecla = 1 Then If Cadena <> "M" And Cadena <> "D" Then Pregunta = MsgBox(Alertas(Index)) 177
  • 178. 7. Anejo 5 Posiciona (Index) Else Mensaje.Caption = Mensajes(Index + 1) Posiciona (Index + 1) End If End If Case 15 ' superficie de la finca KeyAscii = Numeros(tp) If Tecla = 1 Then If Numerico(Cadena) < 0 Or Len(Cadena) = 0 Then Pregunta = MsgBox(Alertas(Index)) Posiciona (Index) Else Mensaje.Caption = Mensajes(0) Comando(5).Visible = True Posiciona (1) End If End If End Select End Sub Private Sub Entrada_DblClick(Index As Integer) Select Case Index 'Case 8 End Select End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) 'Print KeyCode, Shift If Index > 1 And KeyCode = 38 Then Posiciona (Index - 1) End If If Index > 0 And KeyCode = 9 And Shift = 1 Then If Index - 1 < 1 Then Index = 16 Posiciona (Index - 1) Atras = 1 End If End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("Descripcion", Entrada(1)) Call MoverFP("NombreFinca", Entrada(2)) Call MoverFP("Poblacion", Entrada(3)) Call MoverFP("Provincia", Entrada(4)) Call MoverFP("LatitudGrados", Entrada(5)) Call MoverFP("LatitudMinutos", Entrada(6)) Call MoverFP("LatitudSegundos", Entrada(7)) Call MoverFP("Latitud", Entrada(8)) Call MoverFP("LongitudGrados", Entrada(9)) Call MoverFP("LongitudMinutos", Entrada(10)) Call MoverFP("LongitudSegundos", Entrada(11)) Call MoverFP("Longitud", Entrada(12)) Call MoverFP("Altitud", Entrada(13)) Call MoverFP("Clima", Entrada(14)) Call MoverFP("SuperficieFinca", Entrada(15)) ExisteFichero = "SI" Else ExisteFichero = "NO" End If End Sub Private Sub GrabarDatos() If ExisteFichero = "NO" Then 178
  • 179. 7. Anejo 5 fProgramacion.AddNew Else fProgramacion.Edit End If Call MoverPF("NombreProgramacion", Entrada(0)) Call MoverPF("Descripcion", Entrada(1)) Call MoverPF("NombreFinca", Entrada(2)) Call MoverPF("Poblacion", Entrada(3)) Call MoverPF("Provincia", Entrada(4)) Call MoverPF("LatitudGrados", Entrada(5)) Call MoverPF("LatitudMinutos", Entrada(6)) Call MoverPF("LatitudSegundos", Entrada(7)) Call MoverPF("Latitud", Entrada(8)) Call MoverPF("LongitudGrados", Entrada(9)) Call MoverPF("LongitudMinutos", Entrada(10)) Call MoverPF("LongitudSegundos", Entrada(11)) Call MoverPF("Longitud", Entrada(12)) Call MoverPF("Altitud", Entrada(13)) Call MoverPF("Clima", Entrada(14)) Call MoverPF("SuperficieFinca", Entrada(15)) fProgramacion("Pantalla21") = "T" fProgramacion.Update End Sub Private Sub Entrada_GotFocus(Index As Integer) End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Private Sub MoverPF(Campo As String, Pantalla) fProgramacion(Campo) = Pantalla.Text End Sub Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 179
  • 180. 7. Anejo 5 RIEGOS22.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Object ="DBLIST32.OCX" Option Explicit 'Dim Atras Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Tierra(20) Private Sub Form_Load() Indice = 1 Mensajes(1) = "Entra el nombre de cultivio, o cliquea en opciones de cultivo" Mensajes(2) = "Entra la cantidad de Arcilla (%)" Mensajes(3) = "Entra la cantidad de Limo (%)" Mensajes(4) = "Cliquea a la derecha, si quieres escoger textura" Mensajes(5) = "Entra la capacidad de campo (% suelo seco)" Mensajes(6) = "Entra el punto de marchitez(% suelo seco)" Mensajes(7) = "Entra los segundos de latitud del lugar" Mensajes(8) = "Entra la Kc de la fase Inicial []" Mensajes(9) = "Entra la Kc de la fase de media []" Mensajes(10) = "Entra la Kc de la fase Final []" Mensajes(11) = "Entra el número de días de éste intérvalo [días]" Mensajes(12) = "Entra el número de días de éste intérvalo [días]" Mensajes(13) = "Entra el número de días de éste intérvalo [días]" Mensajes(14) = "Entra el número de días de éste intérvalo [días]" Mensajes(15) = "Entra la profundidad efectiva de las raíces [cm]" Mensajes(16) = "Entra la profundidad efectiva de las raíces [cm]" Mensajes(17) = "Entra la profundidad efectiva de las raíces [cm]" Mensajes(18) = "Entra el Kc del mes de Enero []" Mensajes(19) = "Entra el Kc del mes de Febrero []" Mensajes(20) = "Entra el Kc del mes de Marzo []" Mensajes(21) = "Entra el Kc del mes de Abril []" Mensajes(22) = "Entra el Kc del mes de Mayo []" Mensajes(23) = "Entra el Kc del mes de Junio []" Mensajes(24) = "Entra el Kc del mes de Julio []" Mensajes(25) = "Entra el Kc del mes de Agosto []" Mensajes(26) = "Entra el Kc del mes de Septiembre []" Mensajes(27) = "Entra el Kc del mes de Octubre []" Mensajes(28) = "Entra el Kc del mes de Noviembre []" Mensajes(29) = "Entra el Kc del mes de Diciembre []" Mensajes(30) = "Entra la profundidad efectiva de las raíces [cm]" Mensajes(31) = "Entra la fracción de agua disponible en el suelo []" Mensajes(32) = "Entra la toleracia a sales del suelo para una producción del 100% [dS/cm]" Mensajes(33) = "Entra la toleracia a sales del agua para una producción del 100% [dS/cm]" Mensajes(34) = "Entra la toleracia a sales del suelo para una producción del 90% [dS/cm]" Mensajes(35) = "Entra la toleracia a sales del agua para una producción del 90% [dS/cm]" Mensajes(36) = "Entra la toleracia a sales del suelo para una producción del 75% [dS/cm]" Mensajes(37) = "Entra la toleracia a sales del agua para una producción del 75% [dS/cm]" Mensajes(38) = "Entra la toleracia a sales del suelo para una producción del 50% [dS/cm]" Mensajes(39) = "Entra la toleracia a sales del agua para una producción del 50% [dS/cm]" Mensajes(40) = "Entra la máxima toleracia a sales del suelo [dS/cm]" Mensajes(41) = "Entra la fecha de plantación o siembra (anuales). En prurianuales 01-01-año [dd-mm-aaaa]" Alertas(0) = "" Alertas(1) = "Entra la descripción" Alertas(2) = "Entra el nombre" Alertas(3) = "Entra la población" Alertas(4) = "Entra la provincia" Alertas(5) = "El valor de los grados de latitud van de 0 a 180" Alertas(6) = "El valor de los minutos de latitud van de 0 a 59" Alertas(7) = "El valor de los segundos de latitud van de 0 a 59" Alertas(8) = "El valor de la latitud es N o S" Alertas(9) = "El valor de los grados de longitud van de 0 a 180" Alertas(10) = "El valor de los minutos de longitud van de 0 a 59" Alertas(11) = "El valor de los segundos de longitud van de 0 a 59" Alertas(12) = "El valor de la longitud es E u O" 180
  • 181. 7. Anejo 5 Alertas(13) = "La altitud va de 0 a 3000 metros" Alertas(14) = "El número de cultivos va de 1 5" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 22, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("Cultivo", Entrada(1)) Call MoverFP("Tipo", Entrada(2)) Call MoverFP("Hierba", Entrada(3)) Call MoverFP("Heladas", Entrada(4)) Call MoverFP("Humedad", Entrada(5)) Call MoverFP("Vientos", Entrada(6)) Call MoverFP("Edad", Entrada(7)) Call MoverFP("KcI", Entrada(8)) Call MoverFP("KcM", Entrada(9)) Call MoverFP("KcF", Entrada(10)) Call MoverFP("DiasI", Entrada(11)) Call MoverFP("DiasD", Entrada(12)) Call MoverFP("DiasM", Entrada(13)) Call MoverFP("DiasF", Entrada(14)) Call MoverFP("RaicesI", Entrada(15)) Call MoverFP("RaicesM", Entrada(16)) Call MoverFP("RaicesF", Entrada(17)) Call MoverFP("Kc01", Entrada(18)) Call MoverFP("Kc02", Entrada(19)) Call MoverFP("Kc03", Entrada(20)) Call MoverFP("Kc04", Entrada(21)) Call MoverFP("Kc05", Entrada(22)) Call MoverFP("Kc06", Entrada(23)) Call MoverFP("Kc07", Entrada(24)) Call MoverFP("Kc08", Entrada(25)) Call MoverFP("Kc09", Entrada(26)) Call MoverFP("Kc10", Entrada(27)) Call MoverFP("Kc11", Entrada(28)) Call MoverFP("Kc12", Entrada(29)) Call MoverFP("Raices", Entrada(30)) Call MoverFP("Fraccion", Entrada(31)) Call MoverFP("ECe100", Entrada(32)) Call MoverFP("ECw100", Entrada(33)) Call MoverFP("ECe90", Entrada(34)) Call MoverFP("ECw90", Entrada(35)) Call MoverFP("ECe75", Entrada(36)) Call MoverFP("ECw75", Entrada(37)) Call MoverFP("ECe50", Entrada(38)) 181
  • 182. 7. Anejo 5 Call MoverFP("ECw50", Entrada(39)) Call MoverFP("MaxECe", Entrada(40)) Call MoverFP("FechaPlantacion", Entrada(41)) If fProgramacion("Tipo") = "A" Then Frame1.Visible = True Frame2.Visible = False End If If fProgramacion("Tipo") = "B" Then Frame1.Visible = True Frame2.Visible = False End If If fProgramacion("Tipo") = "D" Then Frame1.Visible = True Frame2.Visible = False End If If fProgramacion("Tipo") = "E" Then Frame1.Visible = False Frame2.Visible = True End If If fProgramacion("Tipo") = "F" Then Frame1.Visible = False Frame2.Visible = True End If If fProgramacion("Tipo") = "G" Then Frame1.Visible = False Frame2.Visible = True End If If fProgramacion("Tipo") = "H" Then Frame1.Visible = False Frame2.Visible = True End If If fProgramacion("Tipo") = "O" Then Frame1.Visible = False Frame2.Visible = True End If End If End Sub Private Sub GrabarDatos() fProgramacion.Edit fProgramacion("Cultivo") = Entrada(1).Text fProgramacion("Tipo") = Entrada(2).Text fProgramacion("Hierba") = Entrada(3).Text fProgramacion("Heladas") = Entrada(4).Text fProgramacion("Humedad") = Entrada(5).Text fProgramacion("Vientos") = Entrada(6).Text fProgramacion("Edad") = Entrada(7).Text fProgramacion("KcI") = Entrada(8).Text fProgramacion("KcM") = Entrada(9).Text fProgramacion("KcF") = Entrada(10).Text fProgramacion("DiasI") = Entrada(11).Text fProgramacion("DiasD") = Entrada(12).Text fProgramacion("DiasM") = Entrada(13).Text fProgramacion("DiasF") = Entrada(14).Text fProgramacion("RaicesI") = Entrada(15).Text fProgramacion("RaicesM") = Entrada(16).Text fProgramacion("RaicesF") = Entrada(17).Text fProgramacion("Kc01") = Entrada(18).Text fProgramacion("Kc02") = Entrada(19).Text fProgramacion("Kc03") = Entrada(20).Text fProgramacion("Kc04") = Entrada(21).Text fProgramacion("Kc05") = Entrada(22).Text fProgramacion("Kc06") = Entrada(23).Text fProgramacion("Kc07") = Entrada(24).Text fProgramacion("Kc08") = Entrada(25).Text fProgramacion("Kc09") = Entrada(26).Text fProgramacion("Kc10") = Entrada(27).Text fProgramacion("Kc11") = Entrada(28).Text fProgramacion("Kc12") = Entrada(29).Text fProgramacion("Raices") = Entrada(30).Text fProgramacion("Fraccion") = Entrada(31).Text fProgramacion("ECe100") = Entrada(32).Text fProgramacion("ECw100") = Entrada(33).Text fProgramacion("ECe90") = Entrada(34).Text 182
  • 183. 7. Anejo 5 fProgramacion("ECw90") = Entrada(35).Text fProgramacion("ECe75") = Entrada(36).Text fProgramacion("ECw75") = Entrada(37).Text fProgramacion("ECe50") = Entrada(38).Text fProgramacion("ECw50") = Entrada(39).Text fProgramacion("MaxECe") = Entrada(40).Text fProgramacion("FechaPlantacion") = Entrada(41).Text fProgramacion("Pantalla22") = "T" fProgramacion.Update End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub '***************************************************************************************** Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 1: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 50, 0, "N") Case 2: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 3: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 4: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 5: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 6: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 7: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 1, 0, "N") Case 8: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 9: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 10: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 11: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 12: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 13: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 14: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 15: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 16: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 17: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 18: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 19: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 20: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 21: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 22: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 23: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 24: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 25: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 26: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 27: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 28: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 29: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 30: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 31: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 31: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 32: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 33: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 34: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 35: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 36: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 37: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 38: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 39: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 40: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "S") Case 41: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "F", "N", 10, 1, "N") Comando(5).Visible = True End Select End Sub Function TrataCampo(FormaMe, Index, Campo As String, Tecla, tipo, Signo, Longitud, Decimales, Cero) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 183
  • 184. 7. Anejo 5 Else TrataCampo = Tecla End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 And Cero <> "S" Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Cero <> "S" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then 184
  • 185. 7. Anejo 5 MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 41 Then Indice = 0 End If Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 42 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function Comprobacion(FormaMe, Indice, Campo As String, tipo) Dim ValorN As Double Comprobacion = "OK" If tipo = "N" And Indice <> 8 Then ValorN = CarNum(Campo) End If Select Case Indice Case 1 ' If Campo = "" Then MsgBox ("Entra el nombre del cultivo o esoge uno en opcioens") Comprobacion = "" End If Case 31 ' If Trim(Entrada(2)) = "" Then MsgBox ("Escoge un grupo de cultivo") Comprobacion = "" Else 'If Campo = "" Then ' MsgBox ("Entra algún valor") ' Comprobacion = "" 'End If If ValorN = 0 Then MsgBox ("Entra algún valor") Comprobacion = "" End If If ValorN > 1 Then 185
  • 186. 7. Anejo 5 MsgBox ("Entra algún valor menor de 1 ") Comprobacion = "" End If End If End Select End Function Private Sub ComandoLista_Click(Index As Integer) Select Case Index Case 1 Set ValorControl = Entrada(Index) ValorTabla = "CultivosNombre" Call CargaDBLista(ValorControl, ValorTabla, "Cultivo") Case 2 Set ValorControl = Entrada(Index) ValorTabla = "2" Call CargaLista(ValorControl, Index) Case 3 Set ValorControl = Entrada(Index) ValorTabla = "3" Call CargaLista(ValorControl, Index) Case 4 Set ValorControl = Entrada(Index) ValorTabla = "4" Call CargaLista(ValorControl, Index) Case 5 Set ValorControl = Entrada(Index) ValorTabla = "5" Call CargaLista(ValorControl, Index) Case 6 Set ValorControl = Entrada(Index) ValorTabla = "6" Call CargaLista(ValorControl, Index) Case 7 Set ValorControl = Entrada(Index) ValorTabla = "7" Call CargaLista(ValorControl, Index) End Select Posiciona (1) Indice = 1 DoEvents End Sub Private Sub CargaDBLista(Control, Fichero, Campo) BorraDatos Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM CultivosNombre ORDER BY Cultivo ;") 'Datos.DatabaseName = NBaseDeDatos 'Datos.RecordSource = NCultivosNombre Set Datos.Recordset = Consulta Datos.Refresh DBLista.ZOrder 0 DBLista.Left = Entrada(1).Left 'Control.Left DBLista.Top = Entrada(1).Top 'Control.Top DBLista.Width = Entrada(1).Width 'Control.Width DBLista.Height = 4000 DBLista.ListField = "Cultivo" DBLista.Refresh DBLista.Visible = True End Sub Private Sub DBLista_DblClick() ValorControl.Text = DBLista.Text DBLista.Visible = False Posiciona (1) End Sub Private Sub CargaLista(Control, Index) 'ComandoLista(INDEX).Visible = False Lista.ZOrder 0 Lista.Left = Control.Left Lista.Top = Control.Top 'Lista.Width = Control.Width Lista.Visible = True Select Case Index Case 2 Lista.Clear 186
  • 187. 7. Anejo 5 Lista.Width = 4000 Lista.Height = 5 * 400 Lista.AddItem "Cultivos extensivos y hortalizas" Lista.AddItem "Arroz" Lista.AddItem "Alfalfa" Lista.AddItem "Arboles caducifolios y de nuez" Lista.AddItem "Cítricos" Lista.AddItem "Uva" Lista.AddItem "Plátano" 'Lista.AddItem "Otros" Case 3 Lista.Clear Lista.AddItem "SI" Lista.AddItem "NO" Lista.Height = 2 * 400 Case 4 Lista.Clear Lista.AddItem "HELADAS FUERTES" Lista.AddItem "HELADAS DEBILES" Lista.AddItem "SIN HELADAS" Lista.Height = 2 * 400 Case 5 Lista.Clear Lista.AddItem "ALTA" Lista.AddItem "BAJA" Lista.Height = 2 * 400 Case 6 Lista.Clear Lista.AddItem "FUERTES" Lista.AddItem "DEBILES" Lista.Height = 2 * 400 Case 7 Lista.Clear Lista.AddItem "JOVEN" Lista.AddItem "MEDIO" Lista.AddItem "ADULTO" Lista.Height = 2 * 400 End Select End Sub Private Sub Lista_DblClick() If ValorTabla = "2" Then BorraKc If Lista.Text = "Cultivos extensivos y hortalizas" Then ValorControl.Text = "A" If Lista.Text = "Arroz" Then ValorControl.Text = "B" If Lista.Text = "Alfalfa" Then ValorControl.Text = "D" If Lista.Text = "Arboles caducifolios y de nuez" Then ValorControl.Text = "E" If Lista.Text = "Cítricos" Then ValorControl.Text = "F" If Lista.Text = "Uva" Then ValorControl.Text = "G" If Lista.Text = "Plátano" Then ValorControl.Text = "H" 'If Lista.Text = "Otros" Then ValorControl.Text = "O" DESACTIVATODO If ValorControl = "A" Then ACTIVA (5) ACTIVA (6) Frame1.Visible = True Frame2.Visible = False End If If ValorControl = "B" Then ACTIVA (5) ACTIVA (6) Frame1.Visible = True Frame2.Visible = False End If If ValorControl = "D" Then ACTIVA (5) ACTIVA (6) Frame1.Visible = True Frame2.Visible = False End If If ValorControl = "E" Then ACTIVA (3) ACTIVA (4) ACTIVA (5) 187
  • 188. 7. Anejo 5 ACTIVA (6) ACTIVA (7) Frame1.Visible = False Frame2.Visible = True End If If ValorControl = "F" Then ACTIVA (3) ACTIVA (7) Frame1.Visible = False Frame2.Visible = True End If If ValorControl = "G" Then ACTIVA (4) ACTIVA (5) ACTIVA (6) Frame1.Visible = False Frame2.Visible = True End If If ValorControl = "H" Then ACTIVA (6) ACTIVA (7) Frame1.Visible = False Frame2.Visible = True End If If ValorControl = "O" Then Frame1.Visible = False Frame2.Visible = True End If Posiciona (1) End If If ValorTabla = "3" Then If Lista.Text = "SI" Then ValorControl.Text = "S" If Lista.Text = "NO" Then ValorControl.Text = "N" Posiciona (1) End If If ValorTabla = "4" Then If Lista.Text = "HELADAS DEBILES" Then ValorControl.Text = "D" If Lista.Text = "HELADAS FUERTES" Then ValorControl.Text = "F" If Lista.Text = "SIN HELADAS" Then ValorControl.Text = "S" Posiciona (1) End If If ValorTabla = "5" Then If Lista.Text = "ALTA" Then ValorControl.Text = "A" If Lista.Text = "BAJA" Then ValorControl.Text = "B" Posiciona (1) End If If ValorTabla = "6" Then If Lista.Text = "DEBILES" Then ValorControl.Text = "D" If Lista.Text = "FUERTES" Then ValorControl.Text = "F" Posiciona (1) End If If ValorTabla = "7" Then If Lista.Text = "JOVEN" Then ValorControl.Text = "J" If Lista.Text = "MEDIO" Then ValorControl.Text = "M" If Lista.Text = "ADULTO" Then ValorControl.Text = "A" Posiciona (1) End If Lista.Visible = False ' Proceso de recogida de datos If (Entrada(2) = "A" And Entrada(5) <> "-" And Entrada(6) <> "-") Or _ (Entrada(2) = "B" And Entrada(5) <> "-" And Entrada(6) <> "-") Or _ (Entrada(2) = "D" And Entrada(5) <> "-" And Entrada(6) <> "-") Or _ (Entrada(2) = "E" And Entrada(3) <> "-" And Entrada(4) <> "-" And Entrada(5) <> "-" And Entrada(6) <> "-" And Entrada(7) <> "-") Or _ (Entrada(2) = "F" And Entrada(3) <> "-" And Entrada(7) <> "-") Or _ (Entrada(2) = "G" And Entrada(4) <> "-" And Entrada(5) <> "-" And Entrada(6) <> "-") Or _ (Entrada(2) = "H" And Entrada(6) <> "-") Or _ (Entrada(2) = "O") Then CargaKc CargaDias CargaRaices CargaSal CargaFraccion 188
  • 189. 7. Anejo 5 Comando(5).Visible = True End If End Sub Function CargaKc() fCultivosKc.Index = "ORDEN" fCultivosKc.MoveFirst fCultivosKc.Seek "=", Entrada(1).Text, Entrada(2).Text, Entrada(3).Text, Entrada(4).Text, Entrada(5).Text, Entrada(6).Text, Entrada(7).Text If fCultivosKc.NoMatch = False Then 'Registro encontrado If Entrada(2) = "A" Or Entrada(2) = "B" Or Entrada(3) = "D" Then Entrada(8) = fCultivosKc("KcI") Entrada(9) = fCultivosKc("KcM") Entrada(10) = fCultivosKc("KcF") Else Entrada(18) = NoNulo(fCultivosKc("Kc01")) Entrada(19) = NoNulo(fCultivosKc("Kc02")) Entrada(20) = NoNulo(fCultivosKc("Kc03")) Entrada(21) = NoNulo(fCultivosKc("Kc04")) Entrada(22) = NoNulo(fCultivosKc("Kc05")) Entrada(23) = NoNulo(fCultivosKc("Kc06")) Entrada(24) = NoNulo(fCultivosKc("Kc07")) Entrada(25) = NoNulo(fCultivosKc("Kc08")) Entrada(26) = NoNulo(fCultivosKc("Kc09")) Entrada(27) = NoNulo(fCultivosKc("Kc10")) Entrada(28) = NoNulo(fCultivosKc("Kc11")) Entrada(29) = NoNulo(fCultivosKc("Kc12")) End If Else BorraKc End If End Function Function BorraDatos() BorraKc Dim num For num = 31 To 41 Entrada(num) = "" Next num End Function Function BorraKc() Dim num For num = 8 To 17 Entrada(num) = "" Next num For num = 18 To 30 Entrada(num) = "" Next num End Function Function CargaRaices() fCultivosRaices.Index = "ORDEN" fCultivosRaices.MoveFirst fCultivosRaices.Seek "=", Entrada(1).Text If fCultivosRaices.NoMatch = False Then 'Registro encontrado If Entrada(2) = "A" Or Entrada(2) = "B" Or Entrada(3) = "D" Then Entrada(15) = fCultivosRaices("Raices") Entrada(16) = fCultivosRaices("Raices") Entrada(17) = fCultivosRaices("Raices") Else Entrada(30) = fCultivosRaices("Raices") End If End If End Function Function CargaDias() fCultivosDias.Index = "ORDEN" fCultivosDias.MoveFirst fCultivosDias.Seek "=", Entrada(1).Text If fCultivosDias.NoMatch = False Then 'Registro encontrado If Entrada(2) = "A" Or Entrada(2) = "B" Or Entrada(3) = "D" Then Entrada(11) = fCultivosDias("DiasI") Entrada(12) = fCultivosDias("DiasD") Entrada(13) = fCultivosDias("DiasM") Entrada(14) = fCultivosDias("DiasF") End If End If 189
  • 190. 7. Anejo 5 End Function Function CargaFraccion() fCultivosFraccion.Index = "ORDEN" fCultivosFraccion.MoveFirst fCultivosFraccion.Seek "=", Entrada(1).Text If fCultivosFraccion.NoMatch = False Then 'Registro encontrado Entrada(31) = fCultivosFraccion("Fraccion") End If End Function Function CargaSal() fCultivosSal.Index = "ORDEN" fCultivosSal.MoveFirst fCultivosSal.Seek "=", Entrada(1).Text If fCultivosSal.NoMatch = False Then 'Registro encontrado Entrada(32) = fCultivosSal("ECe100") Entrada(33) = fCultivosSal("ECw100") Entrada(34) = fCultivosSal("ECe90") Entrada(35) = fCultivosSal("ECw90") Entrada(36) = fCultivosSal("ECe75") Entrada(37) = fCultivosSal("ECw75") Entrada(38) = fCultivosSal("ECe50") Entrada(39) = fCultivosSal("ECw50") Entrada(40) = fCultivosSal("MaxECe") End If End Function Function DESACTIVATODO() Dim num For num = 3 To 7 Label(num).Visible = False Entrada(num).Visible = False ComandoLista(num).Visible = False Entrada(num).Text = "-" Next num End Function Function ACTIVA(Numero) Label(Numero).Visible = True Entrada(Numero).Visible = True ComandoLista(Numero).Visible = True End Function Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 190
  • 191. 7. Anejo 5 RIEGOS23.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Object ="DBLIST32.OCX" Option Explicit Dim Indice As Integer Dim Atras As Integer Dim Mensajes(20) As String Dim Alertas(20) As String Dim Campos(20) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Mes Dim Ano Dim Dia Dim TipoDatos Dim NomMes(12) Dim NumeroPicado Private Sub Form_Load() Mensajes(1) = "Entra la temperatura máxima" Mensajes(2) = "Entra la temperatura mínima" Mensajes(3) = "Entra la humedad máxima" Mensajes(4) = "Entra la humedad mínima" Mensajes(5) = "Entra la humedad media" Mensajes(6) = "Entra el viento diario" Mensajes(7) = "Entra la radiación solar diaria" Mensajes(8) = "Entra el número de horas de sol diarias" Mensajes(9) = "Entra la precipitación" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", Val(Right(Me.Name, 2)), "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Comando(0).Visible = True Atras = 0 Indice = 1 Mensaje.Caption = "Escoje una opción" CargarDatos End Sub Private Sub Form_Unload(Cancel As Integer) Unload Me Load Riegos 'Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado TipoDatos = fProgramacion("Clima") Entrada(0).Text = fProgramacion("NombreProgramacion") Else TipoDatos = "M" End If End Sub Private Sub GrabarDatos() If ExisteFichero = "NO" Then fProgramacion.AddNew 191
  • 192. 7. Anejo 5 Else fProgramacion.Edit End If Call MoverPF("NombreProgramacion", Entrada(0)) Call MoverPF("Descripcion", Entrada(1)) Call MoverPF("NombreFinca", Entrada(2)) Call MoverPF("Poblacion", Entrada(3)) Call MoverPF("Provincia", Entrada(4)) Call MoverPF("LatitudGrados", Entrada(5)) Call MoverPF("LatitudMinutos", Entrada(6)) Call MoverPF("LatitudSegundos", Entrada(7)) Call MoverPF("Latitud", Entrada(8)) Call MoverPF("LongitudGrados", Entrada(9)) Call MoverPF("LongitudMinutos", Entrada(10)) Call MoverPF("LongitudSegundos", Entrada(11)) Call MoverPF("Longitud", Entrada(12)) Call MoverPF("Altitud", Entrada(13)) fProgramacion("Pantalla23") = "T" fProgramacion.Update If Right(Riegos.Forma(Val(Right(Me.Name, 2))).Caption, 1) <> ">" Then Riegos.Forma(Val(Right(Me.Name, 2))).Caption = Riegos.Forma(Val(Right(Me.Name, 2))).Caption + " >" End If End Sub 'Private Sub Entrada_GotFocus(Index As Integer) 'End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Private Sub MoverPF(Campo As String, Pantalla) fProgramacion(Campo) = Pantalla.Text End Sub Private Sub Command1_Click() Command1.Visible = False Command2.Visible = False If TipoDatos = "M" Or TipoDatos = "D" Then Command1.Visible = False Call EmpiezaPrograma Else MsgBox ("Ves al menú de datos de la finca y entra el tipo de datos climáticos") End If End Sub Private Sub Command2_Click() Command1.Visible = False Command2.Visible = False If TipoDatos = "M" Or TipoDatos = "D" Then SSPanel1.Visible = True ValorTabla = "ClimaMaestro" Call CargaDBLista(ValorTabla, "Estacion") Mensaje.Caption = "Cliquea en los datos de una estación meteorológica" Else MsgBox ("Ves al menú de datos de la finca y entra el tipo de datos climáticos") End If End Sub Private Sub CargaDBLista(Fichero, Campo) Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM ClimaMaestro WHERE Clima = '" & TipoDatos & "' ORDER BY Estacion ;") Set Datos.Recordset = Consulta Datos.Refresh DBLista.ZOrder 0 DBLista.ListField = "Estacion" DBLista.Refresh DBLista.Visible = True End Sub Private Sub DBLista_DblClick() Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM ClimaDetalle WHERE Clima = '" & TipoDatos & "' and Estacion = '" & DBLista.Text & "' ORDER BY Fecha ;") If Consulta.RecordCount <> 0 Then Consulta.MoveFirst While Not Consulta.EOF fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.Seek "=", NombreProgramacion, Consulta("Fecha"), Consulta("Clima") 192
  • 193. 7. Anejo 5 If fProgramacionClima.NoMatch = False Then 'Registro encontrado fProgramacionClima.Edit Else fProgramacionClima.AddNew fProgramacionClima("NombreProgramacion") = NombreProgramacion fProgramacionClima("Fecha") = Consulta("Fecha") fProgramacionClima("Clima") = TipoDatos fProgramacionClima("Color") = "V" fProgramacionClima("TemperaturaMaxima") = Consulta("TemperaturaMaxima") fProgramacionClima("TemperaturaMinima") = Consulta("TemperaturaMinima") fProgramacionClima("Psicrometro") = Consulta("Psicrometro") fProgramacionClima("HumedadMaxima") = Consulta("HumedadMaxima") fProgramacionClima("HumedadMinima") = Consulta("HumedadMinima") fProgramacionClima("HumedadMedia") = Consulta("HumedadMedia") fProgramacionClima("Radiacion") = Consulta("Radiacion") fProgramacionClima("RadiacionNeta") = Consulta("RadiacionNeta") fProgramacionClima("HorasSol") = Consulta("HorasSol") fProgramacionClima("Viento") = Consulta("Viento") fProgramacionClima("Lluvia") = Consulta("Lluvia") fProgramacionClima.Update End If Consulta.MoveNext Wend fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado fProgramacion.Edit fProgramacion("Pantalla23") = "T" fProgramacion.Update End If End If SSPanel1.Visible = False Command1.Visible = True Command2.Visible = True End Sub Private Sub EmpiezaPrograma() Dim contador Dim leecolor Mes = Month(Date) Ano = Year(Date) CargaInicial If TipoDatos = "D" Then Mensaje.Caption = "Cliquea en un día y entra los datos meteorológicos" SSDiario.Visible = True CalculaDias For contador = 0 To 41 If SSPANEL2(contador).Visible = True Then fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst Dim fechar fechar = Trim((Str(Ano) + Right(Str(Mes + 100), 2) + Right(Str(Val(SSPANEL2(contador).Caption) + 100), 2))) fProgramacionClima.Seek "=", NombreProgramacion, fechar, "D" If fProgramacionClima.NoMatch = False Then 'Registro encontrado leecolor = fProgramacionClima("Color") Else leecolor = "G" End If If leecolor = "G" Then SSPANEL2(contador).BackColor = &HC0C0C0 If leecolor = "V" Then SSPANEL2(contador).BackColor = &H80FF80 If leecolor = "R" Then SSPANEL2(contador).BackColor = &HFF& End If Next contador End If If TipoDatos = "M" Then Mensaje.Caption = "Cliquea en un mes y entra los datos meteorológicos" SSMesario.Visible = True TituloMes.Caption = "Entrada mensual" ' NomMes(Mes) + "-" + Str(Ano) For contador = 1 To 12 fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst fProgramacionClima.Seek "=", NombreProgramacion, Right(Str(contador + 100), 2), "M" If fProgramacionClima.NoMatch = False Then 'Registro encontrado 193
  • 194. 7. Anejo 5 leecolor = fProgramacionClima("Color") Else leecolor = "G" End If If leecolor = "G" Then SSMES(contador - 1).BackColor = &HC0C0C0 If leecolor = "V" Then SSMES(contador - 1).BackColor = &H80FF80 If leecolor = "R" Then SSMES(contador - 1).BackColor = &HFF& Next contador End If End Sub Private Sub Boton_Click(Index As Integer) Select Case Index Case 0 Mes = Mes - 1 If Mes = 0 Then Mes = 12 Ano = Ano - 1 End If Case 1 Ano = Ano - 1 Case 2 Ano = Ano + 1 Case 3 Mes = Mes + 1 If Mes = 13 Then Mes = 1 Ano = Ano + 1 End If End Select CalculaDias Dim contador Dim leecolor For contador = 0 To 41 If SSPANEL2(contador).Visible = True Then fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst Dim fechar fechar = Trim((Str(Ano) + Right(Str(Mes + 100), 2) + Right(Str(Val(SSPANEL2(contador).Caption) + 100), 2))) fProgramacionClima.Seek "=", NombreProgramacion, fechar, "D" If fProgramacionClima.NoMatch = False Then 'Registro encontrado leecolor = fProgramacionClima("Color") Else leecolor = "G" End If If leecolor = "G" Then SSPANEL2(contador).BackColor = &HC0C0C0 If leecolor = "V" Then SSPANEL2(contador).BackColor = &H80FF80 If leecolor = "R" Then SSPANEL2(contador).BackColor = &HFF& End If Next contador Titulo.Caption = Right(Str(Dia + 100), 2) + "-" + Right(Str(Mes + 100), 2) + "-" + Str(Ano) End Sub Private Sub ComandoAceptar_Click() Comando(0).Visible = True SSEntradaDatos.Visible = False Titulo.Visible = False '>> poner codigo de color segun datos Dim QueColor QueColor = Preguntacolor If TipoDatos = "M" Then SSMesario.Visible = True SSMesario.Enabled = True SSMES(NumeroPicado).BackColor = QueColor GrabarDatosMes End If If TipoDatos = "D" Then SSDiario.Visible = True SSDiario.Enabled = True SSPANEL2(NumeroPicado).BackColor = &H80FF80 GrabarDatosdia End If fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion 194
  • 195. 7. Anejo 5 If fProgramacion.NoMatch = False Then 'Registro encontrado fProgramacion.Edit fProgramacion("Pantalla23") = "T" fProgramacion.Update End If '>> poner codigo de grabacion de datos End Sub Private Sub ComandoSalir_Click() Comando(0).Visible = True SSEntradaDatos.Visible = False Titulo.Visible = False If TipoDatos = "M" Then SSMesario.Visible = True SSMesario.Enabled = True End If If TipoDatos = "D" Then SSDiario.Visible = True SSDiario.Enabled = True End If End Sub Private Sub CargaInicial() NomMes(1) = "ENERO" NomMes(2) = "FEBRERO" NomMes(3) = "MARZO" NomMes(4) = "ABRIL" NomMes(5) = "MAYO" NomMes(6) = "JUNIO" NomMes(7) = "JULIO" NomMes(8) = "AGOSTO" NomMes(9) = "SEPTIEMBRE" NomMes(10) = "OCTUBRE" NomMes(11) = "NOVIEMBRE" NomMes(12) = "DICIEMBRE" End Sub Private Sub CalculaDias() Dim num For num = 0 To 41 SSPANEL2(num).Caption = "" SSPANEL2(num).Visible = False 'EntradaDato(Num).Text = "" 'EntradaDato(Num).Visible = False Next num Dim NumDias Dim CadenaDias SSPanel13.Caption = NomMes(Mes) + " - " + Str(Ano) If (Ano = 4 * Int(Ano / 4) And Ano <> 100 * Int(Ano / 100)) Then CadenaDias = "312931303130313130313031" Else CadenaDias = "312831303130313130313031" End If Dim MesCal Dim AnoCal Dim NumFil: NumFil = 0 Dim NumCol: NumCol = 0 Dim Numero: Numero = 0 Dim DiaMes: DiaMes = 0 NumDias = Val(Mid$(CadenaDias, (2 * Mes) - 1, 2)) For DiaMes = 1 To NumDias MesCal = Mes AnoCal = Ano If Mes <= 2 Then MesCal = MesCal + 12 AnoCal = AnoCal - 1 End If Numero = DiaMes + 2 * MesCal + Int(0.6 * (MesCal + 1)) + AnoCal + Int(AnoCal / 4) - Int(AnoCal / 100) + Int(AnoCal / 400) + 2 Numero = (Int((Numero / 7 - Int(Numero / 7)) * 7 + 0.5)) + 1 If Numero < 3 Then NumCol = Numero + 5 Else NumCol = Numero - 2 End If Dim Pos 195
  • 196. 7. Anejo 5 Pos = (NumFil * 7) + (NumCol - 1) SSPANEL2(Pos).Visible = True SSPANEL2(Pos).Caption = DiaMes If NumCol = 7 Then NumFil = NumFil + 1 End If DoEvents Next DiaMes DoEvents '>>leer los que estan cargados End Sub Private Sub SSMES_Click(Index As Integer) Comando(0).Visible = False SSDiario.Enabled = False SSEntradaDatos.Visible = True Call Apaga(3) Call Apaga(4) Call Enciende(5) Posiciona (1) QueMes = Index + 1 Titulo.Caption = NomMes(QueMes) Titulo.Visible = True NumeroPicado = Index Check1_Click Check2_Click Posiciona (1) Me.Mensaje.Caption = Mensajes(1) 'leedatos fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst fProgramacionClima.Seek "=", NombreProgramacion, Right(Str(Index + 101), 2), "M" If fProgramacionClima.NoMatch = False Then 'Registro encontrado Entrada(1) = NoNulo(fProgramacionClima("TemperaturaMaxima")) Entrada(2) = NoNulo(fProgramacionClima("TemperaturaMinima")) Entrada(3) = NoNulo(fProgramacionClima("HumedadMaxima")) Entrada(4) = NoNulo(fProgramacionClima("HumedadMinima")) Entrada(5) = NoNulo(fProgramacionClima("HumedadMedia")) Entrada(6) = NoNulo(fProgramacionClima("Viento")) Entrada(7) = NoNulo(fProgramacionClima("RadiacionNeta")) Entrada(8) = NoNulo(fProgramacionClima("HorasSol")) Entrada(9) = NoNulo(fProgramacionClima("Lluvia")) Check1.Value = 0: If fProgramacionClima("Psicrometro") = "S" Then Check1.Value = 1 Check2.Value = 0: If fProgramacionClima("Radiacion") = "S" Then Check2.Value = 1 Else Dim contador For contador = 1 To 9 Entrada(contador).Text = "" Next contador End If '-End Sub Private Sub SSPANEL2_Click(Index As Integer) Dia = SSPANEL2(Index).Caption Dim Corte1 As String Dim Corte2 As String Corte1 = Str(Ano) + Right(Str(Mes + 100), 2) + Right(Str(Dia + 100), 2) Corte2 = Mid(Date$, 7, 4) + Mid(Date$, 1, 2) + Mid(Date$, 4, 2) If Val(Corte1) >= Val(Corte2) Then MsgBox ("No se puede escoger una fecha mayor que la de ayer") Else SSDiario.Enabled = False SSEntradaDatos.Visible = True Titulo.Caption = Right(Str(Dia + 100), 2) + "-" + Right(Str(Mes + 100), 2) + "-" + Str(Ano) Titulo.Visible = True Posiciona (1) NumeroPicado = Index Check1_Click Check2_Click Me.Mensaje.Caption = Mensajes(1) 'lee datos Dim contador fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst Dim fechar 196
  • 197. 7. Anejo 5 fechar = Trim((Str(Ano) + Right(Str(Mes + 100), 2) + Right(Str(Val(Dia) + 100), 2))) fProgramacionClima.Seek "=", NombreProgramacion, fechar, "D" If fProgramacionClima.NoMatch = False Then 'Registro encontrado Entrada(1) = NoNulo(fProgramacionClima("TemperaturaMaxima")) Entrada(2) = NoNulo(fProgramacionClima("TemperaturaMinima")) Entrada(3) = NoNulo(fProgramacionClima("HumedadMaxima")) Entrada(4) = NoNulo(fProgramacionClima("HumedadMinima")) Entrada(5) = NoNulo(fProgramacionClima("HumedadMedia")) Entrada(6) = NoNulo(fProgramacionClima("Viento")) Entrada(7) = NoNulo(fProgramacionClima("RadiacionNeta")) Entrada(8) = NoNulo(fProgramacionClima("HorasSol")) Entrada(9) = NoNulo(fProgramacionClima("Lluvia")) Check1.Value = 0: If fProgramacionClima("Psicrometro") = "S" Then Check1.Value = 1 Check2.Value = 0: If fProgramacionClima("Radiacion") = "S" Then Check2.Value = 1 Else For contador = 1 To 9 Entrada(contador).Text = "" Next contador End If '-End If End Sub '*********************************************************************** Private Sub Check1_Click() If Check1.Value = 1 Then Call Enciende(3) Call Enciende(4) Call Apaga(5) End If If Check1.Value = 0 Then Call Apaga(3) Call Apaga(4) Call Enciende(5) End If Posiciona (1) End Sub Private Sub Check2_Click() If Check2.Value = 1 Then Call Enciende(7) Call Apaga(8) End If If Check2.Value = 0 Then Call Apaga(7) Call Enciende(8) End If Posiciona (1) End Sub Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 1 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "S", 5, 1) Case 2 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "S", 5, 1) Case 3 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0) Case 4 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0) Case 5 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0) Case 6 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 0) Case 7 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 0) Case 8 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 1) Case 9 KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 6, 0) End Select End Sub 197
  • 198. 7. Anejo 5 Function TrataCampo(FormaMe, Index, Campo, Tecla, tipo, Signo, Longitud, Decimales) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If 198
  • 199. 7. Anejo 5 Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Function Apaga(Index) Entrada(Index).Enabled = False Entrada(Index).BackColor = &H8000000B DoEvents End Function Function Enciende(Index) Entrada(Index).Enabled = True Entrada(Index).BackColor = &H80000005 DoEvents End Function Function Comprobacion(FormaMe, Indice, Campo, tipo) Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 'temperatura If ValorN < -50 Or ValorN > 70 Then MsgBox ("¿Que se puede cultivar con esta temperatura?") Comprobacion = "" End If Case 2 'temperatura If ValorN < -50 Or ValorN > 70 Then MsgBox ("¿Que se puede cultivar con esta temperatura?") Comprobacion = "" End If If ValorN > Val(FormaMe.Entrada(1)) Then MsgBox ("La temperatura mínima no puede ser mayor que la mínima") Comprobacion = "" End If Case 3 'humedad If ValorN < 0 Or ValorN > 100 Then MsgBox ("Entra correctamente la humedad") Comprobacion = "" End If Case 4 'humedad If ValorN < 0 Or ValorN > 100 Then MsgBox ("Entra correctamente la humedad") Comprobacion = "" End If If ValorN > Val(FormaMe.Entrada(3)) Then 199
  • 200. 7. Anejo 5 MsgBox ("La humedad mínima no puede ser mayor que la mínima") Comprobacion = "" End If Case 5 'humedad If ValorN < 0 Or ValorN > 100 Then MsgBox ("Entra correctamente la humedad") Comprobacion = "" End If Case 6 'viento If ValorN < 0 Or ValorN > 3600 Then MsgBox ("Entra correctamente el viento. Km/día") Comprobacion = "" End If Case 7 'radiacion If ValorN < 0 Then MsgBox ("Entra correctamente la radiación solar en MJ/m2·período") Comprobacion = "" End If Case 8 'Horas de sol If ValorN < 0 Or ValorN > 24 Then MsgBox ("Entra correctamente las horas de sol al día") Comprobacion = "" End If Case 9 'Lluvia If ValorN < 0 Or ValorN > 400 Then MsgBox ("Entra correctamente la cantidad de lluvia en litros/m2·periodo") Comprobacion = "" End If End Select End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 9 Then 'antes 14 Indice = 0 End If Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 10 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function MoverFoco(Numero) Posiciona (Numero) End Function Function Preguntacolor() 'Gris = &HC0C0C0 'Verde = &H80FF80 'Rojo = &HFF& Preguntacolor = &HFF& If Check1.Value = 1 And Check2.Value = 1 And _ Trim(Entrada(1)) = "" And _ Trim(Entrada(2)) = "" And _ Trim(Entrada(3)) = "" And _ Trim(Entrada(4)) = "" And _ Trim(Entrada(6)) = "" And _ Trim(Entrada(7)) = "" Then Preguntacolor = &HC0C0C0 End If If Check1.Value = 1 And Check2.Value = 1 And _ Trim(Entrada(1)) <> "" And _ Trim(Entrada(2)) <> "" And _ 200
  • 201. 7. Anejo 5 Trim(Entrada(3)) <> "" And _ Trim(Entrada(4)) <> "" And _ Trim(Entrada(6)) <> "" And _ Trim(Entrada(7)) <> "" Then Preguntacolor = &H80FF80 End If If Check1.Value = 1 And Check2.Value = 0 And _ Trim(Entrada(1)) = "" And _ Trim(Entrada(2)) = "" And _ Trim(Entrada(3)) = "" And _ Trim(Entrada(4)) = "" And _ Trim(Entrada(6)) = "" And _ Trim(Entrada(8)) = "" Then Preguntacolor = &HC0C0C0 End If If Check1.Value = 1 And Check2.Value = 0 And _ Trim(Entrada(1)) <> "" And _ Trim(Entrada(2)) <> "" And _ Trim(Entrada(3)) <> "" And _ Trim(Entrada(4)) <> "" And _ Trim(Entrada(6)) <> "" And _ Trim(Entrada(8)) <> "" Then Preguntacolor = &H80FF80 End If If Check1.Value = 0 And Check2.Value = 1 And _ Trim(Entrada(1)) = "" And _ Trim(Entrada(2)) = "" And _ Trim(Entrada(5)) = "" And _ Trim(Entrada(6)) = "" And _ Trim(Entrada(7)) = "" Then Preguntacolor = &HC0C0C0 End If If Check1.Value = 0 And Check2.Value = 1 And _ Trim(Entrada(1)) <> "" And _ Trim(Entrada(2)) <> "" And _ Trim(Entrada(5)) <> "" And _ Trim(Entrada(6)) <> "" And _ Trim(Entrada(7)) <> "" Then Preguntacolor = &H80FF80 End If If Check1.Value = 0 And Check2.Value = 0 And _ Trim(Entrada(1)) = "" And _ Trim(Entrada(2)) = "" And _ Trim(Entrada(5)) = "" And _ Trim(Entrada(6)) = "" And _ Trim(Entrada(8)) = "" Then Preguntacolor = &HC0C0C0 End If If Check1.Value = 0 And Check2.Value = 0 And _ Trim(Entrada(1)) <> "" And _ Trim(Entrada(2)) <> "" And _ Trim(Entrada(5)) <> "" And _ Trim(Entrada(6)) <> "" And _ Trim(Entrada(8)) <> "" Then Preguntacolor = &H80FF80 End If If Preguntacolor = &HC0C0C0 Then vColor = "G" If Preguntacolor = &H80FF80 Then vColor = "V" If Preguntacolor = &HFF& Then vColor = "R" End Function Function GrabarDatosMes() Dim ExisteFichero fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst fProgramacionClima.Seek "=", NombreProgramacion, Right(Str(QueMes + 100), 2), TipoDatos If fProgramacionClima.NoMatch = False Then 'Registro encontrado ExisteFichero = "SI" Else ExisteFichero = "NO" End If If ExisteFichero = "NO" Then fProgramacionClima.AddNew Else 201
  • 202. 7. Anejo 5 fProgramacionClima.Edit End If fProgramacionClima("NombreProgramacion") = NombreProgramacion fProgramacionClima("Fecha") = Right(Str(QueMes + 100), 2) fProgramacionClima("Clima") = TipoDatos fProgramacionClima("Color") = vColor fProgramacionClima("TemperaturaMaxima") = Entrada(1) fProgramacionClima("TemperaturaMinima") = Entrada(2) If Check1.Value = 1 Then fProgramacionClima("HumedadMaxima") = Entrada(3) fProgramacionClima("HumedadMinima") = Entrada(4) Else fProgramacionClima("HumedadMedia") = Entrada(5) End If fProgramacionClima("Viento") = Entrada(6) If Check2.Value = 1 Then fProgramacionClima("RadiacionNeta") = Entrada(7) Else fProgramacionClima("HorasSol") = Entrada(8) End If fProgramacionClima("Lluvia") = Entrada(9) fProgramacionClima("Psicrometro") = "N" If Check1.Value = 1 Then fProgramacionClima("Psicrometro") = "S" End If fProgramacionClima("Radiacion") = "N" If Check2.Value = 1 Then fProgramacionClima("Radiacion") = "S" End If fProgramacionClima.Update End Function Function GrabarDatosdia() Dim ExisteFichero fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst Dim fechar fechar = Trim((Str(Ano) + Right(Str(Mes + 100), 2) + Right(Str(Val(Dia) + 100), 2))) fProgramacionClima.Seek "=", NombreProgramacion, fechar, "D" If fProgramacionClima.NoMatch = False Then 'Registro encontrado ExisteFichero = "SI" Else ExisteFichero = "NO" End If If ExisteFichero = "NO" Then fProgramacionClima.AddNew Else fProgramacionClima.Edit End If fProgramacionClima("NombreProgramacion") = NombreProgramacion fProgramacionClima("Fecha") = fechar fProgramacionClima("Clima") = TipoDatos fProgramacionClima("Color") = vColor fProgramacionClima("TemperaturaMaxima") = Entrada(1) fProgramacionClima("TemperaturaMinima") = Entrada(2) If Check1.Value = 1 Then fProgramacionClima("HumedadMaxima") = Entrada(3) fProgramacionClima("HumedadMinima") = Entrada(4) Else fProgramacionClima("HumedadMedia") = Entrada(5) End If fProgramacionClima("Viento") = Entrada(6) If Check2.Value = 1 Then fProgramacionClima("RadiacionNeta") = Entrada(7) Else fProgramacionClima("HorasSol") = Entrada(8) End If fProgramacionClima("Lluvia") = Entrada(9) fProgramacionClima("Psicrometro") = "N" If Check1.Value = 1 Then fProgramacionClima("Psicrometro") = "S" End If fProgramacionClima("Radiacion") = "N" If Check2.Value = 1 Then 202
  • 203. 7. Anejo 5 fProgramacionClima("Radiacion") = "S" End If fProgramacionClima.Update End Function Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 203
  • 204. 7. Anejo 5 RIEGOS24.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Object ="DBLIST32.OCX" Option Explicit 'Dim Atras Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Tierra(20) Private Sub Form_Load() Indice = 1 Mensajes(1) = "Entra la cantidad de Arena (%)" Mensajes(2) = "Entra la cantidad de Arcilla (%)" Mensajes(3) = "Entra la cantidad de Limo (%)" Mensajes(4) = "Cliquea a la derecha, si quieres escoger textura" Mensajes(5) = "Entra la capacidad de campo (% suelo seco)" Mensajes(6) = "Entra el punto de marchitez(% suelo seco)" Mensajes(7) = "Entra los segundos de latitud del lugar" Mensajes(8) = "Entra la latitud del lugar" Mensajes(9) = "Entra los grados de longitud del lugar" Mensajes(10) = "Entra los minutos de longitud del lugar" Mensajes(11) = "Entra la densidad aparente" Mensajes(13) = "Entra el porcentaje de pendiente" Mensajes(14) = "Entra la infiltración" Mensajes(15) = "Entra el porcentaje de eficiencia en el lavado de sales" Alertas(0) = "" Alertas(1) = "Entra la descripción" Alertas(2) = "Entra el nombre" Alertas(3) = "Entra la población" Alertas(4) = "Entra la provincia" Alertas(5) = "El valor de los grados de latitud van de 0 a 180" Alertas(6) = "El valor de los minutos de latitud van de 0 a 59" Alertas(7) = "El valor de los segundos de latitud van de 0 a 59" Alertas(8) = "El valor de la latitud es N o S" Alertas(9) = "El valor de los grados de longitud van de 0 a 180" Alertas(10) = "El valor de los minutos de longitud van de 0 a 59" Alertas(11) = "El valor de los segundos de longitud van de 0 a 59" Alertas(12) = "El valor de la longitud es E u O" Alertas(13) = "La altitud va de 0 a 3000 metros" Alertas(14) = "El número de cultivos va de 1 5" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 24, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me 204
  • 205. 7. Anejo 5 End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("Arena", Entrada(1)) Call MoverFP("Arcilla", Entrada(2)) Call MoverFP("Limo", Entrada(3)) Call MoverFP("TipoSuelo", Entrada(4)) Call MoverFP("CapacidadCampo", Entrada(5)) Call MoverFP("PuntoMarchitamiento", Entrada(6)) Call MoverFP("AguaDisponible", Entrada(7)) Call MoverFP("PesoSueloSeco", Entrada(8)) Call MoverFP("VolumenSueloSeco", Entrada(9)) Call MoverFP("DensidadReal", Entrada(10)) Call MoverFP("DensidadAparente", Entrada(11)) Call MoverFP("Porosidad", Entrada(12)) Call MoverFP("PendienteTerreno", Entrada(13)) Call MoverFP("TasaInfiltracion", Entrada(14)) Call MoverFP("EficienciaLavado", Entrada(15)) End If End Sub Private Sub GrabarDatos() fProgramacion.Edit fProgramacion("Arena") = Entrada(1).Text fProgramacion("Arcilla") = Entrada(2).Text fProgramacion("Limo") = Entrada(3).Text fProgramacion("TipoSuelo") = Entrada(4).Text fProgramacion("CapacidadCampo") = Entrada(5).Text fProgramacion("PuntoMarchitamiento") = Entrada(6).Text fProgramacion("AguaDisponible") = Entrada(7).Text fProgramacion("PesoSueloSeco") = Entrada(8).Text fProgramacion("VolumenSueloSeco") = Entrada(9).Text fProgramacion("DensidadReal") = Entrada(10).Text fProgramacion("DensidadAparente") = Entrada(11).Text fProgramacion("Porosidad") = Entrada(12).Text fProgramacion("PendienteTerreno") = Entrada(13).Text fProgramacion("TasaInfiltracion") = Entrada(14).Text fProgramacion("EficienciaLavado") = Entrada(15).Text fProgramacion("Pantalla24") = "T" fProgramacion.Update End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Private Sub ComandoLista_Click(Index As Integer) Select Case Index Case 1 ValorTabla = "Texturas" Call CargaDBLista ' (ValorTabla, "Cultivo") End Select Posiciona (1) Indice = 1 End Sub Private Sub CargaDBLista() '(Fichero, Campo) Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM Texturas ORDER BY Textura ;") Set Datos.Recordset = Consulta Datos.Refresh DBLista.ZOrder 0 DBLista.Left = Entrada(4).Left 'Control.Left DBLista.Top = Entrada(4).Top 'Control.Top DBLista.Width = Entrada(4).Width 'Control.Width DBLista.Height = 4000 DBLista.ListField = "Textura" DBLista.Refresh DBLista.Visible = True End Sub Private Sub DBLista_DblClick() Entrada(4).Text = DBLista.Text 205
  • 206. 7. Anejo 5 Entrada(1) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "Arena") Entrada(2) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "Arcilla") Entrada(3) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "Limo") Entrada(8) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "PesoSueloSeco") Entrada(9) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "VolumenSueloSeco") Entrada(11) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "DensidadAparente") Entrada(10) = "2,65" Entrada(15) = LeerFichero("Texturas", "ORDEN", DBLista.Text, "EficienciaLavado") DBLista.Visible = False Posiciona (1) End Sub '***************************************************************************************** Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 1: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 2: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 3: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 4: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "", 50, 0, "S") Case 5: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 6: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 7: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 8: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 2, "S") Case 9: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 2, "S") Case 10: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 2, "S") Case 11: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 0, "S") Case 12: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 13: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 14: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 15: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Comando(5).Visible = True End Select End Sub Function TrataCampo(FormaMe, Index, Campo, Tecla, tipo, Signo, Longitud, Decimales, Cero) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 And Cero <> "S" Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Cero <> "S" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 206
  • 207. 7. Anejo 5 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 15 Then Indice = 0 End If 207
  • 208. 7. Anejo 5 Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 16 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function Comprobacion(FormaMe, Indice, Campo, tipo) Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN > 100 Then MsgBox ("La cifra no puede exceder de 100") Comprobacion = "" End If Case 2 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN > 100 Then MsgBox ("La cifra no puede exceder de 100") Comprobacion = "" End If Case 3 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN > 100 Then MsgBox ("La cifra no puede exceder de 100") Comprobacion = "" End If If Val(Entrada(1)) + Val(Entrada(2)) + Val(Entrada(3)) = 100 Then If Entrada(1) <> "" And Entrada(2) <> "" And Entrada(3) <> "" Then 'ReDim Tierra(7) Tierra(1) = Entrada(1) Tierra(2) = Entrada(2) Tierra(3) = Entrada(3) CalculaTextura Entrada(4) = Tierra(4) Entrada(5) = Tierra(5) Entrada(6) = Tierra(6) Entrada(7) = Tierra(7) Entrada(14).Text = LeerFichero("Texturas", "ORDEN", Entrada(4), "Infiltracion") End If Else MsgBox ("Los 3 porcentajes han de sumar 100") Comprobacion = "" End If Case 5 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" 208
  • 209. 7. Anejo 5 End If Case 6 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" End If Case 10 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" End If If ValorN > 0 Then Tierra(8) = Entrada(8) Tierra(9) = Entrada(9) Tierra(10) = Entrada(10) 'CalculaDensidadPorosidad Entrada(11) = Tierra(11) Entrada(12) = Tierra(12) End If Case 11 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" End If Case 13 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" Else 'Tierra(13) = Entrada(13) 'CalculaDisminucionInfiltracion 'Entrada(14) = Tierra(14) End If Case 14 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" End If Case 15 ' If Campo = "" Then MsgBox ("Has de entrar algún valor") Comprobacion = "" End If End Select End Function Private Sub CalculaTextura() Dim Are: Are = Val(Tierra(1)) Dim Arc: Arc = Val(Tierra(2)) Dim Lim: Lim = Val(Tierra(3)) Dim Textura If Lim >= 80 And Are <= 12 Then Textura = "LIMOSO" If (Lim >= 50 And Lim <= 80 And Are <= 50 And Arc <= 28) Or (Lim >= 80 And Lim <= 92 And Are <= 8 And Arc <= 20 And Arc >= 12) Then Textura = "FRANCO-LIMOSO" If Are >= 22 And Are <= 52 And Arc >= 8 And Arc <= 28 And Lim >= 28 And Lim <= 50 Then Textura = "FRANCO" If Are <= 20 And Arc >= 28 And Arc <= 40 Then Textura = "FRANCO-ARCILLOSO-LIMOSO" If Are >= 20 And Are <= 45 And Arc <= 40 And Arc >= 28 Then Textura = "FRANCO-ARCILLOSO" If Arc >= 40 And Are <= 45 And Lim <= 40 Then Textura = "ARCILLOSO" If Arc >= 45 And Are >= 45 Then Textura = "ARCILLOSO-ARENOSO" If Arc >= 40 And Lim >= 40 Then Textura = "ARCILLOSO-LIMOSO" If Arc >= 20 And Arc <= 35 And Are >= 45 And Lim <= 28 Then Textura = "FRANCO-ARCILLOSO-ARENOSO" If (Are >= 52 And Are <= 85 And Arc <= 20 And Lim >= (-2 * Arc + 30)) Or (Are >= 42 And Are < 52 And Arc <= 8 And Lim <= 50) Then Textura = "FRANCO-ARENOSO" If Are >= 70 And Are <= 90 And Arc <= 15 And Lim >= (-1.5 * Arc + 15) And Lim <= (-2 * Arc + 30) Then Textura = "ARENOSO-FRANCO" If Are >= 85 And Arc <= 10 And Lim <= (-1.5 * Arc + 15) Then Textura = "ARENOSO" Tierra(4) = Textura Tierra(5) = Int((0.48 * Arc) + (0.162 * Lim) + (0.023 * Are) + 2.62) Tierra(6) = Int((0.302 * Arc) + (0.102 * Lim) + (0.0147 * Are)) Tierra(7) = Int(Tierra(5) - Tierra(6)) End Sub Private Sub CalculaDensidadPorosidad() Dim PSS: PSS = Tierra(8) Dim VSS: VSS = Tierra(9) 209
  • 210. 7. Anejo 5 Dim dr As Double: dr = CDbl(Tierra(10)) Dim Da As Double Tierra(11) = Format((CDbl(PSS) / CDbl(VSS)), "####0.00") Da = CDbl(Tierra(11)) Tierra(12) = Format(((dr - Da) / dr) * 100, "##0") End Sub Private Sub CalculaDisminucionInfiltracion() Dim Pendiente: Pendiente = Tierra(13) Dim Disminucion If Val(Pendiente) >= 0 And Val(Pendiente) <= 5 Then Disminucion = 0 If Val(Pendiente) > 5 And Val(Pendiente) <= 8 Then Disminucion = 20 If Val(Pendiente) > 8 And Val(Pendiente) <= 12 Then Disminucion = 40 If Val(Pendiente) > 12 And Val(Pendiente) <= 20 Then Disminucion = 60 If Val(Pendiente) > 20 And Val(Pendiente) <= 100 Then Disminucion = 75 'Tierra(14) = Tierra(1) - (Tierra(14) * (Format(Disminucion, "##0") / 100)) End Sub Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 210
  • 211. 7. Anejo 5 RIEGOS25.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Option Explicit 'Dim Atras Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Matriz(20) Private Sub Form_Load() Indice = 1 Mensajes(0) = "" Mensajes(1) = "Entra la conductividad del agua de riego" Alertas(0) = "" Alertas(1) = "Entra la descripción" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 25, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("ConductividadElectrica", Entrada(1)) End If End Sub Private Sub GrabarDatos() fProgramacion.Edit fProgramacion("ConductividadElectrica") = Entrada(1).Text fProgramacion("Pantalla25") = "T" fProgramacion.Update End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Function BorraDatos() 'Dim num 'For num = 31 To 41 ' Entrada(num) = "" 'Next num End Function 211
  • 212. 7. Anejo 5 Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 1: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 1, "S") Comando(5).Visible = True End Select End Sub Function TrataCampo(FormaMe, Index, Campo, Tecla, tipo, Signo, Longitud, Decimales, Cero) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Cero <> "S" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else 212
  • 213. 7. Anejo 5 TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 1 Then Indice = 0 End If Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 1 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function Comprobacion(FormaMe, Indice, Campo, tipo) Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 ' 213
  • 214. 7. Anejo 5 If Campo = "" Then MsgBox ("Entra alguna cifra") Comprobacion = "" End If End Select End Function Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 214
  • 215. 7. Anejo 5 RIEGOS26.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Object ="DBLIST32.OCX" Option Explicit Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Matriz(20) Private Sub Form_Load() Indice = 1 Mensajes(1) = "Entra el sistema de riego ó cliquea en opciones ..." Mensajes(2) = "Entra el tipo de riego (L para localizadd ó S para supericie)" Mensajes(3) = "Entra la eficiencia de la aplicación (%)" Mensajes(4) = "Entra el caudal de la instalación" Mensajes(5) = "Entra el porcentaje de área sombreada por el cultivo" Mensajes(6) = "Entra los minutos de latitud del lugar" Mensajes(7) = "Entra los segundos de latitud del lugar" Alertas(0) = "" Alertas(1) = "Entra la descripción" Alertas(2) = "Entra el nombre" Alertas(3) = "Entra la población" Alertas(4) = "Entra la provincia" Alertas(5) = "El valor de los grados de latitud van de 0 a 180" Alertas(6) = "El valor de los minutos de latitud van de 0 a 59" Alertas(7) = "El valor de los segundos de latitud van de 0 a 59" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 26, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("SistemaRiego", Entrada(1)) Call MoverFP("TipoRiego", Entrada(2)) Call MoverFP("EficienciaAplicacion", Entrada(3)) Call MoverFP("CaudalInstalacion", Entrada(4)) Call MoverFP("FraccionAreaSombreada", Entrada(5)) Call MoverFP("NumeroEmisores", Entrada(6)) Call MoverFP("CaudalEmisor", Entrada(7)) 215
  • 216. 7. Anejo 5 Call MoverFP("CoeficienteUniformidad", Entrada(8)) End If If Entrada(2) = "S" Then Entrada(5).Visible = False End Sub Private Sub GrabarDatos() fProgramacion.Edit fProgramacion("SistemaRiego") = UCase(Entrada(1).Text) fProgramacion("TipoRiego") = UCase(Entrada(2).Text) fProgramacion("EficienciaAplicacion") = Entrada(3).Text fProgramacion("CaudalInstalacion") = Entrada(4).Text fProgramacion("FraccionAreaSombreada") = Entrada(5).Text fProgramacion("NumeroEmisores") = Entrada(6).Text fProgramacion("CaudalEmisor") = Entrada(7).Text fProgramacion("CoeficienteUniformidad") = Entrada(8).Text fProgramacion("Pantalla26") = "T" fProgramacion.Update End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Private Sub ComandoLista_Click(Index As Integer) Select Case Index Case 1 ValorTabla = "SistemasRiego" Call CargaDBLista ' (ValorTabla, "Cultivo") End Select Indice = 1 Posiciona (Indice) End Sub Private Sub CargaDBLista() '(Fichero, Campo) Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM SistemasRiego ORDER BY SistemaRiego ;") Set Datos.Recordset = Consulta Datos.Refresh DBLista.ZOrder 0 DBLista.Left = Entrada(1).Left 'Control.Left DBLista.Top = Entrada(1).Top 'Control.Top DBLista.Width = Entrada(1).Width 'Control.Width DBLista.Height = 4000 DBLista.ListField = "SistemaRiego" DBLista.Refresh DBLista.Visible = True End Sub Private Sub DBLista_DblClick() Entrada(1).Text = DBLista.Text Entrada(1) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "SistemaRiego") Entrada(2) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "TipoRiego") Entrada(3) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "EficienciaAplicacion") DBLista.Visible = False Posiciona (1) End Sub Private Sub dblista_click() Entrada(1).Text = DBLista.Text Entrada(1) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "SistemaRiego") Entrada(2) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "TipoRiego") Entrada(3) = LeerFichero("SistemasRiego", "ORDEN", DBLista.Text, "EficienciaAplicacion") DBLista.Visible = False Posiciona (1) End Sub Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Entrada(2) = UCase(Entrada(2)) If UCase(Entrada(2)) = "S" Then Entrada(5).Visible = False Else Entrada(5).Visible = True End If If Index = 4 And Entrada(5).Visible = False Then Comando(5).Visible = True 216
  • 217. 7. Anejo 5 End If If Index = 5 And Entrada(5).Visible = True Then Comando(5).Visible = True End If Select Case Index Case 1: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "N", 50, 0, "S") Case 2: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "A", "N", 1, 0, "S") Case 3: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 4: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 0, "S") Case 5: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 6: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 5, 0, "S") Case 7: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 7, 1, "S") Case 8: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") End Select End Sub Function TrataCampo(FormaMe, Index, Campo, Tecla, tipo, Signo, Longitud, Decimales, Cero) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Cero <> "S" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 217
  • 218. 7. Anejo 5 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 8 Then Indice = 0 End If Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 If Indice > 8 Then Indice = 1 End If Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 9 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function Comprobacion(FormaMe, Indice, Campo, tipo) 218
  • 219. 7. Anejo 5 Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 ' If Campo = "" Then MsgBox ("Entra algún el sistema de riego") Comprobacion = "" End If Case 2 ' If Campo = "" Then MsgBox ("Entra el tipo de riego (L=goteo,aspersion,infiltración S=resto") Comprobacion = "" End If If UCase(Campo) <> "L" And UCase(Campo) <> "S" Then MsgBox ("Entra el tipo de riego (L=goteo,aspersion,infiltración S=resto") Comprobacion = "" End If Case 3 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN < 0 Then MsgBox ("Entra un valor superior a 0") Comprobacion = "" End If If ValorN > 100 Then MsgBox ("La cifra no puede exceder de 100") Comprobacion = "" End If Case 4 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN < 0 Then MsgBox ("Entra un valor superior a 0") Comprobacion = "" End If Case 5 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If If ValorN < 0 Then MsgBox ("Entra un valor superior a 0") Comprobacion = "" End If If ValorN > 100 Then MsgBox ("La cifra no puede exceder de 100") Comprobacion = "" End If End Select End Function Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub 219
  • 220. 7. Anejo 5 RIEGOS27.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" Option Explicit 'Dim Atras Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim Matriz(20) Private Sub Form_Load() Indice = 1 Mensajes(0) = "" Mensajes(1) = "Entra el porcentaje de RFU agotada para emepezar el riego" Mensajes(2) = "Entra el intérvalo de riego Si quires fijarlo. En caso contrario, deja el campo en blanco" Mensajes(3) = "Entra el porcentaje de recarga de la RFU en el riego" Mensajes(5) = "Entra el porcentaje de RFU lleno de agua, al inicio de la programación" Mensajes(6) = "Entra el porcentaje de lluvia efectiva" Mensajes(7) = "Entra la constante de la ecuación" Mensajes(8) = "Entra la constante de la ecuación" Mensajes(9) = "Entra el valor de corte de la lluvia" Mensajes(10) = "Entra la constante de la ecuación" Mensajes(11) = "Entra la constante de la ecuación" Mensajes(12) = "Entra el porcentaje de disminución deseado debido a la conductividad del agua" Alertas(0) = "" Alertas(1) = "Entra la descripción" Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 27, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = Mensajes(1) CargarDatos Posiciona (1) End Sub Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me End Select End Sub Private Sub CargarDatos() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Call MoverFP("NombreProgramacion", Entrada(0)) Call MoverFP("AgotamientoRFU", Entrada(1)) Call MoverFP("IntervaloRiego", Entrada(2)) Call MoverFP("RecargaRFU", Entrada(3)) Call MoverFP("DosisFija", Entrada(4)) Call MoverFP("ReservaInicial", Entrada(5)) Option1 = fProgramacion("Lluvia1") Option2 = fProgramacion("Lluvia2") Option3 = fProgramacion("Lluvia3") 220
  • 221. 7. Anejo 5 Option4 = fProgramacion("Lluvia4") If Option1 = False And Option2 = False And Option3 = False And Option4 = False Then Option1 = True Option1_Click End If If Option1 = True Then Option1 = True Option1_Click End If Call MoverFP("LluviaP", Entrada(6)) Call MoverFP("LluviaA1", Entrada(7)) Call MoverFP("LluviaB1", Entrada(8)) Call MoverFP("LluviaC1", Entrada(9)) Call MoverFP("LluviaA2", Entrada(10)) Call MoverFP("LluviaB2", Entrada(11)) Call MoverFP("RendimientoSal", Entrada(12)) End If End Sub Private Sub GrabarDatos() fProgramacion.Edit fProgramacion("AgotamientoRFU") = Entrada(1).Text fProgramacion("IntervaloRiego") = Entrada(2).Text fProgramacion("RecargaRFU") = Entrada(3).Text fProgramacion("DosisFija") = Entrada(4).Text fProgramacion("ReservaInicial") = Entrada(5).Text fProgramacion("Pantalla27") = "T" fProgramacion("Lluvia1") = Option1.Value fProgramacion("Lluvia2") = Option2.Value fProgramacion("Lluvia3") = Option3.Value fProgramacion("Lluvia4") = Option4.Value fProgramacion("LluviaP") = Entrada(6).Text fProgramacion("LluviaA1") = Entrada(7).Text fProgramacion("LluviaB1") = Entrada(8).Text fProgramacion("LluviaC1") = Entrada(9).Text fProgramacion("LluviaA2") = Entrada(10).Text fProgramacion("LluviaB2") = Entrada(11).Text fProgramacion("RendimientoSal") = Entrada(12).Text fProgramacion.Update End Sub Private Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo)) End Sub Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End If End Sub Private Sub Entrada_KeyPress(Index As Integer, KeyAscii As Integer) Select Case Index Case 1: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 1, "N") Case 2: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 1, "S") Case 3: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 1, "S") Case 4: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 1, "N") Case 5: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 1, "S") Case 6: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 7: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 8: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 9: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 10: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 4, 2, "S") Case 11: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Case 12: KeyAscii = TrataCampo(Me, Index, Entrada(Index).Text, KeyAscii, "N", "N", 3, 0, "S") Comando(5).Visible = True End Select End Sub Function TrataCampo(FormaMe, Index, Campo, Tecla, tipo, Signo, Longitud, Decimales, Cero) As Integer Dim EstaMal Dim EstaMal1 Select Case tipo Case "N" 'Comprobación de Campo Numerico If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla 221
  • 222. 7. Anejo 5 End If If Tecla = 45 And Signo = "S" And Len(Campo) = 0 Then TrataCampo = 45 If Tecla = 8 Then TrataCampo = Tecla If Tecla = 46 Then Tecla = 44 If Tecla = 44 Then TrataCampo = Tecla Dim num For num = 1 To Len(Campo) If Mid(Campo, num, 1) = "," And Tecla = 44 Then TrataCampo = 0 End If Next num If Len(Campo) = 0 And Tecla = 48 And Cero <> "S" Then TrataCampo = 0 End If If Len(Campo) = 1 And Campo = "0" And Cero <> "S" And Tecla = 48 Then TrataCampo = 0 End If If Decimales = 0 And TrataCampo = 46 Then TrataCampo = 0 End If If Decimales > 0 Then Dim Flag Dim CuentaDecimales CuentaDecimales = 0 Flag = False For num = 1 To Len(Campo) If Flag = True Then CuentaDecimales = CuentaDecimales + 1 If Mid(Campo, num, 1) = "." Then Flag = True End If Next num If CuentaDecimales = Decimales Then TrataCampo = 0 End If End If If Len(Campo) = Longitud And TrataCampo <> 8 Then TrataCampo = 0 End If Case "A" 'Tipo Alfanumerico TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 End If Case "F" 'Tipo Fecha If Len(Campo) = 2 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If Len(Campo) = 5 And Tecla <> 45 And Tecla <> 8 And Tecla <> 13 Then Tecla = 0 End If If (Tecla < 48 Or Tecla > 57) And Tecla <> 8 Then TrataCampo = 0 Else TrataCampo = Tecla End If If Tecla = 8 Then TrataCampo = Tecla If Tecla = 45 Then TrataCampo = Tecla If Len(Campo) = Longitud And Tecla <> 8 Then TrataCampo = 0 If Len(Campo) > 8 And (Mid$(Campo, 3, 1) <> "-" Or Mid$(Campo, 6, 1) <> "-") And Tecla <> 8 Then EstaMal = "S" If Tecla = 13 Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "S" End If Else Dim estamal2 EstaMal = "N" End If If Len(Campo) > 0 And Len(Campo) < 10 And Tecla = 13 Then EstaMal = "S" If EstaMal1 <> "S" Then MsgBox ("La fecha es incorrecta. Formato:dd-mm-aaaa") EstaMal1 = "" 222
  • 223. 7. Anejo 5 End If End If End Select If Tecla = 13 Then If EstaMal = "S" Then Posiciona (Indice) Else If Comprobacion(FormaMe, Indice, Campo, tipo) = "OK" Then Call MoverCampo(FormaMe, "AD") Else Posiciona (Indice) End If End If End If If Tecla = 9 Then 'hacia atras If Atras = 1 Then Call MoverCampo(FormaMe, "AT") Else Call MoverCampo(FormaMe, "AD") End If End If End Function Private Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 12 Then Indice = 0 End If Indice = Indice + 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice + 1 If Indice > 12 Then Indice = 0 End If Loop End If If Como = "AT" Then 'atras If Indice - 1 < 1 Then Indice = 13 End If Indice = Indice - 1 Do While Entrada(Indice).Enabled = False Or Entrada(Indice).Visible = False Indice = Indice - 1 Loop End If Posiciona (Indice) Me.Mensaje.Caption = Mensajes(Indice) DoEvents End Sub Function Comprobacion(FormaMe, Indice, Campo, tipo) Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 ' If Campo = "" Then MsgBox ("Entra alguna cifra") Comprobacion = "" End If If ValorN > 200 Then MsgBox ("La cifra no puede exceder de 200") Comprobacion = "" End If Case 2 ' 'If Campo = "" Then ' MsgBox ("Entra algún porcentaje") ' Comprobacion = "" 'End If Case 3 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" 223
  • 224. 7. Anejo 5 End If Case 5 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If Case 6 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If Case 7 ' If Campo = "" Then MsgBox ("Entra algún valor") Comprobacion = "" End If Case 8 ' If Campo = "" Then MsgBox ("Entra algún valor") Comprobacion = "" End If Case 9 ' If Campo = "" Then MsgBox ("Entra algún valor") Comprobacion = "" End If Case 10 ' If Campo = "" Then MsgBox ("Entra algún valor") Comprobacion = "" End If Case 11 ' If Campo = "" Then MsgBox ("Entra algún valor") Comprobacion = "" End If Case 12 ' If Campo = "" Then MsgBox ("Entra algún porcentaje") Comprobacion = "" End If End Select End Function Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub Private Sub Option1_Click() apagaP Label(6).Visible = True Entrada(6).Visible = True Posiciona (1) End Sub Private Sub Option2_Click() apagaP Label(7).Visible = True Label(8).Visible = True Posiciona (1) End Sub Private Sub Option3_Click() apagaP Label(9).Visible = True Label(10).Visible = True Posiciona (1) End Sub Private Sub Option4_Click() apagaP Label(11).Visible = True Label(12).Visible = True Label(13).Visible = True Label(15).Visible = True Entrada(7).Visible = True 224
  • 225. 7. Anejo 5 Entrada(8).Visible = True Entrada(9).Visible = True Entrada(10).Visible = True Entrada(11).Visible = True Posiciona (1) End Sub Function apagaP() Label(6).Visible = False Entrada(6).Visible = False Label(7).Visible = False Label(8).Visible = False Label(9).Visible = False Label(10).Visible = False Label(11).Visible = False Label(12).Visible = False Label(13).Visible = False Label(15).Visible = False Entrada(7).Visible = False Entrada(8).Visible = False Entrada(9).Visible = False Entrada(10).Visible = False Entrada(11).Visible = False Posiciona (1) End Function 225
  • 226. 7. Anejo 5 RIEGOS31.FRM ' Víctor Yusta. Dicembre-1998 Object ="THREED32.OCX" 'Option Explicit Dim Mensajes(41) As String Dim Alertas(41) As String Dim ValorControl As Control Dim ValorTabla As String Dim DiasMes(12) As Integer Dim DiaPeso(12) As Integer Dim Datos(12) As Double Dim Indice As Integer Dim Atras As Integer Dim Campos(41) As String Dim ExisteFichero As String Dim QueMes Dim vColor Dim FechaPlantacion As String * 8 Dim MatrizCalculo(40) As String ' del 1 al 20 datos, del 21 al 40 resultados Dim ReservaInicial As Double Dim InicioRiego As String Dim Cuenta Dim Primero As String Dim Tabu Private Sub Form_Load() Tabu = vbTab Cuenta = 0 ReservaInicial = 0 InicioRiego = "00" 'CC a capacidad de campo, 00 con las reservas a 0 Primero = "SI" Call CargaDiasMes Call CargaPantalla(Me) BaseDatos Me.Caption = LeerFichero("Menu", "Orden", 31, "Titulo") + " " + NombreProgramacion Call DibujaMensaje(Me) Call DibujaPanelComandos(Me) Show Entrada(0).Text = NombreProgramacion Mensaje.Caption = "Escoge una opción" 'Pulsa la tecla de Cálculo" Call AnalizaDatos End Sub Private Sub AnalizaDatos() Dim Falta As String Dim Sortir: Sortir = "NO" fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado If Trim(NoNulo(fProgramacion("Pantalla21"))) = "" And Sortir = "NO" Then Falta = " Faltan datos de la finca " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla22"))) = "" And Sortir = "NO" Then Falta = " Faltan datos del cultivo " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla23"))) = "" And Sortir = "NO" Then Falta = " Faltan datos climáticos " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla24"))) = "" And Sortir = "NO" Then Falta = " Faltan datos del suelo " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla25"))) = "" And Sortir = "NO" Then Falta = " Faltan datos del agua de riego " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla26"))) = "" And Sortir = "NO" Then Falta = " Faltan datos del tipo de riego " GoSub SalidaFalta End If If Trim(NoNulo(fProgramacion("Pantalla27"))) = "" And Sortir = "NO" Then 226
  • 227. 7. Anejo 5 Falta = " Faltan datos de rpogramación del riego" GoSub SalidaFalta End If If Sortir = "NO" Then If fProgramacion("Pantalla21") = "C" And _ fProgramacion("Pantalla22") = "C" And _ fProgramacion("Pantalla23") = "C" And _ fProgramacion("Pantalla24") = "C" And _ fProgramacion("Pantalla25") = "C" And _ fProgramacion("Pantalla26") = "C" And _ fProgramacion("Pantalla27") = "C" Then Call MostrarInformacion1 Call MostrarInformacion2 Else EmpiezaACalcular Call CursorLibre(Me) End If Else Salir End If End If Exit Sub SalidaFalta: MsgBox (Falta) Sortir = "SI" Return End Sub Private Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir End Select End Sub Function CargaDiasMes() ' Se ha puesto un año no bisiesto DiasMes(1) = 31 DiasMes(2) = 28 DiasMes(3) = 31 DiasMes(4) = 30 DiasMes(5) = 31 DiasMes(6) = 30 DiasMes(7) = 31 DiasMes(8) = 31 DiasMes(9) = 30 DiasMes(10) = 31 DiasMes(11) = 30 DiasMes(12) = 31 DiaPeso(1) = 15 DiaPeso(2) = 46 DiaPeso(3) = 74 DiaPeso(4) = 105 DiaPeso(5) = 135 DiaPeso(6) = 166 DiaPeso(7) = 196 DiaPeso(8) = 227 DiaPeso(9) = 258 DiaPeso(10) = 288 DiaPeso(11) = 319 DiaPeso(12) = 349 End Function Private Sub Form_Unload(Cancel As Integer) Salir End Sub Private Sub Salir() Unload Me Load Riegos End Sub Private Sub EmpiezaACalcular() Call CursorOcupado(Me) DoEvents Mensaje.Caption = "ESPERA un momento" fProgramacion.Index = "Programacion" fProgramacion.MoveFirst 227
  • 228. 7. Anejo 5 fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim vTipo Dim vClima vTipo = fProgramacion("Tipo") vClima = fProgramacion("Clima") Dim nnn nnn = fProgramacion("FechaPlantacion") FechaPlantacion = Mid(nnn, 7, 4) + Mid(nnn, 4, 2) + Mid(nnn, 1, 2) If vClima = "M" Then CalculaMensual End If If vClima = "D" Then CalculaDiario End If End If fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado fProgramacion.Edit fProgramacion("Pantalla21") = "C" fProgramacion("Pantalla22") = "C" fProgramacion("Pantalla23") = "C" fProgramacion("Pantalla24") = "C" fProgramacion("Pantalla25") = "C" fProgramacion("Pantalla26") = "C" fProgramacion("Pantalla27") = "C" fProgramacion.Update End If DoEvents Call MostrarInformacion1 Call MostrarInformacion2 Mensaje.Caption = "YA ESTÁ" 'Parrilla.Visible = True End Sub Private Function CalculaDiario() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim vTipo As String Dim vClima As String Dim vLatitud As Double Dim vAltitud As Double Dim cFechaPlantacion Dim cFechaFinal vTipo = fProgramacion("Tipo") vClima = fProgramacion("Clima") vLatitud = fProgramacion("LatitudGrados") + (fProgramacion("LatitudGrados") / 60) + (fProgramacion("LatitudGrados") / 3600) vAltitud = fProgramacion("Altitud") cFechaPlantacion = Mid(fProgramacion("FechaPlantacion"), 7, 4) + Mid(fProgramacion("FechaPlantacion"), 4, 2) + Mid(fProgramacion("FechaPlantacion"), 1, 2) 'cFechaFinal = Consulta Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM ProgramacionClima WHERE NombreProgramacion = '" & NombreProgramacion & "' and Clima = '" & "D" & "' ORDER BY Fecha ;") If Consulta.RecordCount <> 0 Then Consulta.MoveFirst While Not Consulta.EOF Call GrabarDatosDiarios(Consulta("Fecha"), "TemperaturaMaxima", Consulta("TemperaturaMaxima"), 4) Call GrabarDatosDiarios(Consulta("Fecha"), "TemperaturaMinima", Consulta("TemperaturaMinima"), 4) Call GrabarDatosDiarios(Consulta("Fecha"), "HumedadMaxima", Consulta("HumedadMaxima"), 3) Call GrabarDatosDiarios(Consulta("Fecha"), "HumedadMinima", Consulta("HumedadMinima"), 3) Call GrabarDatosDiarios(Consulta("Fecha"), "HumedadMedia", Consulta("HumedadMedia"), 3) Call GrabarDatosDiarios(Consulta("Fecha"), "Viento", Consulta("Viento"), 3) Call GrabarDatosDiarios(Consulta("Fecha"), "RadiacionNeta", Consulta("RadiacionNeta"), 5) Call GrabarDatosDiarios(Consulta("Fecha"), "HorasSol", Consulta("HorasSol"), 4) Call GrabarDatosDiarios(Consulta("Fecha"), "Lluvia", Consulta("Lluvia"), 6) Call GrabarDatosDiarios(Consulta("Fecha"), "Radiacion", Consulta("Radiacion"), 1) Call GrabarDatosDiarios(Consulta("Fecha"), "Psicrometro", Consulta("Psicrometro"), 1) Consulta.MoveNext 228
  • 229. 7. Anejo 5 Wend End If Call CalculoBalanceHidrico(vTipo, vClima, vLatitud, vAltitud) End If End Function Function GrabarDatosDiarios(Fecha, Campo, Valor, Longitud) fBalanceHidrico.Index = "PROGRAMACION" fBalanceHidrico.MoveFirst fBalanceHidrico.Seek "=", NombreProgramacion, Fecha, "D" If fBalanceHidrico.NoMatch = False Then 'Registro encontrado fBalanceHidrico.Edit Else fBalanceHidrico.AddNew End If fBalanceHidrico("NombreProgramacion") = NombreProgramacion fBalanceHidrico("Fecha") = Fecha fBalanceHidrico("Clima") = "D" fBalanceHidrico(Campo) = Valor fBalanceHidrico.Update End Function Private Function CalculaMensual() fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim vTipo As String Dim vClima As String Dim vLatitud As Double Dim vAltitud As Double vTipo = fProgramacion("Tipo") vClima = fProgramacion("Clima") vLatitud = fProgramacion("LatitudGrados") + (fProgramacion("LatitudGrados") / 60) + (fProgramacion("LatitudGrados") / 3600) vAltitud = fProgramacion("Altitud") Call CargaDatosEstimacion(NombreProgramacion, vClima, "TemperaturaMaxima", 4, "N", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "TemperaturaMinima", 4, "N", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "HumedadMedia", 3, "S", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "HumedadMaxima", 3, "S", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "HumedadMinima", 3, "S", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "Viento", 3, "S", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "RadiacionNeta", 5, "N", "M") Call CargaDatosEstimacion(NombreProgramacion, vClima, "HorasSol", 4, "N", "D") Call CargaDatosEstimacion(NombreProgramacion, vClima, "Lluvia", 6, "N", "M") Call CalculoBalanceHidrico(vTipo, vClima, vLatitud, vAltitud) End If End Function Function CargaDatosEstimacion(NombreProgramacion, vClima, Campo, Longitud, Entero, Mensual) Dim num Dim NumAlfa For num = 1 To 12 NumAlfa = Right(Str(num + 100), 2) fProgramacionClima.Index = "PROGRAMACION" fProgramacionClima.MoveFirst fProgramacionClima.Seek "=", NombreProgramacion, NumAlfa, "M" If fProgramacionClima.NoMatch = False Then 'Registro encontrado Dim vPsicrometro Dim vRadiacion vPsicrometro = fProgramacionClima("Psicrometro") vRadiacion = fProgramacionClima("Radiacion") If Mensual = "M" Then Datos(num) = CarNum(Trim(fProgramacionClima(Campo))) / DiasMes(num) Else Datos(num) = (CarNum(NoNulo(Trim(fProgramacionClima(Campo))))) End If If Entero = "S" Then Datos(num) = Int(Datos(num)) End If Next num Call CalculaDatosEstimacion(NombreProgramacion, vClima, Campo, Longitud, vPsicrometro, vRadiacion) End Function Function CalculaDatosEstimacion(NombreProgramacion, vClima, Campo, Longitud, vPsicrometro, vRadiacion) Dim DesdeDia Dim HastaDia Dim DesdeValor 229
  • 230. 7. Anejo 5 Dim HastaValor Dim Valor As Double: Valor = 0 Dim num As Double For num = 1 To 365 'ESTO SIRVE PARA EL CASO QUE SE QUIERA IGUALAR LOS DATOS DEL MES A LOS DIAS DEL MES 'Dim num1 'For num1 = 1 To 12 'If Val(Left(MesDia(num), 2)) = num1 Then Valor = Datos(Val(Left(MesDia(num), 2))) 'End If 'Next num1 'ESTO SIRVE EN EL CASO QUE SE QUIERA BALANCEAR LOS DATOS 'If num >= 1 And num <= DiaPeso(1) Then ' DesdeDia = -16 ' DiaPeso(12) ' HastaDia = DiaPeso(1) ' DesdeValor = Datos(12) ' HastaValor = Datos(1) ' Valor = ((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * num + (DesdeValor - (((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * DesdeDia)) 'End If 'Dim Num1 'For Num1 = 1 To 11 ' If num > DiaPeso(Num1) And num <= DiaPeso(Num1 + 1) Then ' DesdeDia = DiaPeso(Num1) ' HastaDia = DiaPeso(Num1 + 1) ' DesdeValor = Datos(Num1) ' HastaValor = Datos(Num1 + 1) ' Valor = ((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * num + (DesdeValor - (((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * DesdeDia)) ' End If 'Next Num1 'If num > DiaPeso(12) And num <= 365 Then ' DesdeDia = DiaPeso(12) ' HastaDia = 380 ' DesdeValor = Datos(1) ' HastaValor = Datos(12) ' Valor = ((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * num + (DesdeValor - (((HastaValor - DesdeValor) / (HastaDia - DesdeDia)) * DesdeDia)) 'End If 'GRABACION DE DATOS fBalanceHidrico.Index = "PROGRAMACION" fBalanceHidrico.MoveFirst Dim NumAlfa As String NumAlfa = NumCar(num) fBalanceHidrico.Seek "=", NombreProgramacion, "1998" + MesDia(num), "M" If fBalanceHidrico.NoMatch = False Then 'Registro encontrado fBalanceHidrico.Edit Else fBalanceHidrico.AddNew End If fBalanceHidrico("NombreProgramacion") = NombreProgramacion fBalanceHidrico("Fecha") = "1998" + MesDia(num) fBalanceHidrico("Clima") = "M" fBalanceHidrico("Psicrometro") = vPsicrometro fBalanceHidrico("Radiacion") = vRadiacion fBalanceHidrico(Campo) = Left(NumCar(Valor), Longitud) fBalanceHidrico.Update Next num End Function Private Sub CalculoBalanceHidrico(vTipo As String, vClima As String, vLatitud As Double, vAltitud As Double) Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM BalanceHidrico WHERE NombreProgramacion= '" & NombreProgramacion & "' and Clima= '" & vClima & "' ORDER BY Fecha ;") Consulta.MoveFirst If Consulta.RecordCount <> 0 Then Consulta.MoveFirst While Not Consulta.EOF Dim vFecha As String vFecha = Right(Trim(Consulta("Fecha")), 4) Dim vNumDia As Integer vNumDia = DiaDelAno(vFecha) Dim vTMax As Double vTMax = CarNum(Trim(Consulta("TemperaturaMaxima"))) 230
  • 231. 7. Anejo 5 Dim vTmin As Double vTmin = CarNum(Trim(Consulta("TemperaturaMinima"))) Dim vHRMaxima As Double vHRMaxima = CarNum(Trim(NoNulo(Consulta("HumedadMaxima")))) Dim vHRMinima As Double vHRMinima = CarNum(Trim(NoNulo(Consulta("HumedadMinima")))) Dim vHRMedia As Double vHRMedia = CarNum(Trim(NoNulo(Consulta("HumedadMedia")))) Dim vVientoDia As Double vVientoDia = CarNum(Trim(Consulta("Viento"))) Dim vHorasSol As Double vHorasSol = CarNum(Trim(NoNulo(Consulta("HorasSol")))) Dim vPsicrometro As String vPsicrometro = Consulta("Psicrometro") Dim vRadiacion As String vRadiacion = Consulta("Radiacion") Dim vRadiacionNeta As Double vRadiacionNeta = CarNum(Trim(NoNulo(Consulta("RadiacionNeta")))) Consulta.Edit Dim nETo As Double nETo = NumCar(CalculavETo(vLatitud, vAltitud, vNumDia, vTMax, vTmin, vHRMaxima, vHRMinima, vHRMedia, vVientoDia, vRadiacionNeta, vHorasSol, vRadiacion, vPsicrometro)) Consulta("ETo") = Left(nETo, 5) ' meter condicional de Kc4 If (vTipo = "A" Or vTipo = "B" Or vTipo = "D") Then Consulta("DiasCultivo") = DiferenciaFechas(FechaPlantacion, Consulta("Fecha")) Consulta("Kc") = Left(NumCar(CalculaKc4(nETo, Consulta("DiasCultivo"))), 4) Consulta("Raices") = Left(NumCar(CalculaRaices4(Consulta("DiasCultivo"))), 3) Else Consulta("DiasCultivo") = DiferenciaFechas(FechaPlantacion, Consulta("Fecha")) Consulta("Kc") = Left(NumCar(CalculaKc12(vFecha)), 4) Consulta("Raices") = Left(NumCar(CalculaRaices12), 3) End If Dim nKl As Double nKl = NumCar(CalculaKl()) Consulta("Kl") = Left(nKl, 4) Consulta("ETc") = Left(NumCar(CarNum(Consulta("ETo")) * CarNum(Consulta("Kc")) * CarNum(Consulta("Kl"))), 5) Consulta("Fraccion") = Left(NumCar(CalculaFraccion(Consulta("ETc"))), 4) Consulta("LluviaEfectiva") = Left(NumCar(CalculaLluviaEfectiva(Consulta("Lluvia"))), 4) MatrizCalculo(1) = Consulta("Etc") MatrizCalculo(2) = NoNulo(Consulta("LluviaEfectiva")) MatrizCalculo(3) = NoNulo(Consulta("AporteCapilar")) MatrizCalculo(4) = NoNulo(Consulta("Escorrentia")) MatrizCalculo(5) = NoNulo(Consulta("Raices")) MatrizCalculo(6) = NoNulo(Consulta("Fraccion")) MatrizCalculo(7) = NoNulo(Consulta("Reserva")) MatrizCalculo(8) = Consulta("Fecha") CalculaMatrizCalculo Consulta("RfuMaxima") = MatrizCalculo(21) Consulta("RfuMinima") = MatrizCalculo(22) Consulta("Reserva") = MatrizCalculo(23) Consulta("DosisNeta") = MatrizCalculo(24) Consulta("TipoRiego") = MatrizCalculo(25) Consulta("EficienciaAplicacion") = MatrizCalculo(26) Consulta("Lavado") = MatrizCalculo(27) Consulta("EficienciaLavado") = MatrizCalculo(28) Consulta("DosisBruta") = MatrizCalculo(29) Consulta("CC") = MatrizCalculo(31) Consulta("PM") = MatrizCalculo(32) Consulta("DensidadAparente") = MatrizCalculo(33) Consulta("AguaUtil") = MatrizCalculo(34) Consulta("DosisBrutaTotal") = MatrizCalculo(35) Consulta("Tiempo1") = MatrizCalculo(36) Consulta("Tiempo2") = MatrizCalculo(37) Consulta("Notas") = MatrizCalculo(38) Consulta.Update Consulta.MoveNext Wend End If End Sub Private Function CalculaKl() As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst 231
  • 232. 7. Anejo 5 fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim nArea As Double If CarNum(fProgramacion("FraccionAreaSombreada")) <> 0 Then nArea = CarNum(fProgramacion("FraccionAreaSombreada")) / 100 Else nArea = 1 End If If fProgramacion("TipoRiego") <> "L" Then nArea = 1 End If Dim Suma As Double: Suma = 0 Dim Mayor As Double: Mayor = 0 Dim Menor As Double: Menor = 9999 Dim Fml1 As Double: Fml1 = 1.34 * nArea Dim Fml2 As Double: Fml2 = 0.1 * nArea Dim Fml3 As Double: Fml3 = (0.5 * nArea) + 0.5 Dim Fml4 As Double: Fml4 = (0.85 * nArea) + 0.15 If Fml1 > Mayor Then Mayor = Fml1 If Fml2 > Mayor Then Mayor = Fml2 If Fml3 > Mayor Then Mayor = Fml3 If Fml4 > Mayor Then Mayor = Fml4 If Fml1 < Menor Then Menor = Fml1 If Fml2 < Menor Then Menor = Fml2 If Fml3 < Menor Then Menor = Fml3 If Fml4 < Menor Then Menor = Fml4 If Fml1 <> Mayor And Fml1 <> Menor Then Suma = Suma + Fml1 End If If Fml2 <> Mayor And Fml2 <> Menor Then Suma = Suma + Fml2 End If If Fml3 <> Mayor And Fml3 <> Menor Then Suma = Suma + Fml3 End If If Fml4 <> Mayor And Fml4 <> Menor Then Suma = Suma + Fml4 End If CalculaKl = Suma / 2 End If End Function Private Function CalculavETo(Latitud As Double, Altitud As Double, NumDia As Integer, TMax As Double, TMin As Double, HRMax As Double, HRMin As Double, HRMedia As Double, VientoDia As Double, ERadN As Double, vHorasSol As Double, vRadiacion As String, vPsicrometro As String) As Double ' definicion variables Dim WST As Double Dim Emisividad As Double Dim G As Double Dim sigma As Double Dim Rads As Double Dim fnN As Double Dim nN As Double Dim n As Double Dim AngHor As Double Dim YY As Double Dim XX As Double Dim LatRad As Double Dim Decli As Double Dim dr As Double Dim Albedo 'Dim Altitud As Double 'Dim TMin As Double 'Dim TMax As Double Dim ETaero As Double Dim gamma As Double Dim gammaast As Double Dim delta As Double Dim t As Double Dim U2 As Double Dim eaMin As Double Dim eaMax As Double Dim ea As Double Dim edTmin As Double 232
  • 233. 7. Anejo 5 ' ' ' ' ' Dim edTmax As Double Dim ed As Double Dim Presion As Double Dim landa As Double Dim Vientodia As Double Dim VientoSeg As Double Dim HrMedia As Double Dim HRMin As Double Dim HrMax As Double Dim rc As Double Dim LAI As Double Dim AlturaCultivo As Double Dim ra As Double Dim d As Double Dim Zom As Double Dim HorasSol As Double Dim Rada As Double Dim Radn As Double Dim Radns As Double Dim Radnl As Double 'Dim NumDia As Double 'Dim Latitud As Double Dim ETrad As Double Dim vETo As Double 'Dim ERadN As Double: ERadN = 0 'Entradas 'Altitud = 35 'Latitud = 40.558 'TMax = 26.5 'TMin = 23.1 'HrMax = 69.7 'HrMin = 69.7 'HRMedia = 69.7 'VientoDia = 181 HorasSol = 8.4 'ERadN = 2.8 NumDia = 213 '15-7-1998 Albedo = 0.23 AlturaCultivo = 0.12 'Calculos t = (TMax + TMin) / 2 U2 = VientoDia / 86.4 Presion = (101.3) * ((293 - (0.0065 * Altitud)) / (293)) ^ 5.253 eaMin = 0.6108 * Exp((17.27 * TMin) / (TMin + 237.3)) eaMax = 0.6108 * Exp((17.27 * TMax) / (TMax + 237.3)) ea = (eaMin + eaMax) / 2 'ea = 0.6108 * Exp((17.27 * T) / (T + 237.3)) '(eaMin + eaMax) / 2 If vPsicrometro = "N" Then 'con Humedad Relativa Media ed = (HRMedia) / ((50 / eaMin) + (50 / eaMax)) HRMin = (ed / eaMax) * 100 Else ''Con humedades relativas maximas y minimas ed = (eaMin * HRMax) / 200 + (eaMax * HRMin) / 200 End If landa = 2.501 - (0.002361 * (t)) LAI = 24 * AlturaCultivo rc = 200 / LAI d = (2 * AlturaCultivo) / 3 Zom = 0.123 * AlturaCultivo If U2 = 0 Then U2 = 1 ra = (Log((2 - d) / (Zom)) * Log((1.9 - d) / (0.1 * Zom)) / (0.41 * 0.41 * U2)) gamma = 0.0016286 * (Presion / landa) gammaast = gamma * (1 + (rc / ra)) delta = (4098 * ea) / (t + 237.3) ^ 2 WST = (gamma / (delta + gammaast)) ETaero = (gamma / (delta + gammaast)) * (900 / (t + 273)) * U2 * (ea - ed) dr = (1 + 0.033 * Cos((2 * Pi / 365) * NumDia)) Decli = 0.4093 * Sin(((2 * Pi * NumDia) / 365) - 1.39) LatRad = Latitud * (Pi / 180) XX = Sin(Decli) * Sin(LatRad) YY = Cos(Decli) * Cos(LatRad) AngHor = ArcoCosenoRad(-1 * Tan(LatRad) * Tan(Decli)) 233
  • 234. 7. Anejo 5 Rada = 37.586 * dr * ((AngHor * XX) + (YY * Sin(AngHor))) n = (24 * AngHor) / Pi nN = HorasSol / n Rads = Rada * (0.25 + 0.5 * nN) Radns = (1 - Albedo) * Rads fnN = 0.1 + (0.9 * nN) sigma = 0.00000000245 * ((TMax + 273.16) ^ 4 + (TMin + 273.16) ^ 4) Emisividad = 0.34 + (Sqr(ed) * -0.139) Radnl = sigma * fnN * Emisividad If vRadiacion = "N" Then Radn = Radns - Radnl Else Radn = ERadN End If G=0 ETrad = (delta / (delta + gammaast)) * (Radn / landa) vETo = ETaero + ETrad CalculavETo = vETo End Function Private Function CalculaKc12(vFecha) As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado CalculaKc12 = CarNum(NoNulo(fProgramacion("Kc" + (Left(vFecha, 2))))) End If End Function Private Function CalculaRaices12() As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado CalculaRaices12 = fProgramacion("Raices") End If End Function Private Function CalculaKc4(nETo As Double, cDiaCultivo) As Double Dim nDiaCultivo As Double: nDiaCultivo = Val(cDiaCultivo) fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim nIntervaloDeRiego As Double: nIntervaloRiego = 0 nIntervaloDeRiego = CarNum(fProgramacion("IntervaloRiego")) Dim vKcI As String Dim vKcM As String Dim vKcF As String Dim nKcI As Double Dim nKcM As Double Dim nKcF As Double Dim vDiasI As String Dim vDiasD As String Dim vDiasM As String Dim vDiasF As String Dim nDiasI As Double Dim nDiasD As Double Dim nDiasM As Double Dim nDiasF As Double vKcI = fProgramacion("KcI") vKcM = fProgramacion("KcM") vKcF = fProgramacion("KcF") vDiasI = fProgramacion("DiasI") vDiasD = fProgramacion("DiasD") vDiasM = fProgramacion("DiasM") vDiasF = fProgramacion("DiasF") If RTrim(vKcI) = "*" Or RTrim(vKcI) = "" Then nKcI = KcInicial(nIntervaloDeRiego, nETo) Else nKcI = CarNum(vKcI) End If nKcM = CarNum(vKcM) nKcF = CarNum(vKcF) nDiasI = CarNum(vDiasI) nDiasD = CarNum(vDiasD) 234
  • 235. 7. Anejo 5 nDiasM = CarNum(vDiasM) nDiasF = CarNum(vDiasF) CalculaKc4 = 0 Dim Valor As Double If nDiaCultivo > 0 And nDiaCultivo <= nDiasI Then Valor = nKcI End If If nDiaCultivo > nDiasI And nDiaCultivo <= nDiasI + nDiasD Then Valor = EstimacionKc4(nKcI, nKcM, nDiasD, nDiaCultivo - nDiasI) End If If nDiaCultivo > nDiasI + nDiasD And nDiaCultivo <= nDiasI + nDiasD + nDiasM Then Valor = nKcM End If If nDiaCultivo > nDiasI + nDiasD + nDiasM And nDiaCultivo <= nDiasI + nDiasD + nDiasM + nDiasF Then Valor = EstimacionKc4(nKcM, nKcF, nDiasF, nDiaCultivo - (nDiasI + nDiasD + nDiasM)) End If CalculaKc4 = Valor End If End Function Function KcInicial(vFrecuenciaRiego As Double, nETo As Double) As Double If vFrecuenciaRiego = 0 Then vFrecuenciaRiego = 7 If vFrecuenciaRiego = 1 Then vFrecuenciaRiego = 2 If vFrecuenciaRiego > 20 Then vFrecuenciaRiego = 20 Dim Kc(20) Dim vMaxima Dim vMinima If vFrecuenciaRiego = 2 Then vMinima = 2: vMaxima = 2 If vFrecuenciaRiego = 3 Then vMinima = 2: vMaxima = 4 If vFrecuenciaRiego = 4 Then vMinima = 4: vMaxima = 4 If vFrecuenciaRiego = 5 Then vMinima = 4: vMaxima = 7 If vFrecuenciaRiego = 6 Then vMinima = 4: vMaxima = 7 If vFrecuenciaRiego = 7 Then vMinima = 7: vMaxima = 7 If vFrecuenciaRiego = 8 Then vMinima = 7: vMaxima = 10 If vFrecuenciaRiego = 9 Then vMinima = 7: vMaxima = 10 If vFrecuenciaRiego = 10 Then vMinima = 10: vMaxima = 10 If vFrecuenciaRiego = 11 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 12 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 13 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 14 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 15 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 16 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 17 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 18 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 19 Then vMinima = 10: vMaxima = 20 If vFrecuenciaRiego = 20 Then vMinima = 20: vMaxima = 20 Kc(2) = (0.0025 * nETo * nETo) - (0.0588 * nETo) + 1.1068 Kc(4) = (0.0043 * nETo * nETo) - (0.097 * nETo) + 1.0403 Kc(7) = (0.0053 * nETo * nETo) - (0.1049 * nETo) + 0.8502 Kc(10) = (0.0053 * nETo * nETo) - (0.1009 * nETo) + 0.6915 Kc(20) = (0.0046 * nETo * nETo) - (0.0824 * nETo) + 0.52 If vMaxima <> vMinima Then KcInicial = Kc(vMaxima) + ((vFrecuenciaRiego - vMinima) * ((Kc(vMinima) - Kc(vMaxima)) / (vMaxima - vMinima))) Else KcInicial = Kc(vMaxima) End If End Function Function EstimacionKc4(vKc1 As Double, vKc2 As Double, Vdias As Double, Vdia As Double) As Double EstimacionKc4 = vKc1 + (((vKc2 - vKc1) / Vdias) * Vdia) End Function Private Function CalculaRaices4(cDiaCultivo) As Double Dim nDiaCultivo As Double: nDiaCultivo = Val(cDiaCultivo) fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Dim vRaicesI As String Dim vRaicesM As String Dim vRaicesF As String Dim nRaicesI As Double Dim nRaicesM As Double Dim nRaicesF As Double Dim vDiasI As String Dim vDiasD As String 235
  • 236. 7. Anejo 5 Dim vDiasM As String Dim vDiasF As String Dim nDiasI As Double Dim nDiasD As Double Dim nDiasM As Double Dim nDiasF As Double vRaicesI = fProgramacion("RaicesI") vRaicesM = fProgramacion("RaicesM") vRaicesF = fProgramacion("RaicesF") vDiasI = fProgramacion("DiasI") vDiasD = fProgramacion("DiasD") vDiasM = fProgramacion("DiasM") vDiasF = fProgramacion("DiasF") nRaicesI = CarNum(vRaicesI) nRaicesM = CarNum(vRaicesM) nRaicesF = CarNum(vRaicesF) nDiasI = CarNum(vDiasI) nDiasD = CarNum(vDiasD) nDiasM = CarNum(vDiasM) nDiasF = CarNum(vDiasF) CalculaRaices4 = 0 Dim Valor As Double If nDiaCultivo > 0 And nDiaCultivo <= nDiasI Then Valor = nRaicesI End If If nDiaCultivo > nDiasI And nDiaCultivo <= nDiasI + nDiasD Then Valor = EstimacionRaices4(nRaicesI, nRaicesM, nDiasD, nDiaCultivo - nDiasI) End If If nDiaCultivo > nDiasI + nDiasD And nDiaCultivo <= nDiasI + nDiasD + nDiasM Then Valor = nRaicesM End If If nDiaCultivo > nDiasI + nDiasD + nDiasM And nDiaCultivo <= nDiasI + nDiasD + nDiasM + nDiasF Then Valor = EstimacionRaices4(nRaicesM, nRaicesF, nDiasF, nDiaCultivo - (nDiasI + nDiasD + nDiasM)) End If CalculaRaices4 = Valor End If End Function Function EstimacionRaices4(vRaices1 As Double, vRaices2 As Double, Vdias As Double, Vdia As Double) As Double EstimacionRaices4 = vRaices1 + (((vRaices2 - vRaices1) / Vdias) * Vdia) End Function Private Function CalculaFraccion(cETc As String) As Double Dim nETc As Double: nETc = CarNum(cETc) Dim nFraccion As Double: nFraccion = 0 fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado nFraccion = fProgramacion("Fraccion") End If CalculaFraccion = nFraccion ' Es una regla que pone FAO-46 pero no se aplica PARA AUMENTAR O DISMINIUIR LA FRACCION DE AGUA DISPONIBLE EN FUNCION DE LA ETO 'If nETc < 3 Then CalculaFraccion = 1.3 * nFraccion 'If nETc > 8 Then CalculaFraccion = 0.7 * nFraccion 'If nETc = 0 Then CalculaFraccion = 0 End Function Private Function CalculaLluviaEfectiva(cLluvia As String) As Double Dim nTipoLluvia As Integer Dim nLluviaP As Double Dim nLluviaA1 As Double Dim nLluviaB1 As Double Dim nLluviaC1 As Double Dim nLluviaA2 As Double Dim nLluviaB2 As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado If fProgramacion("Lluvia1") = True Then nTipoLluvia = 1 nLluviaP = CarNum(fProgramacion("LluviaP")) End If If fProgramacion("Lluvia2") = True Then nTipoLluvia = 2 236
  • 237. 7. Anejo 5 If fProgramacion("Lluvia3") = True Then nTipoLluvia = 3 If fProgramacion("Lluvia4") = True Then nTipoLluvia = 4 nLluviaA1 = CarNum(fProgramacion("LluviaA1")) nLluviaB1 = CarNum(fProgramacion("LluviaB1")) nLluviaC1 = CarNum(fProgramacion("LluviaC1")) nLluviaA2 = CarNum(fProgramacion("LluviaA2")) nLluviaB2 = CarNum(fProgramacion("LluviaB2")) End If End If Dim nLluvia As Double: nLluvia = CarNum(cLluvia) Dim nLluviaEfectiva As Double: nLluviaEfectiva = 0 If nTipoLluvia = 1 Then 'metodo del porcentaje CalculaLluviaEfectiva = nLluvia * (nLluviaP / 100) End If If nTipoLluvia = 2 Then 'metodo FAO/AGWL If nLluvia * 30 < 70 Then CalculaLluviaEfectiva = ((nLluvia * 30 * 0.6) - 10) / 30 Else CalculaLluviaEfectiva = ((nLluvia * 30 * 0.8) - 25) / 30 End If End If If nTipoLluvia = 3 Then 'metodo USDA If nLluvia * 30 < 250 Then CalculaLluviaEfectiva = ((nLluvia * 30 * (125 - (0.2 * nLluvia * 30))) / 125) / 30 Else CalculaLluviaEfectiva = (125 + (nLluvia * 30 * 0.1)) / 30 End If End If If nTipoLluvia = 4 Then 'metodo empírico If nLluvia * 30 < nLluviaC1 Then CalculaLluviaEfectiva = (((nLluvia * 30 * nLluviaA1) - (nLluviaB1))) / 30 Else CalculaLluviaEfectiva = (((nLluvia * 30 * nLluviaA2) - (nLluviaB2))) / 30 End If End If ' If Metodo = "A" Then 'metodo de Martin de Santa Olalla DE LLUVIA EFECTIVA ' If nLluvia > 7 Then CalculaLluviaEfectiva = 0.98 * nLluvia ' If nLluvia <= 7 Then CalculaLluviaEfectiva = 0.9 * nLluvia ' If nLluvia <= 5 Then CalculaLluviaEfectiva = 0.76 * nLluvia ' If nLluvia <= 3 Then CalculaLluviaEfectiva = 0.65 * nLluvia ' If nLluvia <= 0 Then CalculaLluviaEfectiva = 0 * nLluvia ' End If End Function Function DiferenciaFechas(cFechaInicial As String, cFechaFinal As String) As Double Dim AnoI As Integer: AnoI = Val(Mid(cFechaInicial, 1, 4)) Dim MesI As Integer: MesI = Val(Mid(cFechaInicial, 5, 2)) Dim DiaI As Integer: DiaI = Val(Mid(cFechaInicial, 7, 2)) Dim AnoF As Integer: AnoF = Val(Mid(cFechaFinal, 1, 4)) Dim MesF As Integer: MesF = Val(Mid(cFechaFinal, 5, 2)) Dim DiaF As Integer: DiaF = Val(Mid(cFechaFinal, 7, 2)) Dim FechaInicial As Date: FechaInicial = DateSerial(AnoI, MesI, DiaI) Dim FechaFinal As Date: FechaFinal = DateSerial(AnoF, MesF, DiaF) Dim Numerodias As Double DiferenciaFechas = FechaFinal - FechaInicial + 1 End Function Function MesDia(NumeroDia as integer) 'Dar en string mesdia ("mmdd") End Function Function DiaDelAno(MesDia as string) Dar en integer el número de día End Function Private Sub CalculaMatrizCalculo() '''CalculaDosisNeta = AguaDisponible * (DensidadAparente / 10) * nFraccion * PorcentajeMojado * nRaices 'Datos entrada Dim cNotas As String: cNotas = "" Dim nETc As Double: nETc = CarNum(MatrizCalculo(1)) Dim nLluviaEfectiva As Double: nLluviaEfectiva = CarNum(MatrizCalculo(2)) Dim nRaices As Double: nRaices = CarNum(MatrizCalculo(5)) Dim nFraccion As Double: nFraccion = CarNum(MatrizCalculo(6)) Dim nReserva As Double: nReserva = CarNum(MatrizCalculo(1)) 'Datos salida Dim nCapacidadCampo As Double: nCapacidadCampo = 0 237
  • 238. 7. Anejo 5 Dim nPuntoMarchitez As Double: nPuntoMarchitez = 0 Dim nDensidadAparente As Double: nDensidadAparente = 0 Dim nRfuMaxima As Double: nRfuMaxima = 0 Dim nRFUMinima As Double: nRFUMinima = 0 Dim nDosisNeta As Double: nDosisNeta = 0 Dim vTipoRiego As String: vTipoRiego = "" Dim nEficienciaAplicacion As Double: nEficienciaAplicacion = 0 Dim nEficienciaLavado As Double: nEficienciaLavado = 0 Dim nLavado As Double: nLavado = 0 Dim nDosisBruta As Double: nDosisBruta = 0 Dim nConductividadElectrica As Double Dim nECe100 As Double Dim nRenEsp As Double Dim nMaxECe As Double Dim nAguaUtil As Double Dim nReservaInicial As Double 'Calculos fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado nCapacidadCampo = NumCar(fProgramacion("CapacidadCampo")) nPuntoMarchitez = NumCar(fProgramacion("PuntoMarchitamiento")) nDensidadAparente = NumCar(fProgramacion("DensidadAparente")) vTipoRiego = fProgramacion("TipoRiego") nEficienciaAplicacion = NumCar(fProgramacion("EficienciaAplicacion")) nEficienciaLavado = CarNum(fProgramacion("EficienciaLavado")) nConductividadElectrica = CarNum(fProgramacion("ConductividadElectrica")) nECe100 = CarNum(fProgramacion("ECe100")) nMaxECe = CarNum(fProgramacion("MaxECe")) nRenEsp = CarNum(fProgramacion("RendimientoSal")) nReservaInicial = CarNum(fProgramacion("ReservaInicial")) 'Dim nRFUMinima nRFUMinima = CarNum(fProgramacion("AgotamientoRFU")) / 100 Dim nRecargaRFU nRecargaRFU = CarNum(fProgramacion("RecargaRFU")) / 100 Dim nIntervaloRiego nIntervaloRiego = CarNum(fProgramacion("IntervaloRiego")) Dim nSuperficie nSuperficie = CarNum(fProgramacion("SuperficieFinca")) Dim nPendiente: nPendiente = 0 nPendiente = CarNum(fProgramacion("PendienteTerreno")) Dim nInfiltracion nInfiltracion = CarNum(fProgramacion("TasaInfiltracion")) Dim nCaudal nCaudal = CarNum(fProgramacion("CaudalInstalacion")) End If nAguaUtil = (nCapacidadCampo - nPuntoMarchitez) * (nDensidadAparente / 10) * nRaices nRfuMaxima = (nCapacidadCampo - nPuntoMarchitez) * (nDensidadAparente / 10) * nRaices * nFraccion nRFUMinima = nRfuMaxima * (1 - nRFUMinima) If Primero = "SI" And nRaices > 0 Then Primero = "NO" ReservaInicial = nRfuMaxima * (nReservaInicial / 100) End If If ReservaInicial = 0 Then nReserva = -nETc + nLluviaEfectiva Else nReserva = ReservaInicial - nETc + nLluviaEfectiva End If ReservaInicial = nReserva If nReserva > nRfuMaxima Then nReserva = nRfuMaxima ReservaInicial = nRfuMaxima End If nDosisNeta = 0 If nReserva < nRFUMinima And nIntervaloRiego <> 0 Then nDosisNeta = (nRfuMaxima * nRecargaRFU) - nReserva nReserva = nReserva + nDosisNeta ReservaInicial = nReserva End If If nReserva < nRFUMinima And nIntervaloRiego = 0 Then nDosisNeta = (nRfuMaxima * nRecargaRFU) - nReserva nReserva = nReserva + nDosisNeta 238
  • 239. 7. Anejo 5 ReservaInicial = nReserva End If If nIntervaloRiego > 0 And Cuenta = nIntervaloRiego Then Cuenta = 0 nDosisNeta = (nRfuMaxima * nRecargaRFU) - nReserva If nDosisNeta < 0 Then nDosisNeta = 0 nReserva = nReserva + nDosisNeta ReservaInicial = nReserva End If If nDosisNeta > 0 Then 'Calculo de lavado al 100% Dim FraccionLavado As Double If vTipoRiego = "S" Then Dim nECe As Double nECe = ((nECe100 - nMaxECe) * nRenEsp / 100) + nMaxECe nLavado = nConductividadElectrica / ((5 * nECe) - nConductividadElectrica) FraccionLavado = 1 - nLavado End If If vTipoRiego = "L" Then nLavado = nConductividadElectrica / (2 * nMaxECe) FraccionLavado = 1 - nLavado End If If FraccionLavado < 0 Then cNotas = "AGUA MUY SALINA." Else If FraccionLavado * (nEficienciaLavado / 100) < (nEficienciaAplicacion / 100) Then 'se aplica lavado de sales nDosisBruta = nDosisNeta / (FraccionLavado * (nEficienciaLavado / 100)) cNotas = "Se aplica lavado de sales." Else nDosisBruta = nDosisNeta / (nEficienciaAplicacion / 100) cNotas = "Se aplica eficiencia aplicación." End If End If Else nEficienciaAplicacion = 0 nEficienciaLavado = 0 nDosisBruta = 0 End If Dim nDosisBrutaTotal As Double: nDosisBrutaTotal = 0 nDosisBrutaTotal = (nDosisBruta * nSuperficie) / 1000 MatrizCalculo(21) = Left(NumCar(nRfuMaxima), 5) MatrizCalculo(22) = Left(NumCar(nRFUMinima), 5) MatrizCalculo(23) = Left(NumCar(nReserva), 5) MatrizCalculo(24) = Left(NumCar(nDosisNeta), 5) MatrizCalculo(25) = vTipoRiego MatrizCalculo(26) = Left(NumCar(nEficienciaAplicacion), 3) MatrizCalculo(27) = Left(NumCar(nLavado), 5) MatrizCalculo(28) = Left(NumCar(nEficienciaLavado), 5) MatrizCalculo(29) = Left(NumCar(nDosisBruta), 5) MatrizCalculo(31) = Left(NumCar(nCapacidadCampo), 10) MatrizCalculo(32) = Left(NumCar(nPuntoMarchitez), 10) MatrizCalculo(33) = Left(NumCar(nDensidadAparente), 10) MatrizCalculo(34) = Left(NumCar(nAguaUtil), 10) MatrizCalculo(35) = Left(NumCar(nDosisBrutaTotal), 8) Dim Disminucion: Disminucion = 0 ' DISMINUCION EN FUNCION DE LA PENDIENTE (NO SE APLICA) 'If Val(nPendiente) >= 0 And Val(nPendiente) <= 5 Then Disminucion = 0 'If Val(nPendiente) > 5 And Val(nPendiente) <= 8 Then Disminucion = 20 'If Val(nPendiente) > 8 And Val(nPendiente) <= 12 Then Disminucion = 40 'If Val(nPendiente) > 12 And Val(nPendiente) <= 20 Then Disminucion = 60 'If Val(nPendiente) > 20 And Val(nPendiente) <= 100 Then Disminucion = 75 Dim nInfil As Double: nInfil = 0 Dim nTiempo1 As Double: nTiempo1 = 0 If nDosisBruta > 0 Then nInfil = nInfiltracion - (nInfiltracion * (Disminucion / 100)) nTiempo1 = nDosisBruta / nInfil End If MatrizCalculo(36) = Left(NumCar(nTiempo1), 10) Dim nTiempo2 As Double: nTiempo2 = 0 If nDosisBrutaTotal > 0 Then nTiempo2 = nDosisBrutaTotal / nCaudal End If 239
  • 240. 7. Anejo 5 MatrizCalculo(37) = Left(NumCar(nTiempo2), 10) If nTiempo1 > nTiempo2 Then cNotas = cNotas End If If nTiempo1 < nTiempo2 Then cNotas = cNotas End If MatrizCalculo(38) = Left(cNotas, 100) Cuenta = Cuenta + 1 End Sub Sub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocus End Sub Private Sub MostrarInformacion1() 'Detalle Dim tETc As Double: tETc = 0 Dim tPE As Double: tPE = 0 Dim tRiegos As Double: tRiegos = 0 Dim tDN As Double: tDN = 0 Dim tDB As Double: tDB = 0 Dim tDBT As Double: tDBT = 0 Dim Numero: Numero = 0 Dim Informacion Open "C:RiegosRiegosDetalle.txt" For Output As #1 Dim Busca: Busca = "" Busca = Busca + "SELECT * " Busca = Busca + "FROM BalanceHidrico " Busca = Busca + "WHERE " Busca = Busca + "NombreProgramacion = '" & NombreProgramacion & "' and Raices <> '0' " Busca = Busca + "ORDER BY " Busca = Busca + "Fecha ;" Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset(Busca) If Consulta.RecordCount <> 0 Then Consulta.MoveFirst fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Print #1, " BALANCE HÍDRICO ", Date, Time Print #1, " " Print #1, "Programación........................................: " + Consulta("NombreProgramacion") Print #1, "Finca...............................................: " + fProgramacion("NombreFinca") Print #1, "Población...........................................: " + fProgramacion("Poblacion") Print #1, "Provincia...........................................: " + fProgramacion("Provincia") Print #1, "Latitud [g,m,s].....................................: " + Str(fProgramacion("LatitudGrados")) + "º " + Str(fProgramacion("LatitudMinutos")) + "' " + Str(fProgramacion("LatitudSegundos")) + "'' " + fProgramacion("Latitud") + "º " Print #1, "Longitud [g,m,s]....................................: " + Str(fProgramacion("LongitudGrados")) + "º " + Str(fProgramacion("LongitudMinutos")) + "' " + Str(fProgramacion("LongitudSegundos")) + "'' " + fProgramacion("Longitud") + "º " Print #1, "Altitud [m].........................................: " + Str(fProgramacion("Altitud")) Print #1, "Superficie [m2].....................................: " + fProgramacion("SuperficieFinca") Print #1, "Cultivo.............................................: " + fProgramacion("Cultivo") Print #1, "Fracción agua disponible en el suelo................: " + fProgramacion("Fraccion") Print #1, "Clase textural......................................: " + fProgramacion("TipoSuelo") Print #1, "Densidad aparente [g/cm3]...........................: " + fProgramacion("DensidadAparente") Print #1, "Capacidad de Campo [% peso].........................: " + fProgramacion("CapacidadCampo") Print #1, "Punto de Marchitamiento [%peso].....................: " + fProgramacion("PuntoMarchitamiento") Print #1, "Sistema Riego.......................................: " + fProgramacion("SistemaRiego") Print #1, "Eficiencia en la aplicación [%].....................: " + fProgramacion("EficienciaAplicacion") Print #1, "Caudal instalación riego [m3/parcela]...............: " + fProgramacion("CaudalInstalacion") Print #1, "Conductividad agua de riego [dS/m)..................: " + fProgramacion("ConductividadElectrica") Print #1, "Eficiencia en el lavado de sales [%]................: " + fProgramacion("EficienciaLavado") Print #1, "Rendimiento mínimo deseado debido a salinidad [%]...: " + fProgramacion("RendimientoSal") Print #1, "Fecha Plantación/Inicio.............................: " + fProgramacion("FechaPlantacion") Print #1, "Momento de Riego. Agotamiento de la RFU [%].........: " + fProgramacion("AgotamientoRFU") Print #1, "Intervalo de riego [días]...........................: " + fProgramacion("IntervaloRiego") Print #1, "Dosis de riego. Recarga de la RFU [%]...............: " + fProgramacion("RecargaRFU") Print #1, "Nivel de agua de la RFU al inicio [%]...............: " + fProgramacion("ReservaInicial") Print #1, " " Print #1, " " 240
  • 241. 7. Anejo 5 Print #1, "Fecha " + " " + "ETo " + " " + "Kc " + " " + "Kl " + " " + "ETcKl" + " " + "P.E. " + " " + "Raices" + " " + "F.A." + " " + "R.F.U." + " " + "Reserva" + " " + "d.n. " + " " + "d.b. " + " " + "D.B. " + " " + "tiempoI" + " " + "tiempoC" Print #1, " " + " " + "[mm] " + " " + "[] " + " " + "[] " + " " + "[mm] " + " " + "[mm] " + " " + "[cm] " + " " + "[] " + " " + "[mm] " + " " + "[mm] " + " " + "[mm] " + " " + "[mm] " + " " + "[m3/par]" + " " + "[horas]" + " " + "[hora] " Print #1, "----------" + " " + "-----" + " " + "----" + " " + "----" + " " + "-----" + " " + "------" + " " + "------" + " " + "----" + " " + "-----" + " " + "-------" + " " + "-----" + " " + "-----" + " " + "--------" + " " + "-------" + " " + "-------" Primero = "NO" End If Dim cFecha As String Dim cETo As String * 5 Dim cKc As String * 4 Dim cKl As String * 4 Dim cETc As String * 5 Dim cPE As String * 6 Dim cRaices As String * 6 Dim cFA As String * 4 Dim cRFU As String * 6 Dim cReserva As String * 7 Dim cDN As String * 5 Dim cDB As String * 5 Dim cDBT As String * 8 Dim cTiempo1 As String * 6 Dim cTiempo2 As String * 6 While Not Consulta.EOF Numero = Numero + 1 cFecha = Mid(Consulta("Fecha"), 7, 2) + "-" + Mid(Consulta("Fecha"), 5, 2) + "-" + Mid(Consulta("Fecha"), 1, 4) Dim nETo: nETo = CarNum(Consulta("ETo")): RSet cETo = Format(nETo, "#0.00") Dim nKc: nKc = CarNum(Consulta("Kc")): RSet cKc = Format(nKc, "0.00") Dim nKl: nKl = CarNum(Consulta("Kl")): RSet cKl = Format(nKl, "0.00") Dim nETc: nETc = CarNum(Consulta("ETc")): RSet cETc = Format(nETc, "#0.00") Dim nPE: nPE = CarNum(Consulta("LluviaEfectiva")): RSet cPE = Format(nPE, "##0.00") Dim nRaices: nRaices = CarNum(Consulta("Raices")): RSet cRaices = Format(nRaices, "##0") Dim nFA: nFA = CarNum(Consulta("Fraccion")): RSet cFA = Format(nFA, "0.00") Dim nRFU: nRFU = CarNum(Consulta("RFUMaxima")): RSet cRFU = Format(nRFU, "##0.0") Dim nReserva: nReserva = CarNum(Consulta("Reserva")): RSet cReserva = Format(nReserva, "##0.00") Dim nDN: nDN = CarNum(Consulta("DosisNeta")): RSet cDN = Format(nDN, "##0.00") Dim nDB: nDB = CarNum(Consulta("DosisBruta")): RSet cDB = Format(nDB, "##0.00") Dim nDBT: nDBT = CarNum(Consulta("DosisBrutaTotal")): RSet cDBT = Format(nDBT, "#####0.0") Dim nTiempo1: nTiempo1 = CarNum(Consulta("Tiempo1")): RSet cTiempo1 = Format(nTiempo1, "###0.0") Dim nTiempo2: nTiempo2 = CarNum(Consulta("Tiempo2")): RSet cTiempo2 = Format(nTiempo2, "###0.0") tETc = tETc + nETc tPE = tPE + nPE If nDN > 0 Then tRiegos = tRiegos + 1 tDN = tDN + nDN tDB = tDB + nDB tDBT = tDBT + nDBT End If Informacion = "" Informacion = Informacion + cFecha + " " Informacion = Informacion + cETo + " " Informacion = Informacion + cKc + " " Informacion = Informacion + cKl + " " Informacion = Informacion + cETc + " " Informacion = Informacion + cPE + " " Informacion = Informacion + cRaices + " " Informacion = Informacion + cFA + " " Informacion = Informacion + cRFU + " " Informacion = Informacion + cReserva + " " Informacion = Informacion + cDN + " " Informacion = Informacion + cDB + " " Informacion = Informacion + cDBT + " " Informacion = Informacion + cTiempo1 + " " Informacion = Informacion + cTiempo2 + " " Print #1, Informacion DoEvents Consulta.MoveNext Wend Print #1, " " Print #1, "Total ETc·Kl [mm]..................: " + Str(Int(tETc)) Print #1, "Total P.E. [mm]....................: " + Str(Int(tPE)) Print #1, "Número de Riegos...................: " + Str(Int(tRiegos)) Print #1, "Total dosis neta [mm]..............: " + Str(Int(tDN)) 241
  • 242. 7. Anejo 5 Print #1, "Total dosis bruta [mm].............: " + Str(Int(tDB)) Print #1, "Total dosis bruta [m3/parcela].....: " + Str(Int(tDBT)) Print #1, " " Print #1, "----------------------------------------------------------------------------------" Print #1, "NOTAS:" Print #1, " - Cuando el intervalo de riego está en blanco, no se tiene en cuenta. " Print #1, " - ETo [mm] = Evapotranspiración de referencia." Print #1, " - Kc [] = Constante de cultivo." Print #1, " - Kl [] = Coeficiente de localización. Sólo en riego localizado." Print #1, " - ETcKl [mm]= Evapotranspiración de cultivo por coeficiente de localización" Print #1, " - P.E. [cm]= Lluvia efectiva (véase método aplicado)" Print #1, " - Raíces [cm] = Profundidad efectiva de las raíces " Print #1, " - R.F.U. [mm] = Volumen de agua máximo de la Reserva Fácilmente Utilizable (RFU)" Print #1, " - Reserva [mm] = Volumen de agua existente en la RFU al final del día" Print #1, " - d.n. [mm] = Dosis neta de riego" Print #1, " - d.b. [mm] = Dosis bruta de riego" Print #1, " - D.B. [m3/parcela] = Dosis bruta de riego a aplicar en la parcela" Print #1, " - tiempoI [horas] = Tiempo mínimo previsto de riego debido a la infiltración" Print #1, " - tiempoC [horas] = Tiempo mínimo previsto de riego debido al Caudal" Print #1, " - De las dos cifras anteriores, la mayor de ellas será el tiempo mínimo de riego" Print #1, "----------------------------------------------------------------------------------" End If Close #1 Command3.Visible = True End Sub '*********************************************************************************** Private Sub MostrarInformacion2() ' riegos Dim tRiegos As Double: tRiegos = 0 Dim tDN As Double: tDN = 0 Dim tDB As Double: tDB = 0 Dim tDBT As Double: tDBT = 0 Dim Numero: Numero = 0 Dim Informacion Open "C:RiegosRiegosResumen.txt" For Output As #1 Dim Busca: Busca = "" Busca = Busca + "SELECT * " Busca = Busca + "FROM BalanceHidrico " Busca = Busca + "WHERE " Busca = Busca + "NombreProgramacion = '" & NombreProgramacion & "' and Raices <> '0' and DosisBruta <> '0' " Busca = Busca + "ORDER BY " Busca = Busca + "Fecha ;" Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset(Busca) If Consulta.RecordCount <> 0 Then Consulta.MoveFirst fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado Print #1, " RIEGOS A EFECTUAR ", Date, Time Print #1, " " Print #1, "Programación........................................: " + Consulta("NombreProgramacion") Print #1, "Finca...............................................: " + fProgramacion("NombreFinca") Print #1, "Población...........................................: " + fProgramacion("Poblacion") Print #1, "Provincia...........................................: " + fProgramacion("Provincia") Print #1, "Latitud [g,m,s].....................................: " + Str(fProgramacion("LatitudGrados")) + "º " + Str(fProgramacion("LatitudMinutos")) + "' " + Str(fProgramacion("LatitudSegundos")) + "'' " + fProgramacion("Latitud") + "º " Print #1, "Longitud [g,m,s]....................................: " + Str(fProgramacion("LongitudGrados")) + "º " + Str(fProgramacion("LongitudMinutos")) + "' " + Str(fProgramacion("LongitudSegundos")) + "'' " + fProgramacion("Longitud") + "º " Print #1, "Altitud [m].........................................: " + Str(fProgramacion("Altitud")) Print #1, "Superficie [m2].....................................: " + fProgramacion("SuperficieFinca") Print #1, "Cultivo.............................................: " + fProgramacion("Cultivo") Print #1, "Fracción agua disponible en el suelo................: " + fProgramacion("Fraccion") Print #1, "Clase textural......................................: " + fProgramacion("TipoSuelo") Print #1, "Densidad aparente [g/cm3]...........................: " + fProgramacion("DensidadAparente") Print #1, "Capacidad de Campo [% peso].........................: " + fProgramacion("CapacidadCampo") Print #1, "Punto de Marchitamiento [%peso].....................: " + fProgramacion("PuntoMarchitamiento") Print #1, "Sistema Riego.......................................: " + fProgramacion("SistemaRiego") Print #1, "Eficiencia en la aplicación [%].....................: " + fProgramacion("EficienciaAplicacion") Print #1, "Caudal instalación riego [m3/parcela]...............: " + fProgramacion("CaudalInstalacion") Print #1, "Conductividad agua de riego [dS/m]..................: " + fProgramacion("ConductividadElectrica") 242
  • 243. 7. Anejo 5 Print #1, "Eficiencia en el lavado de sales [%]................: " + fProgramacion("EficienciaLavado") Print #1, "Rendimiento mínimo deseado debido a salinidad [%]...: " + fProgramacion("RendimientoSal") Print #1, "Fecha Plantación/Inicio.............................: " + fProgramacion("FechaPlantacion") Print #1, "Momento de Riego. Agotamiento de la RFU [%].........: " + fProgramacion("AgotamientoRFU") Print #1, "Intervalo de riego [días]...........................: " + fProgramacion("IntervaloRiego") Print #1, "Dosis de riego. Recarga de la RFU [%]...............: " + fProgramacion("RecargaRFU") Print #1, "Nivel de agua de la RFU al inicio [%]...............: " + fProgramacion("ReservaInicial") Print #1, " " Print #1, " " Print #1, "Fecha " + " " + "d.n. " + " " + "d.b. " + " " + "D.B. " + " " + "tiempoI" + " " + "tiempoF" + " " + " Notas " Print #1, " " + " " + "[mm] " + " " + "[mm] " + " " + "[m3/par]" + " " + "[horas]" + " " + "[hora] " + " " + " " Print #1, "----------" + " " + "-----" + " " + "-----" + " " + "--------" + " " + "-------" + " " + "-------" + " " + "------------------------------------------" Primero = "NO" End If Dim cFecha As String Dim cETo As String * 5 Dim cKc As String * 4 Dim cKl As String * 4 Dim cETc As String * 5 Dim cPE As String * 6 Dim cRaices As String * 6 Dim cFA As String * 4 Dim cRFU As String * 6 Dim cReserva As String * 7 Dim cDN As String * 5 Dim cDB As String * 5 Dim cDBT As String * 8 Dim cTiempo1 As String * 6 Dim cTiempo2 As String * 6 While Not Consulta.EOF Numero = Numero + 1 cFecha = Mid(Consulta("Fecha"), 7, 2) + "-" + Mid(Consulta("Fecha"), 5, 2) + "-" + Mid(Consulta("Fecha"), 1, 4) Dim nETo: nETo = CarNum(Consulta("ETo")): RSet cETo = Format(nETo, "#0.00") Dim nKc: nKc = CarNum(Consulta("Kc")): RSet cKc = Format(nKc, "0.00") Dim nKl: nKl = CarNum(Consulta("Kl")): RSet cKl = Format(nKl, "0.00") Dim nETc: nETc = CarNum(Consulta("ETc")): RSet cETc = Format(nETc, "#0.00") Dim nPE: nPE = CarNum(Consulta("LluviaEfectiva")): RSet cPE = Format(nPE, "##0.00") Dim nRaices: nRaices = CarNum(Consulta("Raices")): RSet cRaices = Format(nRaices, "##0") Dim nFA: nFA = CarNum(Consulta("Fraccion")): RSet cFA = Format(nFA, "0.00") Dim nRFU: nRFU = CarNum(Consulta("RFUMaxima")): RSet cRFU = Format(nRFU, "##0.0") Dim nReserva: nReserva = CarNum(Consulta("Reserva")): RSet cReserva = Format(nReserva, "##0.00") Dim nDN: nDN = CarNum(Consulta("DosisNeta")): RSet cDN = Format(nDN, "##0.00") Dim nDB: nDB = CarNum(Consulta("DosisBruta")): RSet cDB = Format(nDB, "##0.00") Dim nDBT: nDBT = CarNum(Consulta("DosisBrutaTotal")): RSet cDBT = Format(nDBT, "#####0.0") Dim nTiempo1: nTiempo1 = CarNum(Consulta("Tiempo1")): RSet cTiempo1 = Format(nTiempo1, "###0.0") Dim nTiempo2: nTiempo2 = CarNum(Consulta("Tiempo2")): RSet cTiempo2 = Format(nTiempo2, "###0.0") Dim cNotas: cNotas = Consulta("Notas") If nDN > 0 Then tRiegos = tRiegos + 1 tDN = tDN + nDN tDB = tDB + nDB tDBT = tDBT + nDBT End If Informacion = "" Informacion = Informacion + cFecha + " " Informacion = Informacion + cDN + " " Informacion = Informacion + cDB + " " Informacion = Informacion + cDBT + " " Informacion = Informacion + cTiempo1 + " " Informacion = Informacion + cTiempo2 + " " Informacion = Informacion + cNotas + " " Print #1, Informacion DoEvents Consulta.MoveNext Wend Print #1, " " Print #1, "Número de Riegos...................: " + Str(Int(tRiegos)) Print #1, "Total dosis neta [mm]..............: " + Str(Int(tDN)) Print #1, "Total dosis bruta [mm].............: " + Str(Int(tDB)) Print #1, "Total dosis bruta [m3/parcela].....: " + Str(Int(tDBT)) 243
  • 244. 7. Anejo 5 Print #1, " " Print #1, "----------------------------------------------------------------------------------" Print #1, "NOTAS:" Print #1, " - Cuando el intervalo de riego está en blanco, no se tiene en cuenta. " Print #1, " - d.n. [mm] = Dosis neta de riego" Print #1, " - d.b. [mm] = Dosis bruta de riego" Print #1, " - D.B. [m3/parcela] = Dosis bruta de riego a aplicar en la parcela" Print #1, " - tiempoI [horas] = Tiempo mínimo previsto de riego debido a la infiltración" Print #1, " - tiempoC [horas] = Tiempo mínimo previsto de riego debido al Caudal" Print #1, " - De las dos cifras anteriores, la mayor de ellas será el tiempo mínimo de riego" Print #1, "----------------------------------------------------------------------------------" Else Print #1, " NO HAY RIEGOS" End If Close #1 Command4.Visible = True Comando(0).Visible = True Label1.Visible = False End Sub Private Sub Command3_Click() Dim ReturnValue ReturnValue = Shell("c:Archivos de ProgramaAccesoriosWordpad.exe c:RiegosRiegosDetalle.txt", 1) AppActivate ReturnValue End Sub Private Sub Command4_Click() Dim ReturnValue ReturnValue = Shell("c:Archivos de ProgramaAccesoriosWordpad.exe c:RiegosRiegosResumen.txt", 1) AppActivate ReturnValue End Sub 244

×