You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

75 lines
4.0 KiB

return: text
lang: plpgsql
src: |
DECLARE
_nbPlanAna integer; -- Nb de plans analytiques possibles.
_templateName text; -- Nom de la vue SQL template.
_template text; -- source SQL template à compléter par cette fonction.
_opt_mode text; -- Option t_divers définissant quelle vue SQL source est à prendre
_viewName text; -- Nom de la vue à créer.
_sqlView text; -- SQL de la vue à créer.
_tmpRatio text; -- Ratio à appliquer.
_tmpSelectId text[]; -- Colonnes à ajouter.
_tmpSelectCode text[]; -- Colonnes à ajouter.
_tmpSelectTexte text[]; -- Colonnes à ajouter.
_tmpJoin text; -- Jointure à utiliser.
result text;
BEGIN
_nbPlanAna = 3; -- Actuellement on gère 3 plans analytiques maximum.
_templateName = 'v_historique_paie_0'; -- Par défaut, le template SQL à récupérer est situé dans cette vue.
_opt_mode = ''; -- Par défaut, on prend la vue standard.
-- Récupération de l'option.
SELECT CASE WHEN valeur != '0' THEN '_1' ELSE '' END INTO _opt_mode FROM rh.t_divers WHERE code = 'OPT_STD_HP';
-- Récupération du template.
SELECT pg_get_viewdef(c.oid, true) INTO _template FROM pg_class c JOIN pg_namespace as n on n.oid = c.relnamespace WHERE n.nspname = 'rh' AND c.relname = _templateName||coalesce(_opt_mode, ''::text);
-- La vue v_historique_paie_0 est un template dans lequel il faut remplace "* 999" et "JOIN ( SELECT 1) subq ON 1 = 1" par les bonnes valeurs.
FOR i IN 1..2^_nbPlanAna LOOP
_tmpRatio = '';
_tmpSelectId = null;
_tmpSelectCode = null;
_tmpSelectTexte = null;
_tmpJoin = '';
_sqlView = '';
IF (i::bit(3) = 0::bit(3)) THEN
_viewName = 'rh.v_historique_paie_1';
ELSE
_viewName = 'rh.v_historique_paie_1_' || i::bit(3)::text;
END IF;
FOR j IN 1.._nbPlanAna LOOP
IF (substr(i::bit(3)::text, j, 1) = '1') THEN
_tmpRatio = _tmpRatio || ' * v' || j::text || '.ratio';
_tmpSelectId[j] = 'v' || j::text || '.section_analytique_id as ng_section_analytique_' || j::text || '_id, v' || j::text || '.section_analytique_section_id as ng_section_analytique_' || j::text || '_section_id';
_tmpSelectCode[j] = 'v' || j::text || '.section_analytique_code as ng_section_analytique_' || j::text || '_code, v' || j::text || '.section_analytique_section_code as ng_section_analytique_' || j::text || '_section_code';
_tmpSelectTexte[j] = 'v' || j::text || '.section_analytique_texte as ng_section_analytique_' || j::text || '_texte, v' || j::text || '.section_analytique_section_texte as ng_section_analytique_' || j::text || '_section_texte';
_tmpJoin = _tmpJoin || ' JOIN rh.p_ventilation_section AS v' || j::text || ' ON v' || j::text || '.ventilation_id = p_historique_paie.ventilation_'|| j::text ||'_id';
ELSE
_tmpSelectId[j] = 'null::bigint as ng_section_analytique_' || j::text || '_id';
_tmpSelectCode[j] = 'null::text as ng_section_analytique_' || j::text || '_code';
_tmpSelectTexte[j] = 'null::text as ng_section_analytique_' || j::text || '_texte';
END IF;
END LOOP;
-- Remplacements
_sqlView = replace (_template, '* 999', _tmpRatio);
_sqlView = replace (_sqlView, '999::bigint', array_to_string(_tmpSelectId, ', ', 'null::bigint'));
_sqlView = replace (_sqlView, '''section_analytique_ng_code''::text', array_to_string(_tmpSelectCode, ', ', 'null::text'));
_sqlView = replace (_sqlView, '''section_analytique_ng_texte''::text', array_to_string(_tmpSelectTexte, ', ', 'null::text'));
_sqlView = replace (_sqlView, 'JOIN ( SELECT 1) subq ON 1 = 1', _tmpJoin);
_sqlView = replace (_sqlView, ' AS to_replace_id', '');
_sqlView = replace (_sqlView, ' AS to_replace_code', '');
_sqlView = replace (_sqlView, ' AS to_replace_texte', '');
-- Suppression de la vue si elle existe.
EXECUTE 'DROP VIEW IF EXISTS ' || _viewName;
-- Création de la vue.
EXECUTE 'CREATE VIEW ' || _viewName || ' AS ' || _sqlView;
END LOOP;
RETURN 'OK';
END;