pggeodb.nancy.inra.fr/db_robot - db_robot on pggeodb.nancy.inra.fr
Previous topic Chapter index Next topic

Function: ps_maj_variables_data_brutes

 

 

Schema

public

 

Owner

postgres

 

Descriptions

Cette fonction traite les données brutes sur une période donnée en paramètre pour le projet précisé en paramètre.
Elle met à jour les variables WA, TA, TDIFF et TR de la table t_datarobot_dat en tenant compte uniquement des données brutes (poids avant et après et horodatage).
Les variables corrigées seront alimentées par une autre fonction après exploitation de la table des spécificités concernée.
Si besoin le traitement des mouvements de plants est lancé puis l'ensemble des variables brutes est réinitialisé / recalculé pour l'ensemble du projet.

 

Options

Option

Value

Returns

boolean

Language

plpgsql

Parameters

date_deb date

date_fin date

nom_projet varchar

 

Definition

CREATE OR REPLACE FUNCTION public.ps_maj_variables_data_brutes (
 date_deb date,
 date_fin date,
 nom_projet varchar
)
RETURNS boolean AS
$span$
DECLARE

 curs_donnee refcursor; -- Curseur recevant les informations de mesure
 rec_donnee  record; -- Enregistrement contenant la mesure en cours de traitement
 plant_en_cours INTEGER; -- Numéro de la palette en cours de traitement
 nb_ligne_traite INTEGER;    -- Nombre de ligne deja traitee pour la palette en cours
 id_ligne_precedente INTEGER; -- Identifiant de la ligne précedemment dans le flux

 poids_avant_ligne_precedente INTEGER; -- Poids avant arrosage de la ligne précédente dans le flux
 poids_apres_ligne_precedente INTEGER; -- Poids après arrosage de la ligne précédente dans le flux
 horodatage_ligne_precedente timestamp; -- Horodatage de la ligne précédente dans le flux
 
 id_projet INTEGER; -- ID du projet concerné par le traitement
 mouvement boolean; -- Indicateur de la nécessité de traiter des mouvements de plants pour le projet concerné
 status boolean; -- booléen permettant de tester le résultat fourni en retour d'une fonction / procédure
 
BEGIN

SELECT
pjt_id FROM t_projet_pjt WHERE lower(pjt_nom) = lower(nom_projet) INTO id_projet;
IF NOT found THEN
     raise notice
'Erreur - Nom projet introuvable : % ', nom_projet;
 return FALSE;
END IF;

SELECT pjt_traitement_mouvement FROM t_projet_pjt WHERE lower(pjt_nom) = lower(nom_projet) INTO mouvement;
IF NOT found THEN
     raise notice
'Erreur - Nom projet introuvable : % ', nom_projet;
 return FALSE;
END IF;

IF mouvement = true THEN -- Des mouvements de plants ont eu lieu, impliquant un recalcul complet des emplacements de plants
status = ps_maj_emplacement(nom_projet); -- Recalcul complet par une procédure stockée dédiée
IF status = true THEN -- Le recalcul s'est déroulé correctement
-- Remise à zéro des données brutes puis repositionnement des paramètres de date de début et date de fin pour couvrir toute la période du projet.


SELECT pjt_date_premier_fichier FROM t_projet_pjt WHERE lower(pjt_nom) = lower(nom_projet) INTO date_deb;
SELECT pjt_date_dernier_fichier FROM t_projet_pjt WHERE lower(pjt_nom) = lower(nom_projet) INTO date_fin;
UPDATE t_datarobot_dat
SET dat_wa = NULL, dat_ta = NULL , dat_tdiff = NULL, dat_tr = NULL
WHERE
dat_id IN
(SELECT public.t_datarobot_dat.dat_id
FROM
 public
.t_fichier_fic
 INNER JOIN public.tr_robot_rob ON (public.t_fichier_fic.fic_rob_id = public.tr_robot_rob.rob_id)
 INNER JOIN public.tj_affectation_rob_pjt_aff ON (public.tr_robot_rob.rob_id = public.tj_affectation_rob_pjt_aff.aff_rob_id)
 INNER JOIN public.t_projet_pjt ON (public.t_projet_pjt.pjt_id = public.tj_affectation_rob_pjt_aff.aff_pjt_id)
 INNER JOIN public.t_datarobot_dat ON (public.t_fichier_fic.fic_id = public.t_datarobot_dat.dat_fic_id)
WHERE
 (public.t_fichier_fic.fic_date BETWEEN public.tj_affectation_rob_pjt_aff.aff_date_debut AND public.tj_affectation_rob_pjt_aff.aff_date_fin) AND
 (lower(public.t_projet_pjt.pjt_nom) = lower(nom_projet)) AND
 (t_datarobot_dat.dat_horodatage BETWEEN date_deb AND date_fin));
               UPDATE t_projet_pjt
                SET pjt_traitement_mouvement = FALSE
                   WHERE
lower(pjt_nom) = lower(nom_projet);
ELSE
return false
;
END IF;
END IF;

OPEN curs_donnee FOR -- Récupération des données de la période ordonnées par N° de plant puis date / heure.
SELECT
 public
.t_datarobot_dat.*
FROM
 public
.t_fichier_fic
 INNER JOIN public.tr_robot_rob ON (public.t_fichier_fic.fic_rob_id = public.tr_robot_rob.rob_id)
 INNER JOIN public.tj_affectation_rob_pjt_aff ON (public.tr_robot_rob.rob_id = public.tj_affectation_rob_pjt_aff.aff_rob_id)
 INNER JOIN public.t_projet_pjt ON (public.t_projet_pjt.pjt_id = public.tj_affectation_rob_pjt_aff.aff_pjt_id)
 INNER JOIN public.t_datarobot_dat ON (public.t_fichier_fic.fic_id = public.t_datarobot_dat.dat_fic_id)
WHERE
 (public.t_fichier_fic.fic_date BETWEEN public.tj_affectation_rob_pjt_aff.aff_date_debut AND public.tj_affectation_rob_pjt_aff.aff_date_fin) AND
 (lower(public.t_projet_pjt.pjt_nom) = lower(nom_projet)) AND
 (t_datarobot_dat.dat_horodatage BETWEEN date_deb AND date_fin) AND
          NOT
(t_datarobot_dat.dat_plt_id isnull)
ORDER BY public.t_datarobot_dat.dat_plt_id, t_datarobot_dat.dat_date, t_datarobot_dat.dat_time;
   
   plant_en_cours = 0;
   nb_ligne_traite = 0;
   
   LOOP
     FETCH curs_donnee into rec_donnee;
     IF found THEN
           raise notice
'Info  Plant - Date :  % - % ' , rec_donnee.dat_plt_id , rec_donnee.dat_date ;

           IF plant_en_cours <> rec_donnee.dat_plt_id THEN
               plant_en_cours = rec_donnee.dat_plt_id;
               nb_ligne_traite = 0;
-- Maj des variables non dépendantes du précédent cycle de mesures
-- WA = poids après - poids avant de la ligne en cours

UPDATE t_datarobot_dat SET dat_wa = rec_donnee.dat_poids_apres - rec_donnee.dat_poids_avant WHERE dat_id = rec_donnee.dat_id;
           END IF;
          
           IF nb_ligne_traite > 0 THEN
-- WA = poids après - poids avant de la ligne en cours
UPDATE t_datarobot_dat SET dat_wa = rec_donnee.dat_poids_apres - rec_donnee.dat_poids_avant WHERE dat_id = rec_donnee.dat_id;
               UPDATE t_datarobot_dat SET dat_ta = poids_apres_ligne_precedente - rec_donnee.dat_poids_avant WHERE dat_id = rec_donnee.dat_id;
-- Delta t (TDIFF) = Différence entre l'horodatage de la ligne en cours et l'horodatage de la ligne précédente
UPDATE t_datarobot_dat SET dat_tdiff = EXTRACT(EPOCH FROM rec_donnee.dat_horodatage - horodatage_ligne_precedente)/60 WHERE dat_id = rec_donnee.dat_id;
-- taux de transpiration (TR) = TA / TDIFF
UPDATE t_datarobot_dat SET dat_tr = (poids_apres_ligne_precedente - rec_donnee.dat_poids_avant) / (EXTRACT(EPOCH FROM rec_donnee.dat_horodatage - horodatage_ligne_precedente)/60) WHERE dat_id = rec_donnee.dat_id;
           END IF;
         
           nb_ligne_traite = nb_ligne_traite + 1;
           id_ligne_precedente = rec_donnee.dat_id; -- Ligne probablement devenue inutile
           poids_avant_ligne_precedente = rec_donnee.dat_poids_avant; -- Ligne probablement devenue inutile
           poids_apres_ligne_precedente = rec_donnee.dat_poids_apres;
           horodatage_ligne_precedente = rec_donnee.dat_horodatage;

      ELSE
        exit
;
           
     END IF;
   END LOOP;
   close curs_donnee ;
   return true;
   
EXCEPTION
WHEN
OTHERS THEN
     raise notice
'Erreur : % %', sqlstate, sqlerrm;
     return false;
END;
$span$
LANGUAGE
'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST
100;

COMMENT ON FUNCTION public.ps_maj_variables_data_brutes(date_deb date, date_fin date, nom_projet varchar)
IS 'Cette fonction traite les données brutes sur une période donnée en paramètre pour le projet précisé en paramètre.
Elle met à jour les variables WA, TA, TDIFF et TR de la table t_datarobot_dat en tenant compte uniquement des données brutes (poids avant et après et horodatage).
Les variables corrigées seront alimentées par une autre fonction après exploitation de la table des spécificités concernée.
Si besoin le traitement des mouvements de plants est lancé puis l''ensemble des variables brutes est réinitialisé / recalculé pour l''ensemble du projet.'
;

This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 26/02/2014 11:51
Previous topic Chapter index Next topic