Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > WinDev > HyperFileSQL
HyperFileSQL HyperFileSQL est un système de gestion de base de données relationnel exploité par les logiciels WinDev, WebDev et WinDev Mobile.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/12/2012, 11h46   #1
recfile
Invité de passage
 
Développeur informatique
Inscription : novembre 2012
Messages : 18
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2012
Messages : 18
Points : 1
Points : 1
Par défaut Requête SQL Crash

Bonjour,

J'utilise une BDD hyperfile (en client/serv). J'ai ma requete qui va bien et qui fonctionne qui a entre autre une condition présence = 1 (bool) Ce que je veux maintenant c'est également présence = 0 donc naturellement j'utilise OR.
mais cette dernière crash mon CCHF. Voici ma requête

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT DISTINCT 
	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
	PERSONNEL.SE_Code AS SE_Code,	
	PERSONNEL.PE_Site AS PE_Site,	
	PERSONNEL.PE_FFonction AS PE_FFonction,	
	SERVICES.SE_Libelle AS SE_Libelle,	
	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
	FORMATIONS.FOR_Financement AS FOR_Financement,	
	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
FROM 
	AFFECTATIONS_FORMATIONS,	
	FORMATIONS,	
	PERSONNEL,	
	SERVICES
WHERE 
	PERSONNEL.SE_Code = SERVICES.SE_Code
	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
	AND		PERSONNEL.PE_Presence = 1
        OR PERSONNEL.PE_Presence = 0
	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
	
ORDER BY 
	IDFORMATIONS ASC,	
	PE_NomPrenom ASC
En rouge la condition que j'ajoute et qui fais planté toute la requête. Le volume de donnée n'est pas très importante, moins de 1000 enregistrement.
Oracle et sqlServer me manque ...
recfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 12h06   #2
tatayo
Expert Confirmé
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 583
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 583
Points : 3 182
Points : 3 182
Bonjour,
Il manque des parenthèses dans ta requête !
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
SELECT DISTINCT 
	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
	PERSONNEL.SE_Code AS SE_Code,	
	PERSONNEL.PE_Site AS PE_Site,	
	PERSONNEL.PE_FFonction AS PE_FFonction,	
	SERVICES.SE_Libelle AS SE_Libelle,	
	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
	FORMATIONS.FOR_Financement AS FOR_Financement,	
	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
FROM 
	AFFECTATIONS_FORMATIONS,	
	FORMATIONS,	
	PERSONNEL,	
	SERVICES
WHERE 
	PERSONNEL.SE_Code = SERVICES.SE_Code
	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
	AND		(PERSONNEL.PE_Presence = 1
        OR PERSONNEL.PE_Presence = 0)
	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
 
ORDER BY 
	IDFORMATIONS ASC,	
	PE_NomPrenom ASC
Sinon pour les lignes de personnel dont pe_presence = 0, le moteur ne va pas appliquer les autres condition, y compris celle concernant les jointures => produit cartésien !

Le problème aurait été "moins grave" si tu avais utilisé des inner join pour les jointures.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 14h19   #3
recfile
Invité de passage
 
Développeur informatique
Inscription : novembre 2012
Messages : 18
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2012
Messages : 18
Points : 1
Points : 1
Merci Tatyo cela fonctionne. C'est dans la norme sql ces parenthèses ?
En tous cas c'est curieux qui me l’exécute il aurait du me faire un message d'erreur de syntaxe normalement non ?
recfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 14h25   #4
tatayo
Expert Confirmé
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 583
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 583
Points : 3 182
Points : 3 182
Ce n'est pas un problème de norme SQL, mais d'algère bolléenne.
Donc le moteur ne renvoie pas d'erreur car syntaxiquement ta requête est correcte. Par contre elle ne correspond pas du tout à ce que tu voulais faire.

Soit 3 "tests" A B et C.
A AND B OR C est vrai si C est vrai, peu importe ce que valent A et B. Ca revient à écrire (A AND B) OR C.
A AND (B OR C) est vrai si et seulement si A est vrai ainsi que B ou C.

Du moment qu'il y a un mélange de AND et de OR dans une condition, il faut mettre des parenthèses.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 14h32   #5
recfile
Invité de passage
 
Développeur informatique
Inscription : novembre 2012
Messages : 18
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : novembre 2012
Messages : 18
Points : 1
Points : 1
merci pour tes précisions, erreur stupide en somme
recfile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 14h45   #6
michel.souris
Membre confirmé
 
Homme
Développeur informatique
Inscription : mars 2009
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mars 2009
Messages : 211
Points : 260
Points : 260
Envoyer un message via MSN à michel.souris
Citation:
Envoyé par recfile Voir le message
Bonjour,

J'utilise une BDD hyperfile (en client/serv). J'ai ma requete qui va bien et qui fonctionne qui a entre autre une condition présence = 1 (bool) Ce que je veux maintenant c'est également présence = 0 donc naturellement j'utilise OR.
mais cette dernière crash mon CCHF. Voici ma requête

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SELECT DISTINCT 
	FORMATIONS.FOR_Libelle AS FOR_Libelle,	
	FORMATIONS.FOR_DuréeValidité AS FOR_DuréeValidité,	
	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM AS DateAcquisition_FORM,	
	PERSONNEL.PE_NomPrenom AS PE_NomPrenom,	
	PERSONNEL.SE_Code AS SE_Code,	
	PERSONNEL.PE_Site AS PE_Site,	
	PERSONNEL.PE_FFonction AS PE_FFonction,	
	SERVICES.SE_Libelle AS SE_Libelle,	
	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
	FORMATIONS.FOR_Financement AS FOR_Financement,	
	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
FROM 
	AFFECTATIONS_FORMATIONS,	
	FORMATIONS,	
	PERSONNEL,	
	SERVICES
WHERE 
	PERSONNEL.SE_Code = SERVICES.SE_Code
	AND		AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
	AND		AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id
	AND		PERSONNEL.PE_Presence = 1
        OR PERSONNEL.PE_Presence = 0
	AND	AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
	
ORDER BY 
	IDFORMATIONS ASC,	
	PE_NomPrenom ASC
En rouge la condition que j'ajoute et qui fais planté toute la requête. Le volume de donnée n'est pas très importante, moins de 1000 enregistrement.
Oracle et sqlServer me manque ...
Bonjour,

C'est marrant mais naturellement j'aurais carrément virer la condition.... ou j'aurais mis la condition "PERSONNEL.PE_Presence is not null"....
michel.souris est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 13h33   #7
Emmanuel Lecoester
Responsable WinDev
 
Avatar de Emmanuel Lecoester
 
Emmanuel Lecoester
Inscription : février 2003
Messages : 1 468
Détails du profil
Informations personnelles :
Nom : Emmanuel Lecoester
Âge : 37
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2003
Messages : 1 468
Points : 3 455
Points : 3 455
Envoyer un message via MSN à Emmanuel Lecoester Envoyer un message via Skype™ à Emmanuel Lecoester
Personnellement pour les requete je passe maintenant en inner ce qui donne pour toi :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT DISTINCT
	PERSONNEL.PE_FFonction AS PE_FFonction,	
	SERVICES.SE_Libelle AS SE_Libelle,	
	FORMATIONS.IDFORMATIONS AS IDFORMATIONS,	
	FORMATIONS.FOR_Organisme AS FOR_Organisme,	
	FORMATIONS.FOR_Financement AS FOR_Financement,	
	FORMATIONS.FOR_IncidenceQUAL AS FOR_IncidenceQUAL
FROM AFFECTATIONS_FORMATIONS 
INNER JOIN FORMATIONS ON AFFECTATIONS_FORMATIONS.IDFORMATIONS = FORMATIONS.IDFORMATIONS
INNER JOIN PERSONNEL ON AFFECTATIONS_FORMATIONS.PE_Id = PERSONNEL.PE_Id AND PERSONNEL.PE_Presence IN (1, 0)
INNER JOIN SERVICES ON PERSONNEL.SE_Code = SERVICES.SE_Code
WHERE AFFECTATIONS_FORMATIONS.DateAcquisition_FORM BETWEEN 20120101 AND 20121231
ORDER BY IDFORMATIONS ASC, PE_NomPrenom ASC
Petite question : pourquoi as-tu besoin d'un distinct dans ta requete ?
__________________
Emmanuel Lecoester
=> On recrute des rédacteurs WinDev
Emmanuel Lecoester est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h44.


 
 
 
 
Partenaires

Hébergement Web