Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 04/03/2014 10:40:32
- Geo-x
- Membre
Création d'une boucle avec variable
Bonjour @ tous.
J'essaie de créer une fonction qui me permettra de renvoyer un tableau au format HTML (sans passer par du PHP).
Je demande donc en entrée 5 champs (parce que c'est ce dont j'ai besoin) et 1 table
CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)
Ensuite je déclare une variable qui contiendra le code HTML
DECLARE var_tableau_html varchar;
Et un record qui me servira plus tard
DECLARE var_titre_tableau record;
Ensuite, je commence à structurer mon tableau en indiquant les titres des colonnes
var_tableau_html='<TABLE BORDER="0"><TR><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR><TR>';
Mais après ça se complique...Quand je veux faire une boucle sur le résultat de ma requête qui remplira le tableau. Je fais une boucle
FOR var_titre_tableau IN EXECUTE 'SELECT DISTINCT '||c1||','||c2||','||c3||','||c4||','||c5||' FROM '||var_table
LOOP
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c2||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c3||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c4||'</TD>';
var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c5||'</TD>';
END LOOP;
Puis je ferme mon tableau que je renvoie
var_tableau_html=var_tableau_html||'</TR></TABLE>';
return var_tableau_html;
Le problème, c'est que la boucle ne fonctionne pas, je n'arrive pas à faire interpréter à ma fonction une grille de lecture sur le résultat de ma requête
ERROR: record "var_titre_tableau" has no field "c2"
J'ai essayé différents stratagèmes :
1- Créer ma requête en amont et exécuter après le IN
2- Créer plutôt dans ma boucle une requête du type
EXECUTE var_tableau_html=var_tableau_html||'<TD>'||var_titre_tableau.c1||'</TD>';
Mais rien n'y fait, ça ne fonctionne pas...
Z'auriez une explication par hasard ? ;-)
Geo-x
Hors ligne
#2 04/03/2014 10:47:31
- rjuju
- Administrateur
Re : Création d'une boucle avec variable
Bonjour,
Vous pouvez construire la partie html directement dans la requête, et remplacer le record par une simple variable text :
FOR v_text IN EXECUTE 'SELECT DISTINCT <td>' || c1 || '</td><td>' || ...
Julien.
https://rjuju.github.io/
Hors ligne
#3 04/03/2014 11:39:57
- Geo-x
- Membre
Re : Création d'une boucle avec variable
Merci rjuju, ça c'est ce que j 'appel de la réactivité !!
Voici le code final de la fonction qui permet, pour rappel, de générer un tableau HTML à partir de 5 champ et 1 table en entrée :
CREATE OR REPLACE FUNCTION sortie_tableau_html5(c1 varchar,c2 varchar,c3 varchar,c4 varchar,c5 varchar,var_table varchar)
RETURNS varchar AS
$BODY$
DECLARE
var_tableau_html varchar;
var_text text;
BEGIN
BEGIN
var_tableau_html='<TABLE BORDER="0"><TR align="center">><TH>'||c1||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c2||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c3||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c4||'</TH> ';
var_tableau_html=var_tableau_html||'<TH>'||c5||'</TH></TR>';
raise notice 'var_tableau_html : %', var_tableau_html;
FOR v_text IN EXECUTE 'SELECT DISTINCT ''<TR align="center"><td>''||'||c1||'||''</td><td>''||'||c2||'||''</td><td>''||'||c3||'||''</td><td>''||'||c4||'||''</td><td>''||'||c5||'||''</td></TR>'' FROM '||var_table
LOOP
var_tableau_html=var_tableau_html||v_text;
raise notice 'var_tableau_html : %', var_tableau_html;
END LOOP;
var_tableau_html=var_tableau_html||'</TABLE>';
return var_tableau_html;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Question subsidiaire, est-il possible de compter le nombre de colonnes issues d'une requête, par exemple, d'un SELECT * ?
A très vite.
Geo-x
Dernière modification par Geo-x (04/03/2014 11:43:45)
Hors ligne
#4 04/03/2014 21:10:18
- gleu
- Administrateur
Re : Création d'une boucle avec variable
Non, pas avec PL/pgsql.
Guillaume.
Hors ligne
Pages : 1