IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Erreur sur jointure et paramètres


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut Erreur sur jointure et paramètres
    Bonjour,

    Je n'arrive pas à trouver une syntaxe correcte à mon problème.
    Je reprends une appli existante développée en Windev fourrée au MySQL


    Mon problème :
    Je cherche à afficher la liste des pièces (devis, commande, BL, facture) en piochant des infos dans différentes tables et en passant à la requête une petite dizaine de paramètres.


    Mes tables :
    • pièce
    • représentant
    • personnel
    • ligne (dans l'idéal, j'aimerais que ma requête renvoie également la somme des montant HT des lignes de la pièce)



    Ma requête actuelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    SELECT 
    	Piece.IDPiece AS IDPiece,	
    	Piece.TypePiece AS TypePiece,	
    	Piece.DatePiece AS DatePiece,	
    	Piece.NumeroPiece AS NumeroPiece,	
    	Representant.codeRepresentant AS codeRepresentant,	
    	Personnel.code AS code
    FROM 
    	Piece LEFT OUTER JOIN Personnel ON Personnel.IDPersonnel = Piece.IDPersonnel,	
    	Piece AS P1 LEFT OUTER JOIN Client ON Client.IDClient = P1.IDClient,	
    	Piece AS P2 LEFT OUTER JOIN Representant ON Representant.IDRepresentant = P2.IDRepresentant
    WHERE 
    	(
    	Piece.IDPiece = P1.IDPiece
    	AND Piece.IDPiece = P2.IDPiece
    	AND Piece.TypePiece = {ParamTypePiece}
    	AND	Piece.IDClient = {ParamIDClient}
    	AND	
    	(
    		Piece.phase = {ParamIDSolde1}
    		OR	Piece.phase = {ParamIDSolde2}
    		OR	Piece.phase = {ParamIDSolde3}
    		OR	Piece.phase = {ParamIDSolde4}
    	)
    	AND	Piece.IDSite = {ParamSite}
    	AND	
    	(
    		Piece.nomCommande = {ParamNomAdresse}
    		OR	Piece.nomFacturation = {ParamNomAdresse}
    		OR	Piece.nomLivraison = {ParamNomAdresse}
    	)
    	)
    ORDER BY 
    	NumeroPiece DESC
    Les parties en rouge provoquent une erreur dans Windev alors que la requête fonctionnait lorsqu'elle ne contenait pas de jointures.


    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Le pgm vous retourne une erreur windev ou sql ?


    Si c'est une erreur sql pourriez vous la préciser ?

    edit :sinon au lieu d'utiliser tous ces "OR" vous pourriez utiliser le prédicat "IN"

  3. #3
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Quand je lance le mode test de l'appli, j'obtiens l'erreur suivante :




    J'avais déjà tenté de remplacer tous mes OR par un IN mais ça ne change rien :

    AND Piece.phase in ({ParamIDSolde1},{ParamIDSolde2},{ParamIDSolde3},{ParamIDSolde4})

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    En fait je ne comprend pas bien vos jointure.

    Avec une syntaxe comme celle là est-ce que cela fonctionne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    SELECT 
    	Piece.IDPiece AS IDPiece,	
    	Piece.TypePiece AS TypePiece,	
    	Piece.DatePiece AS DatePiece,	
    	Piece.NumeroPiece AS NumeroPiece,	
    	Representant.codeRepresentant AS codeRepresentant,	
    	Personnel.code AS code
    FROM Piece 	
    LEFT OUTER JOIN Personnel ON Personnel.IDPersonnel = Piece.IDPersonnel	
    LEFT OUTER JOIN Client ON Client.IDClient = Piece.IDClient
    LEFT OUTER JOIN Representant ON Representant.IDRepresentant = Piece.IDRepresentant
    WHERE 
    	(
    	AND Piece.TypePiece = {ParamTypePiece}
    	AND	Piece.IDClient = {ParamIDClient}
    	AND	Piece.phase in ({ParamIDSolde1}, {ParamIDSolde2}, {ParamIDSolde3}, {ParamIDSolde4})
    	AND	Piece.IDSite = {ParamSite}
    	AND	
    	(
    		Piece.nomCommande = {ParamNomAdresse}
    		OR	Piece.nomFacturation = {ParamNomAdresse}
    		OR	Piece.nomLivraison = {ParamNomAdresse}
    	)
    	)
    ORDER BY NumeroPiece DESC
    Dans votre requête la jointure sur les tables Client / Personnel sont inutile car vous ne ramenez rien de ces tables.

  5. #5
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Cela ne fonctionne pas :

    - l'éditeur de requête m'annonce LEFT inattendu sur le 2ième LEFT

    - le mode test me dit que le paramètre ParamTypePiece est inconnu


    Quant aux infos récupérées, je n'ai pas tout mis dans ce sujet, le SELECT comporte d'autres champs.

    Edit : En remettant la syntaxe précédente, j'ai aussi l'erreur sur le paramètre. Je recompile le projet pour voir si c'est ça...

  6. #6
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    La recompilation a rétabli la situation, je retrouve mes anciennes erreurs

    Windev n'apprécie pas les jointures que vous proposez... (cf post précédent)

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 054
    Points
    53 054
    Billets dans le blog
    6
    Par défaut
    Windev est réputé pour être un des pires outil de développement et n'accepte pas la plupart des syntaxes SQL de la norme.

    Seule solution : développer des procédures stockée.
    Mais comme vous êtes en plus avec MySQL qui est un ersatz de SGBDR, ça va pas être coton ! http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
    Je vous plains.

    La prochaine fois pensez à prendre des outils adaptés genre PHP ou VB, ou C# / PostGreSQL ou MS SQL Server...

    A +

  8. #8
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Alors là, vous m'avez achevé !

    Je suis, comme vous avez pu le deviner, un novice dans ce domaine. Pouvez-vous m'expliquer ou me rediriger vers un tuto sur les "procédures stockées" ?

    Sur ce, je vais aller jouer sur l'autoroute !

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Bonjour,
    Effectivement, le SQL de Windev est "un peu limité"...
    Une solution est d'utiliser hExecuteRequeteSql avec le paramètre hRequeteSansCorrection.
    Ainsi Windev ne met plus son nez dans la requête, et toutes les fonctions du SGBD sont utilisables.

    Utilisateur de Windev, j'ai laissé tombé depuis belle lurette l'analyse et les ordres h*, pour me baser sur de l'ODBC et du SQL pur.

    Tatayo.

  10. #10
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Intéressant !

    Pour ce soir, je jette l'éponge, j'ai passé trop de temps dessus... Je tente cette syntaxe demain matin

    Merci pour la réponse.

  11. #11
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Il doit me manquer un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
     
    LibelleREQ est une chaîne = "SELECT"+... 
    							"Piece.IDPiece AS IDPiece,"+...
    							"Piece.TypePiece AS TypePiece,"+...
    							"Piece.DatePiece AS DatePiece,"+...
    							"Piece.NumeroPiece AS NumeroPiece,"+...
    							"Representant.codeRepresentant AS codeRepresentant,"+...
    							"Personnel.code AS code"+...
    						"FROM"+...
    							"Piece"+...
    								"LEFT OUTER JOIN Personnel ON Personnel.IDPersonnel = Piece.IDPersonnel,"+...
    								"LEFT OUTER JOIN Client ON Client.IDClient = Piece.IDClient,"+...
    								"LEFT OUTER JOIN Representant ON Representant.IDRepresentant =Piece.IDRepresentant"+...
    						"WHERE"+...
    							"("+...
    								"Piece.phase IN ({ParamIDSolde1}, {ParamIDSolde2}, {ParamIDSolde3}, {ParamIDSolde4})"+...
    								"AND Piece.TypePiece = {ParamTypePiece}"+...
    								"AND	Piece.IDClient = {ParamIDClient}"+...
    								"AND	Piece.IDSite = {ParamSite}"+...
    								"AND"+...
    								"("+...
    									"Piece.nomCommande = {ParamNomAdresse}"+...
    									"OR	Piece.nomFacturation = {ParamNomAdresse}"+...
    									"OR	Piece.nomLivraison = {ParamNomAdresse}"+...
    								")"+...
    							")"+...
    						"ORDER BY"+...
    							"NumeroPiece DESC;"
     
    MaREQ est une source de données
     
    HExécuteRequêteSQL(MaREQ,MaConnexion,hRequêteSansCorrection,LibelleREQ)
    HLitPremier(MaREQ)

    Quand je lance le mode Test, erreur !!
    Windev m'annonce que MaREQ n'est pas dans l'analyse, ce qui est normal !

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    Je ne connais pas les ordres h* (que je n'utilise pas), mais je vois que tu ne testes par le retour de hExecuteRequeteSql. hErreurInfo te donnera peut-être une piste à suivre.

    Tatayo.

  13. #13
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Effectivement, HErreurInfo() m'a été très utile en me montrant que j'avais lamentablement omis les espaces en bout de lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    sLibelleREQ = 			"SELECT "+... 
    							"Piece.IDPiece AS IDPiece, "+...
    							"Piece.PICLEUNIK AS PICLEUNIK, "+...
    							"Piece.TypePiece AS TypePiece, "+...
    							"Piece.DatePiece AS DatePiece, "+...
    							"Piece.NumeroPiece AS NumeroPiece, "+...
    							"Representant.codeRepresentant AS codeRepresentant, "+...
    							"Personnel.code AS code "+...
    						"FROM "+...
    							"Piece "+...
    								"LEFT OUTER JOIN Personnel ON Personnel.IDPersonnel = Piece.IDPersonnel "+...
    								"LEFT OUTER JOIN Client ON Client.IDClient = Piece.IDClient "+...
    								"LEFT OUTER JOIN Representant ON Representant.IDRepresentant =Piece.IDRepresentant "+...
    						"WHERE "+...
    							"( "+...
    								"Piece.phase IN ('{ParamIDSolde1}', '{ParamIDSolde2}', '{ParamIDSolde3}', '{ParamIDSolde4}') "+...
    								"AND Piece.TypePiece = '{ParamTypePiece}' "+...
    								"AND	Piece.IDClient = '{ParamIDClient}' "+...
    								"AND	Piece.IDSite = '{ParamSite}' "+...
    								"AND "+...
    								"( "+...
    									"Piece.nomCommande = '{ParamNomAdresse}' "+...
    									"OR	Piece.nomFacturation = '{ParamNomAdresse}' "+...
    									"OR	Piece.nomLivraison = '{ParamNomAdresse}' "+...
    								") "+...
    							") "+...
    						"ORDER BY "+...
    							"NumeroPiece DESC; "

    Cependant, les paramètres ne passent pas car là, c'est la chaîne composée de la variable (ex : "{ParamNomAdresse}") qui est testée !

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 244
    Points : 12 876
    Points
    12 876
    Par défaut
    C'est normal, à aucun moment tu ne remplaces ces paramètres par leur valeur respective.
    Regarde l'aide de ChaineConstruit().

    Tatayo.

  15. #15
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    ça se précise, merci pour ton aide !

    Certains de mes paramètres valent Null. Comment faire ?

    %1 = Null --> Windev comprend 0
    %1 = 'Null' --> c'est la chaîne "Null" qui va être testée

    Faire une requête différente quand mon paramètre = Null ?

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Effectivement tu peux construire ta requête de façon différente s'il y a des paramètres NULL. Mais si en réalité tu cherches vraiment des NULL dans la BDD, n'oublie pas que c'est IS NULL et non pas = NULL en SQL !

  17. #17
    Nouveau membre du Club
    Profil pro
    Chef de projets
    Inscrit en
    Septembre 2010
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de projets

    Informations forums :
    Inscription : Septembre 2010
    Messages : 70
    Points : 35
    Points
    35
    Par défaut
    Ma requête fonctionne !

    Je ne suis pas très satisfait de ce que j'ai fait : je construis la chaîne contenant ma requête selon que les paramètres sont renseignés ou pas.

    Je m'explique :
    - Param1 = 'abc' --> j'ajoute une ligne dans WHERE ( "AND Param1='abc' ")
    - Param1 IS NULL --> je ne fais rien

    Mon temps d'exécution a été divisé par 2 mais reste important.
    ça sera pour la prochaine fois !

    Merci pour votre aide, vous êtes super réactifs sur ce forum !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Erreur 2427 "Expression sans paramètre" sur champ calculé
    Par pierrequimousse dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/04/2010, 09h35
  2. [AC-2003] Erreur 3061 sur OpenRecordset, 2 paramètres attendus
    Par tototiti2008 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/08/2009, 11h53
  3. Erreur sur paramètre const
    Par uriotcea dans le forum C++
    Réponses: 2
    Dernier message: 09/07/2009, 08h49
  4. Erreur de syntaxe sur une requête paramétrée
    Par deglingo37 dans le forum Access
    Réponses: 5
    Dernier message: 16/05/2006, 22h21
  5. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo