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


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut Requête SQL
    Salut les amis,

    Je ne vous apprends pas que je suis novice en requête SQL dont je n'arrive plus à me passer depuis

    Mon souci depuis hier est celui ci :
    Analyse


    J'aimerai récupérer toutes les lignes de commandes d'un article donné sur une période.

    Voici le code :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    Sablier()
     
    // Recupération de l'Id Article
    nIdart est un entier
    L_phraseSQL est une chaîne = "SELECT * FROM T_article "
    SELON COMBO_Critere
     
    	CAS 1	// CODE BARRE
    		L_phraseSQL+= "WHERE code_barre ="+"'"+SAI_Critere+"'"
     
    	CAS 2	// Code Article
    		L_phraseSQL+= "WHERE Réf_article LIKE " +"'%"+ SAI_Critere+"%'"
     
    	CAS 3	// Designation
    		L_phraseSQL+= "WHERE Description LIKE " +"'%"+ SAI_Critere+"%'"
     
    	AUTRE CAS
    FIN
     
    //Info(L_phraseSQL)
     
    L_sdReq,M_sdReq sont des Sources de Données
     
    SI PAS HExécuteRequêteSQL(L_sdReq,hRequêteInterruptible,L_phraseSQL) ALORS
    	Erreur("ERREUR Requête T_Articles "+HErreurInfo(hErrComplet))
    SINON
    	TableSupprimeTout(TABLE_Historiq)
    	POUR TOUT L_sdReq DEPUISDEBUT
    		nIdart= L_sdReq.id_article
    		M_phraseSQL est une chaîne="SELECT Ligne_commande.Id_article,Ligne_commande.qte_article,Ligne_commande.prix_euro,Ligne_commande.prix_vte,Ligne_commande.px_cfa_ut,Ligne_commande.tot_couts,"+RC+...
    		"Entete_facture.Num_fact,Entete_facture.Date_fact"+RC+...
    		"FROM Ligne_commande INNER JOIN Entete_facture"+RC+...
    		"ON (Ligne_commande.Num_fact=Entete_facture.Num_fact)"+RC
    		M_phraseSQL+= " WHERE Entete_facture.Date_fact BETWEEN '"+SC_SélectionPériode.SAI_DateDébut+"' AND '"+SC_SélectionPériode.SAI_DateFin+"'"
    		M_phraseSQL+= " AND Ligne_commande.Id_article = "+nIdart
     
    //		info(M_phraseSQL)
    		SI PAS HExécuteRequêteSQL(M_sdReq,hRequêteInterruptible,M_phraseSQL) ALORS
    			Erreur("ERREUR Requête Ligne_commande "+HErreurInfo(hErrComplet))
    		SINON
    			TableAjoute(TABLE_Historiq,M_sdReq.Date_fact+TAB+...
    										M_sdReq.Num_fact+TAB+...
    										L_sdReq.Description+TAB+...
    										M_sdReq.qte_article+TAB+...
    										M_sdReq.prix_euro+TAB+...
    										M_sdReq.prix_vte+TAB+...
    										M_sdReq.px_cfa_ut+TAB+...
    										M_sdReq.tot_couts)
     
    		FIN
    	FIN
    FIN
     
    HAnnuleDéclaration(L_sdReq)
    HAnnuleDéclaration(M_sdReq)
    Sablier(Faux)
    Malheuresement la requete me remonte les articles mais pas les rubriques Lignes de commande



    Merci d'avance...

  2. #2
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Impossible de te donner une réponse sans passer par le mode pas à pas.

    Pourquoi ne pas utiliser qu'une seule requête ?

    Par exemple :

    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
    SELECT 
    CDE_ENTETE.NUM_FACT, 
    ARTICLE.DESCRIPTION,
    CDE_LIGNE.QTE,
    CDE_LIGNE.PRIX_EURO,
    CDE_LIGNE.PRIX_VTE,
    CDE_LIGNE.PRIX_CFA,
    CDE_LIGNE.TOTAUX 
    FROM 
    CDE_LIGNE 
    	JOIN CDE_ENTETE ON (CDE_LIGNE.CDE_ENTETE_FK_ID = CDE_ENTETE.PK_ID), 
    	JOIN ARTICLE ON (CDE_LIGNE.ART_FK_ID = ARTICLE.PK_ID) 
    WHERE 
    LES CONDITIONS QUE TU VEUX SUR LA TABLE QUE TU VEUX :
    ARTICLE.DESIGNATION LIKE '%TOTO'
    Un petit truc à savoir avec les HExecuteRequeteSQL() c'est que si un HAnnuleDeclaration() n'est pas exécuté sur la source de données, Windev ne libère pas la mémoire associée. Donc au bout d'une certaine durée d'utilisation le programme devient obèse en conso mémoire et devient inutilisable.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Citation Envoyé par Marco46 Voir le message
    Pourquoi ne pas utiliser qu'une seule requête ?
    Tout simplement parceque je n'en savais rien?

    Désolé, j'ai essayé dans tous les sens avec ce code en m'inspirant du tien mais j'ai toujours une erreur. (j'ai regardé l'aide sur JOIN et je crois que je ne l'ai pas comprise...)

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sablier()
     
    L_phraseSQL est une chaîne
    L_phraseSQL+="SELECT "
    L_phraseSQL+="Entete_facture.Num_fact," 
    L_phraseSQL+="T_article.Description,"
    L_phraseSQL+="Ligne_commande.qte_article,"
    L_phraseSQL+="Ligne_commande.prix_euro,"
    L_phraseSQL+="Ligne_commande.prix_vte,"
    L_phraseSQL+="Ligne_commande.px_cfa_ut,"
    L_phraseSQL+="Ligne_commande.tot_couts"+RC 
    L_phraseSQL+="FROM Ligne_commande"+RC
     
    L_phraseSQL+="JOIN Entete_facture ON (Ligne_commande.Num_fact = Entete_facture.Num_fact)" +RC
    L_phraseSQL+="JOIN T_article ON (Ligne_commande.Id_article = T_article.Id_article) "
    L_phraseSQL+=" WHERE "
     
    SELON COMBO_Critere
    	CAS 1	// CODE BARRE
    		L_phraseSQL+= "T_article.code_barre ="+"'"+SAI_Critere+"'"
     
    	CAS 2	// Code Article
    		L_phraseSQL+= "T_article.Réf_article LIKE " +"'%"+ SAI_Critere+"%'"
     
    	CAS 3	// Designation
    		L_phraseSQL+= "T_article.Description LIKE " +"'%"+ SAI_Critere+"%'"
    	AUTRE CAS
    FIN
     
    Info(L_phraseSQL)
    L_sdReq est une Source de Données
     
    SI PAS HExécuteRequêteSQL(L_sdReq,hRequêteInterruptible,L_phraseSQL) ALORS
    	Erreur("ERREUR Requête"+HErreurInfo(hErrComplet))
    SINON
    	TableSupprimeTout(TABLE_Historiq)
    	POUR TOUT L_sdReq DEPUISDEBUT
    		TableAjoute(TABLE_Historiq,L_sdReq.Date_fact+TAB+...
    			L_sdReq.Num_fact+TAB+...
    			L_sdReq.Description+TAB+...
    			L_sdReq.qte_article+TAB+...
    			L_sdReq.prix_euro+TAB+...
    			L_sdReq.prix_vte+TAB+...
    			L_sdReq.px_cfa_ut+TAB+...
    			L_sdReq.tot_couts)
    	FIN
    FIN
    HAnnuleDéclaration(L_sdReq)
    Sablier(Faux)
    RepriseSaisie(SAI_Critere)
    Et voici l'erreur

    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
    36
    37
    38
    39
    40
    41
    42
    Erreur à la ligne 38 du traitement Clic sur BTN_Search.
    <Date_fact> n'est ni une rubrique ni un paramètre de la requête <L_sdReq>. De nouveaux paramètres ne doivent pas être déclarés après la préparation d'une requête. Vérifier également qu'il n'y a pas d'erreur de syntaxe dans le nom de la rubrique ou du paramètre.
     
    Informations techniques
     
    Projet : Aérien
     
    Dump de l'erreur du module <WD120HF.DLL> <12.00Kg>.
     
    - Appel WL :
    Traitement de <FEN_Historiq.BTN_Search>, ligne <38>, thread <0>
     
    - Niveau : erreur fatale (EL_FATAL)
     
    - Code erreur : 70202
     
    - Code erreur WD55 : 202
     
    - Pas de code d'erreur système
     
    - Pas de message d'erreur système
     
    - Que s'est-il passé ?
    <Date_fact> n'est ni une rubrique ni un paramètre de la requête <L_sdReq>. De nouveaux paramètres ne doivent pas être déclarés après la préparation d'une requête. Vérifier également qu'il n'y a pas d'erreur de syntaxe dans le nom de la rubrique ou du paramètre.
     
    - Infos de debug :
    IEWDHF=32008
    Module=<WDHF>
    Version=<12.00Kg>
     
    - Infos attachées :
    EIT_LOGICALTABLENAME : <L_sdReq>
    EIT_PILEWL :
    Clic sur BTN_Search (FEN_Historiq.BTN_Search), ligne 38
    EIT_COMPOSANT :
     
    EIT_DATEHEURE : 28/06/2010 18:07:42
     
    - Identifiant dans le .err : 71703
     
     
    Assistance
    Merci pour le temps que vous prenez

  4. #4
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Tu sélectionnes une rubrique (Date_fact dans le TableAjoute()) que tu n'as pas appelé dans ton SELECT -> Erreur.

    Sinon pour avoir un code plus propre tu peux utiliser la syntaxe des chaines multi-lignes à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    sChaineMultiligne est une Chaine = [
    SELECT 
    MAREQUETE
    FROM
    EST_ICI
    JOIN 1
    JOIN 2
    WHERE
    CRITERE_1=%1 AND 
    CRITERE_2_CHAINE='%2'
    ]
    Et utiliser ensuite un ChaineConstruit() pour faire passer les paramètres à la chaine.

    Ça devient tout de suite beaucoup plus lisible.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Points : 1 283
    Points
    1 283
    Par défaut
    Salut Marco,


    AAAAAAAAAAHHHHH ce SQL ...

    Dommage Marco que tu sois un Homme, sinon le bisou ne t'aurai pas raté

    Ca marche du tonnerre!

    Merci

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

Discussions similaires

  1. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  4. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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