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 |