Tom's Guide > Forum > Programmation > Controle d'insertion dans une base.

Controle d'insertion dans une base.

Forum Programmation : Controle d'insertion dans une base.

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

Voila je fait actuellement une application en intranet de getion de véhicule. mais me voila bloqué, je voudrai empeché l'utilisateur d'inseré dans la base le meme véhicule qui a été emprunté.
Voici ma table rerserver:
(
numres int4 NOT NULL DEFAULT nextval('reserver_numres_seq'::regclass),
nompren varchar(1000) NOT NULL,
codveh varchar(10) NOT NULL,
datedep date NOT NULL,
dateret date NOT NULL,
heuredep time NOT NULL,
heureret time NOT NULL,
lieu varchar(1000) NOT NULL,
comres varchar(1000),
CONSTRAINT "pk-numres" PRIMARY KEY (numres),
CONSTRAINT fk_codeveh FOREIGN KEY (codveh)
REFERENCES vehicule (codveh) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_nompren FOREIGN KEY (nompren)
REFERENCES agent (nompren) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;
ALTER TABLE reserver OWNER TO postgres;


-- Index: fki_nompren

-- DROP INDEX fki_nompren;

CREATE INDEX fki_nompren
ON reserver
USING btree
(nompren);

Merci d'avance.

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

- bonjour
- quel type de base (oracle ?)
- fais une comparaison des résultat entré avec ceux dans la base.

Répondre à okinou

Bonjour,

Apparement tu utilises postgresql comme base.

Quand tu dis "'inseré dans la base le meme véhicule qui a été emprunté", ce n'est pas très clair.

Tu peux enregistrer deux fois le même véhicule dans le cas ou il n'est pas emprunté ? j'espère que non ...

Après comme solution :

- tu as des identifiants unique qui ne peuvent être créé en doublon
- tu peux créer un trigger qui controle les nouvelles insertions
- tu peux faire en plus une routine de vérification dans l'application cliente.

Répondre à 3psilon

Oui j'utilise postgres comme SGBD. Puis je vais vous donnez un exemple ce que je désire (un exemple vaut mille phrase lol)

exemple:
Véhicule emprunté le 24/01/2006 au 24/01/2006 de 10h à 14h il faudrai que l'on puisse pas enmprunté le véhicule a 11h idem pour la date car un véhicule peut etre emprunté sur plusieurs jours.

Répondre à amalec

Ou tu peux mettre un champ "Dispo" non/oui.
Et un second champ "DateLocationFin" avec la date du retour du vehicule, comme ça tu pourras même afficher quand le véhicule serat à nouveau dispo.
Tu peux bien sûr ne mettre que le champ DateLocationFin et si il est plein ça voudras dire que le véhicule et en location.
Tu peux aussi faire un champ "DateLocationDebut" si tu veux pouvoir aussi afficher depuis quand le véhicule et louer, ça peut être pratique en cas de litige ou pour pouvoir faire une vérification.

Répondre à fodzy

Oui c'est pas bete. Mais cela vérifie que le jour pas l'heure car un véhicule peut etre prs plusieur fois dans la journée.
Re exemple :
24/01 au 24/01 heure: 9h à 10h
meme véhicule 24/01 au 24/01 de 10h30 à 12h

Donc ta solution n'est pas bete mais ne gere pas ce cas car le véhicule serai bloquer pour toute la journer.
Mais merci quand de ton aide. ;-)

Répondre à amalec

Slt,

Solution :

Soit : un simple booléen indiquant si le véhicule est présent ou pas. Booléen qu'il faudrait modifier en fonctions des événements (départ et retour des prêts).

Soit : une table d'emprunt associée aux véhicules, qui conserve date et heure des emprunts. (Plus judicieux car sauvegarde de l'histo + planification)

Répondre à 3psilon

Salut,

je ne comprends pas trop où se trouve le problème.
C'est au niveau de l'interface utilisateur que ton système doit être bridé. Ta table contient déjà les infos nécessaires.

- identifiant véhicule
- heure et date de départ
- heure et date de retour

Lorsque la personne cherche un véhicule dispo pour une date tu renvois la liste des véhicule dont les dates sont compatibles avec celle rechercher.
Au moment de l'insertion tu n'as donc aucun risque puisque la personne a forcement sélectionner un véhicule disponible.

A moins que je n'ai pas compris ta question ...

Répondre à ataofeal

Je vous remercie tous pour votre soutien.
Alors pour repondre a ton intérogation je préfére etre sur qu'il n'y a pas d'érreur d'insertion. Car pour l'instant je peut rentré une réservation impossible. Puis l'application que je fait sert a des personne qui son a l'acceuil (D.D.E lol) donc il vont pas rechercher tout le temps si le véhicule est dispo.
Mais je te remerci de t'on aide.

Réponse pour 3psilon :

voila mon schéma:

j'ai une table agent et véhicule qui sont relier a une table reserver.
Je vous ai donné plus haut la table reserver.
maintenent je vous donne la table agent :
CREATE TABLE agent
(
service varchar(50) NOT NULL,
nompren varchar(1000) NOT NULL,
comag varchar(1000),
CONSTRAINT pk_nompren PRIMARY KEY (nompren)
)
WITHOUT OIDS;
ALTER TABLE agent OWNER TO postgres;

et la table véhicule :

CREATE TABLE vehicule
(
codveh varchar(10) NOT NULL,
typveh varchar(10) NOT NULL,
comveh varchar(1000),
CONSTRAINT pk_codeveh PRIMARY KEY (codveh)
)
WITHOUT OIDS;
ALTER TABLE vehicule OWNER TO postgres;

voila.

Répondre à amalec

j'ai créé une requette qui me retourne les véhicule dispo :

select codveh from vehicule
where codveh NOT IN (select codveh from reserver where datedep between 'datedep' and 'dateret'
or dateret between 'datedep' and 'dateret'
and heuredep between 'heuredep and 'heureret'
or heureret between 'heuredep' and 'heureret');

enfin j'ai testé est sa marche enfin pour l'instant.
Mais voila si je la met dans ma page php je fait comment pour testé?

Répondre à amalec

je pense que tu as trouvé la solution, mais à l'inverse

Dans le client,
une requete 'select IN' avant l'insertion, et si le nombre de résultat est > 1 alors c'est que le véhicule à déjà un emprunt de paramétré.

Dans le serveur,
pourquoi pas créer un trigger (BEFORE INSERT) faisant le même type de vérification pour assurer le coup.

Sinon, tu risques avoir un souci avec les heures ex :

emprunt le 14/01 de 10 à 11h
emprunt le 14/01 de 11 à 12h

11h fait partie de l'heure de début du 2e emprunt mais aussi l'heure de fin du 1er emprunt.

Si je suis ta requete (IN) et que je tente l'insertion du 2e emprunt, il me dira que 11h fait déjà parti d'un créno horaire d'un autre emprunt ... a confirmer ... après unejournée de boulot j'ai pas l'esprit très clair :)

Pourquoi ne mets-tu des clauses AND partout ?

Sinon, suivant ton cahier des charges (gestion seulement des heures ?), tu pourrais découper une journée en 24 et réaliser des controles avec des <= =>. Au pire tu peux utiliser des LONG pour anticipier une utilisation des minutes.

Après, il te faudra créer une batterie de test, prendre un thermos de café et une demi-journée ...

Répondre à 3psilon

j'ai pensé au trigger mais je n'arrive pas a le consevoir car j'en effet tres peut et donc j'ai encore des difficulter en consevoir alors si tu pouvais m'aidé a le consevoir ca serrai cool.

Répondre à amalec

Ma super requette ne marche pas lol enfin si mais me donne pas le véhicule diposnible pour la periode .

Répondre à amalec

Bon j'ai cré& un trigger mais il ne fonctionne pas. Help !
lol

Répondre à amalec

triggers :
plusieurs site en parleront bien mieux que moi.

http://traduc.postgresqlfr.org/pgs [...] igger.html
http://www.postgresql.org/docs/8.1 [...] ggers.html


Sinon le principe étant de créer une procédure stockée puis de l'attacher à un trigger BEFORE INSERT sur la table concernée

Dans cette procèdure sockée, tu auras accès au tuple de l'insertion via le mot clé NEW.
Puis en fonction du traitement, cette proc devra retourner NULL (pour une erreur : prêt existant - transaction stopée) ou alors le tuple NEW.

Répondre à 3psilon

Merci pour t'on aide il met tres utilil ;-)

Répondre à amalec
Tom's Guide > Forum > Programmation > Controle d'insertion dans une base.
Aller à :

Il y a 1419 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens