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 :

Affichage de résultats


Sujet :

WinDev

  1. #1
    Futur Membre du Club
    Affichage de résultats
    Bonjour,

    Débutant

    J'ai une Table alimenté par une requête FullText qui fonctionne bien.
    je souhaiterais par programmation que mes références DEV0001 à DEV000X de ma table requête affichent les résultats de la rubrique quantité enregistré dans un autre fichier qui lui aussi a les même références.

    Pour DEV0001 ma COL_Quantité de ma table requête affiche le résultat de mon fichier Quantité qui pour DEV0001 à pour dans la rubrique Qté le résultat correspondant.

    Ceci pour toutes mes lignes de ma table. Car si j'ajoute à ma requête cette rubrique de mon fichier Quantité ma condition FullText est inopérante.

    J'ai essayé en regardant du coté de HLIT et de POURTOUT mais je n'y arrive pas.

    J'espère avoir été clair même si c'est mal formulé

    Merci pour votre aide.

  2. #2
    Membre chevronné
    Bonjour,
    Résumons :
    Tu as un MLD qui ressemble à ça :

    Où PK_Produit prend les valeurs DEVXXXX
    Une requête (REQ_Produit) qui ressemble à ça :
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 
            Produit.NDX_NomProduit AS NomProduit,	
    	Produit.Prix AS Prix,	
    FROM Produit

    et qui alimente un champ table (TABLE_PRODUIT) et tu voudrais en plus faire apparaître QtéProduit.
    Il suffit d'ajouter un clause WHERE à REQ_Produit
    Ce qui donne :
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    	Produit.NDX_NomProduit AS NomProduit,	
    	Produit.Prix AS Prix,	
    	AutreDonnées.QtéProduit AS QtéProduit
    FROM 
    	Produit,	
    	AutreDonnées
    WHERE 
    	Produit.PK_Produit = AutreDonnées.FK_Produit
    Il y a peut être plus simple, mais ça tourne

  3. #3
    Futur Membre du Club
    Bonjour?

    Je viens juste de voir le message j'ai du mal paramétré les notifications
    Mon MLD ressemble à ça :


    Ma table est alimenté par ma requête FullTxt suivante:
    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
    SELECT 
      FProduits.IDFProduits AS IDFProduits,  
      FProduits.Référence AS Référence,  
      FProduits.CodeBarre AS CodeBarre,  
      FProduits.NomTypeProduit AS NomTypeProduit,  
      FProduits.NomFamillesProduits AS NomFamillesProduits,  
      FProduits.NomProduit AS NomProduit,  
      FProduits.Valeur AS Valeur,  
      FProduits.Photo AS Photo,  
    FROM 
      FProduits
    WHERE 
      MATCH(FProduits.NomTypeProduit, FProduits.NomFamillesProduits, FProduits.NomProduit, FProduits.Valeur) AGAINST({ParamIndex_FullText}) > 0
    ORDER BY 
      Référence ASC


    Si je change mon paramètre fulltext ou si je fait une jointure FProduits et FStock et que le produit n'est pas le stock ma requête n'affiche pas les enregistrements sans stock.
    D'où le fait de vouloir passer par du code du style je lit tous les enregistrements de mon fichier FProduits et si ma référence de ce fichier et dans le fichier stock j'affiche le résultat et il s'affiche quand même les produits qui ne sont pas dans le stock.

    Merci de votre aide.

  4. #4
    Membre actif
    Tu veux un truc comme ça?
    J'ai pas mis toutes les rubriques c'est juste pour le test mais j'obtiens dans la requête une colonne de quantité en plus, à 0 si la référence n'existe pas dans le fichier des stocks (le DECODE gère ce cas sinon forcément ça vaut NULL, mais en affichage je présume que tu veux un joli zéro)
    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
    SELECT 
      FProduits.IDFProduits AS IDFProduits,  
      FProduits.Référence AS Référence,  
      FProduits.CodeBarre AS CodeBarre,  
      FProduits.NomTypeProduit AS NomTypeProduit,  
      FProduits.NomFamillesProduits AS NomFamillesProduits,  
      FProduits.NomProduit AS NomProduit,  
      FProduits.Valeur AS Valeur,
      DECODE(Fstock.QteEnStock,NULL,0,Fstock.QteEnStock) as QteEnStock
    FROM 
      FProduits
    left JOIN Fstock on FStock.Référence = FProduits.Référence
    WHERE 
      MATCH(FProduits.NomTypeProduit, FProduits.NomFamillesProduits, FProduits.NomProduit, FProduits.Valeur) AGAINST({ParamIndex_FullText}) > 0
    ORDER BY 
      Référence ASC

  5. #5
    Futur Membre du Club
    Bonjour,

    Je ne veux pas forcément un joli 0.
    Je me demande pourquoi vouloir toucher à la requête.
    Ne peut-on pas passer par exemple à l'initialisation de la table lire tout les référence du fichier produit et lorsque une correspondance référence est trouvée dans le fichier stock la quantité s'affiche dans la colonne de ma table et s'il n'y a aucune correspondance rien ne s'affiche.
    J'ai en plus une erreur sur la fonction DECODE qui n'est pas reconnue.

    Merci pour l'aide.

  6. #6
    Membre chevronné
    Citation Envoyé par iznogood84 Voir le message

    Je me demande pourquoi vouloir toucher à la requête.
    Tout simplement parce qu'une requête est nettement plus rapide (surtout dans un langage interprété).
    Il y a peut être plus simple, mais ça tourne

  7. #7
    Membre actif
    Pour DECODE je m'en sers sur du HFSQL donc ne voyant pas ton code je ne peux rien dire mais je suis certain qu'elle passe en tout cas en WD25 bien sur (la prise en charge de cette fonction dans les précédentes versions je ne la connais pas)
    Evidemment qu'en faisant un parcours programmé tu peux aboutir à ta solution: tu regardes chaque produit et tu vas voir si pour chacun d'eux un stock existe, et tu remplis ta table par programmation.
    Néanmoins, ça c'est un raisonnement itératif, de pur développeur, qui tombe à l'eau dans les cas suivants (je ne sais pas si tu es dedans):

    -ta base est locale: tu vas devoir faire une boucle pour parcourir le fichier et rechercher à chaque fois sur une colonne référence qui est une chaine (il faudrait que l'ID soit entier): ca va être long à mesure que la table grossit
    -ta base est réseau: faire une boucle sur du réseau en HFCS ou autre chose est suicidaire au niveau des perfs. Dès que la table fera quelques centaines de lignes, ton programme va mourir en aller-retour sur le réseau et tu diras "mais pourquoi c'est long?"

    Parcourir chaque ligne une à une est un raisonnement comme je le disais itératif, avec le requêtage ce n'est pas la bonne façon de faire, il faut adopter une approche ensembliste. Là tu récupères toute la table, mais si demain tu ne veux qu'une fraction de la table tu ajouteras des WHERE à ma requête et le résultat t'arriveras en quelques secondes.
    Avec une approche itérative tu peux faire comme tu veux, plus le nombre d'enregistrements grossit, et plus tu perds en perfs car tu fais des aller retour réseau, pour faire sur le poste un filtrage qui doit être fait par la base.

    Ne cherches pas à faire le boulot d'une base de données, si elle peut faire le job, laisses là faire. C'est mon conseil.

  8. #8
    Futur Membre du Club
    Merci de vos réponses.
    Je vais repartir sur vos conseils (requête).
    Je reviendrais signaler si j'arrive ou pas.

    Merci beaucoup.

  9. #9
    Membre actif
    Ca marche.
    Si tu veux, tu peux simuler ce que je racontes: en quelques lignes de codes tu peux faire un random et remplir tes tables de centaines, milliers, millions de valeurs et ensuite importer cette base sur un serveur HF puis tester.
    Pour que ce soit représentatif ton serveur HF devrait être sur une machine distante et ainsi tu pourras constater les temps de réponse.

  10. #10
    Rédacteur/Modérateur

    Avec la configuration proposée par Kunnskap, l'écart va être colossal.

    Très grossièrement, on peut dire que chaque appel à la base de donnée coûte une unité de temps pour l'appel et la prise en considération de ta demande, plus éventuellement une unité de temps pour faire le job proprement dit. Très très grossièrement, j'avais prévenu.

    Avec une requête qui traite 1 million d'enregistrements, et avec cette estimation grossière, il faudra 2 unités de temps.
    Alors qu'avec une boucle, il faudra 1 million d'unités de temps.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Futur Membre du Club
    Bonsoir,

    Mon application est mono_poste et HFSQL Classic

    C'est bon j'ai appliqué vos conseilles refait ma requête directement en sql et tout est bon!

    Merci à tous pour vos conseils et solutions .