programa para el cálculo de las necesidades hídricas en cultivos
TRANSCRIPT
ESCUELA SUPERIOR DE AGRICULTURA DE BARCELONA
Ingeniería Técnica AgrícolaHortofruticultura y Jardinería
Trabajo Final de Carrera
Autor: Víctor Yusta Laguna
Diciembre de 1998
Programapara el cálculo
de las necesidades hídricas de los cultivos
2
ESCUELA SUPERIOR DE AGRICULTURA DE BARCELONA
Ingeniería Técnica AgrícolaHortofruticultura y Jardinería
Trabajo Final de Carrera
Profesor ponente: Nuria Cañameras i Riba
Autor: Víctor Yusta Laguna
Diciembre de 1998
Programapara el cálculo
de las necesidades hídricas de los cultivos
3
AGRADECIMIENTOS.
A la profesora, Nuria Cañameras, por su ayuda 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.
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.
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.
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 air-
soil-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.
Indice
7
Í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 21
1.4. Estimación de las necesidades hídricas mediante el método FAO-24 23
1.4.1. Cálculo de la evapotranspiración 24
1.4.1.1. Cálculo de la evapotranspiración de referencia 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
Indice
8
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
1.6.6. Programas para la simulación de las necesidades hídricas 63
1.6.7. Otros programas relacionados con las necesidades hídricas 63
2. Objetivos 65
3. Material y métodos 67
3.1. Material 68
3.2. Métodos 68
Indice
9
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. 160
Capítulo 3. Triángulo de texturas 161
7. Anejo 5. Listado del programa 162
1. Introducción
10
1. INTRODUCCIÓN.
1. Introducción
11
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).
1. Introducción
12
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).
1. Introducción
13
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.
1. Introducción
14
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,
que produce 20 Tm. de materia seca, a lo largo de su cultivo retiene 4 m3 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).
1. Introducción
15
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.
1. Introducción
16
- 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.
1. Introducción
17
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.
1. Introducción
18
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.
1. Introducción
19
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.
1. Introducción
20
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.
1. Introducción
21
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
1. Introducción
22
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).
1. Introducción
23
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.
1. Introducción
24
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:
1. Introducción
25
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
1. Introducción
26
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:
Ra·Nn
baRs
+=
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.
1. Introducción
27
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).
∆+γ
γ+
γ+∆
∆= Ea·Rn·Eo
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].
1. Introducción
28
( ) ( )as2 ee·U0092,01·35,0Ea −+=
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:
( ) ( ) ( )[ ]as ee·Uf·W1WRncETo −−+=
donde: ETo : evapotranspiración de referencia [mm dia-1].
c : 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.
+=
100U
1·27,0)U(f 2
donde: f(U) : función relacionada con el viento.
U2 : velocidad del viento diario a 2 metros de altura [km dia-1].
nlns RRRn −=
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].
1. Introducción
29
RaNn
5,025,075,0Rns
+=
donde: Rns : 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.
( ) ( )
=Nn
f·edf·tfRnl
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.
1. Introducción
30
La evapotranspiración se calcula mediante la siguiente fórmula:
ETo = Epan · Kp
donde: ETo : evapotranspiración de referencia [mm dia-1].
Epan : evaporación de la cubeta [mm dia-1].
Kp : 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).
1. Introducción
31
Tabla2. Sumario de estadísticas y su ranking para varios métodos de estimación mensual de la
evapotranspiración.
All Months Peak Month WeightedSEE(7)
Ranking Method (1)
% (2) SEE (3) b (4) r (5) ASEE (6) % SEE B R ASEE1 Penman-Monteith 101 0.36 1.00 0.99 0.36 97 0.52 1.03 0.99 0.47 0.40
2 1982 Kimberly-Penman 107 0.53 0.95 0.98 0.49 107 0.79 0.96 0.96 0.73 0.59
3 FAO-PPP-17 Penman 111 0.66 0.93 0.97 0.56 105 0.72 0.99 0.97 0.72 0.66
4 Penman (1963) 106 0.57 0.99 0.97 0.57 99 0.95 1.07 0.96 0.81 0.67
5 Penman (1963), VPD #3 113 0.67 0.93 0.97 0.57 105 0.77 1.00 0.96 0.77 0.68
6 1972 Kimberly-Penman 112 0.74 0.93 0.96 0.67 102 0.72 1.03 0.97 0.70 0.72
7 FAO-24 Radiation 114 0.73 0.91 0.97 0.59 110 0.88 0.95 0.96 0.78 0.73
8 FAO-24 Blaney-Criddle 108 0.68 0.95 0.96 0.64 106 0.98 0.98 0.94 0.97 0.76
9 FAO-24 Penman (c=1) 121 0.91 0.88 0.96 0.65 111 0.84 0.95 0.96 0.76 0.82
10 Jansen-Haise 85 0.84 1.11 0.95 0.71 83 1.44 1.15 0.92 1.06 0.95
11 Hargreaves et al. (1985) 108 0.88 1.00 0.93 0.88 101 1.47 1.07 0.87 1.39 1.05
12 Businger-van Bavel 121 1.10 0.87 0.92 0.90 110 1.19 0.97 0.91 1.16 1.08
13 FAO-24 Corrected Penman 127 1.16 0.82 0.96 0.65 122 1.53 0.86 0.93 1.00 1.10
14 FAO-24 Pan 100 0.92 0.94 0.92 0.88 95 1.58 1.03 0.82 1.57 1.11
15 SCS Blaney-Criddle 101 1.16 0.99 0.87 1.15 103 1.31 1.05 0.89 1.26 1.20
16 Christiansen pan 92 0.95 1.03 0.91 0.94 88 1.88 1.11 0.78 1.73 1.21
17 Pan evaporation 118 1.34 0.82 0.92 0.87 113 1.82 0.88 0.83 1.56 1.35
18 Turc 90 1.30 1.20 0.89 1.07 85 2.26 1.31 0.84 1.49 1.46
19 Priestley-Taylor 85 1.29 1.22 0.90 1.02 86 2.34 1.28 0.78 1.72 1.48
20 Thornthwaite 79 1.68 1.24 0.78 1.47 79 2.69 1.41 0.79 1.70 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”.
1. Introducción
32
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:
LAI·5,0R
r 1c =
donde: rc : resistencia de la cubierta vegetal [s m-1].
R1 : 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.
1. Introducción
33
A continuación se expone la fórmula de Penman-Monteith para un cultivo con las
características anteriormente mencionadas:
( ))U0.34+(1+
eeU273T
900R408,0
ETo2
da2n
γ∆
−+
γ+∆=
donde: ETo : 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 ].
(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 ].
nlnsn RRR −=
donde: Rn : 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 ].
R )Nn
0.50 + (0.2577,0 = R ans
donde: Rns : 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 ].
1. Introducción
34
s64,7N ϖ=
donde: N : horas máximas de sol [h].
ws : ángulo horario de puesta de sol [rad].
( ))sen()dcos()lcos()lsen()dsen(dr6,37 R ssa ϖ+ϖ=
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].
( ))dtg()ltg( cos= 1s −ϖ −
donde: ws : ángulo horario de puesta de sol [rad].
l : latitud [rad].
d : declinación solar [rad].
)39,1J0172,0sen(409,0= d −
donde: d : declinación solar [rad].
J : número de día del año .
)J0172,0cos(033,01= dr +
donde: dr : distancia relativa Sol-Tierra .
J : número de día del año .
1. Introducción
35
2Dia309
Mes275= JDIA −
+−
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 .
23,15Mes42,30= JMES −
donde: JMES : Número de día del año para estimación mensual .
Mes : Número de mes del año en curso .
)T+ T( )ed0.14 - (0.34 0.1)+ Nn
(0.910 . 2.45 = R 4minima
4maxima
-nl
9
donde: Rnl : 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].
Tmaxima : temperatura máxima del aire [ºK].
Tminima : temperatura mínima del aire [ºK].
)tmax(a)tmin(a
mediad
e50
e50
HR= e
+
donde: ed : 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 [%].
1. Introducción
36
+ 3,237T
T27,17
a e·6108,0= e
donde: ea : presión de vapor de saturación a la temperatura T [kPa].
T : temperatura [ºC].
ClP
00163,0= γ
donde: y : constante psicrométrica [kPa ºC-1].
P : presión atmosférica [kPa].
Cl : calor latente de vaporización [MJ kg-1].
26,5
T273alt0065.0)T273(
3,101= P
+−+
donde: P : presión atmosférica en la altitud alt [kPa].
T : temperatura del aire [ºC].
alt : altitud [m].
)T10·361,2(501,2= Cl 3−−donde: Cl : calor latente de vaporización [MJ kg-1].
T : temperatura del aire [ºC].
( )2a
3,273T
e4098
+=∆
donde: A : 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].
1. Introducción
37
1.4.2. Coeficiente de cultivo (Kc).
El coeficiente de cultivo relaciona la evapotranspiración de referencia con la
evapotranspiración del cultivo:
ETcETo
Kc =
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 TIPO DE CULTIVOA B D E F G H L
Cubierta vegetal PP PPHeladas PP PPHumedad PP PP PP PP PPViento PP PP PP PP PP PPEdad PP PP PPFrecuencia riegos o lluvias PP PP PPTextura del suelo PPTipos 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
1. Introducción
38
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.
1. Introducción
39
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.
1. Introducción
40
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.
1. Introducción
41
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.
1. Introducción
42
- 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
1. Introducción
43
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.
1. Introducción
44
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.
1. Introducción
45
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]
1. Introducción
46
- 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
1. Introducción
47
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.
1. Introducción
48
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.
1. Introducción
49
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.
1. Introducción
50
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:
CEaCEs5CEa
LR−
=
siendo LR : 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:
MaxCEs·2CEa
LR =
siendo 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].
1. Introducción
51
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:
%o%100%o
S CEP100
CECECE +⋅
−
=
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.
1. Introducción
52
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):
EaNn
Nb =
siendo 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):
FlNn
Nb =
siendo Nb : Necesidad bruta de riego [mm].
Nn : Necesidad neta de riego [mm].
Fl : Fracción de lavado .
1. Introducción
53
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.
1. Introducción
54
La relación es la siguiente:
−=−
ETmETa
1KyYmYa
1
donde Ya : Producción 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.
1. Introducción
55
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.
1. Introducción
56
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
1. Introducción
57
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.
1. Introducción
58
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.
1. Introducción
59
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.
1. Introducción
60
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.
1. Introducción
61
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.
1. Introducción
62
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.
1. Introducción
63
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, watersupplies)HOURLYET (Hourly Evapotranspiration for Automatic Weather Stations)HOWWET ? (Estimating the storage of water and mineralised nitrogen in your soil using rainfallrecords )HYDRA (Modelling and Decision Support Systems to irrigation)I M S ( Irrigation Scheduling)
1. Introducción
64
INCA (Irrigation Network Control & Analysis)I W R ( Irrigation Water RequirementsLANDSCAPE WATER MANAGEMENT SOFTWARE (Auditing & Budgeting) MacPET (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 )
2. Objetivos
65
2. OBJETIVOS.
2. Objetivos
66
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.
3. Material y métodos
67
3. MATERIAL Y MÉTODO
3. Material y métodos
68
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).
3. Material y métodos
69
- 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
4. Resultados y discusión
70
4. RESULTADOS Y DISCUSIÓN
4. Resultados y discusión
71
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.
4. Resultados y discusión
72
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.
4. Resultados y discusión
73
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.
4. Resultados y discusión
74
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
4. Resultados y discusión
75
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.
4. Resultados y discusión
76
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.
4. Resultados y discusión
77
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.
4. Resultados y discusión
78
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.
4. Resultados y discusión
79
Fecha de plantación. En los cultivos anuales se introducirá la fecha (mes-dia-
añ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.
4. Resultados y discusión
80
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.
4. Resultados y discusión
81
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.
4. Resultados y discusión
82
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[%]
DensidadAparente[g/cm3]
Infiltración[mm/hora]
EficienciaLavado
[%]
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
4. Resultados y discusión
83
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.
4. Resultados y discusión
84
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.
4. Resultados y discusión
85
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.
4. Resultados y discusión
86
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
4. Resultados y discusión
87
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.
4. Resultados y discusión
88
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.
5. Conclusiones
89
5. CONCLUSIONES.
5. Conclusiones
90
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.
6. Bibliografía
91
6. BIBLIOGRAFÍA
6. Bibliografía
92
6. BIBLIOGRAFÍA.
COROMINAS, J. 1997. El regadío en el umbral del siglo XXI: Plan Nacional deRegadíos y Plan de Regadíos de Andalucía. Número: 90. Páginas: 22-37. Riegosy Drenajes XXI.
COROMINAS, J. 1997. El regadío en el umbral del siglo XXI: Plan Nacional deRegadíos y Plan de Regadíos de Andalucía. Número: 91. Páginas: 46-55. Riegosy Drenajes XXI.
DOORENBOS, J. y PRUITT, W.O. . 1977. Las necesidades de agua de loscultivos. 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.Generalitatde Catalunya. D.A.R.P. 19 pp.
GENERALITAT DE CATALUNYA.1997.PACREG. Programa de reg localizat i persuperficie (versio 3.0). Manual de l'usuari. Generalitat de Catalunya. D.A.R.P. 48pp.
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íadel 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 Mundi-Prensa. 188 pp.
SMITH, M. . 1993. CROPWAT. Programa de ordenador para planificar y manejarel 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.
7. Anejos
93
7. ANEJOS.
7. Anejo 1
94
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla1. Porcentaje diario medio de horas diurnas anuales a diferentes latitudes.
7. Anejo 1
95
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.
7. Anejo 1
96
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.
7. Anejo 1
97
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 3. Radiación extraterrestre.
7. Anejo 1
98
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 4. Duración máxima de las horas fuertes de insolación.
7. Anejo 1
99
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).
7. Anejo 1
100
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 6. Factor de ponderación W.
7. Anejo 1
101
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.
7. Anejo 1
102
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 7. Factor de corrección c en la ecuación de Penman.
7. Anejo 1
103
7. ANEJO1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 8. Presión saturante del vapor ea.
7. Anejo 1
104
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 9. Presión del vapor ed.
7. Anejo 1
105
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.
7. Anejo 1
106
7. ANEJO 1. TABLAS Y FIGURAS DEL MANUAL FAO-24.Tabla 14. Coeficiente Kp para una cubeta de clase A.
7. Anejo 2
107
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.Figura 1. Programa DAYLET.
7. Anejo 2
108
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 2. Programa FAO-PMAN.XLS (continuación).
7. Anejo 2
109
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 3. Programa FAO-PMAN.XLS (continuación).
7. Anejo 2
110
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 4. Programa-FAO PMAN.XLS (continuación)
Tmax Temperatura máxima [ºC] Aeroterm Término aerodinámico [mm d-1
]Tmin Temperatura mínima [ºC] Month MesRHmean Humedad relativa media [%] Dayno Día del añoRHmin Humedad relativa mínima [%] Soldeclin Declinación solar [rad]
Wind (km/d) Humedad relativa máxima [%] Omega Angulo horario [rad]Sunhours Horas de sol Dr Distancia relativa Sol-Tierra
ET fao ETo FAO [mm] Ra Radiación extraterrestre [MJ m-2
d-1]
Avg Temp Temperatura media [ºC] N Horas de sol máximas
n/N Relación horas Sol y horas máximas de Sol Rns Radiación neta de onda corta [MJ m-2 d
-1]
Wind (m/s) Viento diario [m/s] f(n/N) Factor de nubes bajas
Ea(Tmax) Presión de vapor en saturación a temp. Máxima [kPa] sigma(Tx_Tn) Constante de Stefan-Boltzman [MJ-2
K-4
d-1]
Ea(Tmin) Presión de vapor en saturación a temp. Mínima [kPa] emissivity Emisividad
Edew Presión actual de vapor [kPa] Rbo Radiación neta de onda larga [MJ m-2 d
-1]
RH(max-min) Humedad relativa media [%] LWR Radiación neta de onda larga [MJ m -2 d-1]
Dlt(ETx-ETn) Pendiente de la curva de presión de vapor [kPA] Rn (Rns-Rl) Radiación Neta [MJ m-2 d
-1]
P-atm. Presión atmosférica [kPa] G Flujo de calor del suelo [MJ m-2
d-1]
lambda Calor latente de vaporización [MJ kg-1
] Rn-G Radiación neta - Flujo de calor del suelo [MJ m-2
d-1
]
gamma Constante psicrométrica [kPa ºC-1
] Rad Term Término debido a la radiación [MJ m-2
d-1
]rc Resistencia aerodinámica del cultivo Rad Term(-G) Término radiación - Flujo calor suelo [MJ m
-2 d
-1]
ra Resistencia aerodinámica [ s m-1] ETcomb ETo [mm]
gamma* Constante psicrométrica modificada [kPa ºC-1] ET (-G) Evapotranspiración - Flujo de calor del suelo [mm]
Leyenda de la hoja de cálculo FAO-PMON.XLS
7. Anejo 2
111
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 5. Programa FAO-PMAN.XLS (continuación).
FAO Penman-Monteith - EToRef. Evapotranspiration Rome
0,00
1,00
2,00
3,00
4,00
5,00
6,00
7,00
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
ET
o m
m/d
ay
ETo (-G) ETo
7. Anejo 2
112
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 6. Programa SW.
7. Anejo 2
113
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
7. Anejo 2
114
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 8. Programa REQRIEGO.XLS.
7. Anejo 2
115
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 9. Programa REQRIEGO.XLS (continuación).
7. Anejo 2
116
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 10. Programa REQRI EGO.X LS (continuación)
ea Presión de vapor saturante [kPa]HR Humedad relativa [%]ea-ed Déficit de presión de vapor [kPa]
Uo Velocidad viento diario [m s-1]
f(n) Función de viento [mm kPa-1]Delta Pendiente de la curva de presión de vapor [kPa]
Gamma Constante psicrométrica [kPa ºC-1]W Función de peso
T. Suelo Tipo de suelo (textura)CC Capacidad de campo [%]
PMP Punto de marchitamiento permanente [%]Da Densidad aparente [g cm -3]
Pr Profundidad raíces [cm]
K Factor agotamiento permisible DEC Declinación solar [rad]
N Horas de sola máxima [h]Ra Radiación extraterrestre [MJ m -2 d-1]
n Horas de sol percibidas [h]Rns Radiación neta de onda corta [MJ m -2 d-1]
Rnl Radiación neta de onda larga [MJ m -2 d-1]
ETo Evapotranspiración de referencia [mm periodo -1]Kc Coeficiente de cultivoETc Evapotranspiración de cultivo [mm dia-1]
Precip.efect. precipitación efectiva [mm periodo-1]BALANCE Balance hídrico [mm mes -1]
Leyenda de la hoja de cálculo REQRIEGO.XLS
7. Anejo 2
117
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
-0,200
0,000
0,200
0,400
0,600
0,800
1,000
1,200
1,400
0 1 2 3 4 5 6 7 8 9 10 11 12
meses del año
Kc Ser ie1
7. Anejo 2
118
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 ?
7. Anejo 2
119
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
7. Anejo 2
120
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 14. Programa BIGSIM.
7. Anejo 2
121
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 15. Programa CROPSYST.
7. Anejo 2
122
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 16. Programa WATERMOD.
7. Anejo 2
123
7. ANEJO 2. PROGRAMAS PARA EL CÁLCULO DE LAS NECESIDADES HÍDRICAS.
Figura 17. RED IRRISOFT
7. Anejo 3
124
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 1. Flujo de datos
PROGRAMACIÓN
DatosFinca
DatosCultivo
DatosClimáticos
DatosSuelo
DatosAgua Riego
ProgramaciónRiego
Prof. Raíces
Kc
Sistemas RiegoCultivos
Fracción Agotami.
Días Cultivo Clima
Tolerancia Sal
BALANCE HÍDRICO
Cálculos
Decisión
BALANCE HÍDRICO RIEGOS
Texturas Suelo
Tipo Riego
LEYENDA
Entrada/Visualización de datos
Proceso
Decisión
Fichero
Listado
7. Anejo 3
125
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 2. Menú del programa.
7. Anejo 3
126
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 3. Nuevo diseño en diseño agronómico.
7. Anejo 3
127
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 4. Abrir diseño en diseño agronómico.
7. Anejo 3
128
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 5. Mantenimiento de tablas.
7. Anejo 3
129
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 6. Sistemas de riego en mantenimiento de tablas.
7. Anejo 3
130
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 7. Datos de la finca.
7. Anejo 3
131
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 8. Datos del cultivo (cultivo con Kc en 12 fases).
7. Anejo 3
132
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 9. Datos del cultivo (cultivo con Kc en 4 fases).
7. Anejo 3
133
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 10. Datos meteorológicos (formato de entrada).
7. Anejo 3
134
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 11. Datos meteorológicos (obtención de un fichero meteorológico).
7. Anejo 3
135
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 12. Datos meteorológicos (calendario diario).
7. Anejo 3
136
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 13. Datos meteorológicos (calendario mensual).
7. Anejo 3
137
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 14. Datos meteorológicos (entrada de datos meteorológicos).
7. Anejo 3
138
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 15. Datos del suelo.
7. Anejo 3
139
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 16. Datos del agua de riego.
7. Anejo 3
140
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 17. Datos del tipo de riego.
7. Anejo 3
141
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 18. Datos de la programación de riego.
7. Anejo 3
142
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 19. Resultados.
7. Anejo 3
143
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 20. Resultados. Listado del balance hídrico.BALANCE HÍDRICO 28/11/98 19:23:55
Programación........................................: NARANJAS (CLIMA DIARIO, AÑO 1998, VICENTE MAS)Finca...............................................: La TaronjeraPoblación...........................................: AlcanarProvincia...........................................: TarragonaLatitud [g,m,s].....................................: 40º 3' 33'' NºLongitud [g,m,s]....................................: 0º 31' 28'' EºAltitud [m].........................................: 35Superficie [m2].....................................: 10000Cultivo.............................................: NARANJOFracción agua disponible en el suelo................: 0,35Clase textural......................................: FRANCODensidad aparente [g/cm3]...........................: 1,51Capacidad de Campo [% peso].........................: 19Punto de Marchitamiento [%peso].....................: 10Sistema Riego.......................................: GOTEO (ZONAS ARIDAS)Eficiencia en la aplicación [%].....................: 90Caudal instalación riego [m3/parcela]...............: 12Conductividad agua de riego [dS/m)..................: 1Eficiencia en el lavado de sales [%]................: 70Rendimiento mínimo deseado debido a salinidad [%]...: 100Fecha Plantación/Inicio.............................: 01-01-1998Momento de Riego. Agotamiento de la RFU [%].........: 100Intervalo de riego [días]...........................: 2Dosis de riego. Recarga de la RFU [%]...............: 100Nivel de agua de la RFU al inicio [%]...............: 0
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------01-01-1998 0,97 0,75 0,79 0,57 6,24 60 0,35 28,5 5,67 0,00 0,00 0,0 0,0 0,002-01-1998 0,85 0,75 0,79 0,51 6,08 60 0,35 28,5 11,24 0,00 0,00 0,0 0,0 0,003-01-1998 1,75 0,75 0,79 1,04 24,10 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,004-01-1998 2,03 0,75 0,79 1,20 0,00 60 0,35 28,5 27,33 0,00 0,00 0,0 0,0 0,005-01-1998 0,50 0,75 0,79 0,30 4,06 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,006-01-1998 0,49 0,75 0,79 0,29 31,20 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,007-01-1998 1,13 0,75 0,79 0,67 0,93 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,008-01-1998 0,32 0,75 0,79 0,19 7,80 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
144
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------09-01-1998 1,16 0,75 0,79 0,69 0,31 60 0,35 28,5 28,53 0,38 0,57 5,7 6,5 0,510-01-1998 2,03 0,75 0,79 1,20 0,00 60 0,35 28,5 27,34 0,00 0,00 0,0 0,0 0,011-01-1998 1,05 0,75 0,79 0,62 0,00 60 0,35 28,5 28,53 1,82 2,78 27,8 0,3 2,312-01-1998 1,21 0,75 0,79 0,72 0,16 60 0,35 28,5 27,98 0,00 0,00 0,0 0,0 0,013-01-1998 0,50 0,75 0,79 0,30 0,16 60 0,35 28,5 28,53 0,69 1,05 10,5 0,1 0,914-01-1998 1,07 0,75 0,79 0,63 0,16 60 0,35 28,5 28,06 0,00 0,00 0,0 0,0 0,015-01-1998 1,41 0,75 0,79 0,83 0,00 60 0,35 28,5 28,53 1,31 1,99 19,9 0,2 1,716-01-1998 1,13 0,75 0,79 0,67 0,00 60 0,35 28,5 27,86 0,00 0,00 0,0 0,0 0,017-01-1998 0,79 0,75 0,79 0,47 6,56 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,018-01-1998 1,29 0,75 0,79 0,76 0,16 60 0,35 28,5 27,93 0,00 0,00 0,0 0,0 0,019-01-1998 0,60 0,75 0,79 0,36 2,96 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,020-01-1998 1,32 0,75 0,79 0,78 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,021-01-1998 1,10 0,75 0,79 0,65 0,16 60 0,35 28,5 28,53 0,49 0,75 7,5 8,5 0,622-01-1998 1,19 0,75 0,79 0,70 0,62 60 0,35 28,5 28,45 0,00 0,00 0,0 0,0 0,023-01-1998 0,97 0,75 0,79 0,58 4,21 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,024-01-1998 0,91 0,75 0,79 0,54 3,28 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,025-01-1998 1,03 0,75 0,79 0,61 5,46 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,026-01-1998 1,18 0,75 0,79 0,70 0,00 60 0,35 28,5 27,83 0,00 0,00 0,0 0,0 0,027-01-1998 0,72 0,75 0,79 0,42 0,16 60 0,35 28,5 28,53 0,96 1,47 14,7 0,2 1,228-01-1998 1,32 0,75 0,79 0,78 0,16 60 0,35 28,5 27,91 0,00 0,00 0,0 0,0 0,029-01-1998 0,75 0,75 0,79 0,44 9,04 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,030-01-1998 1,41 0,75 0,79 0,83 0,16 60 0,35 28,5 27,86 0,00 0,00 0,0 0,0 0,031-01-1998 0,79 0,75 0,79 0,47 0,16 60 0,35 28,5 28,53 0,98 1,50 15,0 0,2 1,201-02-1998 1,32 0,75 0,79 0,78 0,00 60 0,35 28,5 27,75 0,00 0,00 0,0 0,0 0,002-02-1998 0,97 0,75 0,79 0,57 0,16 60 0,35 28,5 28,53 1,20 1,82 18,2 0,2 1,503-02-1998 1,65 0,75 0,79 0,98 1,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,004-02-1998 1,39 0,75 0,79 0,82 0,00 60 0,35 28,5 28,53 0,82 1,26 12,6 0,1 1,005-02-1998 1,32 0,75 0,79 0,78 0,16 60 0,35 28,5 27,91 0,00 0,00 0,0 0,0 0,006-02-1998 1,75 0,75 0,79 1,03 0,00 60 0,35 28,5 28,53 1,66 2,53 25,3 0,3 2,107-02-1998 1,63 0,75 0,79 0,97 0,16 60 0,35 28,5 27,73 0,00 0,00 0,0 0,0 0,008-02-1998 1,48 0,75 0,79 0,88 0,16 60 0,35 28,5 28,53 1,53 2,33 23,3 0,3 1,909-02-1998 1,50 0,75 0,79 0,89 0,16 60 0,35 28,5 27,80 0,00 0,00 0,0 0,0 0,010-02-1998 1,38 0,75 0,79 0,82 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,811-02-1998 1,68 0,75 0,79 0,99 0,16 60 0,35 28,5 27,70 0,00 0,00 0,0 0,0 0,012-02-1998 1,92 0,75 0,79 1,14 0,00 60 0,35 28,5 28,53 1,97 3,00 30,0 0,3 2,513-02-1998 2,79 0,75 0,79 1,65 0,00 60 0,35 28,5 26,88 0,00 0,00 0,0 0,0 0,014-02-1998 2,04 0,75 0,79 1,21 0,00 60 0,35 28,5 28,53 2,86 4,36 43,6 0,5 3,615-02-1998 4,48 0,75 0,79 2,66 2,34 60 0,35 28,5 28,22 0,00 0,00 0,0 0,0 0,016-02-1998 1,85 0,75 0,79 1,09 0,00 60 0,35 28,5 28,53 1,41 2,15 21,5 0,2 1,817-02-1998 1,65 0,75 0,79 0,98 0,00 60 0,35 28,5 27,56 0,00 0,00 0,0 0,0 0,018-02-1998 1,42 0,75 0,79 0,84 0,00 60 0,35 28,5 28,53 1,82 2,77 27,7 0,3 2,319-02-1998 1,71 0,75 0,79 1,01 0,00 60 0,35 28,5 27,52 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
145
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------20-02-1998 1,85 0,75 0,79 1,09 0,00 60 0,35 28,5 28,53 2,11 3,21 32,1 0,4 2,721-02-1998 1,35 0,75 0,79 0,80 0,16 60 0,35 28,5 27,90 0,00 0,00 0,0 0,0 0,022-02-1998 1,18 0,75 0,79 0,70 0,00 60 0,35 28,5 28,53 1,34 2,04 20,4 0,2 1,723-02-1998 1,12 0,75 0,79 0,66 0,00 60 0,35 28,5 27,87 0,00 0,00 0,0 0,0 0,024-02-1998 1,58 0,75 0,79 0,94 0,16 60 0,35 28,5 28,53 1,44 2,19 21,9 0,2 1,825-02-1998 2,00 0,75 0,79 1,18 0,00 60 0,35 28,5 27,35 0,00 0,00 0,0 0,0 0,026-02-1998 3,63 0,75 0,79 2,15 0,00 60 0,35 28,5 28,53 3,34 5,08 50,8 0,6 4,227-02-1998 2,33 0,75 0,79 1,38 0,00 60 0,35 28,5 27,16 0,00 0,00 0,0 0,0 0,028-02-1998 1,73 0,75 0,79 1,03 0,00 60 0,35 28,5 28,53 2,41 3,66 36,6 0,4 3,101-03-1998 1,26 0,80 0,79 0,79 0,00 60 0,35 28,5 27,74 0,00 0,00 0,0 0,0 0,002-03-1998 1,52 0,80 0,79 0,96 0,16 60 0,35 28,5 28,53 1,59 2,43 24,3 0,3 2,003-03-1998 1,20 0,80 0,79 0,76 0,16 60 0,35 28,5 27,94 0,00 0,00 0,0 0,0 0,004-03-1998 1,45 0,80 0,79 0,92 0,00 60 0,35 28,5 28,53 1,52 2,31 23,1 0,3 1,905-03-1998 1,43 0,80 0,79 0,90 0,00 60 0,35 28,5 27,63 0,00 0,00 0,0 0,0 0,006-03-1998 1,53 0,80 0,79 0,97 0,00 60 0,35 28,5 28,53 1,87 2,84 28,4 0,3 2,407-03-1998 2,00 0,80 0,79 1,27 0,00 60 0,35 28,5 27,27 0,00 0,00 0,0 0,0 0,008-03-1998 2,70 0,80 0,79 1,71 0,16 60 0,35 28,5 28,53 2,81 4,28 42,8 0,5 3,609-03-1998 2,60 0,80 0,79 1,64 0,00 60 0,35 28,5 26,89 0,00 0,00 0,0 0,0 0,010-03-1998 2,54 0,80 0,79 1,60 0,00 60 0,35 28,5 28,53 3,25 4,94 49,4 0,6 4,111-03-1998 3,03 0,80 0,79 1,91 0,00 60 0,35 28,5 26,62 0,00 0,00 0,0 0,0 0,012-03-1998 2,52 0,80 0,79 1,59 0,00 60 0,35 28,5 28,53 3,51 5,34 53,4 0,6 4,513-03-1998 2,48 0,80 0,79 1,57 0,00 60 0,35 28,5 26,97 0,00 0,00 0,0 0,0 0,014-03-1998 2,45 0,80 0,79 1,55 0,00 60 0,35 28,5 28,53 3,12 4,75 47,5 0,5 4,015-03-1998 2,46 0,80 0,79 1,55 0,00 60 0,35 28,5 26,98 0,00 0,00 0,0 0,0 0,016-03-1998 2,46 0,80 0,79 1,55 0,00 60 0,35 28,5 28,53 3,11 4,74 47,4 0,5 3,917-03-1998 2,37 0,80 0,79 1,49 0,00 60 0,35 28,5 27,04 0,00 0,00 0,0 0,0 0,018-03-1998 3,15 0,80 0,79 1,99 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,419-03-1998 6,14 0,80 0,79 3,88 0,00 60 0,35 28,5 24,65 0,00 0,00 0,0 0,0 0,020-03-1998 2,96 0,80 0,79 1,87 0,00 60 0,35 28,5 28,53 5,75 8,77 87,7 1,0 7,321-03-1998 2,40 0,80 0,79 1,52 0,00 60 0,35 28,5 27,02 0,00 0,00 0,0 0,0 0,022-03-1998 2,29 0,80 0,79 1,45 0,00 60 0,35 28,5 28,53 2,97 4,52 45,2 0,5 3,823-03-1998 2,26 0,80 0,79 1,43 0,00 60 0,35 28,5 27,10 0,00 0,00 0,0 0,0 0,024-03-1998 3,22 0,80 0,79 2,03 0,62 60 0,35 28,5 28,53 2,84 4,33 43,3 0,5 3,625-03-1998 1,65 0,80 0,79 1,04 0,00 60 0,35 28,5 27,50 0,00 0,00 0,0 0,0 0,026-03-1998 2,83 0,80 0,79 1,79 0,00 60 0,35 28,5 28,53 2,83 4,31 43,1 0,5 3,627-03-1998 2,81 0,80 0,79 1,78 0,00 60 0,35 28,5 26,76 0,00 0,00 0,0 0,0 0,028-03-1998 2,94 0,80 0,79 1,86 0,00 60 0,35 28,5 28,53 3,63 5,53 55,3 0,6 4,629-03-1998 2,30 0,80 0,79 1,45 0,00 60 0,35 28,5 27,08 0,00 0,00 0,0 0,0 0,030-03-1998 2,78 0,80 0,79 1,75 0,00 60 0,35 28,5 28,53 3,21 4,89 48,9 0,5 4,131-03-1998 2,17 0,80 0,79 1,37 0,00 60 0,35 28,5 27,16 0,00 0,00 0,0 0,0 0,001-04-1998 2,43 0,80 0,79 1,54 0,00 60 0,35 28,5 28,53 2,91 4,43 44,3 0,5 3,702-04-1998 2,81 0,80 0,79 1,78 0,00 60 0,35 28,5 26,76 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
146
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------03-04-1998 3,01 0,80 0,79 1,90 0,00 60 0,35 28,5 28,53 3,68 5,61 56,1 0,6 4,704-04-1998 3,92 0,80 0,79 2,48 0,00 60 0,35 28,5 26,06 0,00 0,00 0,0 0,0 0,005-04-1998 3,52 0,80 0,79 2,23 0,00 60 0,35 28,5 28,53 4,70 7,16 71,6 0,8 6,006-04-1998 3,40 0,80 0,79 2,15 0,00 60 0,35 28,5 26,38 0,00 0,00 0,0 0,0 0,007-04-1998 2,51 0,80 0,79 1,59 0,00 60 0,35 28,5 28,53 3,74 5,69 56,9 0,6 4,708-04-1998 1,88 0,80 0,79 1,19 0,00 60 0,35 28,5 27,35 0,00 0,00 0,0 0,0 0,009-04-1998 3,17 0,80 0,79 2,00 0,00 60 0,35 28,5 28,53 3,19 4,85 48,5 0,5 4,010-04-1998 3,48 0,80 0,79 2,20 0,16 60 0,35 28,5 26,50 0,00 0,00 0,0 0,0 0,011-04-1998 3,38 0,80 0,79 2,14 0,00 60 0,35 28,5 28,53 4,18 6,36 63,6 0,7 5,312-04-1998 3,99 0,80 0,79 2,52 0,00 60 0,35 28,5 26,01 0,00 0,00 0,0 0,0 0,013-04-1998 3,08 0,80 0,79 1,94 0,00 60 0,35 28,5 28,53 4,47 6,81 68,1 0,8 5,714-04-1998 3,32 0,80 0,79 2,10 0,00 60 0,35 28,5 26,44 0,00 0,00 0,0 0,0 0,015-04-1998 3,14 0,80 0,79 1,99 0,16 60 0,35 28,5 28,53 3,92 5,98 59,8 0,7 5,016-04-1998 3,07 0,80 0,79 1,94 0,00 60 0,35 28,5 26,60 0,00 0,00 0,0 0,0 0,017-04-1998 1,13 0,80 0,79 0,71 2,80 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,018-04-1998 1,05 0,80 0,79 0,67 7,64 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,019-04-1998 1,74 0,80 0,79 1,10 0,78 60 0,35 28,5 28,53 0,32 0,49 4,9 5,5 0,420-04-1998 0,48 0,80 0,79 0,30 24,60 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,021-04-1998 3,49 0,80 0,79 2,20 0,00 60 0,35 28,5 28,53 2,20 3,36 33,6 0,4 2,822-04-1998 3,65 0,80 0,79 2,30 0,00 60 0,35 28,5 26,23 0,00 0,00 0,0 0,0 0,023-04-1998 3,58 0,80 0,79 2,26 0,00 60 0,35 28,5 28,53 4,57 6,96 69,6 0,8 5,824-04-1998 2,79 0,80 0,79 1,76 0,00 60 0,35 28,5 26,77 0,00 0,00 0,0 0,0 0,025-04-1998 3,42 0,80 0,79 2,16 0,00 60 0,35 28,5 28,53 3,92 5,98 59,8 0,7 5,026-04-1998 2,91 0,80 0,79 1,84 0,16 60 0,35 28,5 26,86 0,00 0,00 0,0 0,0 0,027-04-1998 3,34 0,80 0,79 2,11 0,00 60 0,35 28,5 28,53 3,79 5,78 57,8 0,6 4,828-04-1998 4,81 0,80 0,79 3,04 0,00 60 0,35 28,5 25,50 0,00 0,00 0,0 0,0 0,029-04-1998 6,14 0,80 0,79 3,88 0,00 60 0,35 28,5 28,53 6,92 10,54 105,4 1,2 8,830-04-1998 4,37 0,80 0,79 2,76 0,00 60 0,35 28,5 25,77 0,00 0,00 0,0 0,0 0,001-05-1998 4,20 0,80 0,79 2,65 0,00 60 0,35 28,5 28,53 5,41 8,25 82,5 0,9 6,902-05-1998 3,81 0,80 0,79 2,40 0,00 60 0,35 28,5 26,13 0,00 0,00 0,0 0,0 0,003-05-1998 3,25 0,80 0,79 2,05 0,00 60 0,35 28,5 28,53 4,46 6,79 67,9 0,8 5,704-05-1998 3,84 0,80 0,79 2,43 0,16 60 0,35 28,5 26,27 0,00 0,00 0,0 0,0 0,005-05-1998 4,88 0,80 0,79 3,08 0,00 60 0,35 28,5 28,53 5,35 8,15 81,5 0,9 6,806-05-1998 6,98 0,80 0,79 4,41 0,00 60 0,35 28,5 24,12 0,00 0,00 0,0 0,0 0,007-05-1998 3,02 0,80 0,79 1,91 0,62 60 0,35 28,5 28,53 5,70 8,68 86,8 1,0 7,208-05-1998 4,02 0,80 0,79 2,54 0,00 60 0,35 28,5 25,99 0,00 0,00 0,0 0,0 0,009-05-1998 4,08 0,80 0,79 2,58 0,00 60 0,35 28,5 28,53 5,12 7,80 78,0 0,9 6,510-05-1998 3,04 0,80 0,79 1,92 0,00 60 0,35 28,5 26,61 0,00 0,00 0,0 0,0 0,011-05-1998 2,56 0,80 0,79 1,62 0,00 60 0,35 28,5 28,53 3,54 5,39 53,9 0,6 4,512-05-1998 2,36 0,80 0,79 1,49 0,00 60 0,35 28,5 27,04 0,00 0,00 0,0 0,0 0,013-05-1998 3,27 0,80 0,79 2,06 0,00 60 0,35 28,5 28,53 3,56 5,42 54,2 0,6 4,514-05-1998 3,75 0,80 0,79 2,37 0,31 60 0,35 28,5 26,48 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
147
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------15-05-1998 1,76 0,80 0,79 1,11 0,93 60 0,35 28,5 28,53 2,24 3,41 34,1 0,4 2,816-05-1998 3,65 0,80 0,79 2,31 0,00 60 0,35 28,5 26,23 0,00 0,00 0,0 0,0 0,017-05-1998 3,87 0,80 0,79 2,45 1,24 60 0,35 28,5 28,53 3,51 5,35 53,5 0,6 4,518-05-1998 3,69 0,80 0,79 2,33 0,00 60 0,35 28,5 26,20 0,00 0,00 0,0 0,0 0,019-05-1998 3,12 0,80 0,79 1,97 0,00 60 0,35 28,5 28,53 4,30 6,56 65,6 0,7 5,520-05-1998 5,84 0,80 0,79 3,69 0,00 60 0,35 28,5 24,84 0,00 0,00 0,0 0,0 0,021-05-1998 3,91 0,80 0,79 2,47 1,87 60 0,35 28,5 28,53 4,29 6,54 65,4 0,7 5,422-05-1998 4,12 0,80 0,79 2,60 0,00 60 0,35 28,5 25,93 0,00 0,00 0,0 0,0 0,023-05-1998 4,33 0,80 0,79 2,74 0,00 60 0,35 28,5 28,53 5,34 8,14 81,4 0,9 6,824-05-1998 1,69 0,80 0,79 1,07 0,16 60 0,35 28,5 27,63 0,00 0,00 0,0 0,0 0,025-05-1998 5,21 0,80 0,79 3,29 6,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,026-05-1998 6,20 0,80 0,79 3,92 0,00 60 0,35 28,5 24,62 0,00 0,00 0,0 0,0 0,027-05-1998 5,18 0,80 0,79 3,28 0,00 60 0,35 28,5 28,53 7,19 10,95 109,6 1,2 9,128-05-1998 5,01 0,80 0,79 3,16 0,00 60 0,35 28,5 25,37 0,00 0,00 0,0 0,0 0,029-05-1998 5,35 0,80 0,79 3,38 0,00 60 0,35 28,5 28,53 6,54 9,97 99,7 1,1 8,330-05-1998 3,07 0,80 0,79 1,94 0,00 60 0,35 28,5 26,60 0,00 0,00 0,0 0,0 0,031-05-1998 2,23 0,80 0,79 1,41 5,93 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,001-06-1998 2,34 0,85 0,79 1,57 1,40 60 0,35 28,5 28,36 0,00 0,00 0,0 0,0 0,002-06-1998 3,78 0,85 0,79 2,54 0,00 60 0,35 28,5 28,53 2,71 4,13 41,3 0,5 3,403-06-1998 5,04 0,85 0,79 3,38 0,00 60 0,35 28,5 25,15 0,00 0,00 0,0 0,0 0,004-06-1998 2,00 0,85 0,79 1,34 3,75 60 0,35 28,5 28,53 0,98 1,49 14,9 0,2 1,205-06-1998 5,07 0,85 0,79 3,40 0,00 60 0,35 28,5 25,13 0,00 0,00 0,0 0,0 0,006-06-1998 5,56 0,85 0,79 3,73 0,00 60 0,35 28,5 28,53 7,13 10,86 108,7 1,2 9,107-06-1998 2,32 0,85 0,79 1,55 0,93 60 0,35 28,5 27,91 0,00 0,00 0,0 0,0 0,008-06-1998 5,34 0,85 0,79 3,58 0,00 60 0,35 28,5 28,53 4,21 6,41 64,1 0,7 5,309-06-1998 5,21 0,85 0,79 3,50 0,00 60 0,35 28,5 25,04 0,00 0,00 0,0 0,0 0,010-06-1998 4,61 0,85 0,79 3,09 0,00 60 0,35 28,5 28,53 6,59 10,04 100,4 1,1 8,411-06-1998 5,32 0,85 0,79 3,57 0,00 60 0,35 28,5 24,96 0,00 0,00 0,0 0,0 0,012-06-1998 4,66 0,85 0,79 3,13 0,00 60 0,35 28,5 28,53 6,70 10,20 102,1 1,1 8,513-06-1998 4,82 0,85 0,79 3,23 0,00 60 0,35 28,5 25,30 0,00 0,00 0,0 0,0 0,014-06-1998 6,51 0,85 0,79 4,37 0,00 60 0,35 28,5 28,53 7,60 11,58 115,8 1,3 9,715-06-1998 5,30 0,85 0,79 3,56 0,00 60 0,35 28,5 24,98 0,00 0,00 0,0 0,0 0,016-06-1998 3,17 0,85 0,79 2,13 0,00 60 0,35 28,5 28,53 5,69 8,67 86,7 1,0 7,217-06-1998 2,81 0,85 0,79 1,88 0,00 60 0,35 28,5 26,65 0,00 0,00 0,0 0,0 0,018-06-1998 3,56 0,85 0,79 2,39 0,62 60 0,35 28,5 28,53 3,65 5,56 55,6 0,6 4,619-06-1998 4,30 0,85 0,79 2,88 0,00 60 0,35 28,5 25,65 0,00 0,00 0,0 0,0 0,020-06-1998 5,16 0,85 0,79 3,46 0,00 60 0,35 28,5 28,53 6,35 9,67 96,7 1,1 8,121-06-1998 4,83 0,85 0,79 3,24 0,00 60 0,35 28,5 25,29 0,00 0,00 0,0 0,0 0,022-06-1998 3,85 0,85 0,79 2,58 0,00 60 0,35 28,5 28,53 5,82 8,87 88,7 1,0 7,423-06-1998 6,17 0,85 0,79 4,14 0,00 60 0,35 28,5 24,39 0,00 0,00 0,0 0,0 0,024-06-1998 5,37 0,85 0,79 3,61 0,00 60 0,35 28,5 28,53 7,75 11,80 118,0 1,3 9,825-06-1998 4,24 0,85 0,79 2,84 0,00 60 0,35 28,5 25,69 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
148
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------26-06-1998 4,68 0,85 0,79 3,14 0,78 60 0,35 28,5 28,53 5,20 7,93 79,3 0,9 6,627-06-1998 2,77 0,85 0,79 1,86 0,00 60 0,35 28,5 26,68 0,00 0,00 0,0 0,0 0,028-06-1998 1,60 0,85 0,79 1,07 28,20 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,029-06-1998 3,74 0,85 0,79 2,51 0,00 60 0,35 28,5 26,02 0,00 0,00 0,0 0,0 0,030-06-1998 4,44 0,85 0,79 2,98 0,00 60 0,35 28,5 28,53 5,49 8,37 83,7 0,9 7,001-07-1998 4,49 0,85 0,79 3,02 0,00 60 0,35 28,5 25,52 0,00 0,00 0,0 0,0 0,002-07-1998 4,29 0,85 0,79 2,88 0,16 60 0,35 28,5 28,53 5,74 8,74 87,4 1,0 7,303-07-1998 4,67 0,85 0,79 3,13 0,16 60 0,35 28,5 25,56 0,00 0,00 0,0 0,0 0,004-07-1998 2,45 0,85 0,79 1,64 6,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,005-07-1998 6,20 0,85 0,79 4,16 0,00 60 0,35 28,5 24,37 0,00 0,00 0,0 0,0 0,006-07-1998 5,27 0,85 0,79 3,54 0,00 60 0,35 28,5 28,53 7,71 11,74 117,4 1,3 9,807-07-1998 5,59 0,85 0,79 3,75 0,00 60 0,35 28,5 24,78 0,00 0,00 0,0 0,0 0,008-07-1998 6,03 0,85 0,79 4,05 0,00 60 0,35 28,5 28,53 7,80 11,88 118,8 1,3 9,909-07-1998 3,46 0,85 0,79 2,32 1,40 60 0,35 28,5 27,61 0,00 0,00 0,0 0,0 0,010-07-1998 3,97 0,85 0,79 2,67 0,31 60 0,35 28,5 28,53 3,28 4,99 49,9 0,6 4,211-07-1998 5,41 0,85 0,79 3,63 0,00 60 0,35 28,5 24,90 0,00 0,00 0,0 0,0 0,012-07-1998 4,70 0,85 0,79 3,16 0,00 60 0,35 28,5 28,53 6,79 10,34 103,5 1,2 8,613-07-1998 4,94 0,85 0,79 3,31 0,00 60 0,35 28,5 25,22 0,00 0,00 0,0 0,0 0,014-07-1998 4,33 0,85 0,79 2,91 0,00 60 0,35 28,5 28,53 6,22 9,48 94,8 1,1 7,915-07-1998 5,80 0,85 0,79 3,90 0,00 60 0,35 28,5 24,64 0,00 0,00 0,0 0,0 0,016-07-1998 5,02 0,85 0,79 3,37 0,00 60 0,35 28,5 28,53 7,26 11,06 110,7 1,2 9,217-07-1998 5,90 0,85 0,79 3,96 0,00 60 0,35 28,5 24,58 0,00 0,00 0,0 0,0 0,018-07-1998 5,42 0,85 0,79 3,64 0,00 60 0,35 28,5 28,53 7,60 11,57 115,7 1,3 9,619-07-1998 5,58 0,85 0,79 3,74 0,00 60 0,35 28,5 24,79 0,00 0,00 0,0 0,0 0,020-07-1998 3,71 0,85 0,79 2,49 0,00 60 0,35 28,5 28,53 6,23 9,50 95,0 1,1 7,921-07-1998 4,63 0,85 0,79 3,11 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,022-07-1998 5,39 0,85 0,79 3,62 0,00 60 0,35 28,5 28,53 6,73 10,24 102,5 1,2 8,523-07-1998 4,18 0,85 0,79 2,81 0,16 60 0,35 28,5 25,89 0,00 0,00 0,0 0,0 0,024-07-1998 5,26 0,85 0,79 3,53 0,00 60 0,35 28,5 28,53 6,18 9,41 94,1 1,1 7,825-07-1998 5,74 0,85 0,79 3,85 0,00 60 0,35 28,5 24,68 0,00 0,00 0,0 0,0 0,026-07-1998 5,44 0,85 0,79 3,65 0,00 60 0,35 28,5 28,53 7,51 11,44 114,4 1,3 9,527-07-1998 4,40 0,85 0,79 2,96 0,00 60 0,35 28,5 25,58 0,00 0,00 0,0 0,0 0,028-07-1998 4,62 0,85 0,79 3,11 0,00 60 0,35 28,5 28,53 6,06 9,24 92,4 1,0 7,729-07-1998 4,67 0,85 0,79 3,13 0,00 60 0,35 28,5 25,40 0,00 0,00 0,0 0,0 0,030-07-1998 4,89 0,85 0,79 3,28 0,00 60 0,35 28,5 28,53 6,42 9,78 97,8 1,1 8,131-07-1998 5,78 0,85 0,79 3,88 0,00 60 0,35 28,5 24,65 0,00 0,00 0,0 0,0 0,001-08-1998 4,79 0,85 0,79 3,22 0,00 60 0,35 28,5 28,53 7,10 10,81 108,2 1,2 9,002-08-1998 4,81 0,85 0,79 3,23 0,00 60 0,35 28,5 25,30 0,00 0,00 0,0 0,0 0,003-08-1998 4,84 0,85 0,79 3,25 0,00 60 0,35 28,5 28,53 6,48 9,88 98,8 1,1 8,204-08-1998 3,86 0,85 0,79 2,59 0,93 60 0,35 28,5 26,87 0,00 0,00 0,0 0,0 0,005-08-1998 3,14 0,85 0,79 2,11 1,87 60 0,35 28,5 28,53 1,90 2,89 28,9 0,3 2,406-08-1998 3,60 0,85 0,79 2,42 0,31 60 0,35 28,5 26,43 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
149
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------07-08-1998 4,43 0,85 0,79 2,97 0,78 60 0,35 28,5 28,53 4,30 6,55 65,5 0,7 5,508-08-1998 4,56 0,85 0,79 3,06 0,00 60 0,35 28,5 25,48 0,00 0,00 0,0 0,0 0,009-08-1998 4,88 0,85 0,79 3,28 0,00 60 0,35 28,5 28,53 6,34 9,65 96,5 1,1 8,010-08-1998 3,15 0,85 0,79 2,12 18,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,011-08-1998 4,95 0,85 0,79 3,32 0,16 60 0,35 28,5 28,53 3,16 4,82 48,2 0,5 4,012-08-1998 4,94 0,85 0,79 3,32 0,00 60 0,35 28,5 25,22 0,00 0,00 0,0 0,0 0,013-08-1998 4,74 0,85 0,79 3,18 0,00 60 0,35 28,5 28,53 6,50 9,90 99,0 1,1 8,314-08-1998 4,69 0,85 0,79 3,15 0,00 60 0,35 28,5 25,39 0,00 0,00 0,0 0,0 0,015-08-1998 4,86 0,85 0,79 3,26 0,00 60 0,35 28,5 28,53 6,41 9,77 97,7 1,1 8,116-08-1998 3,71 0,85 0,79 2,49 0,16 60 0,35 28,5 26,20 0,00 0,00 0,0 0,0 0,017-08-1998 4,19 0,85 0,79 2,81 0,00 60 0,35 28,5 28,53 5,14 7,83 78,3 0,9 6,518-08-1998 3,27 0,85 0,79 2,19 0,00 60 0,35 28,5 26,34 0,00 0,00 0,0 0,0 0,019-08-1998 4,40 0,85 0,79 2,96 0,00 60 0,35 28,5 28,53 5,15 7,85 78,5 0,9 6,520-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,021-08-1998 4,65 0,85 0,79 3,12 0,00 60 0,35 28,5 28,53 6,22 9,48 94,8 1,1 7,922-08-1998 4,94 0,85 0,79 3,32 0,00 60 0,35 28,5 25,22 0,00 0,00 0,0 0,0 0,023-08-1998 4,76 0,85 0,79 3,20 0,00 60 0,35 28,5 28,53 6,52 9,93 99,3 1,1 8,324-08-1998 4,76 0,85 0,79 3,20 0,00 60 0,35 28,5 25,34 0,00 0,00 0,0 0,0 0,025-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,30 9,60 96,0 1,1 8,026-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,027-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,928-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,029-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,930-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,031-08-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,901-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,002-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,903-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,004-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,905-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,006-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,907-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,008-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,909-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,010-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,911-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,012-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,913-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,014-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,915-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,016-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 28,53 6,20 9,45 94,5 1,1 7,917-09-1998 4,62 0,85 0,79 3,10 0,00 60 0,35 28,5 25,43 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
150
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------18-09-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 4,84 7,37 73,7 0,8 6,119-09-1998 3,32 0,85 0,79 2,23 0,00 60 0,35 28,5 26,31 0,00 0,00 0,0 0,0 0,020-09-1998 3,10 0,85 0,79 2,08 0,00 60 0,35 28,5 28,53 4,30 6,56 65,6 0,7 5,521-09-1998 3,23 0,85 0,79 2,17 0,00 60 0,35 28,5 26,37 0,00 0,00 0,0 0,0 0,022-09-1998 3,15 0,85 0,79 2,11 0,93 60 0,35 28,5 28,53 3,35 5,10 51,0 0,6 4,323-09-1998 3,07 0,85 0,79 2,06 0,00 60 0,35 28,5 26,47 0,00 0,00 0,0 0,0 0,024-09-1998 1,91 0,85 0,79 1,28 0,47 60 0,35 28,5 28,53 2,87 4,37 43,7 0,5 3,625-09-1998 0,56 0,85 0,79 0,38 13,00 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,026-09-1998 3,15 0,85 0,79 2,12 0,00 60 0,35 28,5 28,53 2,12 3,22 32,2 0,4 2,727-09-1998 3,10 0,85 0,79 2,08 0,00 60 0,35 28,5 26,45 0,00 0,00 0,0 0,0 0,028-09-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 2,80 4,26 42,6 0,5 3,629-09-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,030-09-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,801-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,002-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,803-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,004-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,805-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,006-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,807-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,008-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,809-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,010-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,811-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,012-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,813-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,014-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 28,53 1,43 2,19 21,9 0,2 1,815-10-1998 1,07 0,85 0,79 0,72 0,00 60 0,35 28,5 27,82 0,00 0,00 0,0 0,0 0,016-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 2,46 3,74 37,4 0,4 3,117-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,018-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,419-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,020-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,421-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,022-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,423-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 26,80 0,00 0,00 0,0 0,0 0,024-10-1998 2,59 0,85 0,79 1,74 0,00 60 0,35 28,5 28,53 3,48 5,30 53,0 0,6 4,425-10-1998 2,43 0,85 0,79 1,63 0,00 60 0,35 28,5 26,91 0,00 0,00 0,0 0,0 0,026-10-1998 1,64 0,85 0,79 1,10 0,00 60 0,35 28,5 28,53 2,73 4,16 41,6 0,5 3,527-10-1998 1,61 0,85 0,79 1,08 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,028-10-1998 0,34 0,85 0,79 0,23 42,30 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,029-10-1998 1,67 0,85 0,79 1,12 0,00 60 0,35 28,5 27,41 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
151
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------30-10-1998 1,69 0,85 0,79 1,13 0,00 60 0,35 28,5 28,53 2,25 3,43 34,3 0,4 2,931-10-1998 1,76 0,85 0,79 1,18 0,00 60 0,35 28,5 27,36 0,00 0,00 0,0 0,0 0,001-11-1998 1,57 0,80 0,79 0,99 0,00 60 0,35 28,5 28,53 2,17 3,31 33,1 0,4 2,802-11-1998 0,92 0,80 0,79 0,58 2,34 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,003-11-1998 0,25 0,80 0,79 0,16 1,09 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,004-11-1998 1,35 0,80 0,79 0,85 0,16 60 0,35 28,5 27,84 0,00 0,00 0,0 0,0 0,005-11-1998 0,87 0,80 0,79 0,55 0,00 60 0,35 28,5 28,53 1,24 1,89 18,9 0,2 1,606-11-1998 2,31 0,80 0,79 1,46 0,47 60 0,35 28,5 27,55 0,00 0,00 0,0 0,0 0,007-11-1998 1,97 0,80 0,79 1,25 0,00 60 0,35 28,5 28,53 2,23 3,40 34,0 0,4 2,808-11-1998 2,36 0,80 0,79 1,49 0,00 60 0,35 28,5 27,04 0,00 0,00 0,0 0,0 0,009-11-1998 2,36 0,80 0,79 1,49 0,00 60 0,35 28,5 28,53 2,98 4,54 45,4 0,5 3,810-11-1998 1,98 0,80 0,79 1,25 0,00 60 0,35 28,5 27,29 0,00 0,00 0,0 0,0 0,011-11-1998 1,85 0,80 0,79 1,17 0,93 60 0,35 28,5 28,53 1,48 2,26 22,6 0,3 1,912-11-1998 1,86 0,80 0,79 1,18 0,00 60 0,35 28,5 27,36 0,00 0,00 0,0 0,0 0,013-11-1998 0,77 0,80 0,79 0,49 0,00 60 0,35 28,5 28,53 1,66 2,54 25,4 0,3 2,114-11-1998 1,25 0,80 0,79 0,79 0,00 60 0,35 28,5 27,74 0,00 0,00 0,0 0,0 0,015-11-1998 1,20 0,80 0,79 0,76 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,816-11-1998 1,19 0,80 0,79 0,75 0,00 60 0,35 28,5 27,78 0,00 0,00 0,0 0,0 0,017-11-1998 1,06 0,80 0,79 0,67 0,00 60 0,35 28,5 28,53 1,42 2,17 21,7 0,2 1,818-11-1998 0,51 0,80 0,79 0,32 0,16 60 0,35 28,5 28,37 0,00 0,00 0,0 0,0 0,019-11-1998 1,99 0,80 0,79 1,26 0,00 60 0,35 28,5 28,53 1,42 2,16 21,6 0,2 1,820-11-1998 1,77 0,80 0,79 1,12 0,00 60 0,35 28,5 27,41 0,00 0,00 0,0 0,0 0,021-11-1998 0,37 0,80 0,79 0,23 3,90 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,022-11-1998 2,02 0,80 0,79 1,28 0,16 60 0,35 28,5 27,42 0,00 0,00 0,0 0,0 0,023-11-1998 1,62 0,80 0,79 1,02 0,00 60 0,35 28,5 28,53 2,14 3,26 32,6 0,4 2,724-11-1998 1,02 0,80 0,79 0,64 0,00 60 0,35 28,5 27,89 0,00 0,00 0,0 0,0 0,025-11-1998 0,76 0,80 0,79 0,48 6,24 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,026-11-1998 0,72 0,80 0,79 0,45 13,60 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,027-11-1998 1,25 0,80 0,79 0,79 0,78 60 0,35 28,5 28,53 1,00 1,52 0,2 1,7 1,328-11-1998 0,71 0,80 0,79 0,45 0,16 60 0,35 28,5 28,24 0,00 0,00 0,0 0,0 0,029-11-1998 2,15 0,80 0,79 1,36 0,31 60 0,35 28,5 28,53 1,34 2,04 20,4 0,2 1,730-11-1998 4,04 0,80 0,79 2,55 0,62 60 0,35 28,5 26,60 0,00 0,00 0,0 0,0 0,001-12-1998 1,17 0,80 0,79 0,74 0,00 60 0,35 28,5 28,53 2,67 4,07 40,7 0,5 3,402-12-1998 2,15 0,80 0,79 1,36 0,00 60 0,35 28,5 27,18 0,00 0,00 0,0 0,0 0,003-12-1998 1,58 0,80 0,79 1,00 0,00 60 0,35 28,5 28,53 2,36 3,59 35,9 0,4 3,004-12-1998 0,81 0,80 0,79 0,51 7,80 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,005-12-1998 1,81 0,80 0,79 1,14 12,40 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,006-12-1998 1,18 0,80 0,79 0,74 0,00 60 0,35 28,5 27,79 0,00 0,00 0,0 0,0 0,007-12-1998 0,72 0,80 0,79 0,45 0,00 60 0,35 28,5 28,53 1,20 1,82 18,2 0,2 1,508-12-1998 0,88 0,80 0,79 0,56 0,00 60 0,35 28,5 27,98 0,00 0,00 0,0 0,0 0,009-12-1998 0,89 0,80 0,79 0,56 0,00 60 0,35 28,5 28,53 1,12 1,70 17,0 0,2 1,410-12-1998 0,72 0,80 0,79 0,46 0,00 60 0,35 28,5 28,08 0,00 0,00 0,0 0,0 0,0
7. Anejo 3
152
Fecha ETo Kc Kl ETcKl P.E. Raices F.A. R.F.U. Reserva d.n. d.b. D.B. tiempoI tiempoC [mm] [mm] [mm] [cm] [mm] [mm] [mm] [mm] [m3/par] [horas] [hora]---------- ----- ---- ---- ----- ------ ------ ---- ------ ------- ----- ----- -------- ------- -------11-12-1998 0,58 0,80 0,79 0,36 0,00 60 0,35 28,5 28,53 0,82 1,25 12,5 0,1 1,012-12-1998 0,63 0,80 0,79 0,40 3,90 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,013-12-1998 1,22 0,80 0,79 0,77 0,00 60 0,35 28,5 28,53 0,77 1,18 11,8 0,1 1,014-12-1998 0,61 0,80 0,79 0,39 0,00 60 0,35 28,5 28,15 0,00 0,00 0,0 0,0 0,015-12-1998 1,15 0,80 0,79 0,73 0,00 60 0,35 28,5 28,53 1,11 1,70 17,0 0,2 1,416-12-1998 0,20 0,80 0,79 0,13 9,84 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,017-12-1998 5,10 0,80 0,79 3,22 6,24 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,018-12-1998 0,17 0,80 0,79 0,10 2,65 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,019-12-1998 0,45 0,80 0,79 0,28 0,00 60 0,35 28,5 28,53 0,28 0,43 4,3 4,8 0,420-12-1998 1,41 0,80 0,79 0,89 0,31 60 0,35 28,5 27,96 0,00 0,00 0,0 0,0 0,021-12-1998 0,99 0,80 0,79 0,63 0,00 60 0,35 28,5 28,53 1,20 1,83 18,3 0,2 1,522-12-1998 0,69 0,80 0,79 0,44 0,00 60 0,35 28,5 28,10 0,00 0,00 0,0 0,0 0,023-12-1998 2,41 0,80 0,79 1,53 0,16 60 0,35 28,5 28,53 1,80 2,75 27,5 0,3 2,324-12-1998 0,65 0,80 0,79 0,41 0,00 60 0,35 28,5 28,12 0,00 0,00 0,0 0,0 0,025-12-1998 0,89 0,80 0,79 0,56 0,00 60 0,35 28,5 28,53 0,97 1,48 14,8 0,2 1,226-12-1998 1,12 0,80 0,79 0,71 0,62 60 0,35 28,5 28,45 0,00 0,00 0,0 0,0 0,027-12-1998 2,31 0,80 0,79 1,46 0,16 60 0,35 28,5 28,53 1,39 2,12 21,2 0,2 1,828-12-1998 1,49 0,80 0,79 0,94 0,00 60 0,35 28,5 27,60 0,00 0,00 0,0 0,0 0,029-12-1998 0,70 0,80 0,79 0,44 0,00 60 0,35 28,5 28,53 1,38 2,10 21,0 0,2 1,830-12-1998 0,38 0,80 0,79 0,24 0,31 60 0,35 28,5 28,53 0,00 0,00 0,0 0,0 0,031-12-1998 0,52 0,80 0,79 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]..................: 671Total P.E. [mm]....................: 384Número de Riegos...................: 162Total dosis neta [mm]..............: 594Total dosis bruta [mm].............: 905Total dosis bruta [m3/parcela].....: 9038
7. Anejo 3
153
----------------------------------------------------------------------------------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----------------------------------------------------------------------------------
7. Anejo 3
154
7. ANEJO 3. PROGRAMA REALIZADO.
Figura 21. Resultados. Listado de riegos a efectuar.RIEGOS A EFECTUAR 28/11/98 19:28:13
Programación........................................: MAIZ (LLEIDA,MENSUAL)Finca...............................................: El maizalPoblación...........................................: LleidaProvincia...........................................: LleidaLatitud [g,m,s].....................................: 41º 37' 49'' NºLongitud [g,m,s]....................................: 0º 35' 50'' EºAltitud [m].........................................: 190Superficie [m2].....................................: 10000Cultivo.............................................: MAIZ (GRANO)Fracción agua disponible en el suelo................: 0,4Clase textural......................................: FRANCODensidad aparente [g/cm3]...........................: 1,51Capacidad de Campo [% peso].........................: 19Punto de Marchitamiento [%peso].....................: 10Sistema Riego.......................................: ASPERSION (CLIMA SECO)Eficiencia en la aplicación [%].....................: 67Caudal instalación riego [m3/parcela]...............: 100Conductividad agua de riego [dS/m]..................: 3Eficiencia en el lavado de sales [%]................: 70Rendimiento mínimo deseado debido a salinidad [%]...: 100Fecha Plantación/Inicio.............................: 01-04-1998Momento de Riego. Agotamiento de la RFU [%].........: 100Intervalo de riego [días]...........................:Dosis de riego. Recarga de la RFU [%]...............: 100Nivel de agua de la RFU al inicio [%]...............: 0
Fecha d.n. d.b. D.B. tiempoI tiempoF Notas [mm] [mm] [m3/par] [horas] [hora]---------- ----- ----- -------- ------- ------- ---------------------------01-04-1998 5,67 17,80 178,1 1,2 1,8 Se aplica lavado de sales.25-04-1998 5,52 17,34 173,5 1,2 1,7 Se aplica lavado de sales.04-05-1998 6,60 20,72 207,3 1,4 2,1 Se aplica lavado de sales.08-05-1998 6,62 20,81 208,1 1,4 2,1 Se aplica lavado de sales.12-05-1998 7,80 24,50 245,1 1,6 2,5 Se aplica lavado de sales.16-05-1998 8,93 28,06 280,6 1,9 2,8 Se aplica lavado de sales.20-05-1998 10,10 31,75 317,5 2,1 3,2 Se aplica lavado de sales.24-05-1998 11,27 35,45 354,5 2,4 3,5 Se aplica lavado de sales.
7. Anejo 3
155
Fecha d.n. d.b. D.B. tiempoI tiempoF Notas [mm] [mm] [m3/par] [horas] [hora]---------- ----- ----- -------- ------- ------- ---------------------------27-05-1998 8,81 27,68 276,8 1,8 2,8 Se aplica lavado de sales.30-05-1998 10,02 31,49 315,0 2,1 3,1 Se aplica lavado de sales.02-06-1998 11,74 36,91 369,1 2,5 3,7 Se aplica lavado de sales.05-06-1998 12,97 40,77 407,7 2,7 4,1 Se aplica lavado de sales.08-06-1998 13,32 41,87 418,8 2,8 4,2 Se aplica lavado de sales.11-06-1998 14,46 45,46 454,7 3,0 4,5 Se aplica lavado de sales.14-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.17-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.20-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.23-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.26-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.29-06-1998 13,92 43,75 437,6 2,9 4,4 Se aplica lavado de sales.01-07-1998 11,17 35,10 351,1 2,3 3,5 Se aplica lavado de sales.03-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.05-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.07-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.09-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.11-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.13-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.15-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.17-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.19-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.21-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.23-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.25-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.27-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.29-07-1998 13,05 41,03 410,4 2,7 4,1 Se aplica lavado de sales.31-07-1998 13,81 43,40 434,0 2,9 4,3 Se aplica lavado de sales.03-08-1998 15,52 48,79 487,9 3,3 4,9 Se aplica lavado de sales.07-08-1998 19,37 60,90 609,1 4,1 6,1 Se aplica lavado de sales.12-08-1998 22,10 69,46 694,7 4,6 6,9 Se aplica lavado de sales.18-08-1998 23,41 73,57 735,8 4,9 7,4 Se aplica lavado de sales.27-08-1998 28,74 90,35 903,5 6,0 9,0 Se aplica lavado de sales.
Número de Riegos...................: 41Total dosis neta [mm]..............: 534Total dosis bruta [mm].............: 1679Total dosis bruta [m3/parcela].....: 16793
----------------------------------------------------------------------------------
7. Anejo 3
156
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----------------------------------------------------------------------------------
7. Anejo 4
157
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 ó lluviasETo [mm] (2 días) (4 días) (7 días) (10 días) (20 días)
0,50 1,08 0,98 0,81 0,65 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
7. Anejo 4
158
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:
( )
−−
−+=MENORMAYOR
MENORMAYORMENORMAYOR DiasKcDiasKc
KcKcDiasKcDiasRiegoKcKc
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.
7. Anejo 4
159
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]
7. Anejo 4
160
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 [%].
7. Anejo 4
161
3. TRIÁNGULO DE TEXTURA DE LA U.S.D.A.
Figura 1. Triángulo de texturas y clases texturales.
7. Anejo 5
162
7. ANEJO 5. LISTADO DEL PROGRAMA.
RIEGOS.VBP' Víctor Yusta. Dicembre-1998Type=ExeReference=DAO350 ' para gobernar AccessObject=TABCTL32.OCXObject=THREED32.OCXObject=DBLIST32.OCXForm=Riegos.frmModule=Riegos1; Riegos1.basModule=Riegos2; Riegos2.basForm=Riegos12.frmForm=Riegos21.frmForm=Riegos25.frmForm=Riegos22.frmForm=Riegos23.frmForm=Riegos31.frmForm=Riegos27.frmForm=Riegos26.frmForm=Riegos24.frmObject=DBGRID32.OCXForm=Riegos00.frmForm=Riegos11.frmIconForm="Riegos"Startup="Riegos"HelpFile=""Title="RIEGOS"ExeName32="Riegos.exe"Command32=""Name="Riego"HelpContextID="0"CompatibleMode="0"MajorVer=1MinorVer=0RevisionVer=0AutoIncrementVer=0ServerSupportFiles=0CompilationType=0OptimizationType=0FavorPentiumPro(tm)=0CodeViewDebugInfo=0NoAliasing=0BoundsCheck=0OverflowCheck=0FlPointCheck=0FDIVCheck=0UnroundedFP=0StartMode=0Unattended=0ThreadPerObject=0MaxNumberOfThreads=1
7. Anejo 5
163
RIEGOS1.BAS' Víctor Yusta. Dicembre-1998Attribute VB_Name = "Riegos1"Option ExplicitGlobal gsDatabase As StringGlobal gsConnect As StringGlobal gsRecordsource As String Global NombreProgramacion As String * 50 Public MenuInicial As String Public ValorControl As Control Public ValorTabla As StringPublic 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:\Riegos\Riegos.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 SubPublic 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 IfEnd FunctionPublic Function NoNulo(Dato) ' Sustituye el dato Null por Cadena Vacia NoNulo = IIf(IsNull(Dato), "", Dato)End FunctionPublic Function LeerMSJ(Valor As String) ' Lee mensajes en la tabla (TablaMensajes) If Idioma = "CS" Then LeerMSJ = LeerFichero("TablaMensajes", "Orden", Valor, "TextoMensaje")
7. Anejo 5
164
Else LeerMSJ = LeerFichero("TablaMensajes", "Orden", Valor, "TexteMissatge") End IfEnd FunctionPublic Function CargaPantalla(NombreForm As Form) NombreForm.Top = 0 NombreForm.Left = 0 NombreForm.Height = 8600 NombreForm.Width = 12000End FunctionPublic Function Numeros(tp As Integer) As Integer If (tp < 48 Or tp > 57) And tp <> 8 Then Numeros = 0 Else Numeros = tp End IfEnd FunctionPublic Function Numerico(Valor As String) As Integer Numerico = Val(Trim(Valor))End FunctionPublic Sub DibujaMensaje(NomForm) NomForm.Mensaje.Height = 330 NomForm.Mensaje.Left = 105 NomForm.Mensaje.Top = 7980 NomForm.Mensaje.Width = 11775End SubPublic Sub DibujaPanelComandos(NomForm) NomForm.PanelComandos.Height = 960 NomForm.PanelComandos.Left = 0 NomForm.PanelComandos.Top = 0 NomForm.PanelComandos.Width = 11985End SubPublic Function CursorOcupado(NombreForm As Form) NombreForm.MousePointer = 11End FunctionPublic Function CursorLibre(NombreForm As Form) NombreForm.MousePointer = 0End FunctionFunction 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 FunctionFunction NumCar(Variable As Double) As StringDim 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 = FraseEnd Function
7. Anejo 5
165
RIEGOS2.BAS' Víctor Yusta. Dicembre-1998Attribute VB_Name = "Riegos2"Option Explicit Public Const Pi As Double = 3.14159265358979Public 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)) '+ 1End FunctionPublic Function GraRad() As Double GraRad = Pi / 180End FunctionPublic Function RadGra() As Double RadGra = 180 / PiEnd FunctionPublic Function Seno(Valor As Double) As Double Seno = Sin(Valor * GraRad())End FunctionPublic Function Coseno(Valor As Double) As Double Coseno = Cos(Valor * GraRad())End FunctionPublic Function Tangente(Valor As Double) As Double Tangente = Tan(Valor * GraRad())End FunctionPublic 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 IfEnd FunctionPublic 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 IfEnd FunctionPublic 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 IfEnd FunctionPublic Function ArcCosRad(Valor As Double) As Double ArcCosRad = Atn(-Valor / Sqr(-Valor * Valor + 1)) + 2 * Atn(1)End FunctionPublic Function SexCen(Valor As String) As Double SexCen = Val(Mid(Valor, 1, 2)) + (Val(Mid(Valor, 4, 2)) / 60)End FunctionPublic Function CenSex(Valor As Double) As String CenSex = Str(Int(Valor)) & "º" + Str((Valor - Int(Valor)) * 60) & "'"End FunctionPublic Function LOG10(Valor As Double) As Double LOG10 = Log(Valor) / Log(10#)End Function
7. Anejo 5
166
RIEGOS.FRM' Víctor Yusta. Dicembre-1998Option ExplicitPrivate Sub Form_Load() Call CargaPantalla(Me) BaseDatos Call CargaMenu Show DoEventsEnd SubPrivate Sub Form_Terminate() SalirProyectoEnd SubPrivate Sub Form_Unload(Cancel As Integer) Cancel = SalirProyectoEnd SubFunction SalirProyecto() Dim Pregunta Pregunta = MsgBox("¿ Quieres salir del programa? ", vbYesNo, "Salida") If Pregunta = vbYes Then Cls End End If SalirProyecto = 1End FunctionPrivate 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 Num1End FunctionPrivate 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
7. Anejo 5
167
End SubPrivate 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 Riegos31End Sub
7. Anejo 5
168
RIEGOS00.FRM' Víctor Yusta. Dicembre-1998VERSION 5.00Object = "DBGRID32.OCX"Option ExplicitDim msSortCol As StringDim mbCtrlKey As IntegerPrivate 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 SubLoadErr: MsgBox "Error:" & Err & " " & Err.Description Unload MeEnd SubSub cmdClose_Click() Unload MeEnd SubPrivate 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 SubFilterErr: Screen.MousePointer = vbDefault MsgBox "Error:" & Err & " " & Err.Description Exit SubEnd SubPrivate Sub cmdRefresh_Click() On Error GoTo RefErr Data1.Recordset.Requery Exit SubRefErr: MsgBox "Error:" & Err & " " & Err.Description Exit SubEnd SubPrivate 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
7. Anejo 5
169
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 SubSortErr: Screen.MousePointer = vbDefault MsgBox "Error:" & Err & " " & Err.Description Exit SubEnd SubPrivate Sub Form_Resize() On Error Resume Next If Me.WindowState <> 1 Then grdDataGrid.Height = Me.Height - (425 + picButtons.Height) End IfEnd SubPrivate Sub grdDataGrid_BeforeDelete(Cancel As Integer) If MsgBox("¿Desea eliminar la fila actual?", vbYesNo + vbQuestion) <> vbYes Then Cancel = True End IfEnd SubPrivate Sub grdDataGrid_BeforeUpdate(Cancel As Integer) If MsgBox("¿Desea realizar los cambios?", vbYesNo + vbQuestion) <> vbYes Then Cancel = True End IfEnd SubPrivate 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 restableceEnd SubPrivate Sub grdDataGrid_MouseUp(Button As Integer, Shift As Integer, x As Single, Y As Single) mbCtrlKey = ShiftEnd Sub
7. Anejo 5
170
RIEGOS11.FRM' Víctor Yusta. Dicembre-1998Object ="TABCTL32.OCX"Object ="THREED32.OCX"Object ="DBLIST32.OCX"Option Explicit Dim numPrivate 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 SubPrivate 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, "BORRANDOPROGRAMACIÓN") If Pregunta = vbOK Then BorrarProgramacion (NombreProgramacion) End If Comando(2).Visible = False Comando(4).Visible = False End SelectEnd SubFunction 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.SetFocusEnd FunctionPrivate 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
7. Anejo 5
171
Riegos.Forma(num).Enabled = True Next num Riegos.Forma(31).Enabled = True Riegos.Forma(32).Enabled = True SalirForm End SelectEnd SubPrivate 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 SelectEnd SubPrivate Sub SalirForm() Unload Me Load RiegosEnd SubPrivate 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 IfEnd SubPrivate 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 SalirFormEnd SubPrivate 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.SetFocusEnd If'If Tabla.Tab = 2 Then Entrada(1).SetFocusEnd SubPrivate Sub MostrarInformacion() Dim Busca Busca = ""
7. Anejo 5
172
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:\Riegos\Riegos.mdb" 'NombreBaseDeDatos Data1.RecordsetType = 1 Data1.RecordSource = Busca Data1.Refresh Else MsgBox ("No hay información") SalirForm End IfEnd SubSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
173
RIEGOS12.FRM' Víctor Yusta. Dicembre-1998Object = "THREED32.OCX"Option Explicit Dim num Dim Tablas(20) As StringPrivate 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 SubPrivate 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:\Riegos\Riegos.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 IfEnd SubPrivate Sub Comando_Click(Index As Integer) Select Case Index Case 0 SalirForm End SelectEnd SubPrivate Sub SalirForm() Unload Me Load RiegosEnd SubPrivate Sub MostrarInformacion() Dim Busca
7. Anejo 5
174
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:\Riegos\Riegos.mdb" 'NombreBaseDeDatos Data1.RecordsetType = 1 Data1.RecordSource = Busca Data1.Refresh Else MsgBox ("No hay información") SalirForm End IfEnd Sub
7. Anejo 5
175
RIEGOS21.FRM' Víctor Yusta. Dicembre-1998Object ="THREED32.OCX"Option Explicit Dim Atras Dim Mensajes(20) As String Dim Alertas(20) As String Dim Campos(20) As String Dim ExisteFichero As StringPrivate 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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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
7. Anejo 5
176
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
7. Anejo 5
177
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))
7. Anejo 5
178
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 SelectEnd SubPrivate Sub Entrada_DblClick(Index As Integer) Select Case Index 'Case 8 End SelectEnd SubPrivate 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 SelectEnd SubPrivate 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 IfEnd SubPrivate 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 IfEnd SubPrivate Sub GrabarDatos() If ExisteFichero = "NO" Then
7. Anejo 5
179
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.UpdateEnd SubPrivate Sub Entrada_GotFocus(Index As Integer)End SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubPrivate Sub MoverPF(Campo As String, Pantalla) fProgramacion(Campo) = Pantalla.TextEnd SubSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
180
RIEGOS22.FRM' Víctor Yusta. Dicembre-1998Object ="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 = 1Mensajes(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"
7. Anejo 5
181
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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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 SelectEnd SubPrivate 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))
7. Anejo 5
182
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 IfEnd SubPrivate 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
7. Anejo 5
183
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.UpdateEnd SubPrivate 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 IfEnd SubPrivate 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 SelectEnd SubFunction 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
7. Anejo 5
184
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
7. Anejo 5
185
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 IfEnd FunctionPrivate 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)DoEventsEnd SubFunction 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
7. Anejo 5
186
MsgBox ("Entra algún valor menor de 1 ") Comprobacion = "" End If End If End SelectEnd FunctionPrivate 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 DoEventsEnd SubPrivate 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 = TrueEnd SubPrivate Sub DBLista_DblClick() ValorControl.Text = DBLista.Text DBLista.Visible = False Posiciona (1)End SubPrivate 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
7. Anejo 5
187
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 SelectEnd SubPrivate 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)
7. Anejo 5
188
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) <> "-" AndEntrada(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
7. Anejo 5
189
Comando(5).Visible = True End IfEnd SubFunction 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 IfEnd FunctionFunction BorraDatos() BorraKc Dim num For num = 31 To 41 Entrada(num) = "" Next numEnd FunctionFunction BorraKc() Dim num For num = 8 To 17 Entrada(num) = "" Next num For num = 18 To 30 Entrada(num) = "" Next numEnd FunctionFunction 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 IfEnd FunctionFunction 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
7. Anejo 5
190
End FunctionFunction CargaFraccion() fCultivosFraccion.Index = "ORDEN" fCultivosFraccion.MoveFirst fCultivosFraccion.Seek "=", Entrada(1).Text If fCultivosFraccion.NoMatch = False Then 'Registro encontrado Entrada(31) = fCultivosFraccion("Fraccion") End IfEnd FunctionFunction 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 IfEnd FunctionFunction DESACTIVATODO() Dim num For num = 3 To 7 Label(num).Visible = False Entrada(num).Visible = False ComandoLista(num).Visible = False Entrada(num).Text = "-" Next numEnd FunctionFunction ACTIVA(Numero) Label(Numero).Visible = True Entrada(Numero).Visible = True ComandoLista(Numero).Visible = TrueEnd FunctionSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
191
RIEGOS23.FRM' Víctor Yusta. Dicembre-1998Object ="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 NumeroPicadoPrivate 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" CargarDatosEnd SubPrivate Sub Form_Unload(Cancel As Integer) Unload Me Load Riegos'SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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 SelectEnd SubPrivate 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 IfEnd SubPrivate Sub GrabarDatos() If ExisteFichero = "NO" Then fProgramacion.AddNew
7. Anejo 5
192
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 IfEnd Sub'Private Sub Entrada_GotFocus(Index As Integer)'End SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubPrivate Sub MoverPF(Campo As String, Pantalla) fProgramacion(Campo) = Pantalla.TextEnd SubPrivate 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 IfEnd SubPrivate 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 IfEnd SubPrivate 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 = TrueEnd SubPrivate Sub DBLista_DblClick() Dim Consulta As Recordset Set Consulta = BaseDeDatos.OpenRecordset("SELECT * FROM ClimaDetalle WHERE Clima = '" & TipoDatos & "' andEstacion = '" & 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")
7. Anejo 5
193
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 IfSSPanel1.Visible = FalseCommand1.Visible = TrueCommand2.Visible = TrueEnd SubPrivate 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
7. Anejo 5
194
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 IfEnd SubPrivate 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 SubPrivate 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
7. Anejo 5
195
If fProgramacion.NoMatch = False Then 'Registro encontrado fProgramacion.Edit fProgramacion("Pantalla23") = "T" fProgramacion.Update End If '>> poner codigo de grabacion de datosEnd SubPrivate Sub ComandoSalir_Click()Comando(0).Visible = TrueSSEntradaDatos.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 IfEnd SubPrivate 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 SubPrivate 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
7. Anejo 5
196
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 cargadosEnd SubPrivate 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 SubPrivate 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
7. Anejo 5
197
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 IfEnd 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 SubPrivate 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 SubPrivate Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End IfEnd SubPrivate 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 SelectEnd Sub
7. Anejo 5
198
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
7. Anejo 5
199
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 IfEnd FunctionFunction Apaga(Index) Entrada(Index).Enabled = False Entrada(Index).BackColor = &H8000000B DoEventsEnd FunctionFunction Enciende(Index) Entrada(Index).Enabled = True Entrada(Index).BackColor = &H80000005 DoEventsEnd FunctionFunction 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
7. Anejo 5
200
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 SelectEnd FunctionPrivate 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) DoEventsEnd SubFunction MoverFoco(Numero) Posiciona (Numero)End FunctionFunction 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 _
7. Anejo 5
201
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 FunctionFunction 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
7. Anejo 5
202
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.UpdateEnd FunctionFunction 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
7. Anejo 5
203
fProgramacionClima("Radiacion") = "S" End If fProgramacionClima.UpdateEnd FunctionSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
204
RIEGOS24.FRM' Víctor Yusta. Dicembre-1998Object ="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 = 1Mensajes(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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir Case 5 ' Salida del formulario Call GrabarDatos Unload Me
7. Anejo 5
205
End SelectEnd SubPrivate 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 IfEnd SubPrivate 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.UpdateEnd SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubPrivate Sub ComandoLista_Click(Index As Integer) Select Case Index Case 1 ValorTabla = "Texturas" Call CargaDBLista ' (ValorTabla, "Cultivo") End Select Posiciona (1) Indice = 1End SubPrivate 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 = TrueEnd SubPrivate Sub DBLista_DblClick() Entrada(4).Text = DBLista.Text
7. Anejo 5
206
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 IfEnd SubPrivate 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 SelectEnd SubFunction 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
7. Anejo 5
207
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 IfEnd FunctionPrivate Sub MoverCampo(FormaMe, Como) If Como = "AD" Then ' adelante If Indice + 1 > 15 Then Indice = 0 End If
7. Anejo 5
208
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) DoEventsEnd SubFunction 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 = ""
7. Anejo 5
209
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 SelectEnd FunctionPrivate 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 AndArc >= 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 SubPrivate Sub CalculaDensidadPorosidad() Dim PSS: PSS = Tierra(8) Dim VSS: VSS = Tierra(9)
7. Anejo 5
210
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 SubPrivate 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 SubSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
211
RIEGOS25.FRM' Víctor Yusta. Dicembre-1998Object ="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 = 1Mensajes(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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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 SelectEnd SubPrivate 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 IfEnd SubPrivate Sub GrabarDatos() fProgramacion.Edit fProgramacion("ConductividadElectrica") = Entrada(1).Text fProgramacion("Pantalla25") = "T" fProgramacion.UpdateEnd SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubFunction BorraDatos() 'Dim num 'For num = 31 To 41 ' Entrada(num) = "" 'Next numEnd Function
7. Anejo 5
212
Private Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End IfEnd SubPrivate 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 SelectEnd SubFunction 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
7. Anejo 5
213
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 IfEnd FunctionPrivate 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) DoEventsEnd SubFunction Comprobacion(FormaMe, Indice, Campo, tipo) Dim ValorN Comprobacion = "OK" If tipo = "N" Then ValorN = Val(Campo) End If Select Case Indice Case 1 '
7. Anejo 5
214
If Campo = "" Then MsgBox ("Entra alguna cifra") Comprobacion = "" End If End SelectEnd FunctionSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
215
RIEGOS26.FRM' Víctor Yusta. Dicembre-1998Object ="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 = 1Mensajes(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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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 SelectEnd SubPrivate 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))
7. Anejo 5
216
Call MoverFP("CoeficienteUniformidad", Entrada(8)) End If If Entrada(2) = "S" Then Entrada(5).Visible = FalseEnd SubPrivate 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.UpdateEnd SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubPrivate Sub ComandoLista_Click(Index As Integer) Select Case Index Case 1 ValorTabla = "SistemasRiego" Call CargaDBLista ' (ValorTabla, "Cultivo") End Select Indice = 1 Posiciona (Indice)End SubPrivate 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 = TrueEnd SubPrivate 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 SubPrivate 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 SubPrivate Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End IfEnd SubPrivate 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
7. Anejo 5
217
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 SelectEnd SubFunction 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
7. Anejo 5
218
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 IfEnd FunctionPrivate 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) DoEventsEnd SubFunction Comprobacion(FormaMe, Indice, Campo, tipo)
7. Anejo 5
219
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 SelectEnd FunctionSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd Sub
7. Anejo 5
220
RIEGOS27.FRM' Víctor Yusta. Dicembre-1998Object ="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 SubPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate 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 SelectEnd SubPrivate 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")
7. Anejo 5
221
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 IfEnd SubPrivate 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).TextfProgramacion.UpdateEnd SubPrivate Sub MoverFP(Campo As String, Pantalla) Pantalla.Text = NoNulo(fProgramacion(Campo))End SubPrivate Sub Entrada_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer) If KeyCode = 9 Then Atras = 1 End IfEnd SubPrivate 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 SelectEnd SubFunction 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
7. Anejo 5
222
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 = ""
7. Anejo 5
223
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 IfEnd FunctionPrivate 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) DoEventsEnd SubFunction 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 = ""
7. Anejo 5
224
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 SelectEnd FunctionSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd SubPrivate Sub Option1_Click() apagaP Label(6).Visible = True Entrada(6).Visible = True Posiciona (1)End SubPrivate Sub Option2_Click() apagaP Label(7).Visible = True Label(8).Visible = True Posiciona (1)End SubPrivate Sub Option3_Click() apagaP Label(9).Visible = True Label(10).Visible = True Posiciona (1)End SubPrivate Sub Option4_Click() apagaP Label(11).Visible = True Label(12).Visible = True Label(13).Visible = True Label(15).Visible = True Entrada(7).Visible = True
7. Anejo 5
225
Entrada(8).Visible = True Entrada(9).Visible = True Entrada(10).Visible = True Entrada(11).Visible = True Posiciona (1)End SubFunction 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
7. Anejo 5
226
RIEGOS31.FRM' Víctor Yusta. Dicembre-1998Object ="THREED32.OCX"'Option ExplicitDim Mensajes(41) As StringDim Alertas(41) As StringDim ValorControl As ControlDim ValorTabla As StringDim DiasMes(12) As IntegerDim DiaPeso(12) As IntegerDim Datos(12) As DoubleDim Indice As IntegerDim Atras As IntegerDim Campos(41) As StringDim ExisteFichero As StringDim QueMesDim vColorDim FechaPlantacion As String * 8Dim MatrizCalculo(40) As String ' del 1 al 20 datos, del 21 al 40 resultadosDim ReservaInicial As DoubleDim InicioRiego As StringDim CuentaDim Primero As String Dim TabuPrivate 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 AnalizaDatosEnd SubPrivate 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
7. Anejo 5
227
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 IfExit SubSalidaFalta: MsgBox (Falta) Sortir = "SI"ReturnEnd SubPrivate Sub Comando_Click(Index As Integer) Select Case Index Case 0 ' Salida del formulario Salir End SelectEnd SubFunction 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) = 349End FunctionPrivate Sub Form_Unload(Cancel As Integer) SalirEnd SubPrivate Sub Salir() Unload Me Load RiegosEnd SubPrivate Sub EmpiezaACalcular() Call CursorOcupado(Me) DoEvents Mensaje.Caption = "ESPERA un momento" fProgramacion.Index = "Programacion" fProgramacion.MoveFirst
7. Anejo 5
228
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 = TrueEnd SubPrivate 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
7. Anejo 5
229
Wend End If Call CalculoBalanceHidrico(vTipo, vClima, vLatitud, vAltitud) End IfEnd FunctionFunction 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.UpdateEnd FunctionPrivate 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 IfEnd FunctionFunction 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 FunctionFunction CalculaDatosEstimacion(NombreProgramacion, vClima, Campo, Longitud, vPsicrometro, vRadiacion) Dim DesdeDia Dim HastaDia Dim DesdeValor
7. Anejo 5
230
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 numEnd FunctionPrivate 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")))
7. Anejo 5
231
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 IfEnd SubPrivate Function CalculaKl() As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst
7. Anejo 5
232
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 IfEnd FunctionPrivate 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 AsDouble, 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
7. Anejo 5
233
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))
7. Anejo 5
234
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 = vEToEnd FunctionPrivate 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 IfEnd FunctionPrivate Function CalculaRaices12() As Double fProgramacion.Index = "Programacion" fProgramacion.MoveFirst fProgramacion.Seek "=", NombreProgramacion If fProgramacion.NoMatch = False Then 'Registro encontrado CalculaRaices12 = fProgramacion("Raices") End IfEnd FunctionPrivate 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)
7. Anejo 5
235
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 IfEnd FunctionFunction 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 IfEnd FunctionFunction EstimacionKc4(vKc1 As Double, vKc2 As Double, Vdias As Double, Vdia As Double) As Double EstimacionKc4 = vKc1 + (((vKc2 - vKc1) / Vdias) * Vdia)End FunctionPrivate 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
7. Anejo 5
236
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 IfEnd FunctionFunction EstimacionRaices4(vRaices1 As Double, vRaices2 As Double, Vdias As Double, Vdia As Double) As Double EstimacionRaices4 = vRaices1 + (((vRaices2 - vRaices1) / Vdias) * Vdia)End FunctionPrivate 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 AGUADISPONIBLE 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 = 0End FunctionPrivate 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
7. Anejo 5
237
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 IfEnd FunctionFunction 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 + 1End FunctionFunction MesDia(NumeroDia as integer) 'Dar en string mesdia ("mmdd")End FunctionFunction DiaDelAno(MesDia as string) Dar en integer el número de díaEnd FunctionPrivate 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
7. Anejo 5
238
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
7. Anejo 5
239
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
7. Anejo 5
240
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 + 1End SubSub Posiciona(Lugar As Integer) Me.Entrada(Lugar).SelStart = 0 Me.Entrada(Lugar).SelLength = Len(Entrada(Lugar)) Me.Entrada(Lugar).SetFocusEnd SubPrivate 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:\Riegos\RiegosDetalle.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, " "
7. Anejo 5
241
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))
7. Anejo 5
242
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 = TrueEnd 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:\Riegos\RiegosResumen.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")
7. Anejo 5
243
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))
7. Anejo 5
244
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 = FalseEnd SubPrivate Sub Command3_Click() Dim ReturnValue ReturnValue = Shell("c:\Archivos de Programa\Accesorios\Wordpad.exe c:\Riegos\RiegosDetalle.txt", 1) AppActivate ReturnValueEnd SubPrivate Sub Command4_Click() Dim ReturnValue ReturnValue = Shell("c:\Archivos de Programa\Accesorios\Wordpad.exe c:\Riegos\RiegosResumen.txt", 1) AppActivate ReturnValueEnd Sub