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 :

HFiltre sur requete qui comporte une même table employée 2 fois


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut HFiltre sur requete qui comporte une même table employée 2 fois
    Bonjour à tous,

    j'ai une requete qui tape sur une table qui gère une nomenclature de fabrication. Donc je relie 1 produit à 1 ou plusieurs composants. Produits et composants sont tous dans la table article. Donc j'ai une requete qui emploie la table art (article) deux fois en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *, t1.art_reference AS produit, t2.art_reference AS fourniture 
    FROM art t1, art t2, et d'autres tables....
    WHERE etc.....
    Maintenant quand j'utilise le critère suivant dans mon HFiltre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    critere = "produit ~] '" + SAI_filtre + "' ET fourniture ~] '" + SAI_filtre2 + "'"
    HDésactiveFiltre(REQ_Lancements)
    HFiltre(REQ_Lancements, critere)
    TableSupprimeTout(TABLE_Lancements)
    TableAffiche(TABLE_Lancements)
    Windev retranscrit la requete sans se précoccuper des AS t1, AS t2, pour lui je filtre art.art_reference avec SAI_filtre puis art.art_reference avec SAI_filtre2 !!!

    Donc forcément il ne sait pas choisir entre la table art (t1) et la table art (t2) ...

    Ci-dessous le log d'erreur, regardez bien la clause WHERE, on voit qu'il interprête mal le critère de filtre ("art"."art_reference" LIKE '%%' AND "art"."art_reference" LIKE '%%') :

    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
    Le champ 'TABLE_Lancements' n'a pas pu s'initialiser, car il a rencontré l'erreur HyperFileSQL suivante :
    =============================
    Erreur de l'accès OLE DB.
    Numéro d'erreur = 170129 
     
    Echec de l'ouverture du fichier.
    =============================
     
    Détail de l'erreur système :
     
    	Description = L'identificateur en plusieurs parties "art.art_reference" ne peut pas être lié.
    	Source = Microsoft OLE DB Provider for SQL Server
    	SQL State = 42000
    	Error Number = -2147217900 (0x80040e14)
    	Native Error Number = 4104 (0x1008)
     
    Erreur de l'accès OLE DB.
    Numéro d'erreur = 170129 
     
    Texte de la requête : SELECT "nof"."nof_of_id"  
    AS "nof_of_id" , "nof"."nof_op"  AS "nof_op" , "nof"."nof_fourniture" 
    AS "nof_fourniture" , "nof"."nof_qte_lien" 
    AS "nof_qte_lien" , "nof"."nof_qte_necessaire" 
    AS "nof_qte_necessaire" , "nof"."nof_qte_lancee" 
    AS "nof_qte_lancee" , "nof"."nof_prix_revient" 
    AS "nof_prix_revient" , "ofs"."of_id"  AS "of_id" , "ofs"."of_num" 
    AS "of_num" , "ofs"."of_article_id"  AS "of_article_id" , "ofs"."of_delai" 
    AS "of_delai" , "ofs"."of_commande" 
    AS "of_commande" , "ofs"."of_qte_lancee" 
    AS "of_qte_lancee" , "ofs"."of_lance_le" 
    AS "of_lance_le" , "ofs"."of_lance_par"  AS "of_lance_par" , "ofs"."of_termine" 
    AS "of_termine" , "ofs"."of_index"  AS "of_index" , "stck"."stck_article" 
    AS "stck_article" , "stck"."stck_qte"  AS "stck_qte" , "stck"."stck_attendu" 
    AS "stck_attendu" , "stck"."stck_besoin"  AS "stck_besoin" , "t1"."art_id" 
    AS "art_id" , "t1"."art_reference"  AS "art_reference" , "t1"."art_designation" 
    AS "art_designation" , "t1"."art_um"  AS "art_um" , "t1"."art_empl" 
    AS "art_empl" , "t1"."art_casier"  AS "art_casier" , "t1"."art_appro" 
    AS "art_appro" , "t1"."art_stock_secu"  AS "art_stock_secu" , "t1"."art_prix_vente"  AS "art_prix_vente" , "t1"."art_prix_achat"  AS "art_prix_achat" , "t1"."art_prix_revient"  AS "art_prix_revient" , "t2"."art_id"  AS "art_id1" , "t2"."art_reference"  AS "art_reference1" , "t2"."art_designation"  AS "art_designation1" , "t2"."art_um"  AS "art_um1" , "t2"."art_empl"  AS "art_empl1" , "t2"."art_casier"  AS "art_casier1" , "t2"."art_appro"  AS "art_appro1" , "t2"."art_stock_secu"  AS "art_stock_secu1" , "t2"."art_prix_vente"  AS "art_prix_vente1" , "t2"."art_prix_achat"  AS "art_prix_achat1" , "t2"."art_prix_revient"  AS "art_prix_revient1" , "t1"."art_reference"  AS "produit" , "t2"."art_reference"  AS fourniture , ( "nof"."nof_qte_necessaire" - "nof"."nof_qte_lancee" )  AS "reste" 
    FROM "nof" , "ofs" , "stck" , "art" "t1" , "art" "t2" 
    WHERE (  ( ( ( ( "ofs"."of_article_id" = "t1"."art_id" ) AND ( "nof"."nof_fourniture" = "t2"."art_id" ) ) AND ( "nof"."nof_fourniture" = "stck"."stck_article" ) ) AND ( "nof"."nof_of_id" = "ofs"."of_id" ) )) 
    AND ( ( "art"."art_reference" LIKE  '%%' AND "art"."art_reference" LIKE  '%%' )) 
     ORDER BY "ofs"."of_id" DESC,"nof"."nof_op","stck"."stck_article","t1"."art_id","nof"."nof_of_id","nof"."nof_fourniture","nof"."nof_qte_lien","nof"."nof_qte_necessaire","nof"."nof_qte_lancee","nof"."nof_prix_revient","ofs"."of_num","ofs"."of_article_id","ofs"."of_delai","ofs"."of_commande","ofs"."of_qte_lancee","ofs"."of_lance_le","ofs"."of_lance_par","ofs"."of_termine","ofs"."of_index","stck"."stck_qte","stck"."stck_attendu","stck"."stck_besoin","t1"."art_reference","t1"."art_um","t1"."art_empl","t1"."art_casier","t1"."art_appro","t1"."art_stock_secu","t1"."art_prix_vente","t1"."art_prix_achat","t1"."art_prix_revient",46
    Nombre de paramètres : 0
    IEWDOLDB=111.6
    Module=<WDOLDB>
    Version=<17.0.21.0>
    J'espère que j'ai été clair, n'hésitez pas à me demander des précisions.

    Cordialement

    Bob
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Je précise que j'ai essayé avec le critère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    critere = "t1.art_reference ~] '" + SAI_filtre + "' ET t2.art_reference ~] '" + SAI_filtre2 + "'"
    et aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    critere = "art_reference ~] '" + SAI_filtre + "' ET art_reference1 ~] '" + SAI_filtre2 + "'"
    sans plus d succès...

    Ne soyez pas surpris que la requête qui est dans le log soit un peu différente que celle que je vous ai donné au tout début de mon explication, c'était pour shématiser...
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pourquoi ne pas contruire dynamiquement le code SQL de la requête, avec ChaineConstruit() par exemple ?

    Tatayo.

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Bonjour

    Un peu du mal à comprendre ton besoin et le contexte.

    Tu as combien de table ? C'est quoi l'analyse ?
    Produit --->> Composant
    Article ---->> Produit
    Article ---->> Composant
    Ou
    Article ---->> Composant (associant 2 articles, 1 pour le produit, 1 pour le composant)

    Ta requête fonctionne-t-elle ?
    Que veux tu obtenir avec ?
    A tu vraiment besoin de filtrer le résultat de la requête ? ou bien un requête bien pondu te suffirait ?

    Un peut de précision stp
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Dans le message d'erreur j'ai vu ta requête ce qui me permet de mieux comprendre ton analyse.

    A moins que je ne me trompe mais j'ai l'impression que tu fais une confusion entre les paramètre de ta requête et l'usage de filtre.
    C'est 2 choses différentes.

    Pour exécuter ta requête et l'afficher dans la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TableSupprimeTout(TABLE_Lancements)
     
    // si comme j'ai cru le comprendre le nom des paramètres sont produit et fourniture
    REQ_Lancements.produit    = SAI_filtre
    REQ_Lancements.fourniture = SAI_filtre2
    HExécuteRequête(REQ_Lancements)
    TableAffiche(TABLE_Lancements)
    Si tu tiens à faire un filtre sur la requête il faut que tu lui enlèves ces paramètres et que tu exécutes la requête avant de lui appliquer le filtre.

    Bon dev
    Laurent
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 359
    Points : 508
    Points
    508
    Par défaut
    Par expérience, plusieurs tables dans une même fenêtre qui affichent des données issues d'un même fichier c'est casse gueule. A force d'avoir des soucis, j'ai été obligé de modifier l'organisation de mes données. Lourd quand l'application est déjà bien avancée.
    Les solutions les plus simples sont les plus efficaces

  7. #7
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par laurent30s Voir le message
    Dans le message d'erreur j'ai vu ta requête ce qui me permet de mieux comprendre ton analyse.

    A moins que je ne me trompe mais j'ai l'impression que tu fais une confusion entre les paramètre de ta requête et l'usage de filtre.
    C'est 2 choses différentes.

    Pour exécuter ta requête et l'afficher dans la table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TableSupprimeTout(TABLE_Lancements)
     
    // si comme j'ai cru le comprendre le nom des paramètres sont produit et fourniture
    REQ_Lancements.produit    = SAI_filtre
    REQ_Lancements.fourniture = SAI_filtre2
    HExécuteRequête(REQ_Lancements)
    TableAffiche(TABLE_Lancements)
    Si tu tiens à faire un filtre sur la requête il faut que tu lui enlèves ces paramètres et que tu exécutes la requête avant de lui appliquer le filtre.

    Bon dev
    Laurent
    Non non ce ne sont pas des paramètres.

    La requête de base fonctionne.

    En init de fenêtre je fais un HExecute de la requete, qui fonctionne.

    Je veux filtrer dynamiquement la requête d'après un critere qui varie en fonction des différentes selection de liste et/ou saisie de champs filtres articles (pour faire des recherche dans les references articles et fournitures....)
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  8. #8
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Voilà le code exécuté sur clic de ma liste de produits. Il faut imaginer que j'ai le même code sur clic de ma liste de fournitures :

    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
    critere est une chaîne
     
    SI LISTE_articles..Valeur = 0 ALORS
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    		// TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURES QUI RESPECTENT FILTRE2
    		critere = "art_reference ~] '" + SAI_filtre + "' ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	SINON
    		// TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURE SELECTIONNEE
    		critere = "art_reference ~] '" + SAI_filtre + "' ET nof_fourniture = " + LISTE_fournitures..Valeur
    	FIN
     
    SINON
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    		// TOUS LES LANCEMENTS DE L'ARTICLE SELECTIONNE ET TOUTES LES FOURNITURES
    		critere = "of_article_id = " + LISTE_articles..Valeur + " ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	SINON
    		// TOUS LES LANCEMENTS DE L'ARTICLE ET DE LA FOURNITURE SELECTIONNES
    		critere = "of_article_id = " + LISTE_articles..Valeur + " ET nof_fourniture = " + LISTE_fournitures..Valeur
    	FIN
     
     
    FIN
     
    HDésactiveFiltre(REQ_Lancements)
    HFiltre(REQ_Lancements, critere)
    TableSupprimeTout(TABLE_Lancements)
    TableAffiche(TABLE_Lancements)
    et la requête Req_Lancements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 	*, (nof.nof_qte_necessaire - nof.nof_qte_lancee)  AS reste
    FROM nof, ofs, stck, art t1, art t2
    WHERE 
    	ofs.of_article_id = t1.art_id
    	AND		nof.nof_fourniture = t2.art_id
    	AND		nof.nof_fourniture = stck.stck_article
    	AND		nof.nof_of_id = ofs.of_id
     
    ORDER BY 
    	of_id DESC,	
    	nof_op ASC
    La table ofs contient les ordres de fabrication est donc un pointeur vers l'article à produire
    la table nof contient, pour un of donné, la liste des fournitures nécessaires
    La table stck contient les données de stocks pour les articles.

    Je suis contraint d'évoluer avec ce modèle de données.

    Pour moi c'est un bug de transcription du critere fourni à la fonction HFiltre qui entraine cette erreur, ou moi qui ne sait pas définir correctement le critere.....
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  9. #9
    Membre émérite
    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
    Points : 2 562
    Points
    2 562
    Par défaut
    Bonjour,

    Laurent30S t'a donné la bonne solution : tu dois paramètrer ta requête et la lancer avec ou sans paramètres. Si tu ne les donnes pas, les filtres ne seront pas faits. Si tu donnes que la moitié des paramètres, il ne prendra que cela en compte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *, t1.art_reference AS produit, t2.art_reference AS fourniture 
    FROM art t1, art t2, et d'autres tables....
    WHERE etc.....
    AND t1.art_reference ~] {param1} 
    AND t2.art_reference ~] {param2} 
    AND t1.nof_fourniture = {param3}
    .....
    à bientôt,

    Nicolas

  10. #10
    Membre émérite
    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
    Points : 2 562
    Points
    2 562
    Par défaut
    Pour rappel : tu ne peux pas filtrer les résultats de la requête mais uniquement les données de la table ou des tables source.

    Autrement dit si tu veux filtrer les résultats, il faut que les résultats soient la source d'une autre requête, ce qui est tout à fait possible.

  11. #11
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Franchement j'ai du mal à comprendre.

    C'est pas la première fois que je fonctionne selon ce mécanisme :

    une requete globale sans paramètres
    la définition d'un critère de filtrage
    que j'emploie dans un HFiltre(requete, critere)
    je vide ma table
    et je la reaffiche

    ça a toujours fonctionné
    seulement je n'avais pas dans mon critère 2 même champs d'une même table utilisé dans 2 contextes différents

    Alors là, ma seule solution c'est de mettre des paramètres dans ma requête.
    Globalement ce que je reproche dans windev c'est qu'on ne peut jamais employer une meme méthode de programmation, ça change tout le temps selon le contexte, un coup on peut faire ceci, une autre fois on ne peut pas faire cela....
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Bonjour à tous !

    Une suggestion...

    Pourquoi ne pas forcer le mode d'exécution de la requête à hRequêteSansCorrection, comme ça la couche HyperFile n'essaiera pas de (mal) comprendre la requête ?

  13. #13
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bon je viens de transformer ma requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT 	*, (nof.nof_qte_necessaire - nof.nof_qte_lancee)  AS reste
    FROM nof, ofs, stck, art t1, art t2
    WHERE 
    	ofs.of_article_id = t1.art_id
    	AND		nof.nof_fourniture = t2.art_id
    	AND		nof.nof_fourniture = stck.stck_article
    	AND		nof.nof_of_id = ofs.of_id
    	AND 	t1.art_reference LIKE '%{produit}%'
    	AND 	t2.art_reference LIKE '%{fourniture}%'
    	AND 	t1.art_id = {pid}
    	AND 	t2.art_id = {fid}
    ORDER BY 
    	of_id DESC,	
    	nof_op ASC
    Quand je l'exécute via l'éditeur de requête, il me demande bien de saisir les différents paramètres, et le résultat est conforme selon que je renseigne ou pas un paramètre.

    MAIS

    Quand j'affecte les paramètres dans mon programme, ça ne fonctionne pas. Ci-dessous le code qui va exécuter la requête paramétrée :

    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
    SI LISTE_articles..Valeur = 0 ALORS
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    	         // TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURES QUI RESPECTENT FILTRE2
    	         critere = "art_reference ~] '" + SAI_filtre + "' ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	         REQ_Lancements.produit = SAI_filtre
    	         REQ_Lancements.fourniture = SAI_filtre2
    	SINON
    	         // TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURE SELECTIONNEE
    	         critere = "art_reference ~] '" + SAI_filtre + "' ET nof_fourniture = " + LISTE_fournitures..Valeur
    	         REQ_Lancements.produit = SAI_filtre
    	         REQ_Lancements.fid = LISTE_fournitures..Valeur
    	FIN
     
    SINON
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    	         // TOUS LES LANCEMENTS DE L'ARTICLE SELECTIONNE ET TOUTES LES FOURNITURES
    	             critere = "of_article_id = " + LISTE_articles..Valeur + " ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	             REQ_Lancements.pid = LISTE_articles..Valeur
    	             REQ_Lancements.fourniture = SAI_filtre2
    	SINON
    		// TOUS LES LANCEMENTS DE L'ARTICLE ET DE LA FOURNITURE SELECTIONNES
    		critere = "of_article_id = " + LISTE_articles..Valeur + " ET nof_fourniture = " + LISTE_fournitures..Valeur
    		REQ_Lancements.pid = LISTE_articles..Valeur
    		REQ_Lancements.fid = LISTE_fournitures..Valeur
    	FIN
     
     
    FIN
     
    HExécuteRequête(REQ_Lancements, hRequêteDéfaut)
    TableSupprimeTout(TABLE_Lancements)
    TableAffiche(TABLE_Lancements)
    j'ai laissé la définition du critère même si ça ne sert pas.

    Je ne peux meme pas exécuter mon appli, il ne reconnait pas les paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur :La rubrique produit n'appartient pas au fichier REQ_Lancements.
    Erreur :La rubrique fourniture n'appartient pas au fichier REQ_Lancements.
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  14. #14
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par OnePoint Voir le message
    Bonjour à tous !

    Une suggestion...

    Pourquoi ne pas forcer le mode d'exécution de la requête à hRequêteSansCorrection, comme ça la couche HyperFile n'essaiera pas de (mal) comprendre la requête ?
    On ne peut pas faire ça dans le hfiltre ....
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Bonjour

    Je pense que ton problème vient d'une condition ET entre des paramètres pour les quel tu transmet une valeur vide.

    Si une valeur que tu veux transmettre à un paramètre est vide il faut la remplacer par Null (avec null la condition n'est pas exécuté)

    Pour les champs de saisi coche retour NULL si vide (pour éviter d'avoir à tester si vide)
    Pour les champs liste tu dois vérifier leur valeur pour savoir si tu transmet la valeur ou Null

    Essaye ce 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
    SI LISTE_articles..Valeur = 0 ALORS
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    	         // TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURES QUI RESPECTENT FILTRE2
    	         critere = "art_reference ~] '" + SAI_filtre + "' ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	         REQ_Lancements.produit = SAI_filtre
    	         REQ_Lancements.fourniture = SAI_filtre2
    	SINON
    	         // TOUS LES ARTICLES QUI RESPECTENT FILTRE1 ET FOURNITURE SELECTIONNEE
    	         critere = "art_reference ~] '" + SAI_filtre + "' ET nof_fourniture = " + LISTE_fournitures..Valeur
    	         REQ_Lancements.produit = SAI_filtre
    	         SI LISTE_fournitures..Valeur = 0 ALORS
    	                  REQ_Lancements.fid = Null
    	         ALORS
    	                  REQ_Lancements.fid = LISTE_fournitures..Valeur
    	         FIN	         
    	FIN
     
    SINON
     
    	SI LISTE_fournitures..Valeur = 0 ALORS
    	         // TOUS LES LANCEMENTS DE L'ARTICLE SELECTIONNE ET TOUTES LES FOURNITURES
    	             critere = "of_article_id = " + LISTE_articles..Valeur + " ET art_reference1 ~] '" + SAI_filtre2 + "'"
    	             REQ_Lancements.pid = Null
    	             REQ_Lancements.fourniture = SAI_filtre2
    	SINON
    		// TOUS LES LANCEMENTS DE L'ARTICLE ET DE LA FOURNITURE SELECTIONNES
    		critere = "of_article_id = " + LISTE_articles..Valeur + " ET nof_fourniture = " + LISTE_fournitures..Valeur
    		REQ_Lancements.pid = LISTE_articles..Valeur
    		REQ_Lancements.fid = LISTE_fournitures..Valeur
    	FIN
     
     
    FIN
     
    HExécuteRequête(REQ_Lancements, hRequêteDéfaut)
    TableSupprimeTout(TABLE_Lancements)
    TableAffiche(TABLE_Lancements)
    Bon dev
    Laurent
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

  16. #16
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Merci pour vos réponses.

    Je me suis finalement décidé à passer par une construction dynamique du texte de la requete :

    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
    extra = ""
    SI LISTE_articles..Valeur = 0 ALORS
    	extra = " AND t1.art_reference LIKE '%" + SAI_filtre + "%'"
    SINON
    	extra = " AND t1.art_id = " + LISTE_articles..Valeur
    FIN
     
    SI LISTE_fournitures..Valeur = 0 THEN
    	extra = extra + " AND t2.art_reference LIKE '%" + SAI_filtre2 + "%'"
    SINON
    	extra = extra + " AND t2.art_id = " + LISTE_fournitures..Valeur
    FIN
     
    TableSupprimeTout(TABLE_Lancements)
     
    Sql = "SELECT nof_fourniture, nof_of_id, of_num, nof_op, t2.art_reference fourniture, stck_qte, nof_qte_necessaire, nof_qte_lancee, (nof_qte_necessaire - nof_qte_lancee) AS reste FROM nof, ofs, stck, art t1, art t2 " + ...
    	"WHERE nof_of_id = of_id AND nof_fourniture = stck_article and nof_fourniture = t2.art_id AND of_article_id = t1.art_id " + extra + " ORDER BY of_id DESC, nof_op"
     
    SI PAS HExécuteRequêteSQL(Rs,Cnx,hRequêteSansCorrection ,Sql) ALORS
    	Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo()+ RC + RC + Sql)
    	RETOUR 
    FIN
    HLitPremier(Rs)
    TANTQUE PAS HEnDehors(Rs)
    	TableAjouteLigne(TABLE_Lancements, Rs.of_num, Rs.nof_op, Rs.fourniture, Rs.stck_qte, Rs.nof_qte_necessaire, Rs.nof_qte_lancee, Rs.reste)
    	HLitSuivant(Rs)
    FIN
    Evidemment que ça fonctionne, mais c'est un peu plus lourd et on n'utilise pas les HFiltre qui sont d'habitude bien pratique...
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par bvadam Voir le message
    Citation Envoyé par OnePoint Voir le message
    Une suggestion...

    Pourquoi ne pas forcer le mode d'exécution de la requête à hRequêteSansCorrection, comme ça la couche HyperFile n'essaiera pas de (mal) comprendre la requête ?
    On ne peut pas faire ça dans le hfiltre ....
    Le mode d'exécution de la requête est déclaré au moment d'exécuter HExécuteRequête ou HExécuteRequêteSQL.

    Et j'imagine que l'implémentation de HFiltre tient compte du mode d'exécution de la requête.

    Et dans le cas d'une requête sans correction, il serait sans doute plus simple d'écrire le filtre avec la même syntaxe que celle utilisée en SQL dans une clause WHERE.

Discussions similaires

  1. [Toutes versions] Condition sur 2 champs d'une même table pour éviter des doublons
    Par btks59 dans le forum Modélisation
    Réponses: 6
    Dernier message: 23/05/2011, 08h48
  2. Différence entre 1 même champ sur 2 enregistrements d'une même table
    Par manulemalin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/02/2008, 09h47
  3. Conditions sur les champs d'une même table
    Par Pucho dans le forum Modélisation
    Réponses: 10
    Dernier message: 19/10/2007, 17h52
  4. Requete sur les elements d'une même table
    Par jean-marieb dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/10/2007, 14h40
  5. jointure sur des lignes d'une même table
    Par elsa_dach dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/01/2007, 12h08

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