Svp aidé moi!!

cs_NourElhoudaa Messages postés 15 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 18 décembre 2012 - 29 nov. 2012 à 19:06
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012 - 18 déc. 2012 à 09:38
BS
cette requête ne peut pas se fonctionner:
CREATE TABLE "ENTRER"
( "DATE-E" DATE NOT NULL ENABLE ,
"RÉF" Number NOT NULL ENABLE,
"QTT" Number NOT NULL ENABLE,
"P/UNIT" Number NOT NULL ENABLE,
CONSTRAINT ENTRER_PK PRIMARY KEY (DATE-E),
CONSTRAINT ENTRER_FK FOREIGN KEY (RÉF),
REFERENCE PRODUIT_PK (RÉF) )
il m'a affiche se problème : ORA-00936: expression absente

11 réponses

cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
16 déc. 2012 à 15:19
Bonjour,
Imaginons que la table référencée par la table ENTRER s’écrit comme ceci:
CREATE TABLE "PRODUIT"
( "RÉF" Number NOT NULL ENABLE,
CONSTRAINT PRODUIT_PK PRIMARY KEY ("RÉF")) ;

NB : On doit insérer la table produit en premier. En outre, il ne faut pas oublier les guillemets dans KEY ("DATE-E") et dans KEY ("DATE-E"). En plus, il faut remplacer « PRODUIT_PK » par le nom de la table référencée, dans mon exemple j’ai mis la table « produit ».
CREATE TABLE "ENTRER"
( "DATE-E" DATE NOT NULL ENABLE ,
"RÉF" Number NOT NULL ENABLE,
"QTT" Number NOT NULL ENABLE,
"P/UNIT" Number NOT NULL ENABLE,
CONSTRAINT ENTRER_PK PRIMARY KEY ("DATE-E"),
CONSTRAINT REF_FK FOREIGN KEY ("RÉF")
REFERENCES PRODUIT("RÉF")
 ) ;
0
cs_NourElhoudaa Messages postés 15 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 18 décembre 2012
16 déc. 2012 à 16:32
Bonsoir,
merci bien, et stp es que tu peut m'aidée car ma table entrer ou je vait enregistrer touts les entrer elle es comme suit:
CREATE TABLE "ENTER"
( "DATE-E" DATE NOT NULL ENABLE,
"RÉF" NUMBER NOT NULL ENABLE,
"Qtt" NUMBER NOT NULL ENABLE,
"P/UNIT" NUMBER NOT NULL ENABLE,
"MONTANT" NUMBER NOT NULL ENABLE,
CONSTRAINT "ENTER_PK" PRIMARY KEY ("DATE-E") ENABLE,
CONSTRAINT "RÉF_FK" FOREIGN KEY ("RÉF")
REFERENCES "PRODUIT" ("RÉF") ENABLE
WHERE "MONTANT" := "P/UNIT" * "Qtt"
)
il m'a affiche se problème : ORA-00904: : identificateur non valide
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 17:18
C’est une contrainte d’intégrité  que tu veux sur le montant ? Si c’est  le cas, alors tu peux utiliser le « check » contrainte de vérification ainsi la requête devient : 

CREATE TABLE "ENTER"
( "DATE-E" DATE NOT NULL ENABLE,
"RÉF" NUMBER NOT NULL ENABLE,
"Qtt" NUMBER NOT NULL ENABLE,
"P/UNIT" NUMBER NOT NULL ENABLE,
"MONTANT" NUMBER NOT NULL ,
CONSTRAINT "ENTER_PK" PRIMARY KEY ("DATE-E") ENABLE,
CONSTRAINT "RÉF_FK" FOREIGN KEY ("RÉF")
REFERENCES "PRODUIT" ("RÉF"),
CONSTRAINT check_montant check("MONTANT" = "P/UNIT" * "Qtt") 
) ;
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 17:20
C’est une contrainte d’intégrité que tu veux sur le montant ? Si c’est le cas, alors tu peux utiliser le « check » contrainte de vérification ainsi la requête devient :
CREATE TABLE "ENTER"
( "DATE-E" DATE NOT NULL ENABLE,
"RÉF" NUMBER NOT NULL ENABLE,
"Qtt" NUMBER NOT NULL ENABLE,
"P/UNIT" NUMBER NOT NULL ENABLE,
"MONTANT" NUMBER NOT NULL ,
CONSTRAINT "ENTER_PK" PRIMARY KEY ("DATE-E") ENABLE,
CONSTRAINT "RÉF_FK" FOREIGN KEY ("RÉF")
REFERENCES "PRODUIT" ("RÉF"),
CONSTRAINT check_montant check("MONTANT" = "P/UNIT" * "Qtt")
) ;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_NourElhoudaa Messages postés 15 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 19:09
Bonsoir,
merci bien c'est gentille de votre part, mais SVP es que vous pouvez m'aidé dans cette requête aussi:
CREATE TABLE "STOCK"
( "DATE_ST" DATE NOT NULL ENABLE,
"RÉF" NUMBER NOT NULL ENABLE,
"Qtt" NUMBER NOT NULL ENABLE,
"MONTANT" NUMBER NOT NULL ENABLE,
CONSTRAINT "STOCK_PK" PRIMARY KEY ("DATE_ST") ENABLE,
CONSTRAINT "RÉF_FK2" FOREIGN KEY ("RÉF")
REFERENCES "PRODUIT" ("RÉF") ENABLE,
CONSTRAINT check_QTT check("Qtt" = "ENTER"."Qtt" - "sortir"."Qtt"),
CONSTRAINT check_MONTANTS check("MONTANT" = "ENTER"."MONTANT" + "sortir"."MONTANT")
) ;
il m'a affiche se problème :ORA-00904: "ENTER"."Qtt" : identificateur non valide
je veut faire la table qui me donne touts les produit stocké et le montant générale et je vous remercie une notre foi .
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 20:56
rebonjour,
Les contraintes définies avec « CONSTRAINT » ne s’appliquent que sur les champs de la même table. Cependant, lorsqu’on voudrait appliquer une contrainte sur un champ d’une autre table, on devrait utiliser les triggers (qui sont fait d’ailleurs pour ça). En effet, pour réussir à mettre en place ces contraintes, on doit utiliser une jointure entre les tables. De plus, nous avons la possibilité de gérer les exceptions des erreurs avec les triggers.
Je suppose que les trois tables sortir, entrer et stock partagent la même réf, ce qui est logique. Donc, voici un exemple d’un trigger ou déclencheur : attention il se peut que ce code contienne quelques erreurs d’inattention…
Bon courage,
CREATE OR REPLACE TRIGGER tg_contraintes_stock before UPDATE or INSERT ON STOCK FOR EACH ROW 
DECLARE
tg_exeption EXCEPTION;
v_ok	NUMBER:=-1;
begin

select count(*)
into v_ok
from entrer e, sortie s, stock st
where e.ref = s.ref
and s.ref = st.ref
and e.ref = :new.ref
and :new.MONTANT = e.MONTANT + s.MONTANT
and :new.Qtt = ENTER.Qtt - sortir.Qtt;

if v_ok<1 then
  RAISE tg_exeption ;
end if;


EXCEPTION
WHEN tg_exeption THEN
dbms_output.put_line ('attention !! erreur de saisie.....     text ....du text');
ROLLBACK;


end;

/
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 21:00
Attention il faut remplacer
and :new.Qtt = ENTER.Qtt - sortir.Qtt;
par
and and :new.Qtt = e.Qtt - s.Qtt;
0
cs_NourElhoudaa Messages postés 15 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 21:14
Re Bonsoir,
merci de vote aidé mais il m'affiche encore se problème: ERREUR à la ligne 13 : PLS-00049: variable de lien erronée 'NEW.QTT' es que vous pouvez me dire pourquoi?!
merci une notre foi et pardons pour le dérangement!!
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
17 déc. 2012 à 23:36
Essayer ça,
CREATE OR REPLACE TRIGGER tg_contraintes_stock before UPDATE or INSERT ON STOCK FOR EACH ROW 
DECLARE
tg_exeption EXCEPTION;

v_mt	entrer.montant%TYPE :=0;
v_qtt   entrer.qtt%TYPE :=0;
begin

select (e.Qtt - s.Qtt),
(e.MONTANT + s.MONTANT)
into  v_qtt, 
      v_mt	
from entrer e, sortie s, stock st
where e.ref = s.ref
and s.ref = st.ref
and e.ref = :new.ref;

if (not( v_qtt= :new.qtt)  or not(v_mt=:new.montant)) then
  RAISE tg_exeption ;
end if;


EXCEPTION
WHEN tg_exeption THEN
dbms_output.put_line ('attention !! erreur de saisie.....     text ....du text');
ROLLBACK;


end;

Nb : je n’ai rien sur mois pour que je puisse faire des tests. c'est juste un exemple pour vous aidez...
bon courage,
0
cs_NourElhoudaa Messages postés 15 Date d'inscription mardi 6 mars 2012 Statut Membre Dernière intervention 18 décembre 2012
18 déc. 2012 à 00:13
merci bien c'est gentille de votre part
0
cs_ziti Messages postés 8 Date d'inscription dimanche 8 février 2009 Statut Membre Dernière intervention 18 décembre 2012
18 déc. 2012 à 09:38

Bonjour,
Ce trigger simplifié fonctionne ( test ok).
Cependant, votre schéma n’est pas vraiment correct. Par ce que, La même référence produit pourrait être insérée plusieurs fois dans la même table ce qu’il n’est pas bon : c’est mieux de mettre à jour les caractéristiques du produit que de l’insérer à chaque fois (problème de redondance). C est pourquoi, il faut ajouter une contrainte (clé primaire ou KEY) sur ce champ (sur les trois table stock – sortie - entrer) ;



CREATE OR REPLACE TRIGGER tg_contraintes_stock before UPDATE or INSERT ON STOCK FOR EACH ROW 
DECLARE
tg_exeption EXCEPTION;
v_mt	NUMBER:=0;
v_qtt   NUMBER :=0;
begin
select (e."Qtt" - s."Qtt"),
(e."MONTANT" -s."MONTANT")
into  v_qtt, 
  v_mt	
from entrer e, sortie s
where e."REF" = s."REF"
and e."REF" = :new."REF";

 DBMS_OUTPUT.PUT_LINE( ' diff qte' ||v_qtt||'diff montant '||v_qtt) ;
 
if (not(v_qtt= :new."Qtt") or not(v_mt=:new."MONTANT") )  then
raise_application_error(-20004,&#8216;erreur text ....exemple &#8217;);
end if;		
end;
/
0
Rejoignez-nous