Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de requête sql

8 réponses
Avatar
PascalXLD
Bonjour

Voil=E0 je dois executer une requete SQL sur une BDD HyperFile c/s

Je bataille d=E9j=E0 avec 2 tables mais il faudra passer =E0 3 apr=E8s. Alo=
rs
je m'explique

J'ai une table "Materiel" et une table "Mouvement"

Je veux recuperer TOUT mon mat=E9riel et si il y a un mouvement dont la
date de sortie est vide r=E9cuperer l'"IdMouvement" (ensuite il faudra
recuperer la personne)

J'ai fait le code ci-dessous. Mais je recupere bien tout mon materiel
avec une date de sortie vide, je r=E9cup=E8re bien mon materiel sans
mouvement, Mais je ne r=E9cup=E8re pas mon materiel qui a un ou des
mouvements mais dont aucun n'a la date de sortie vide

Pourriez-vous me guider s'il vous plait.

SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=3DMouvement.IDMateriel AND Mouvement.Date_Fin =3D '')

en r=E9sum=E9
En fait je veux r=E9cuperer toute la liste de mon materiel

1 - si il y a un mouvement dont la date de sortie est vide je veux
recuperer ce mouvement avec le materiel

2 - mais si il n'y a aucun mouvement je veux n=E9anmoins recuperer mon
materiel.

3 - ou si il y a des mouvements mais tous avec une date de sortie je
veux n=E9anmoins recuperer mon materiel.

J'ai bien les points 1 et 2 mais je n'arrive pas =E0 avoir le 3 et
pourtnat le code sql doit =EAtre bon


Merci d'avance

Pascal

8 réponses

Avatar
Emmanuel LECOESTER
SELECT Materiel.IDMateriel
FROM Materiel
-- cas 1
where exists (select 1
from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)
-- cas 2
or not exists (select 1
from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel)
- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a pas
de date)
or not exists (select 1 from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)

reste ensuite à faire les jointures nécessaires.

EN espérant avoir fait avancer le shmilblick
Avatar
JeAn-PhI
PascalXLD a présenté l'énoncé suivant :
Bonjour

Voilà je dois executer une requete SQL sur une BDD HyperFile c/s

Je bataille déjà avec 2 tables mais il faudra passer à 3 après. Alors
je m'explique

J'ai une table "Materiel" et une table "Mouvement"

Je veux recuperer TOUT mon matériel et si il y a un mouvement dont la
date de sortie est vide récuperer l'"IdMouvement" (ensuite il faudra
recuperer la personne)

J'ai fait le code ci-dessous. Mais je recupere bien tout mon materiel
avec une date de sortie vide, je récupère bien mon materiel sans
mouvement, Mais je ne récupère pas mon materiel qui a un ou des
mouvements mais dont aucun n'a la date de sortie vide

Pourriez-vous me guider s'il vous plait.

SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=Mouvement.IDMateriel AND Mouvement.Date_Fin = '')

en résumé
En fait je veux récuperer toute la liste de mon materiel

1 - si il y a un mouvement dont la date de sortie est vide je veux
recuperer ce mouvement avec le materiel

2 - mais si il n'y a aucun mouvement je veux néanmoins recuperer mon
materiel.

3 - ou si il y a des mouvements mais tous avec une date de sortie je
veux néanmoins recuperer mon materiel.

J'ai bien les points 1 et 2 mais je n'arrive pas à avoir le 3 et
pourtnat le code sql doit être bon


Merci d'avance

Pascal


vous pouvez faire qq chose comme ca :

SELECT Materiel.IDMateriel, Materiel.Modele_Materiel,
Materiel.Processeur_Ordi, Materiel.RAM_Ordi,
Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,
Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,
Mouvement.IDMouvement
FROM Materiel LEFT OUTER JOIN Mouvement ON
(Materiel.IDMateriel=Mouvement.IDMateriel)
WHERE Mouvement.Date_Fin <> '' OR Mouvement.Date_Fin = ''

--
Cordialement JeAn-PhI
Avatar
PascalXLD
Alors retour après essai

Pour Emmanuel je n'arrive pas à réécrire ton code. Peux-tu me filer un
coup de main STP?

Pour Jean-Phi Je ne crois pas que cela réponde à mon besoin

Ce que je ne comprends pas c'est que pourtant c'est bien le principe
du LEFT OUTER JOIN de récuperer les données de la table de gauche si
la condition de la jointure n'est pas remplie.

Si quelqu'un a une idée

Merci d'avance
Avatar
mat
PascalXLD wrote:
Alors retour après essai

Pour Emmanuel je n'arrive pas à réécrire ton code. Peux-tu me filer un
coup de main STP?




Bonjour,

Windev n'aime pas les liaisons multiples sans alias. En plus, je n'ai
jamais réussi à faire fonctionner EXIST/NOT EXIST. Le suivant serait ma
version HF du code d'Emmanuel :


where IDMateriel IN (select IDMateriel AS IDM1 FROM Mouvement
WHERE Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)

-- cas 2
or IDMateriel NOT IN (select IDMateriel AS IDM2 FROM Mouvement
WHERE Materiel.IDMateriel=Mouvement.IDMateriel)

- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a
pas de date)
or IDMateriel NOT IN (select IDMateriel AS IDM3 from Mouvement
where Materiel.IDMateriel=Mouvement.IDMateriel
AND Mouvement.Date_Fin is null)

Saltuations
Mat
Avatar
mat
...
Windev n'aime pas les liaisons multiples AU MEME FICHIER sans alias.


...
Avatar
mat
mat wrote:

comme je disais le problème peut exister lors de liaisons multiples au
même fichier, donc l'alias devrait être sur le fichier pas sur la rubrique:



where IDMateriel IN (select IDMateriel FROM Mouvement AS M1
WHERE Materiel.IDMateriel=M1.IDMateriel
AND M1.Date_Fin is null)

-- cas 2
or IDMateriel NOT IN (select IDMateriel FROM Mouvement AS M2
WHERE Materiel.IDMateriel=M2.IDMateriel)

- cas 3 : si tous les mouvements ont une date <=> pas (un mouvement n'a
pas de date)
or IDMateriel NOT IN (select IDMateriel from Mouvement AS M3
where Materiel.IDMateriel=M3.IDMateriel
AND M3.Date_Fin is null)

Saltuations
Mat


Avatar
PascalXLD
Ok merci Mat

je regarderai cela demain et je vous tiens au courant
Avatar
PascalXLD
Re

Alors pour conclure j'ai fait un truc de ce genre là

MaReqSQLBase1="SELECT Materiel.IDMateriel AS IDMateriel,
Materiel.Modele_Materiel, Materiel.Processeur_Ordi,
Materiel.RAM_Ordi,"+...
"Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,"+...
"Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,"+...
"Personne.Nom_Personne+' '+ Personne.Prenom_Personne "+...
" FROM Personne, Mouvement,Materiel "+...
"WHERE Personne.IDPersonne = Mouvement.IDPersonne AND
Materiel.IDMateriel = Mouvement.IDMateriel AND (Mouvement.Date_Fin =
'') AND "

MaReqSQLBase2="SELECT DISTINCT Materiel.IDMateriel AS IDMateriel,
Materiel.Modele_Materiel, Materiel.Processeur_Ordi,
Materiel.RAM_Ordi,"+...
"Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,"+...
"Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,"+...
"' ' "+...
" FROM Materiel "+...
"WHERE Materiel.IDMateriel NOT IN(SELECT Materiel.IDMateriel AS
IDMateriel, Materiel.Modele_Materiel, Materiel.Processeur_Ordi,
Materiel.RAM_Ordi,"+...
"Materiel.HD_Ordi, Materiel.Ref_Interne_Materiel,
Materiel.Date_Achat_Materiel, Materiel.Date_Garantie_Materiel,"+...
"Materiel.Date_Sortie_Materiel, Materiel.Stand_By,
Materiel.Prevoir_Remplacement, Materiel.Prix_Achat_Materiel,
Materiel.IDType_Materiel,"+...
"Personne.Nom_Personne+' '+ Personne.Prenom_Personne "+...
" FROM Personne, Mouvement,Materiel "+...
"WHERE Personne.IDPersonne = Mouvement.IDPersonne AND
Materiel.IDMateriel = Mouvement.IDMateriel AND (Mouvement.Date_Fin =
'')) AND "

j'ai donc fait 2 requêtes
ensuite ces 2 requêtes sont complétées (suite à des saisies)
et je fais un union de 2

Merci pour votre aide