Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#76 PL/Perl » envoie de mail » 20/12/2012 15:28:45
- alassanediakite
- Réponses : 6
Salut
Dans mes projets sur PostgreSQL sous windows, je voudrais mettre en place un système d'envoie de mail. Ainsi PostgreSQL m'enverrait les problèmes et d'autres statistiques sur mon mail yahoo.
J'ai trouvé un code que j'ai voulu adapter mais pour le moment le mail n'est pas envoyé
Voici mon code.
CREATE OR REPLACE FUNCTION envoiemail()
RETURNS smallint AS
$BODY$
use strict;
use warnings;
use Carp;
use MIME::Lite; # Pour envoyer des emails
my $from = 'allhassane@yahoo.fr';
my $to = 'diakitealhassane@gmail.com';
my $subject = 'Etat demarrage';
my $message;
$message = 'essai';
my $mail = new MIME::Lite
From => $from,
To => $to,
Subject => $subject,
Type => 'text',
Data => $message;
eval
{$mail->send or die(0);};
if ($@){return 0;}
else {return 1;}
$BODY$
LANGUAGE plperlu VOLATILE
COST 100;A savoir que je ne connais pas bien perl!!!
Je suis entrain de chercher du coté de VBscript+batch aussi.
Si vous avez des idées.
Merci d'avance
#77 Re : Autres langages » fonction en langage C » 22/05/2012 15:59:04
Salut
Je ne déchiffre pas bien ce qu'il me dit. J'ai tenter avec "msbuild.exe" il me dit que le chemin d'accès spécifié est introuvable. J'ai tenter avec VC++ 2005 express, avec VS 2008 sous XP SP3 mais rien ne passe.
J'abandonne pour le moment!!! J'attends les prochaines versions pour voir s'il y a une facilitation pour nous qui somme habitués à "clicker"
Grand merci pour l'aide.
#78 Re : Autres langages » fonction en langage C » 18/05/2012 14:11:01
Salut
J'ai VS 2008 sur machine virtuelle. Le même message d'erreur apparait:"unable to determine vcbuild version..."
Le problème peut-il venir du "PATH"? Ou comment faire le build en précisant la version du build? Sachant que les deux commandes "... build" et "... build mkvcbuild.pl" donnent la même erreur.
Merci d'avance.
PS: je serai absent pour deux ou trois jours. Toutes mes excuses.
#79 Re : Autres langages » fonction en langage C » 17/05/2012 21:38:48
Salut
Les choses avancent.
J'ai pu me placer sur le répertoire. Mais j'ai le message d'erreur:"Unable to vcbuild version from first line of utput! at solution.pm line 71".
Voici le code de la ligne 66 0 72 du fichier solution.pm... (à titre indicatif, sinon j'y connais rien en ce langage!!!)
open(P,"vcbuild /? |") || die "vcbuild command not found";
my $line = <P>;
close(P);
if ($line !~ /^Microsoft\s*\(R\) Visual C\+\+ [^-]+ - \D+(\d+)\.00\.\d+/)
{
die "Unable to determine vcbuild version from first line of output!";
}J'ai vs2010 et vs2008 installé; SDK 6.0A et 7.0A. Est-ce là le problème?
Merci d'avance.
#80 Re : Autres langages » fonction en langage C » 17/05/2012 14:45:21
Salut et merci de l'accompagnement.
Mon repertoire de la source ne possède pas "config.pl" mais seulement "confgi_default.pl".
Dans "config_default.pl" j'ai changé
Perl=>undef, en
perl=>'C:\Program Files\Perl\bin',.
Voici ce que me donne les tentatives avec la ligne de commande de VS2008
Merci d'avance.
#81 Re : Autres langages » fonction en langage C » 15/05/2012 14:30:07
Salut
Je continue de chercher (VS2008, VS2010, codeblock, developpez.com, google, youtube ...) mais rien pour le moment ne donne!
Pour VS 2010 j'ai copier le dossier "include" de la source. Cela résout le problème d'inclusion d'en-tète. Mais j'ai un autre problème dont voici le message d'erreur...
Erreur 1 error LNK2019: symbole externe non résolu "unsigned int __cdecl Float8GetDatum(double)" (?Float8GetDatum@@YAIN@Z)
référencé dans la fonction "unsigned int __cdecl add_one_float8(struct FunctionCallInfoData *)" (?add_one_float8@@YAIPAUFunctionCallInfoData@@@Z)
C:\Users\DIAKITE\Documents\Visual Studio 2010\Projects\myfunc\myfunc\mesfnC.obj myfuncJ'ai aussi tenté avec un fonction perle. "Create extension" passe mais à chaque fois que j'essaye de créer une fonction en perle la connexion se coupe et le serveur (le service postgresql) s'arrête. Je pensais à un problème de droit, j'ai alors pris le user postgres de win comme administrateur mais rien ne change.
Mon environnement: win7 pro, pg9.1.3, activeperle 5.14.2.
Merci d'avance.
#82 Re : Autres langages » fonction en langage C » 11/05/2012 22:22:43
Salut et merci de la réponse.
Cela parait plus ardu que je ne le pensais. Est-ce obligatoire (en plus du SDK de microsoft) d’avoir les autres (perle, bison…).
Je viens de télécharger la source de PostgreSQL. Cela ne pose-t-il pas de problème avec l’installation déjà existante ?
Je continue les recherches.
#83 Autres langages » fonction en langage C » 11/05/2012 19:43:17
- alassanediakite
- Réponses : 12
Salut
Je cherche a faire une fonction en langage C sur postgresql. J'ai suivie cette démarche .
Je voulais l'adapter à l'exemple[/] de la doc postgresql...
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "utils/geo_decls.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
/* par valeur */
PG_FUNCTION_INFO_V1(add_one);
Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
/* par référence, longueur fixe */
PG_FUNCTION_INFO_V1(add_one_float8);
Datum
add_one_float8(PG_FUNCTION_ARGS)
{
/* La macro pour FLOAT8 cache sa nature de passage par référence. */
float8 arg = PG_GETARG_FLOAT8(0);
PG_RETURN_FLOAT8(arg + 1.0);
}
PG_FUNCTION_INFO_V1(makepoint);
Datum
makepoint(PG_FUNCTION_ARGS)
{
/* Ici, la nature de passage par référence de Point n'est pas cachée. */
Point *pointx = PG_GETARG_POINT_P(0);
Point *pointy = PG_GETARG_POINT_P(1);
Point *new_point = (Point *) palloc(sizeof(Point));
new_point->x = pointx->x;
new_point->y = pointy->y;
PG_RETURN_POINT_P(new_point);
}
/* par référence, longueur variable */
PG_FUNCTION_INFO_V1(copytext);
Datum
copytext(PG_FUNCTION_ARGS)
{
text *t = PG_GETARG_TEXT_P(0);
/*
* VARSIZE est la longueur totale de la structure en octets.
*/
text *new_t = (text *) palloc(VARSIZE(t));
SET_VARSIZE(new_t, VARSIZE(t));
/*
* VARDATA est un pointeur vers la région de données de la structure.
*/
memcpy((void *) VARDATA(new_t), /* destination */
(void *) VARDATA(t), /* source */
VARSIZE(t) - VARHDRSZ); /* nombre d'octets */
PG_RETURN_TEXT_P(new_t);
}
PG_FUNCTION_INFO_V1(concat_text);
Datum
concat_text(PG_FUNCTION_ARGS)
{
text *arg1 = PG_GETARG_TEXT_P(0);
text *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
SET_VARSIZE(new_text, new_text_size);
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1) - VARHDRSZ),
VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
PG_RETURN_TEXT_P(new_text);
}Mais à chaque fois qu'une "#include..." apparait dans un fichier ".h" de postgresql VS2010 me dit qu'il ne trouve pas le fichier.
Je suis débutant en C et mon objectif est de récupérer (dans postgresql) les données d'une bd ACCESS par ODBC avec la DLL en C. Pour le moment je cherche juste les bases de compilation d'une fonction en C sur postgresql.
Un grand merci d'avance.
#84 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 23/01/2012 18:54:16
Salut
Pour ceux qui sont intéresses, j'ai trouvé la solution ailleurs.
Pour l'insertion...
CREATE OR REPLACE FUNCTION _insert_reglement_exclusion()
RETURNS TRIGGER AS
$BODY$
declare
montant integer := 0;
montant_init integer := 0;
begin
SELECT COALESCE(sum(montantreglement), 0) INTO montant FROM reglement a WHERE a.idfacture = new.idfacture;
SELECT sum(prixunitaire*quantite) INTO montant_init FROM lignefacture WHERE idfacture = new.idfacture;
IF montant + new.montantreglement > montant_init then
RAISE 'le montant des règlements dépasse le total de la facture!';
end IF;
RETURN NEW;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION _insert_reglement_exclusion()
OWNER TO postgres;Pour la mise à jour...
CREATE OR REPLACE FUNCTION _update_reglement_exclusion()
RETURNS TRIGGER AS
$BODY$
declare
montant integer := 0;
montant_init integer := 0;
begin
SELECT COALESCE(sum(montantreglement), 0) INTO montant FROM reglement a WHERE a.idfacture = new.idfacture AND a.idfacture = OLD.idfacture;
SELECT sum(prixunitaire*quantite) INTO montant_init FROM lignefacture WHERE idfacture = new.idfacture AND idfacture = OLD.idfacture;
IF montant -old.montantreglement+ new.montantreglement > montant_init then
RAISE 'le montant des règlements dépasse le total de la facture!';
end IF;
RETURN NEW;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION _update_reglement_exclusion()
OWNER TO postgres;Merci beaucoup à vous gleu
#85 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 11/01/2012 11:26:35
Salut
Je vous demandais...
"sum(montantreglement)" contient-il le montant en cours d'insertion?vous avez répondu OUI; donc le code...
insert into vreglement(idfacture, datereglement, montantreglement) values(1,'12/03/2011',5000)devrait donner [5000, 9000] dans la table controle ce qui n'est pas le cas.
Par ailleurs le code n'est pas adaptable à la table reglement car pgAdmin me dit qu'il ne peut y avoir de trigger INSETEAD OF sur une table.
Je m'excuse de vous faire perdre du temps. Mais on peut juste répondre à la question suivante: Est il possible (par trigger de postgresql) de récupérer l'ensemble de lignes en cours d'insertion ou de modification, vérifier ce ensemble par agrégation, annuler ou valider selon des conditions?
Merci d'avance.
#86 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 10/01/2012 14:00:48
Salut
J'ai créé une table...
create table controle(tr int, tf int)pour verifier le trigger.
J'ai alors modifier le trigger ...
-- Function: verifiereginsertion()
-- DROP FUNCTION verifiereginsertion();
CREATE OR REPLACE FUNCTION verifiereginsertion()
RETURNS trigger AS
$BODY$
DECLARE
totalfacture integer;
totalreglement integer;
BEGIN
SELECT INTO totalfacture sum(lignefacture.quantite*lignefacture.prixunitaire) FROM lignefacture WHERE idfacture=NEW.idfacture;
SELECT INTO totalreglement coalesce(sum(montantreglement),0) FROM reglement WHERE idfacture=NEW.idfacture;
insert into controle(tr,tf) values(totalreglement, totalfacture);
IF totalreglement>totalfacture THEN
RAISE 'le montant des règlements depasse le total de la facture!';
RETURN NULL;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION verifiereginsertion()
OWNER TO postgres;Le trigger est mis sur INSTEAD OF INSERT OR UPDATE de vregelement qui est une vue sur la table reglement.
Avec...
insert into vreglement(idfacture, datereglement, montantreglement) values(1,'12/03/2011',5000)La table reglement reste vide et la table controle contient [0, 9000] (9000 représente en faite le total de la facture 1)
A présent il y des problèmes.
#87 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 09/01/2012 17:33:40
salut
Dans ce code ...
SELECT INTO totalreglement sum(montantreglement) FROM reglement WHERE idfacture=NEW.idfacture;"sum(montantreglement)" contient-il le montant en cours d'insertion?
Et...
RETURN NEW;comment utiliser le retour? (ou encore comment utiliser la sortie du trigger?)
Merci d'avance
PS: Je vous ai envoyé l'email sur la doc.
#88 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 09/01/2012 16:59:22
Salut
Il ne s’agit pas de contrôler les insertions ou modifications de la table lignefacture !!! Mais plutôt la table règlement.
La facture est créer avec ses détails (lignefacture) et le client est livré (ou nous recevons les produits) et cette facture est ses détails ne sont plus modifiés. A chaque fois que le client se présente pour payer (ou que nous payons chez le fournisseur) une partie de (ou toute) la facture alors la table règlement est mouvementée. Il s’agit alors de faire en sorte que le client ne paye pas plus que ce qu’il nous doit (ou que nous ne payons pas plus que ce qu'on doit au fournisseur). On peut l’assimiler aussi à un prêt bancaire. Il ne faut pas que les remboursements dépassent le capital + l’interêt.
Exemple
Facture
idfacture datefacture typefacture
1 02/01/2012 vente
lignefacture (ou détail facture)
idfacture produit quantite prixunitaire
1 CPUI4 4 30
1 EHP1755 2 45
reglement
idfacture idreglement datereglement montantreglement
1 1 02/01/2012 90
1 2 10/01/2012 70
Nous voyons que la facture N° 1 fait un total de (4*30)+(2*45)=210. Il ne faut pas alors que le total des différents règlements sur cette facture dépasse 210.
#89 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 08/01/2012 14:57:00
Salut gleu
Je pense que les contenus de mes tables ne sont pas bien compris ou j'ai pas compris votre méthode.
En fait, la table lignefacture enregistre les détails de factures (les produits contenu dans la facture) et la table règlement enregistre les différents règlements (payements) de facture que le client effectue. Le montant total de la facture est calculé par SUM(quantite*prixunitaire) par idfacture. Pour chaque règlement on vérifie que le client ne dépasse pas le montant réel de sa facture. Le trigger doit donc vérifier les entrées ou modifications de la table règlement!!!
Merci de l'accompagnement.
PS: comment peut on signaler des erreurs dans la doc française? Par exemple sur la "mise à jour des vues" il y a une phrase non traduite.
#90 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 08/01/2012 01:34:56
salut
Je retourne vers vous avec maintes chemins essayés. Le dernier est INSTEAD OF avec une vue...
CREATE OR REPLACE FUNCTION verifiereginsertion()
RETURNS trigger AS
$BODY$begin
IF ((select COALESCE(sum(lignefacture.quantite*lignefacture.prixunitaire),0)- COALESCE(sum(reglement.montantreglement),0)- sum(NEW.montantreglement)
from lignefacture
left join reglement on lignefacture.idfacture=reglement.idfacture)<0) then
RAISE 'le montant des règlements depasse le total de la facture!';
else
RETURN NEW;
end if;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;... je ne sais pas comment capter le
RETURN NEW.
Je reformule la question alors.
J'ai quatre tables
--table facture
facture
(
idfacture serial NOT NULL,
datefacture date NOT NULL DEFAULT ('now'::text)::date,
typefacture smallint NOT NULL,
CONSTRAINT facture_pkey PRIMARY KEY (idfacture ),
CONSTRAINT facture_typefacture_check CHECK (typefacture = ANY (ARRAY[1, 2]))
)
--table produit
produit
(
idproduit serial NOT NULL,
refproduit character varying(10) NOT NULL,
libelleproduit character varying(75) NOT NULL,
CONSTRAINT produit_pkey PRIMARY KEY (idproduit )
)
--table lignefacture
lignefacture
(
idfacture integer NOT NULL,
produit integer NOT NULL,
quantite smallint NOT NULL,
prixunitaire integer NOT NULL,
CONSTRAINT pklignefacture PRIMARY KEY (idfacture , produit ),
CONSTRAINT lignefacture_idfacture_fkey FOREIGN KEY (idfacture)
REFERENCES facture (idfacture) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE,
CONSTRAINT lignefacture_produit_fkey FOREIGN KEY (produit)
REFERENCES produit (idproduit) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
)
--table reglement
reglement
(
idfacture integer,
idreglement serial NOT NULL,
datereglement date NOT NULL,
montantreglement integer NOT NULL,
CONSTRAINT reglement_pkey PRIMARY KEY (idreglement ),
CONSTRAINT reglement_idfacture_fkey FOREIGN KEY (idfacture)
REFERENCES facture (idfacture) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE
)Comment faire (avec trigger) que l'ensemble des règlements d'une facture ne dépassent pas le montant total de la dite facture? Que l'INSERTION ou la MODIFICATION concerne une ligne ou plusieurs.
Merci d'avance
#91 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 02/01/2012 21:54:10
Avec BEFOR et OLD j'ai le même message "L'enregistrement OLD n'est pas encore affectée...".
Par ailleur je suis confronté au fait que les vues de pgsql sont en lecture seule et cela m'a amener vers les SYSTEMES DE REGLES de pgsql que je découvre pour la premiere fois comme notion en bases de données. Encore du chemin à faire...
Merci d'avance
#92 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 02/01/2012 20:08:35
Salut
Le code m'envoie "L'enregistrement NEW n'est pas encore affectée...". Je pense que cela est due au fait que j'ai utilisé BEFOR. Mais j'ai aussi le message "Les tables ne peuvent pas avoir de triggers INSTEAD OF." quand j'essaye INSTEAD OF.
Alors où est le problème avec NEW?
Merci d'avance.
#93 Re : PL/pgSQL » trigger controlant plusieurs lignes à la fois » 02/01/2012 19:48:18
Merci de la reponse.
Pour votre question:(total de ligne facture) >= (total déjà payé)+(payement en cours)
Je vais votre solution.
#94 PL/pgSQL » trigger controlant plusieurs lignes à la fois » 02/01/2012 19:12:00
- alassanediakite
- Réponses : 18
Salut
J'ai trois tables factures, lignesfacture et reglementsfatcture. Une facture peut avoir plusieurs règlements, ce qui me pousse à vérifier par trigger que le montant total des règlements d'une facture ne dépasse pas le total réel de la facture.
J'ai tenter de faire ça...
CREATE OR REPLACE FUNCTION verifiereginsertion()
RETURNS trigger AS
$BODY$begin
IF ((select COALESCE(sum(lignefacture.quantite*lignefacture.prixunitaire),0)- COALESCE(sum(reglement.montant),0)- sum(NEW.montant)
from lignefacture
left join reglement on lignefacture.idfacture=reglement.idfacture
inner join NEW on lignefacture.idfacture=NEW.idfacture)<0) then
RAISE EXCEPTION '% le montant des règlements depasse le total de la facture!';
else
RETURN NEW;
end if;
end;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION verifiereginsertion()
OWNER TO postgres;Mais j'ai le message:"NEW n'est pas une relation..."
Je croyais que OLD et NEW se comportaient comme INSERTED et DELETED de SQLserver mais la doc me dit que OLD et NEW ne sont que des RECORD.
Je sais que je peux passer par le CHECK, mais là j'apprends les triggers avec postgresql. Alors je voudrais savoir s'il y avait une possibilité avec les triggers?
Merci d'avance.