8791 sujets

Développement web côté serveur, CMS

Bonjour,

Je ne savais pas ou mettre ce post donc je le met là.

Voilà mon soucis:

J'ai une base de données sur oracle qui doit gérer des hospitalisations.
Voici mes différentes tables:
PATIENTS (Numpat(clé primaire), Nom, Prenom, datenai)
SERVICE (Numserv(clé primaire), Libelle, Nbrelitmaxi)
CHAMBRE (Numch(clé primaire), nblit, Numserv)
HOSPITALISATION (Numpat, Numch, Datedeb(les trois clés primaire), datefin)

En faite je doit faire un Trigger qui me permet de vérifier à l'insertion et à la modification si la chambre voulu n'est pas pleine pour les dates voulus et si le patien n'est pas déjà hospitalisé pour cette période.

Voici le trigger que j'ai réalisé:

create or replace trigger InitHospitalisation
before insert or update on Hospitalisation
for each row
declare
  chlit number;
  nblits number;
begin
  select count(*) into chlit
  from HOSPITALISATION
  where Numch = :new.Numch
  And ((datedeb >= :new.datedeb) and (datefin >= :new.datefin))
  or ((datedeb < :new.datedeb) and (datefin < :new.datefin))
  or ((datedeb > :new.datedeb) and (datefin > :new.datefin))
  or ((datedeb > :new.datedeb) and (datefin < :new.datefin));
  select Nblit into nblits
  from CHAMBRE
  where Numch = :new.Numch;
  if (chlit + 1 > nblits) then
    raise_application_error(-20000,'Tous les lits sont pris pour cette chambre');
  end if;
end;
/


Il enregistre tous les patient que je lui insert sans regarder le nombre de lit pour la chambre ni les dates.

Si vous trouvez se qui ne vas pas je vous en serais trés reconnaissante.

Bonne fin de journée.

Miala
Modifié par Miala (16 Apr 2009 - 10:05)
Salut,

hmm... désolé mais je ne comprends rien à cette partie du code :
Miala a écrit :
...
  And ((datedeb >= :new.datedeb) and (datefin >= :new.datefin))
  or ((datedeb < :new.datedeb) and (datefin < :new.datefin))
  or ((datedeb > :new.datedeb) and (datefin > :new.datefin))
  or ((datedeb > :new.datedeb) and (datefin < :new.datefin));

Je suppose que tu cherches à compter le nombre de lits occupés pour une chambre donnée et pour une période donnée ?

Si oui il me semble qu'il suffit de faire
And ((new.datedeb between datedeb and datefin) 
OR (new.datefin between datedeb and datefin));
En faite, il faut que je regarde si le nombre de lit n'est pas complet pour cette période.
Donc comparer les date des patients qui sont déjà dans la chambre si à cette période la chambre est compléte j'envois un message d'érreur si elle est compléte pour cette période.

Je sais pas si je suis bien clair, ma prof m'as expliqué comme ça mais j'ai pas trés bien compris et la partie du code que tu as mise c'est ce qu'elle nous as dit de faire.
Miala a écrit :
En faite, il faut que je regarde si le nombre de lit n'est pas complet pour cette période.
C'est bien comme ça que j'avais compris... tu as essayé le code que je t'ai proposé ?

Au passage je suis un peu surpris que le code soit le même pour un Insert (ma proposition) et pour un Update. Smiley hein
Bonjour,

Je n'ai pas encore testé le code que tu m'as proposé parce que j'ai du mal à installé correctement Oracle sur Vista.
Bonsoir,

J'ai testé le code que tu m'as donné, il fonctionne bien pour l'insert mais pas pour le update.

Pour update, il me met que la table est en mutation, je voit pas trop ce que ça veut dire.

Par contre j'aurais une autre question, enfin un autre problème:

Dans mon trigger je doit aussi ajouter le fait que le patient ne doit pas être déjà hospitalisé pour la période choisie.
J'ai essayer avec un nouveau select, mais il me met à l'insertion qu'il n'y a aucune données.

Si quelqu'un a une petite idée, je continue à chercher de mon coté.

Merci d'avance.

Bonne soirée à tous.
Bonjour,

J'ai trouver comment débloquer mon problème.

Merci pour l'aide.

Bonne journée.