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 sur une vue.


Sujet :

WinDev

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut Requête sur une vue.
    Bonjour,

    J'ai une procédure globale dans laquelle j'exécute une requête sur une vue passer en paramètre.
    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
     
    PROCEDURE ListeDesProduitsParPays(nNumPays est un entier, lstProd est une Liste d'entier, sdVueProd est une Source de Données)
     
    sQuery 			est une chaîne
    sdResultQuery 	est une Source de Données
     
    Trace(HNbEnr(sdVueProd))
     
    sQuery = [
    	SELECT 
    		sdVueProd.T_produits_ID AS T_produits_ID,	
    		T_distributeurs.T_distributeurs_numPays AS T_distributeurs_numPays
    	FROM 
    		T_distributeurs,	
    		sdVueProd
    	WHERE 
    		sdVueProd.T_produits_numDistributeur	=	T_distributeurs.T_distributeurs_ID
    	AND
    	(
    		T_distributeurs.T_distributeurs_numPays = %1
    	)
    ]
     
    sQuery = ChaîneConstruit(sQuery,nNumPays)
     
    SI PAS HExécuteRequêteSQL(sdResultQuery,hRequêteDéfaut,sQuery) ALORS
    	Erreur(ErreurInfo())
    FIN
    Dans le "Trace" j'ai bien le bon nombre d'enregistrements, mais quand j'exécute la requête il me dit que "sdVueProd" est inconnu ??

    Quelqu'un a t'il une idée ?

    Merci.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Bonjour,

    Que se passe-t-il si tu traces le "nom logique" de la vue ?
    Qu'est-ce qui est affiché ?

    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PROCEDURE ListeDesProduitsParPays(nNumPays est un entier, lstProd est une Liste d'entier, sdVueProd est une Source de Données)
     
    sQuery est une chaîne
    sdResultQuery est une Source de Données
     
    Trace(HNbEnr(sdVueProd))
    Trace(sdVueProd)

    Dans le code SQL, il faut utiliser les "noms logiques" déclarés au moteur de bases de données HyperFile, et non pas les variables du WLangage.

    Ok ?
    _

  3. #3
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut
    Bonjour,

    Effectivement il fallait utiliser le nom logique et là plus de soucis. Merci.

    Maintenant ce que je ne comprend pas c'est que si je fais ma requête sur ma table produits j'ai un certain nombre de produits qui remontent.

    Je crée ma vue sur ma table produits, sans condition, quand je trace le nombre de produits (sur mon paramètre sdVueProd) je vois qu'ils y sont tous.
    Mais quand je fais ma requête sur cette vue (avec son nom logique), qui est une image conforme de ma table, je ne remonte aucun résultat !?

    Pourquoi ?

    Je ne comprend pas une chose, je passe en paramètre ma vue, que je récupère dans sdVueProd, mais dans ma requête j'utilise le nom logique qui est : sdVueProduits.
    En conclusion je n'ai pas besoin de passer ma vue en paramètre ?
    Et quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace(HNbEnr(sdVueProduits))
    ma procédure me dit que sdVueProduits n'existe pas.

    Merci.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Bonjour,

    Citation Envoyé par thierrybatlle Voir le message

    Maintenant ce que je ne comprend pas c'est que si je fais ma requête sur ma table produits j'ai un certain nombre de produits qui remontent.

    Je crée ma vue sur ma table produits, sans condition, quand je trace le nombre de produits (sur mon paramètre sdVueProd) je vois qu'ils y sont tous.
    Mais quand je fais ma requête sur cette vue (avec son nom logique), qui est une image conforme de ma table, je ne remonte aucun résultat !?

    Pourquoi ?
    Je ne connais pas précisément ta situation, peut être devrais-tu nous donner tout le code correspondant à ton problème.

    Néanmoins, je peux témoigner sur la faisabilité de ta démarche.

    Si je crée une source de données de type Vue, puis je crée une source de données basée sur une requête qui utilise la Vue... la source de données basée sur la requête me donne bien accès aux données issues de la Vue.
    Je confirme.

    Citation Envoyé par thierrybatlle Voir le message

    Je ne comprend pas une chose, je passe en paramètre ma vue, que je récupère dans sdVueProd, mais dans ma requête j'utilise le nom logique qui est : sdVueProduits.
    En conclusion je n'ai pas besoin de passer ma vue en paramètre ?
    De toute façon, il te faut connaître le nom logique, n'est-ce pas ?

    Citation Envoyé par thierrybatlle Voir le message

    Et quand je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace(HNbEnr(sdVueProduits))
    ma procédure me dit que sdVueProduits n'existe pas.
    Il faut que tu sois bien clair par rapport aux conditions d'utilisation d'un nom sans guillemet dans une fonction HyperFile H*.
    Tu peux utiliser un nom sans guillemet dans un des 3 cas suivants:
    1. c'est un nom de "fichier HyperFile" décrit dans l'analyse associée au projet,
    2. c'est un nom "symbolique" déclaré avec le mot clé EXTERNE et qui correspond au nom logique d'un "fichier HyperFile" déclaré autrement que par l'analyse,
    3. c'est un nom de variable de type source de données, dans le respect des règles de portée.

    Autrement, tu dois utiliser une chaîne de caractères qui contient le nom logique du "fichier HyperFile".
    _

  5. #5
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut
    Bonjour,

    Depuis que j'utilise les guillemets j'ai le bon nombre d'enregistrement dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Trace(HNbEnr("sdVueProduits"))
    Mais toujours pas de résultat lors de l'exécution de la requête !?

    Voici mon 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
     
    PROCEDURE ListeDesProduitsParPays(nNumPays est un entier, lstProd est une Liste d'entier, sdVueProd est une Source de Données)
     
    sQuery 			est une chaîne
    sdResultQuery 	est une Source de Données
     
    Trace(HNbEnr("sdVueProduits"))
    Trace(sdVueProd)
    sQuery = [
    	SELECT 
    		sdVueProduits.T_produits_ID AS T_produits_ID,	
    		T_distributeurs.T_distributeurs_numPays AS T_distributeurs_numPays
    	FROM 
    		T_distributeurs,	
    		sdVueProduits
    	WHERE 
    		sdVueProduits.T_produits_numDistributeur	=	T_distributeurs.T_distributeurs_ID
    	AND
    	(
    		T_distributeurs.T_distributeurs_numPays = %1
    	)
    ]
     
    sQuery = ChaîneConstruit(sQuery,nNumPays)
     
    SI PAS HExécuteRequêteSQL(sdResultQuery,hRequêteDéfaut,sQuery) ALORS
    	Erreur(ErreurInfo())
    FIN
    Trace(HNbEnr(sdResultQuery))
    HLitPremier(sdResultQuery)
    TANTQUE PAS HEnDehors(sdResultQuery)
    	Ajoute(lstProd,"sdVueProduits".T_produits_ID)
    	HLitSuivant(sdResultQuery)
    FIN
     
    Trace(lstProd..Occurrence)
    sdVueProduits est créée dans le code du bouton qui appelle cette procédure.
    Je passe cette vue en 3eme paramètre à ma procédure.

    Merci bien.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Bonjour,

    Citation Envoyé par thierrybatlle Voir le message

    Mais toujours pas de résultat lors de l'exécution de la requête !?
    Qu'est que tu entends par «toujours pas de résultat» ?

    Quelle est la valeur tracée par:
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace(HNbEnr(sdResultQuery))


    Je vois que tu veux remplir une variable de type liste lstProd avec des données... mais tu fais erreur sur la source de données, j'ai l'impression...

    Au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HLitPremier(sdResultQuery)
    TANTQUE PAS HEnDehors(sdResultQuery)
    	Ajoute(lstProd,"sdVueProduits".T_produits_ID)
    	HLitSuivant(sdResultQuery)
    FIN
    Je te propose d'essayer ceci :
    (j'ai utilisé une instruction de parcours HyperFile POUR TOUT, qui équivaut à HLitPremier, TANTQUE PAS HEnDehors, HLitSuivant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    POUR TOUT sdResultQuery
    	Ajoute(lstProd,sdResultQuery.T_produits_ID)
    FIN

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Encore un conseil en ce qui concerne la source de données et l'utilisation de son nom logique, en particulier dans une requête SQL.

    Citation Envoyé par thierrybatlle Voir le message
    Bonjour,

    Depuis que j'utilise les guillemets j'ai le bon nombre d'enregistrement dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Trace(HNbEnr("sdVueProduits"))
    Si la procédure reçoit en paramètre une source de données, autant utiliser "son" nom logique, plutôt qu'un nom logique tapé "en dur", n'est-ce pas ?

    Dans une requête SQL, pour éviter de recopier le nom logique autant de fois que c'est nécessaire, je te propose d'utiliser un ALIAS SQL (cf. mot clé AS dans la requête SQL).
    Ainsi, en déclarant l'alias SQL V_Produits, il sera plus simple de coder la requête

    C'est la fonction ChaîneConstruit() qui se chargera d'insérer le nom logique dans la requête SQL.

    Cerise sur le gateau : tu remarqueras que le nom logique est placé entre crochets pour se protéger de l'éventualité d'un nom logique qui pourrait contenir des caractères problématiques via à vis de la syntaxe SQL (espace, tabulation, point...).

    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
     
     
    PROCEDURE ListeDesProduitsParPays(nNumPays est un entier, lstProd est une Liste d'entier, sdVueProd est une Source de Données)
     
    sQuery est une chaîne
    sdResultQuery est une Source de Données
     
    Trace(HNbEnr(sdVueProd))
    Trace(sdVueProd)
     
    sQuery = [
        SELECT 
            V_Produits.T_produits_ID AS T_produits_ID, 
            T_distributeurs.T_distributeurs_numPays AS T_distributeurs_numPays 
        FROM 
            T_distributeurs, 
            [%1] AS V_Produits 
        WHERE 
            V_Produits.T_produits_numDistributeur = T_distributeurs.T_distributeurs_ID 
            AND T_distributeurs.T_distributeurs_numPays = %2 
    ]
     
    sQuery = ChaîneConstruit(sQuery,sdVueProd,nNumPays)

  8. #8
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut
    Si je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
    	V_Produits.T_produits_ID AS T_produits_ID,
    	V_Produits.T_produits_numDistributeur
    FROM 
    	[%1] AS V_Produits
    J'ai bien les numéros des distributeurs quand j'exécute ma requête.

    Je ne vois pas pourquoi ma liaison ne veut pas fonctionner ???

  9. #9
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut
    Même cela ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT 
    	V_Produits.T_produits_ID ,
    	V_Produits.T_produits_numDistributeur
    FROM 
    	[%1] AS V_Produits JOIN T_distributeurs ON V_Produits.T_produits_numDistributeur = T_distributeurs.T_distributeurs_ID
    WHERE
    	T_distributeurs.T_distributeurs_numPays = %2
    Alors que dans WDSQL ce code marche très bien.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Salut Thierry, ne désespère pas.

    Je n'ai pas de réponse pour l'instant, mais à titre de comparaison, je vais te montrer mon code de test qui fonctionne.

    Code WLangage : 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
     
     
    srcVue est une Source de Données
    srcVue+=HeureSys()
     
    HCréeVue(srcVue,PIECES,"*","T_JOURNAL","",hVueDéfaut)
     
    Info(HNbEnr(srcVue))
     
    srcReq est une Source de Données
    SQL est une chaîne = [
    SELECT 
    	V.ID_BORDEREAU, V.ID_PIECE, V.T_JOURNAL, V.D_PIECE, 
    	V.T_CPT_TIERS, V.T_NUM_PIECE, 
    	BORDEREAUX.T_FICHIER 
    FROM 
    	[%1] AS V, BORDEREAUX 
    WHERE 
    	T_JOURNAL='VTEDIV' 
    	AND V.ID_BORDEREAU = BORDEREAUX.ID_BORDEREAU 
    ]
    SQL=ChaîneConstruit(SQL,srcVue)
     
    SI HExécuteRequêteSQL(srcReq,hRequêteDéfaut,SQL) = Faux ALORS
    	Erreur()
    	RETOUR
    FIN
     
    Info(HNbEnr(srcReq))

  11. #11
    Membre éclairé Avatar de thierrybatlle
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2005
    Messages
    621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2005
    Messages : 621
    Par défaut
    Petite remarque :
    Est-ce que cela ne viendrait pas du fait que j'ai tout mon code avec la vue dans une procédure globale ?

    Merci.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Par défaut
    Citation Envoyé par thierrybatlle Voir le message
    Petite remarque :
    Est-ce que cela ne viendrait pas du fait que j'ai tout mon code avec la vue dans une procédure globale ?
    Je ne vois pas pourquoi...

    Peut être que tu pourrais nous montrer le code qui construit la vue (de la déclaration de la variable source de données jusqu'à la déclaration de la vue) ?

    Comme je te l'ai déjà proposé, as-tu essayé ta requête SQL en gardant la jointure mais sans filtrer sur le pays ?
    _

Discussions similaires

  1. Requête sur une vue et temps de réponse
    Par shaun_the_sheep dans le forum SQL
    Réponses: 47
    Dernier message: 20/02/2012, 13h21
  2. limiter les requêtes /le CPU sur une vue db2
    Par batou22003 dans le forum DB2
    Réponses: 4
    Dernier message: 08/11/2011, 17h43
  3. Requête sur une vue indexée
    Par VladTepes dans le forum Développement
    Réponses: 0
    Dernier message: 10/08/2010, 17h37
  4. Problème de requête sur une vue Hibernate
    Par littlebear dans le forum Hibernate
    Réponses: 16
    Dernier message: 05/01/2009, 14h48
  5. delete sur une vue: rule
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 18/05/2004, 18h58

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