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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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 : 43
    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
    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

  2. #2
    Membre éclairé 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 : 43
    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
    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...

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 434
    Par défaut
    Bonjour,
    Pourquoi ne pas contruire dynamiquement le code SQL de la requête, avec ChaineConstruit() par exemple ?

    Tatayo.

  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
    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

  5. #5
    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
    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

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

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 372
    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.

  7. #7
    Membre éclairé 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 : 43
    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
    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....)

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