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

WinDev Discussion :

requête sql non exécutée ou incompléte [WD15]


Sujet :

WinDev

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Qatar

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2012
    Messages : 31
    Par défaut requête sql non exécutée ou incompléte
    Bonjour,
    je dispose d'une base de données bien alimentée et j'ai utilisé l'assistant pour créer mes requêtes mais à l'exécution, j'ai soit "pas d'enregistrement" ou un résultat incomplet c-à-d pas tous les enregistrements pour chacune des requétes suivantes.
    req 1 :
    Code sql : 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 
       Commande.dateCom AS Période,	
       Marketeur.designationMark AS Client,	
       Produit.libProd AS Nature,	
       Produit.IDProd AS Prod,
       Détails.livréDetails AS Ok,	
       Détails.remqDetails AS Remarque,	
       Détails.volA15Details AS Volume,	
       Détails.poidsDetails AS Poids,
       Détails.IDDetails AS detailsId
    FROM 
       Marketeur,	
       Commande,	
       Détails,	
       Produit
    WHERE 
       Commande.IDMarkCom=Marketeur.IDMark
       AND	Détails.IDComDetails=Commande.IDCom
       AND	Détails.IDProdDetails=Produit.IDProd
       AND
       (
        Commande.IDCom = {Param1}
       )
    ORDER BY 
       Produit.libProd ASC

    req 2 :
    Code sql : 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
     
    SELECT 
       Commande.IDCom AS Com,	
       Commande.dateCom AS DATE,	
       Marketeur.designationMark AS Requérant,	
       COUNT(Détails.IDProdDetails) AS Article,	
       Commande.qtiteTotaleCom AS Cumul
    FROM 
       Marketeur,	
       Commande,	
       Détails
    WHERE 
       Commande.IDMarkCom	=	Marketeur.IDMark
       AND	Détails.IDComDetails	=	Commande.IDCom
       AND
       (
        Commande.dateCom BETWEEN {Param1} AND {Param2}
       )
    GROUP BY 
       Commande.dateCom,	
       Commande.qtiteTotaleCom,	
       Marketeur.designationMark,	
       Commande.IDCom
    ORDER BY 
       DATE DESC

    Merci de bien m'éclairer.

  2. #2
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    A première vue, sans connaître ton contexte, tes requêtes semblent bonnes.

    Comment passes tu les paramètres de tes requêtes ?
    Et comment tu les exécutes ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Qatar

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2012
    Messages : 31
    Par défaut
    le passage des paramatres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Req_AfficheDetailsCommande.Param1 = sai_numCom
    HExécuteRequête(Req_AfficheDetailsCommande,hRequêteDéfaut)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Req_ListeCmd.Param1 = Val(DateVersChaîne(sai_dat1,"AAAAMMJJ"))
    Req_ListeCmd.Param2 = Val(DateVersChaîne(sai_dat2,"AAAAMMJJ"))	
    HExécuteRequête(Req_ListeCmd,hRequêteDéfaut)
    je rappelle que ça marche une fois sur deux et que quand ça marche je n'ai pas toujours tous les détails d'une commande ou le nombre d'articles n'est pas correct.

  4. #4
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Sur la 1ère requête je ne voit rien de particulier.

    Sur la 2ème je m'interroge
    La rubrique Commande.dateCom est de quel type ? Date ou numérique ?

    je dispose d'une base de données bien alimentée et j'ai utilisé l'assistant pour créer mes requêtes mais à l'exécution, j'ai soit "pas d'enregistrement" ou un résultat incomplet c-à-d pas tous les enregistrements pour chacune des requétes suivantes.
    Précision les requêtes telle qu'elles sont faites ne retourne que les lignes qui respectent toutes les liaisons entre les fichiers.

    Si tu veux que des lignes soient incluses même si certaines liaisons ne sont pas respectées, double clique sur l'image qui symbolise les jointures. Une fenêtre s'ouvre, il suffit de cocher les cas où les lignes sont à inclure...

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur et responsable micros/réseaux
    Inscrit en
    Octobre 2010
    Messages
    1 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur et responsable micros/réseaux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 286
    Par défaut
    Bonjour,

    je m'interroge également sur le type de la colonne Commande.dateCom car tu transformes ta date en valeur numérique et donc le test between ne peut plus marcher.

    à bientôt,

    Nicolas

  6. #6
    Membre chevronné
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Par défaut
    Bonjour,

    Dans la 1ere requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND	Détails.IDProdDetails=Produit.IDProd
    perso, j'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND	Produit.IDProd=Détails.IDProdDetails
    Mais je ne sais pas si Windev est très malin à ce niveau là...

    PS: Utilisant très peu les requêtes, je préfère la syntaxe JOIN ou LEFT JOIN pour les jointures...

    Ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    "SELECT Co.dateCom Période,Mk.designationMark Client,Pr.libProd Nature,Pr.IDProd Prod,De.livréDetails OK,De.remqDetails Remarque,De.volA15Details Volume,De.poidsDetails Poids,De.IDDetails detailsId "+...
    "FROM Commande co "+...
    "JOIN Marketeur mk ON mk.IDMark=co.IDMarkCom and co.IDCom="+SAI_NUMCOM+" "+...
    "JOIN Détails de ON de.IDComDetails=co.IDCom "+...
    "JOIN Produit pr ON pr.IDProd=de.IDProdDetails "+...
    "ORDER BY Pr.libProd "
    Pour tester si des jointures ne se font pas, vous pouvez temporairement utiliser LEFT JOIN et la fonction NVL(<rubrique>,"???") dans le select...
    (dans le cas d'un LEFT JOIN entre commande et marketeur, ne faites pas la sélection du n° de commande dans la jointure, mais dans le where car ce cas ne fonctionne que depuis les dernières versions 17)

    Pour la 2ème requête, je confirme: passez la date sans conversion.

    Patrick

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Qatar

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2012
    Messages : 31
    Par défaut
    Bonjour

    la convertion c'était simplement lors de la recherche de solution à mon probléme car "aaaammjj" est le format renvoyé par windev lors du traitement. J'ai supprimé la convertion et le probléme reste entier.

    je vais tester les suggestions de SevenSoftware au courant de la journée et je vous revient.

  8. #8
    Membre très actif

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Par défaut
    Bonjour,

    j' ai bien une idée mais pourrait tu nous donner tes cardinalités
    (une image idéalement)
    Disons au minimum les relations clé entre les tables et les cardinalités
    car à mon avis c'est un problème de jointure.

    BD

  9. #9
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Citation Envoyé par yoonu Voir le message
    j'ai utilisé l'assistant pour créer mes requêtes
    Comme le dit yoonu, il a utilisé l'éditeur de requête...

    Citation Envoyé par SevenSoftware Voir le message
    Dans la 1ere requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND	Détails.IDProdDetails=Produit.IDProd
    perso, j'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND	Produit.IDProd=Détails.IDProdDetails
    Donc en principe les liaisons sont récupérées de l'analyse. Si c'est le cas c'est juste le nom des rubriques qui est ambiguë.
    Toutefois il est possible de créer les liaisons à la main, auquel cas l'erreur est possible...

    Citation Envoyé par SevenSoftware Voir le message
    PS: Utilisant très peu les requêtes, je préfère la syntaxe JOIN ou LEFT JOIN pour les jointures...
    Il est vrai que la syntaxe avec JOIN est préférable mais l'éditeur de requête fait le choix d'utiliser la méthode avec les égalités entre les ID.
    Sauf si on demande d'inclure des ligne même si elles ne sont pas en liaison. On retrouve les syntaxes RIGHT OUTER JOIN, LEFT OUTER JOIN et FULL OUTER JOIN...

    De ce que je vois tes requêtes ne me semblent pas mauvaises, pour preuve tu n'as pas d'erreur d'exécution... ou alors tu ne nous en parles pas...
    Par contre tu n'obtiens pas les lignes que tu veux . Sans doute parce que tu n'interroges pas ta base correctement.
    J'ai fréquemment eu des collaborateurs débutants en requête qui venaient me voir en se plaignant que leurs requêtes ne retournent pas toutes les lignes. Et la plus-part du tant c'était du à un manque de compréhension de toutes les restrictions qui s'oppèrent.

    Je reviens sur ce que je t'ai dit dans mon précédent message.
    Les restrictions qui s’opèrent sur sur tes requêtes ne se limitent pas au respect de tes paramètres (conditions) mais aussi à ce que les lignes qui respectent toutes les liaisons entre les fichiers.

    Ce que je te propose c'est de prendre une ligne que tu penses qui devrait être affichée et qui ne l'est pas.
    Et de regarder le respect de toutes les conditions y compris la présence des ID de chaque côté de liaisons, de toutes les liaisons.
    Ainsi tu devrais arriver à comprendre pourquoi certaines lignes ne sont pas afficher...
    Auquel cas, penses que tu peux inclure des lignes même si elles n'ont pas de liaison comme je te l'ai expliqué plus haut.

    Bon courage...

  10. #10
    Membre Expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Par défaut
    Sans vouloir faire mon puriste en SQL (ce que je fais en répondant là) on ne met pas de clause where dans un join ensuite pour éviter toute ambiguité j'ajoute toujours INNER devant

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    "SELECT Co.dateCom Période,Mk.designationMark Client,Pr.libProd Nature,Pr.IDProd Prod,De.livréDetails OK,De.remqDetails Remarque,De.volA15Details Volume,De.poidsDetails Poids,De.IDDetails detailsId "+...
    "FROM Commande co "+...
    "INNER JOIN Marketeur mk ON mk.IDMark=co.IDMarkCom "
    "INNER JOIN Détails de ON de.IDComDetails=co.IDCom "+...
    "INNER JOIN Produit pr ON pr.IDProd=de.IDProdDetails "+...
    "WHERE co.IDCom="+SAI_NUMCOM+" "
    "ORDER BY Pr.libProd "
    Pour en revenir au pb, je rejoins laurent : avant de parler bug ou autre, c'est bien souvant l'une des jointures qui filtre un peu trop

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Qatar

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2012
    Messages : 31
    Par défaut
    Bonjour,
    j'ai eu des urgences à évacuer depuis mon dernier message.

    hier, j'ai suivi l'ensemble de vos conseils sans succés. J'ai alors transferé la base hyperfile vers sqlserver 2008 par ssis pour y tester l'ensemble des requêtes.
    Et là j'ai eu pas mal d'erreurs de convertion pour les enregistrements non affichés de COMMANDE.
    Suppression du fichier COMMANDE puis sa recréation puis insertion des enregistrements (corrigés) et les requêtes marchent.
    Je me souviens maintenant que j'ai modifié la table COMMANDE aprés insertion d'enregistrements.

    UN GRAND MERCI A TOUS POUR VOS SUGGESTIONS QUI M'ONT ORIENTE VERS LA SOLUTION.

  12. #12
    Membre Expert Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 889
    Par défaut
    Si ton problème est résolu pense à cliquer sur

  13. #13
    Membre chevronné
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Par défaut
    @emmanuel:

    Sans vouloir faire ma tête de mule (ce que je fais en répondant là), la condition dans le INNER JOIN est strictement équivalente au where.

    Il me semble avoir lu (probablement en DB2/400 qui est ma BDD de prédilection) que ça pouvait parfois améliorer les performances en réduisant la taille de la jointure.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/09/2009, 12h03
  2. Réponses: 6
    Dernier message: 15/09/2009, 11h18
  3. Requête SQL s'exécute deux fois
    Par brazilia28 dans le forum ASP.NET
    Réponses: 11
    Dernier message: 06/05/2008, 11h55
  4. Réponses: 1
    Dernier message: 08/08/2007, 11h26
  5. [SQL] Requête SQL non prise en compte
    Par Petit bateau dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/07/2007, 10h43

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