Con este informe vamos a obtener información sobre el estado de la explotación, así como algunos gráficos. El botón que genera está en Reproducción → Informes → Informes RE, el id de referencia es impEstadoEstablo, el id del informe es admin/central/102. La interfaz está definida en client/principal/f_informes_RE.xml. La ejecución comienza impEstadoEstablo.addActionListener - Primero obtenemos los registros de los animales que tenemos en la tabla de la interfaz de [[barra_menu_principal:menu_reproduccion#informes_re|Informes RE]] - Consultamos la entidad ''EAnimales'' para obtener los registros de la base de datos para los animales de la explotaión que no estén de baja o que la baja sea posterior a la fecha en la que se consulta - Con estos datos conformamos un Hashtable y hacemos una consulta a la entidad ''EEstado_Establo'' con el flag de consulta ''estadoestablo'' con valor ''si'' - Con este flag se nos ejecuta el método **fai_informe** - Primero obtenemos los valores del nombre, el apellido y el móvil de la tabla de Técnicos - Inicializamos las variables que tienen la información para el informe - Comenzamos a iterar por todos lo animales - Buscamos el registro más reciente del historial de un animal que fue registrado en o antes de la fecha de consulta. - Si el registro existe obtenemos los campos "fecha_parto", "fecha_secado", "fecha_baja", "fecha_ins_fecundante", "tipo", "estado" y "n_inseminaciones" - Si el tipo de animal es "Vaca" y el estado no es "Seca" ni "Cebo", entonces se evalúan más condiciones. Si el estado es "Baja", entonces se calcula la diferencia de días entre la fecha del último parto y la fecha de baja del animal. Si no es "Baja", entonces se asigna DEL a la diferencia de días entre la fecha del último parto y la fecha actual. Si el estado es "Cebo" y es "Baja", entonces se asigna DEL a la diferencia de días entre la fecha del último parto y la fecha de baja del animal. Los resultados de estas operaciones se suman a la variable media_del y se incrementa el contador conta_del para calcular la media de estas diferencias más adelante. - Ahora si el animal es una vaca, y es su primera lactación entonces en dependencia de su estado vamos contando en los arrays que declaramos en el principio, y así vamos contando para cada número de lactación - También vamos contando animales por tramos de DEL como DEL - Rellenamos un Hashtable con las variables calculadas y lo insertamos en la tabla ''gnd_inf_estado_establo'' - A continuación ejecutamos el método ''fai_media_del'' que lo que nos hace es insertar en ''gnd_inf_estado_establo''. Rellnamos un Hashtable con los valores "user_", "id_explotacion", "propietario", "cea", "tecnico", "movil", "fecha_inf", además de estos campos "tipo", "total", "2parto", "3parto", "4parto", "5parto", "media" a cero. A continuación el rellenamos los campos "1parto" y estado en dependencia de el tramo en el que se encuentra la media de DEL, si por ejemplo la media de días en leche está entre 30 y 60 días, entonces los valores serían "1parto"=media_del y estado="30-60 del" - A continuación ejecutamos el método **fai_indices** - Este método primero vacía los registros de ''gnd_inf_indices_abreviado'' para el presente usuario. - Luego creamos dos variables con la fecha de consulta y la fecha de un año atrás y se las pasamos el método ''captura_datos_repro'' - Dentro de este método primero vamos a consultar en la entidad ''EHistorial_indices'' con el flag "indices" en "si" y le pasamos los argumentos: "id_explotacion", "animales", "fech", "fecha", "fech_ini", "fecha_ini", "fech_fin", "fecha_fin", "vac_gest", "med_del", "vac_prob", "par_1_ins", "par_ins_fec", "ferti", "int_par_par_i", "int_par_ins_f", "int_par_par_p", "int_par_par", "edad_par", "dias_sec_par", "por_par_prem", "por_abortos", "por_repos", "por_elim", "por_bajas", "por_ani_per", "por_ani_gan", "por_vac_sec", "por_vac_sec_a", "edad_ins_1", "por_nov_pre", "edad_ins_fec", "edad_par_pre", "nov_pro", "int_ins", "nov_ret", "ferti_nov", "por_abortos_nov", "nov_pro_ins", "nov_pro_mes", "nov_ret_mes", "nov_ret_kil", "nov_ret_cm", "con_cor_per", "con_cor_gan", "por_abortos_int", "por_abortos_nov_int", "por_bajas_nov", "por_bajas_int" y "por_bajas_nov_int". Estos argumentos los utilizamos más adelante para decidir que cálculos utilizar. - Con estos argumentos ejecutamos el método ''fai_indices'' - Dentro de este método inicializamos las variables numero_ani, numero_vac, numero_vac_baj, numero_nov, numero_nov_baj, fecha_alta, fecha_nac, fecha_1_parto, edad_1_parto - Ahora consultamos ''EExplotaciones'' para obtener los datos días de secado previsto, días de parto previsto y días de primer parto previsto - Luego ejecutamos el método ''inicializa varibles'' que nos rellena las variables globales que tenemos declaradas que tiene la información que utilizará el informe - Inicializamos más arrays que tendrán más información del informe - En este caso en el código miramos si la variable ''rse2'' no está vacía y ejecutamos un bloque de código, como en este caso no utilizamos esa variable, entonces ignoramos este bloque y vamos directamente al siguiente - Ahora comenzamos a iterar sobre los resultados del ''rse'' que contiene la consulta de los animales del paso 2 - Para cada animal sobre el que iteramos buscamos primero la información de técnico, el administrador o el ganadero. - Luego consultamos la tabla historial animales para la última acción antes de la fecha y que no sea ni mamitis ni baja - De esta acción obtenemos la fecha de parto, la fecha de baja, la fecha de secado, la fecha de secado previsto, la fecha de parto previsto y la fecha de alta - Ahora vamos a distinguir entre los argumentos que mencionamos en el paso 18, entonces vamos a ejecutar las siguientes acciones - Comprobamos que la línea de historial sea de una **Vaca** y que no esté **Seca** ni sea Gestante. En dependencia del número de lactación contamos en el número de partos. - Obtenemos la diferencia de días entre los días de inseminación fecundante y los días de parto previsto - Si existe el día de inseminación fecundante entonces - Si la fecha de inseminación fecundante es posterior a la fecha de parto, entonces - Si no hay aborto, entonces vamos contando las vacas paridas y la cantidad de días de días desde el parto en dependencia de la diferencia entre los días de inseminación fecundante y los días de parto previsto de menor a 330, entre 330 y 349, 350 y 369, 370 y 399, 400 y 430 y de 431 en adelante. También sumo vacas gestantes. - Si hay aborto entonces hago lo mismo pero comparo la fecha de inseminación fecundante con la fecha de aborto - Ahora comprobamos las vacas con problemas, para ello primero hallamos los días en leche y si es más de 150 y su estado no es ni Descarte, ni Seca, ni Cebo, ni Gestante, entonces las contamos en dependencia del número de lactación. - A continuación vamos a ejecutar otro bloque en el que primeramente comprobamos que exista fecha de primera inseminación y que exista la fecha del último parto, si la fecha de primera inseminación es posterior a la fecha del último parto, entonces continuamos - Obtenemos los días en leche y vamos rellenando las variables del informe en dependencia del número de lactación en el que nos encontramos y de los días de parto de la primera inseminación - A continuación vamos a ejecutar otro bloque en el que primeramente comprobamos que exista fecha de inseminación fecundante y que exista fecha de último parto - Si la fecha del último parto es posterior a la fecha de inseminación fecundante continuamos - En función de varias condiciones, calculamos los días en leche como la diferencia de días entre fecha del último parto y la fecha de baja; - Ahora continuamos contando las vacas inseminación fecundante en función del número de lactación y los días de inseminación fecundante - Si hay aborto, comprobamos que la fecha de inseminación fecundante es posterior a la fecha de aborto, si es así entonces calculamos los días en leche contamos las vacas inseminadas fecundantes en base al número de lactación y también en base a la diferencia de días. - Ahora ejecutamos el bloque de código que tenemos en el flag 'int_par_par', que lo que hace es calcular la cantidad de vacas clasificadas por rango de días entre parto y parto - Ejecutamos el bloque de código que tenemos en el flag 'edad_par', este bloque nos cuenta los animales clasificados por edad. - Ejecutamos el bloque de código que tenemos en el flag 'dias_sec_par'. Aquí contamos las vacas secas por número de lactación. - Ejecutamos el bloque de código que tenemos en el flag 'por_par_prem'. En este bloque de código consultamos la tabla de acciones animales para el animal que estamos iterando y para las acciones del tipo Parto entres las fecha inicial y final, en este caso un año atrás, vamos iterando entre estas acciones y rellenamos los valores de partos, partos muerta, partos hembra, partos macho. - Vamos a ejecutar el bloque de código que tenemos luego del if que chequea el flag 'por_abortos' o 'por_abortos_int'. Primero con consultamos nuevamente la tabla de acciones animales para las acciones del animal en la fecha inicial y final y que sean del tipo aborto, luego iteramos mes por mes de los resultados. Luego vamos agrupando los abortos por tercio y también por número de lactación. - Ahora se ejecuta el bloque de código que se activa por el flag 'por_repos', 'por_bajas', 'por_bajas_nov', 'por_bajas_int' o por 'por_bajas_nov_int'. Consultamos los datos de la acción de parto que corresponde al primer parto, entra la fecha inicio y fin - Si hay resultados contamos esos animales como vacas, s no hay resultado, comprobamos que la fecha de alta está entre la fecha inicio y fin, y si es así la contamos como vaca - Si el animal que estamos mirando no es vaca entonces la contamos como novilla - Pasamos ahora al bloque que se nos ejecuta con el flag activado de 'edad_ins_1' - Si el animal es Novilla, consultamos la última acción de reproducción que consta en gnd_historial y en gnd_acciones_animales que es del tipo 'Inseminación' - Si existe un resultado, entonces en función de la edad de la novilla se van contando. - Ejecutamos el bloque de código que se activa con el flag 'edad_ins_fec' - Si el animal es de tipo novilla y es 'Gestante' entonces - Obtenemos la fecha de inseminación fecundante, luego obtenemos los datos de la acción para esa fecha y si devuelve resultados, entonces atendiendo a la edad de la novilla las vamos contando de forma agrupada. - Ejecutamos el bloque de código que se activa con el flag 'edad_par_pre' - Aquí vamos contando los animales que sean Novillas, Gestantes y que tengan edad de parto previsto, las contamos por grupos de edad menor de 24 meses, igual a 25 meses, 26 meses, 27 meses o mayores que 27 meses. - Ejecutamos el bloque de código que se activa con el flag 'por_abortos_nov' - En este bloque primero comprobamos si es Novilla, luego buscamos si hay una acción que incluya aborto entre las fechas de inicio y fin para el animal, contamos los agrupados por cada mes, mirando los 12 últimos meses. Además también se agrupan por el Tercio del aborto. - Ejecutamos el bloque de código que se activa con el flag 'ferti' - Primeramente generamos unos arrays de meses y años entre fecha_ini y fecha_fin, donde cada entrada representa el mes y el año de una fecha incrementada por un mes desde fecha_ini. - Ahora comenzamos a recorrer estos arrays y lo que hacer que estemos iterando por los meses del paso anterior - En cada mes miramos el historial del animal para el mes de iteración que sea del tipo inseminación - Recorremos el resultado de la consulta anterior. Si el animal es una Vaca, que tengo fecha de ultima inseminación, y que el estado sea Vacía, en base a esto se crea una matriz para contar los animales en función de el número de inseminación y el mes en el que estamos iterando. - Consultamos para este mismo mes el historial para las acciones de diagnóstico de gestación y si hay resultados, entonces creamos otra matriz con el conteo de animales atendiendo al número de inseminación y al mes en el que estamos iterando. - Si el animal no es una Vaca entonces creamos la mismas matrices que en los pasos anteriores pero para las novillas. - En el paso 27 si no obtenemos resultados de la consulta del historial, entonces hacemos los siguientes pasos. - Primero consultamos si es una vaca y la contamos si es el caso, si no la contaos como novilla - Ejecutamos el bloque de código que se activa con el flag 'por_bajas' - Aquí vamos iterando sobre la matriz v_vac_baj, y rellenamos las variables que guardan lo porcentajes de bajas. - Luego calculamos otras variables de porcentajes de partos. - Luego como tenemos activado el flag 'por_bajas' se nos ejecuta el bloque de código correspondiente, que lo que hace es añadir un registro al EntityResult que vamos a devolver con el contenido del hashtable que devuelve el método **fai_vac_baixas** que nos crea un hashtable con los campos "texto_sup", "tit_numero_ani", "tit_inter_1", "tit_inter_2", "tit_inter_3", "tit_inter_4", "tit_inter_5", "tit_inter_6", "indice", "resultado_indice", "numero_ani", "numero_ind_1", "por_ind_1", "numero_ind_2", "por_ind_2", "numero_ind_3", "por_ind_3", "numero_ind_4", "por_ind_4", "numero_ind_5", "por_ind_5", "numero_ind_6", "por_ind_6", "tipo", "accidente", "mamitis", "repro", "patas", "prod", "enfermedad", "voluntaria", "muerte", "edad", "venta", "propietario", "cea", "fecha_inf", "fecha_ana", "aux1", "aux2", "aux3", "tecnico", "telefono" que obtuvimos en los pasos anteriores. - Ejecutamos el bloque de código que se activa con el flag 'ferti_nov' - Dentro de este bloque comenzamos recorriendo los arrays v_nov_ges_f y v_nov_inse_f para rellenar los valores de por_gesf, por_partof, fmedia_del que son valores medios y porcentuales. - Luego estos valores se lo pasamos la función **fai_ferti_nov_fec** y no se devuelve un hashtable con los valores "texto_sup", "tit_numero_ani", "tit_inter_1", "tit_inter_2", "tit_inter_3", "tit_inter_4", "tit_inter_5", "tit_inter_6", "indice", "resultado_indice", "numero_ani", "numero_ind_1", "por_ind_1", "numero_ind_2", "por_ind_2", "numero_ind_3", "por_ind_3", "numero_ind_4", "por_ind_4", "numero_ind_5", "por_ind_5", "numero_ind_6", "por_ind_6", "tipo", "propietario", "cea", "fecha_inf", "fecha_ana", "aux1", "aux2", "aux3", "tecnico", "telefono" y luego se lo pasamos al EntityResult que devolveremos. - A continuación calculamos los porcentajes de novillas gestantes fecundadas para cada uno de los 6 meses para los que se obtuvieron datos. - Ejecutamos la función **fai_ferti_nov_fec** similar a los pasos anteriores pero le pasamos el número de vacas y nos devuelve una hashtable el cual le pasamos al EntityResult que devolveremos. - Ejecutamos el bloque de código que se activa con el flag 'ferti'. - En este bloque calculamos los porcentajes de fertilidad para las vacas, con estos datos calculados se los pasamos el método **fai_ferti_nov_fec** para luego añadirlo al EntityResult que devolveremos. También hacemos lo mismo para los porcentajes de partos. - Ejecutamos el bloque de código que se activa con el flag 'por_abortos_nov'. - En este bloque los que calculamos es el porcentaje de abortos en novillas por tercios y por edad, tanto con el total de abortos por tercios, como analizando por tercio específico y edad. - Ejecutamos el bloque de código que se activa con el flag 'edad_par_pre'. - En este bloque primero calculamos la media de la suma de las edades de animales con parto previsto. Luego hacemos lo mismo para cada novilla para las edades de 24, 25, 26 y 27 meses. Le pasamos estos valores al método 'fai_edad_par_pre' que no devuelve un hashtable con estos valores para luego añadirlo al EntityResult que devuelve la función. - Ejecutamos el bloque de código que se activa con el flag 'edad_ins_fec'. Aquí hacemos las mismas operaciones que en el paso anterior pero para las edades de las novillas fecundadas en las edades de entre 14 y 15, 16 y 17, 18 y 19, 20 y 21 y mayor de 21 meses. - Ejecutamos el bloque de código que se activa con el flag 'por_abortos'. En el que calculamos los porcentajes de abortos e insertamos el resultado del método **fai_abort_vac1** en el EntityResult que devolveremos - Ejecutamos el bloque de código que se activa con el flag 'por_par_prem'. Aquí calculamos los porcentajes de partos prematuros. - Ejecutamos el bloque de código que se activa con el flag 'dias_sec_par'. Este bloque calculamos las medias de días de vacas secas, tanto en el total como agrupadas por lactación. - Ejecutamos el bloque de código que se activa con el flag 'edad_par'. Calculamos primeramente la edad media de parto en general y agrupada por mes de parto. Lo hacemos también por lactación. Luego estos datos lo pasamos al método **fai_edad_par1** que nos devuelve un hastable que pasamos al EntityResult que se va a devolver. - Ejecutamos el bloque de código que se activa con el flag 'int_par_par'. Calculamos la media de las vacas clasificadas por rango de días entre parto y parto. - Ejecutamos el bloque de código que se activa con el flag 'int_par_par_p'. Con este bloque calculamos la media de diferencias de días entre fecha de inseminación fecundante y fecha de parto previsto. - Ejecutamos el bloque de código que se activa con el flag 'int_par_par_f'. Con este bloque calculamos la media de diferencias de días entre fecha de inseminación fecundante y fecha de parto previsto también con referencia al los aborto. - Ejecutamos el bloque de código que se activa con el flag 'par_ins_fec'. Con este bloque calculamos el porcentaje de vacas con inseminación fecundante después de un aborto para cada lactación. - Ejecutamos el bloque de código que se activa con el flag 'par_1_ins'. Con este bloque calculamos las medias de partos de primera inseminación. - Ejecutamos el bloque de código que se activa con el flag 'vac_prob'. Aquí sacamos los porcentajes de vacas con problemas. - Con todos estos datos devolvemos el EntityResult al método **captura_datos_repro**. - A continuación creamos un hashtable con los valores de captura_datos_repro y lo vamos insertando en la entidad **EInf_indices_reproductivos_abreviado** - Luego ejecutamos el método **fai_media_del_1_ia** en el que insertamos los datos de las medias de DEL de la primera inseminación en la entidad **EInf_indices_reproductivos_abreviado** - Ahora ejecutamos el método de **fai_ritmo_prenez**, en el que hacemos lo siguiente. - Primero borramos el contenido de la tabla gnd_inf_pulsografo - Hacemos una consulta a la entidad **EHistorial_indices** pero como no tenemos el flag de 'indices' entonces no ejecutamos la mayoría del bloque de código, por lo que este método devuelve un EntityResult vacío. - Dado que el EntityResult que devuelve es vacío no ejecutamos el siguiente bloque de código. - A continuación como no tenemos ningún dato en la tabla de gnd_inf_pulsografo entonces no se realizan más operaciones para este método - Ejecutamos ahora el método **fai_ritmo_prenez_novi** en el que hacemos los siguiente - Primero borramos el contenido de la tabla gnd_inf_pulsografo - Hacemos una consulta a la entidad **EHistorial_indices** pero como no tenemos el flag de 'indices' entonces no ejecutamos la mayoría del bloque de código, por lo que este método devuelve un EntityResult vacío. - Dado que el EntityResult que devuelve es vacío no ejecutamos el siguiente bloque de código. - A continuación como no tenemos ningún dato en la tabla de gnd_inf_pulsografo entonces no se realizan más operaciones para este método - Ahora ejecutamos el método **fai_dias_seca** que ocurre lo mismo que en el método anterior. - Seguimos insertando datos en la entidad **EInf_indices_reproductivos_abreviado** - Luego le pasamos estos datos al EntityResult del método **captura_datos_repro** y a su vez terminamos el métodos **fai_indices** - Con esto terminaríamos la parte del query de la entidad EEstado_establo - Ya con estos datos se los pasamos al método generador de informes