Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#176 Général » Utilisation de crosstab » 17/01/2011 14:40:26
- damalaan
- Réponses : 14
Bonjour,
je souhaite utiliser la fonction crosstab pour faire un genre de tableau croisé (à la manière d'excel ou access)
voici donc mon code
SELECT *
FROM crosstab(
'select mois, round
from view_moy_labo')
AS ct(mois text, ET numeric);et voici l'erreur
ERREUR: la fonction crosstab(unknown) n'existe pas
LINE 2: FROM crosstab(
^
HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
********** Erreur **********
ERREUR: la fonction crosstab(unknown) n'existe pas
État SQL :42883
Astuce : Aucune fonction ne correspond au nom donné et aux types d'arguments.Apparemment cette fonction n'existe pas sur mon pg
y a t il un module à installer?
je suis sous pgsql 9.0
merci
#177 Re : PL/pgSQL » Passage de paramètre pour la COPY » 08/01/2011 17:09:43
je suis allé jusqu'à 3 \ (au pif, c'est vrai), il m'en manquait 1 !!!
Merci pour les infos.
#178 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 21:57:29
select essais('C:/v10.txt') fonctionne très bien
j'avais oublié que le slash fonctionnait!!
#179 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 21:48:29
J'ai modifié ma fonction mais ça ne marche pas
CREATE OR REPLACE FUNCTION essais(text)
RETURNS void AS
$BODY$
DECLARE
ordre_sql varchar;
BEGIN
-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_temp2_tm2;
-- on importe le fichier
SET client_encoding TO 'LATIN1';
ordre_sql := 'COPY tbl_import FROM ''' || $1 || ''' WITH CSV HEADER DELIMITER '';''';
execute ordre_sql;
.....voici le lancement de la fonction
select essais(E'C:\\v10.csv');
voici l'erreur renvoyée
ERREUR: n'a pas pu ouvrir le fichier « C:v10.csv » pour une lecture : No such file or directory
CONTEXT: instruction SQL « COPY tbl_import FROM 'C:\v10.csv' WITH CSV HEADER DELIMITER ';' »
PL/pgSQL function "essais" line 14 at instruction EXECUTE
********** Erreur **********
État SQL :58P01apparemment c'est un souci d'échappement de caractère dans le nom du fichier...
#180 Re : PL/pgSQL » Passage de paramètre pour la COPY » 06/01/2011 18:06:22
Bien sûr!!! ça va de soi ![]()
petite précision : ça reste interne à un réseau d'entreprise.
#181 PL/pgSQL » Passage de paramètre pour la COPY » 05/01/2011 21:42:53
- damalaan
- Réponses : 7
Bonjour,
j'ai créé une fonction qui importe un fichier texte. Je voudrais passé le chemin du fichier en paramètre pour pouvoir me servir de cette fonction depuis une page web via PHP
-- Function: essais()
-- DROP FUNCTION essais();
CREATE OR REPLACE FUNCTION essais()
RETURNS void AS
$BODY$
BEGIN
-- on efface les tables temporaires
delete from tbl_import;
delete from tbl_import2;
-- on importe le fichier
SET client_encoding TO 'LATIN1';
COPY tbl_import FROM 'C:/essai.txt'
WITH
CSV HEADER
DELIMITER ';';
.....Merci d'avance
#182 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 22:39:25
Effectivement la jointure est plus judicieuse surtout que j'ai conçu ma base de cette manière!!
je suis à 120000 lignes et 8s de temps de réponse, pas mal!
#183 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 17:11:47
comment dire...............parfait!!!!
quand je pense le temps que j'ai passé à faire ça sous access!! et là ça se fait tout seul (ou presque)
en cherchant sur le net j'ai trouvé ce tuto : http://lalystar.developpez.com/fonction … ques/#L3.2 (c'est pour Oracle, mais les fonctions des 2 sgbd étant proches, cela m'a plus aidé que la doc de postgresql)
pour l'instant je sors les valeurs en un peu plus de 1100 ms, mais je n'ai que 24000 lignes, et je suis sur un netbook; je teste dès que je peux en réel!!
voici quand même mon code :
SELECT
tbl_tournee_trn.trn_date_prel,
tbl_tournee_trn.trn_tournee,
tbl_tournee_trn.trn_usine,
tbl_valeur_mg.mg_matricule,
tbl_valeur_mg.mg_val,
tbl_valeur_mg.mg_val - lag (tbl_valeur_mg.mg_val, 1)
over (partition by tbl_valeur_mg.mg_matricule
order by tbl_tournee_trn.trn_date_prel) ecart
FROM
tbl_valeur_mg,
tbl_tournee_trn
WHERE
tbl_tournee_trn.trn_id = tbl_valeur_mg.trn_id ;encore merci
plus ça va plus j'aime postgreSQL!!
#184 Re : Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 16:07:38
je suis sous la version 9.0........et je débute donc je ne connais pas ces fonctions..........
#185 Général » Calcul d'écart entre chaque enregistrement » 03/01/2011 15:52:37
- damalaan
- Réponses : 8
Bonjour,
Voici un extrait de données
trn_date trn_tr trn_us mg_mat mg_val écart
90201 140 1711 1003 39.9
90202 140 1711 1003 41.6 1.7
90203 140 1711 1003 40.2 -1.4
90301 140 1711 1003 39.1 -1.1
90302 140 1711 1003 39.7 0.6
90303 140 1711 1003 40.3 0.6
90201 135 1711 1005 42.2
90202 135 1711 1005 42.1 -0.1
90203 135 1711 1005 42.1 0
90301 135 1711 1005 40.9 -1.2
90302 135 1711 1005 40.6 -0.3
90303 135 1711 1005 39.9 -0.7
90201 104 1711 1010 42.5
90202 104 1711 1010 42.8 0.3
90203 104 1711 1010 42.1 -0.7
90301 104 1711 1010 41 -1.1
90302 104 1711 1010 41.5 0.5
90303 104 1711 1010 41.8 0.3
90201 141 1711 1014 41.9
90202 141 1711 1014 41.4 -0.5
90203 141 1711 1014 43.5 2.1
90301 141 1711 1014 37.9 -5.6
90302 141 1711 1014 39.4 1.5
90303 141 1711 1014 40.9 1.5
90201 132 1711 1016 42.9
90202 132 1711 1016 41.6 -1.3
90203 132 1711 1016 39.2 -2.4
90301 132 1711 1016 37.5 -1.7
90302 132 1711 1016 37.6 0.1
90303 132 1711 1016 38 0.4
90201 141 1711 1019 44
90202 141 1711 1019 43.8 -0.2
90203 141 1711 1019 44.4 0.6
90301 141 1711 1019 41.4 -3
90302 141 1711 1019 42 0.6
90303 141 1711 1019 41.2 -0.8Ce que je veux faire, c'est calculer la différence qu'il y a entre 2 enregistrements consécutifs mg_val tant que mg_mat = mgmat-1, tout cela classer par date
Mon souci est que dans ma base j'ai plus de 400000 lignes et qu'elle grossit de 20000 env par mois; j'ai fait un essai avec des select imbriqués, sur 50 valeurs ça marche, mais évidemment sur 400000 c'est pas la peine.
Actuellement, cette appli tourne sur Access et je fais mon calcul en VBA : à chaque import, je recalcule tout et je stocke la valeur calculée dans la table (pas top!!).
Auriez-vous une solution sous Postgresql un peu plus propre?
Le but final de cette appli étant de faire des stats sur ces écarts calculés sur une durée que l'utilisateur définit lui même.
Merci d'avance
#186 Re : PHP » Création page web pour s'identifier » 29/12/2010 08:45:45
oui c'est bien lors de l'authentification
j'ai adapté un code que j'ai trouvé sur le net prévu pour MySQL et qui utilise le cryptage en md5; d'où mon interrogation.
Encore merci pour vos remarques, c'est toujours constructif!
#187 Re : PHP » Création page web pour s'identifier » 28/12/2010 21:42:33
Finalement j'ai décidé de procéder d'une autre manière :
1-affichage de la page de connexion
<form action="/session2/connexion.php" method="post">
<input name="name" type="text" size="12" value="" /> Name<br />
<input name="pass" type="password" size="12" value="" /> Password<br />
<input name="submit" type="submit" value="Connexion" />
</form>2-sur le clic du bouton connexion on traite l'identification avec le fichier connexion.php
<?php
//initialisation de la session
session_start();
//si les champs ont été remplis
if (!$_POST['name']=="" && !$_POST['pass']=="")
{
//on récupère les valeurs des champs
$name = $_POST['name'];
$pass = $_POST['pass'];
//connexion à la base de donnée
$connect = @pg_connect("host=localhost port=5432 dbname=madbpg user=$name password=$pass");
//echo pg_last_error($connect);
if (!$connect) {
header('Location: stop.php');
}
else {
echo "connexion ok";
$_SESSION['name'] = $name;
$_SESSION['pass']= $pass;
echo "<a href=\"lien.php\">Cliquez ici<\a>";
}
}
?>donc si la conexion foncttionne j'affiche "connexion ok" , je passe le nom d'utilisateur et son mot de passe dans la session et je teste avec un lien vers une page faisant appel à une requete sur la bdd
3-affichage de la page lien et utilisation des variables de session
<?php
require 'auth.php';
echo $_SESSION['name'];
echo $_SESSION['pass'];
$name = $_SESSION['name'];
$pass = $_SESSION['pass'];
$connect = pg_connect("host=localhost port=5432 dbname=madbpg user=$name password=$pass");
$result = pg_query($connect, "SELECT * from tbl_pente");
if (!$result) {
echo "Une erreur s'est produite.\n";
exit;
}
while ($row = pg_fetch_row($result)) {
echo "ID: $row[0] TYPE: $row[1] VAL: $row[2] REPET: $row[2]";
echo "<br />\n";
}
?>et je vérifie l'authentification à chaque page avec require 'auth.php'
<?php
session_start();
//on vérifie que l'utilisateur est identifé
if (!isset($_SESSION['name'])) {
//si la variable de session n'existe pas
//on redirige l'utilisateur vers le formulaire d'identification
header('Location: ./index.php');
//on arrête l'exécution
exit();}
else
{
$name=$_SESSION['name'];
$pass=$_SESSION['pass'];
}
?>mes soucis sont
-que le mot de passe passe en clair, impossible de le faire fonctionner en le
passant en md5
-que je n'arrive pas à passer les variables de session telles quelles dans les connexions
je suis obligé de les repasser dans une variable classique avant (je pense que je vais faire un autre fichier php pour cela ça évitera de le faire pour chaque page)
dans l'attente de vos remarques!
#188 Re : PHP » Création page web pour s'identifier » 19/12/2010 22:02:55
j'ai donc utilisé la tbl pg_roles, et adapté un script conçu initialement pour mysql
mon souci est que l'identification est tjs refusé : Votre nom ou votre mot de passe est incorrect
script pour se logger:
<form action="/session/session.php" method="post">
<input name="name" type="text" size="12" value="" /> Name<br />
<input name="pass" type="text" size="12" value="" /> Password<br />
<input name="submit" type="submit" value="Connexion" />
</form>et script d'authentification
<?php
//initialisation de la session
session_start();
//si les champs ont été remplis
if (!$_POST['name']=="" && !$_POST['pass']=="")
{
//on récupère les valeurs des champs
$name = $_POST['name'];
$pass = md5($_POST['pass']);
//connexion à la base de donnée
$connect = pg_connect("host=localhost port=5432 dbname=madbpg user=postgres password=****");
echo $name;
$sql= "SELECT rolpassword FROM pg_roles WHERE rolname like '$name';";
echo $sql."</br>";
$sql = pg_query($connect, $sql);
$row = pg_fetch_array($sql, 0, PGSQL_NUM);
$pass_sql= $row[0];
//on teste si le mot de passe correspond à la base de donnée
if ($pass_sql == $pass)
{
//l'utilisateur est valide
//on crée la variable de session avec son nom
$_SESSION['name'] = $name;
$msg = 'Vous êtes correctement indentifié';
}
else {
//sinon on avertit l'utilisateur
$msg = 'Votre nom ou votre mot de passe est incorrect<br />';
$msg .= '<a href="/index.php">Retour</a>';}
//fermeture de la connexion
pg_close();}
else {
//un des champs n'est pas rempli
$msg = 'Votre nom et/ou votre mot de passe n\'est pas renseigné<br />';
$msg .= '<a href="/index.php">Retour</a>';}
//on affiche le resultat
echo $msg;
?>merci de votre aide
#189 PHP » Création page web pour s'identifier » 02/12/2010 23:52:52
- damalaan
- Réponses : 6
Bonjour,
je débute tout juste avec postgresql.
je m’exerce donc à créer une petite base (1 table pour le moment) avec des utilisateurs (roles) ayant des droits différents.
je voudrais interfacer ma base avec une page web, et utiliser les session de php pour autoriser (ou non) les différentes actions d'un utilisateur dès lors qu'il s'est loggé et tout au long de la navigation sur le site.
Ma question est : puis-je utilisé pour identifier mes utilisateurs la table système pg_roles ou doit créer une table user de toutes pièces (et dans ce cas comment je gère les droits select, insert, update, delete sur les tables)?
Merci d'avance