1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

WD Optimisation de Recherche

Discussion dans 'Windev' créé par WindevWindev, Jan 20, 2020.

  1. WindevWindev

    WindevWindev Member

    Inscrit:
    Juil 13, 2019
    Messages:
    34
    J'aime reçus:
    2
    Bonjour a tous
    je souhaites faire une recherche dans 5 rubriques d'un même ficher.
    quelle est la méthode la plus rapide pour y arrive ( mon fichier a plus 10.000 lignes)
    Merci d'avance.


    voici le code Interne que j'utilise mais qui est un peu trop lent

    [windev]
    PROCÉDURE INTERNE MAJCode(sMonCode est une chaîne,nRangCodeFournisseur est un entier,nProd est un entier)
    bCodeEANTrouve est un booléen = Faux
    bCodeExiste est un booléen = Faux

    SI Taille(sMonCode) > 7 ALORS
    bCodeEANTrouve = Vrai
    SINON
    bCodeEANTrouve = Faux
    FIN
    POUR TOUT Produit
    HLitRecherchePremier(Produit,CodeProduit1,sMonCode,hGénérique)
    SI HTrouve(Produit) ALORS
    SI Produit.IDPRODUIT <> nProd ALORS
    bCodeExiste = Vrai
    FIN
    HLitRecherchePremier(Produit,CodeProduit2,sMonCode,hGénérique)
    SI HTrouve(Produit) ALORS
    SI Produit.IDPRODUIT <> nProd ALORS
    bCodeExiste = Vrai
    FIN
    FIN
    HLitRecherchePremier(Produit,CodeProduit3,sMonCode,hGénérique)
    SI HTrouve(Produit) ALORS
    SI Produit.IDPRODUIT <> nProd ALORS
    bCodeExiste = Vrai
    FIN
    FIN
    HLitRecherchePremier(Produit,CodeProduit4,sMonCode,hGénérique)
    SI HTrouve(Produit) ALORS
    SI Produit.IDPRODUIT <> nProd ALORS
    bCodeExiste = Vrai
    FIN
    FIN
    FIN
    HLitRecherchePremier(Produit,CodeProduitEAN,sMonCode,hGénérique)
    SI HTrouve(Produit) ALORS
    SI Produit.IDPRODUIT <> nProd ALORS
    bCodeExiste = Vrai
    FIN
    FIN

    SI bCodeExiste = Vrai ALORS
    Erreur("le Code existe déjà dans la Base de Donnée")
    RETOUR
    SINON
    SELON nRangCodeFournisseur
    CAS 1
    Produit.CodeProduit1 = REQ_BonLivraison.ProdCodeIdentifiant
    CAS 2
    Produit.CodeProduit2 = REQ_BonLivraison.ProdCodeIdentifiant
    CAS 3
    Produit.CodeProduit3 = REQ_BonLivraison.ProdCodeIdentifiant
    CAS 4
    Produit.CodeProduit4 = REQ_BonLivraison.ProdCodeIdentifiant
    FIN
    SI bCodeEANTrouve = Vrai ALORS
    Produit.CodeProduitEAN = REQ_BonLivraison.ProdCodeIdentifiant
    FIN
    HModifie(Produit)
    FIN
    FIN
    FIN
    [/windev]
     
    Tags:
  2. Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Pourquoi ne pas tout simplement utiliser une requête, en ayant pris soin d'indexer les colonnes concernées.
    Du style
    [SQL]
    SELECT
    Produit.PK_Produit
    FROM
    Produit
    WHERE
    Produit.CodeProduit1={pCodeProduit}
    OR
    .....
    Produit.CodeEAN={pCodeProduit}
    [/SQL]
    Cela peut aussi se faire via le requêteur windev.

    Par ailleurs, dans ton code, tu parcours ta table Produit donc tu pourrais directement faire les comparaison au sein de la boucle sans passer par les 5 hLitRecherchePremier qui eux aussi parcourent la table Produit. Donc tu passe d'une complexité n à une complexité 5*n^2

    Code (Text):
    [/COLOR]
    [COLOR=#00ff00]FONCTION RechercherProduit(sCodeAChercher est chaîne) : booléen[/COLOR]
    [COLOR=#0000ff]POUR TOUT Produit[/COLOR]
    [INDENT][COLOR=#00ff00]SI Produit.Code1=sCodeAChercher OU .....OU Produit.CodeEAN=sCodeAChercher ALORS[/COLOR][/COLOR]
    [COLOR=#0000ff][INDENT][COLOR=#00ff00]ReNVOYER Vrai[/COLOR][/INDENT][/COLOR]
    [COLOR=#0000ff][COLOR=#00ff00]FIN[/COLOR][/INDENT][/COLOR]
    [COLOR=#0000ff][COLOR=#00ff00]FIN[/COLOR]
    [COLOR=#0000ff]RENVOYER Faux
     


    Code principal :
    Code (Text):
    [/COLOR]
    [COLOR=#00ff00].....[/COLOR]
    [COLOR=#0000ff]bCodeExiste=RechercherProduit(sMonCode)
    SI bCodeExiste ALORS
    ......
     
     
    #2 Dandypunk, Jan 20, 2020
    Dernière édition: Jan 20, 2020
    khaliassas apprécie ceci.
  3. WindevWindev

    WindevWindev Member

    Inscrit:
    Juil 13, 2019
    Messages:
    34
    J'aime reçus:
    2
    O

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Pourquoi ne pas tout simplement utiliser une requête, en ayant pris soin d'indexer les colonnes concernées.
    Du style
    [SQL]
    SELECT
    Produit.PK_Produit
    FROM
    Produit
    WHERE
    Produit.CodeProduit1={pCodeProduit}
    OR
    .....
    Produit.CodeEAN={pCodeProduit}
    [/SQL]
    Cela peut aussi se faire via le requêteur windev
    Cliquez pour agrandir...
    OK Merci j'y est pensé mais je voulais passé par là pour plus précision

    je vais voir vers les raquettes
     
  • Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Ta réponse et la correction de mon post se sont croisés. J'ai eu une autre idée entre temps, je suis en train de gérer la mise en forme.
    Je reprend le code, il sera plus lisible comme ça (enfin j'espère)
    Code (Text):

    FONCTION RechercherProduit (sCodeAChercher est chaine) : booléen
    POUR TOUT Produit
    SI Produit.Code1=sCodeAChercher OU ... OU Produit.CodeEAN=sCodeAChercher ALORS
    RENVOYER Vrai
    FIN
    FIN
    RENVOYER Faux
     


    Code principal :
    Code (Text):

    bCodeExiste=RechercherProduit(sMonCode)
    SI bCodeExiste ALORS
    Erreur(....)
    RENVOYER Faux
    SINON
    .....
    FIN
     

    On n'aura pas mieux au niveau mise en forme pour l'instant, désolé
     
    #4 Dandypunk, Jan 20, 2020
    Dernière édition: Jan 20, 2020
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    je souhaites faire une recherche dans 5 rubriques d'un même ficher.
    Cliquez pour agrandir...
    Bonsoir,

    Oui une simple requête fera largement l'affaire.


    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Avec des conditions de sélection "OU"

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Code (Windev):
    REQ_Recherche.ParamCodeProduit1 = sMonCode
    REQ_Recherche.ParamCodeProduit2 = sMonCode
    REQ_Recherche.ParamCodeProduit3 = sMonCode
    REQ_Recherche.ParamCodeProduit4 = sMonCode
    REQ_Recherche.ParamCodeProduitEAN = sMonCode

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    (REQ_Recherche)
     
    Le HNbEnr(REQ_Recherche) tu donnera le nombre d’occurrence du code rechercher.

    Bon dev.
     

    Fichiers attachés:

    TGSoft apprécie ceci.
  • LAPIPE2018

    LAPIPE2018 Active Member
    MEMBRE WX

    Inscrit:
    Fev 17, 2018
    Messages:
    647
    J'aime reçus:
    227
    Bonjour, tu peux utiliser l'index Full Text, c'est optimisé , avec la requete
     
    khaliassas apprécie ceci.
  • khaliassas

    khaliassas Active Member

    Inscrit:
    Mar 4, 2019
    Messages:
    446
    J'aime reçus:
    142

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour, tu peux utiliser l'index Full Text, c'est optimisé , avec la requete
    Cliquez pour agrandir...
    attention pas compatible avec toutes les bases. sinon oui c'est super rapide.
    tu met toutes tes rubriques dans le full text index .
     
  • WindevWindev

    WindevWindev Member

    Inscrit:
    Juil 13, 2019
    Messages:
    34
    J'aime reçus:
    2
    Ok Merci a tous

    j'ai testé vos différentes solutions

    Requête (sans paramétré)

    La requête est plus facile en exécution et en programmation (HModification)
    je l'ai exécute et parcouru ( HLitPremier et hLitSuivant) comme ça je peux modifié les doublons sans faire trop d'aller-retour au serveur

    ça marche nickel
     
  • khaliassas

    khaliassas Active Member

    Inscrit:
    Mar 4, 2019
    Messages:
    446
    J'aime reçus:
    142
    je crois que dans la requette tu peux mettre sans doublon directement.
     
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    je crois que dans la requette tu peux mettre sans doublon directement.
    Cliquez pour agrandir...
    Bonjour,

    Bah non dans ce cas précis on a besoin des doublons
     
  • Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Je pense qu'il veux justement supprimer les doublons
     
  • khaliassas

    khaliassas Active Member

    Inscrit:
    Mar 4, 2019
    Messages:
    446
    J'aime reçus:
    142
    oui peut être a tort j'avais compris qu'il voulais supprimer les doublon.
    et donc je voulais lui éviter un retraitement par procédure.
    si il a besoin ben c'est tout bon.
     
  • WindevWindev

    WindevWindev Member

    Inscrit:
    Juil 13, 2019
    Messages:
    34
    J'aime reçus:
    2
    Bonjour je n'y arrive toujours pas
    j'explique le fonctionnement
    un produit peut avoir 5 codes qui correspondent a chaque fournisseur le probleme est que le code (589955) par exemple peut egal a un produit A chez un fournisseur et a un produit B chez un autre

    comment a la saisie du bordereau de livraison detecter ces codes la et les mettre a jour les codes dans le partie code fournisseur (Fournisseur 1 : code produit 1; etc...) pour eviter une entrée de stock sur le mauvais produit vue que la saisie de produit ce fait par code parce que une fois de plus les libelles des produits diffère d'un fournisseur a un autre.

    En gros voila le
     
  • Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Je pense que tu as un problème d'analyse, il te faut une table de relation entre ta table Produit et ta table fournisseur. C'est dans cette table que tu indiquera la référence.

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    On pourra ajouter une clé composée sur référence et fournisseur afin de faciliter la recherche
     
    channibal et khaliassas aiment ça.
  • khaliassas

    khaliassas Active Member

    Inscrit:
    Mar 4, 2019
    Messages:
    446
    J'aime reçus:
    142
    aurais tu un exmple des tes bases de ta requete....de ta fenetre.

    si tu peux modifier la structure de la base. on pourrait imaginer tune table par exemple
    ref_interne
    idproduitinterne | libéléinterne | ...

    une table ref fournisseur
    idauto | idproduitinterne |idfournisseur | libele fournisseur | prix....

    ici idproduitinterne est clef avec doublon

    apres tu peux faire une requete

    select ref_interne.idproduitinterne, ref_interne.libeleinterne, ref_fournisseur.idfournisseur, ref_fournisseur.libelefournisseur from ref_interne, ref_fournisseur where (ref_interne;idproduitinterne=ref_fourniseur.idproduitinterne) and ref_intern.idproduitinterne={paramid}


    publier apres dandypunk, mais je pense comme lui
     
  • channibal

    channibal Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 22, 2018
    Messages:
    210
    J'aime reçus:
    277
    Bonjour,

    Est ce qu'on peut savoir :

    - Comment ta fiche de produit est-elle créée ?

    - La structure de ton fichier produits ?

    - Tu gère le(s) stock(s) dans quel(s) fichier(s) ?

    Edit: Publié après Dandypunk et Khalissas mais même principe (la logique quoi) :D
     
    khaliassas apprécie ceci.
  • Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Pour le principe au moins, Windev² est fixé. D'autant plus que nous nous trouvons face à un "classique".
     
    #17 Dandypunk, Jan 31, 2020
    Dernière édition: Jan 31, 2020
    channibal apprécie ceci.
  • WindevWindev

    WindevWindev Member

    Inscrit:
    Juil 13, 2019
    Messages:
    34
    J'aime reçus:
    2
  • khaliassas

    khaliassas Active Member

    Inscrit:
    Mar 4, 2019
    Messages:
    446
    J'aime reçus:
    142
    je reste sur regarde le poste de

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    .
    la je ne vois pas comment tu peut faire le lien entre ta table produit et ta table fournisseur.
    il te manque la table intermediare qui t'a été proposé.
     
  • Dandypunk

    Dandypunk Well-Known Member

    Inscrit:
    Nov 28, 2019
    Messages:
    544
    J'aime reçus:
    297
    Avec une telle analyse il est étonnant que tu n'ai pas encore eu d'erreur d'intégrité.
    Avec 2 fournisseurs ayant le même nom, c'est déjà fichu. Tu peux éventuellement indexer sur NomFournisseur (clé avec doublon) mais surtout pas en faire une AK.
    Il en va de même au niveau de tes CodeProduit
    Au niveau du prix d'achat, le fait de le mettre directement dans ta table "Produit" interdit la modification de ce prix sans que tout soit faussé, et suppose que tous les fournisseurs pratiquent le même tarif
    Il en va de même pour la date de péremption .....
     
  • Partager cette page

    Chargement...