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

Pourquoi doit on éviter la fonction HFiltre?

Discussion dans 'Résolution problème & conseils' créé par suenodesign, Fev 9, 2018.

  1. suenodesign

    suenodesign Well-Known Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    507
    J'aime reçus:
    732
    Bonsoir,

    Tout est dit dans de le titre.

    Si quelqu'un ici pourrait éclaircir ce sujet SVP.
     
    zeuslefou apprécie ceci.
  2. zeuslefou

    zeuslefou Member

    Inscrit:
    Fev 8, 2018
    Messages:
    17
    J'aime reçus:
    36
    Aucune idée, mais je vais garder la question en tête et la poser lors de la présentation windev en avril, il faut juste de la patiente ... :(
     
    lejag et suenodesign aiment ça.
  3. suenodesign

    suenodesign Well-Known Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    507
    J'aime reçus:
    732
    Merci mon pote.
     
    zeuslefou apprécie ceci.
  4. WX1331

    WX1331 Well-Known Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 1, 2018
    Messages:
    610
    J'aime reçus:
    670
    Moi j'ai déjà utilisé les filtres dans mes programmes, j'ai pas trouvé ça long, c'est vrai que beaucoup de gens me conseillent d'utiliser des requêtes au lieu de filtre mais sans explications, j'ai pas trouvé ça long, effectivement je n’était pas en C/S .

    Salutations
     
  5. Fakirato

    Fakirato New Member
    WXG24 MEMBRE WX WXG 23 WXG 22 WXG 21

    Inscrit:
    Déc 30, 2017
    Messages:
    302
    J'aime reçus:
    816
    Bonjour
    Pour sur la fonction Hfiltre ces contrainte c'est le curseur de donnés
    si vous utiliser deux fenêtres simultanément et il on tous les deux des fonctions HFiltre sur le même tables et vous ne les gérer bien en tous les Evénements vous allez avoir des conflit de donnés , par exemple vous n'avez pas ré-appeler la fonction Hfiltre avant l'enregistrement d'un sous entité vous allez avoir des confls
    aussi j'ai constaté quelle est gourmette en mémoire !

    Juste une remarque :
    Tous les projets qui utilisent Hfiltre que j'ais rencontré en tant que consultant avais des problèmes non logique a leurs DB !

    Des enregistrements remplacé !
    Des IDAUTO identiques
    Des sous entêtes manquante .........
    etc......
    Pour cela je vous conseil de passer par des requêtes ou l'utilisations des vue pour optimisations !
     
    #5 Fakirato, Fev 9, 2018
    Dernière édition: Fev 9, 2018
  6. suenodesign

    suenodesign Well-Known Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    507
    J'aime reçus:
    732

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

    Bonjour
    Pour sur la fonction Hfiltre ces contrainte c'est le curseur de donnés
    si vous utiliser deux fenêtres simultanément et il on tous les deux des fonctions HFiltre sur le même tables et vous ne les gérer bien en tous les Evénements vous allez avoir des conflit de donnés , par exemple vous n'avez pas ré-appeler la fonction Hfiltre avant l'enregistrement d'un sous entité vous allez avoir des confls
    aussi j'ai constaté quelle est gourmette en mémoire !

    Juste une remarque :
    Tous les projets qui utilisent Hfiltre que j'ais rencontré en tant que consultant avais des problèmes non logique a leurs DB !

    Des enregistrements remplacé !
    Des IDAUTO identiques
    Des sous entêtes manquante .........
    etc......
    Pour cela je vous conseil de passer par des requêtes ou l'utilisations des vue pour optimisations !
    Cliquez pour agrandir...
    Merci Fakirato pour cette précision
     
  • krm

    krm Member

    Inscrit:
    Jan 3, 2018
    Messages:
    31
    J'aime reçus:
    35
    Ici :

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

     
  • suenodesign

    suenodesign Well-Known Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    507
    J'aime reçus:
    732

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

    Ici :

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

    Cliquez pour agrandir...
    UN GRAND MERCI
     
    Fakirato apprécie ceci.
  • Fakirato

    Fakirato New Member
    WXG24 MEMBRE WX WXG 23 WXG 22 WXG 21

    Inscrit:
    Déc 30, 2017
    Messages:
    302
    J'aime reçus:
    816
    Merci pour cette explication technique !
     
  • aminej76

    aminej76 Active Member
    MEMBRE WX

    Inscrit:
    Jan 23, 2018
    Messages:
    283
    J'aime reçus:
    102
    Je confirme l'avis de Fakirato.
    Dans tous mes projets j’utilise le HFiltre et j'ai rencontré des problèmes surtout si j'oublie le HDésactiveFiltre.
    Si quelqu'un insiste à utiliser cette fonction, il faut être très prudent. Commencer par HDésactiveFiltre et termine aussi par HDésactiveFiltre.
    BRAVO Fakirato pour vos remarques et expériences.

    //-- IDEE 1
    HDésactiveFiltre(CLIENT)
    HFiltre(CLIENT,DEPARTEMENT,"34000","34000")
    HLitPremier(CLIENT,DEPARTEMENT)
    TANTQUE PAS HEnDehors()
    //Traitement
    HLitSuivant(CLIENT,DEPARTEMENT)
    FIN
    HDésactiveFiltre(CLIENT)

    //-- IDEE 2

    HlitrecherchePremier(CLIENT,DEPARTEMENT,"34000")
    TANTQUE PAS Htrouve()
    //Traitement
    HLitSuivant(CLIENT,DEPARTEMENT)
    FIN

    Pour ces 2 méthodes on'a le même nombre de ALLER/RETOUR du client au serveur. Donc aucune optimisation si j'ai bien compris.
     
  • aminej76

    aminej76 Active Member
    MEMBRE WX

    Inscrit:
    Jan 23, 2018
    Messages:
    283
    J'aime reçus:
    102
    A votre Avis comment on remplace ce code de MAJ des lignes Bon de Livraison


    PROCEDURE MAJ_LIGNE_BON_LIVRAISON()

    SI gModeFenetre = "Modif" ALORS
    HDésactiveFiltre(BON_LIVRAISON_COM)
    HFiltre(BON_LIVRAISON_COM,CLE_B,AN+NUM,AN+NUM)
    HLitPremier(BON_LIVRAISON_COM,CLE_B)
    TANTQUE PAS HEnDehors()
    HSupprime(BON_LIVRAISON_COM)
    HLitSuivant(BON_LIVRAISON_COM,CLE_B)
    FIN
    HDésactiveFiltre(BON_LIVRAISON_COM)
    FIN


    POUR i=1 _A_ Table..Occurrence
    SI Table.TQT <>0 ALORS
    HRAZ(BON_LIVRAISON_COM)
    BON_LIVRAISON_COM.CLE_B = AN+NUM
    BON_LIVRAISON_COM.NUM_LIGNE = Table.TNUM_LIGNE
    BON_LIVRAISON_COM.DES_ART = Table.TDESART
    BON_LIVRAISON_COM.COD_ART = Table.TREFAR
    BON_LIVRAISON_COM.COD_CLI= COD_CLI
    BON_LIVRAISON_COM.DATE = DATE
    BON_LIVRAISON_COM.P_U_HT= Table.TPUHT
    BON_LIVRAISON_COM.QT = Table.TQT
    BON_LIVRAISON_COM.REM= Table.TRemise
    BON_LIVRAISON_COM.TVA= Table.TTVA
    HAjoute(BON_LIVRAISON_COM)
    SI HErreurDoublon() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN

    SI HErreurIntégrité() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN

    FIN
    FIN

    ;);););)
     
  • WX1331

    WX1331 Well-Known Member
    MEMBRE WX DUMP TEAM

    Inscrit:
    Jan 1, 2018
    Messages:
    610
    J'aime reçus:
    670
    Bonjur

    Voila comment je procède:

    Hlitrecherchepremier(BON_LIVRAISON_COM,CLE_B,CLERECHERCHE)
    TANTQUE HTROUVE ALORS
    HSUPPRIME(BON_LIVRAISON)
    SI HErreurIntégrité() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN

    HLITSUIVANT(BON_LIVRAISON_COM,CLE_B)
    FIN

    POUR i=1 _A_ Table..Occurrence
    SI Table.TQT <>0 ALORS
    HRAZ(BON_LIVRAISON_COM)
    BON_LIVRAISON_COM.CLE_B = AN+NUM
    BON_LIVRAISON_COM.NUM_LIGNE = Table.TNUM_LIGNE
    BON_LIVRAISON_COM.DES_ART = Table.TDESART
    BON_LIVRAISON_COM.COD_ART = Table.TREFAR
    BON_LIVRAISON_COM.COD_CLI= COD_CLI
    BON_LIVRAISON_COM.DATE = DATE
    BON_LIVRAISON_COM.P_U_HT= Table.TPUHT
    BON_LIVRAISON_COM.QT = Table.TQT
    BON_LIVRAISON_COM.REM= Table.TRemise
    BON_LIVRAISON_COM.TVA= Table.TTVA
    HAjoute(BON_LIVRAISON_COM)
    SI HErreurDoublon() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN
     
    elhacene, aminej76 et hammatag aiment ça.
  • chfuchs

    chfuchs New Member

    Inscrit:
    Jan 28, 2018
    Messages:
    3
    J'aime reçus:
    6
    moi j'utilise les contextes pour sécuriser si besoin
     
    aminej76 apprécie ceci.
  • aminej76

    aminej76 Active Member
    MEMBRE WX

    Inscrit:
    Jan 23, 2018
    Messages:
    283
    J'aime reçus:
    102
    C'est une nouvelle technique. Pouvez nous eclairir un peu et nous donner un script.
    Merci d'avance.
     
    suenodesign apprécie ceci.
  • chfuchs

    chfuchs New Member

    Inscrit:
    Jan 28, 2018
    Messages:
    3
    J'aime reçus:
    6
    Voici la fonction que j'ai fait:

    PROCEDURE HContexte_Hyperfile(_NOM_CONTEXTE_,_MODE_,_FIC_="*")

    TMP_LISTE_FICHIER,TMP_NOMFIC est une chaîne

    SI _FIC_="*" ALORS
    TMP_LISTE_FICHIER=HListeFichier() //tous les fichiers
    SINON
    TMP_LISTE_FICHIER=Remplace(_FIC_,";",RC) //juste les fichiers passés en param
    FIN

    POUR TOUTE CHAÎNE TMP_NOMFIC DE TMP_LISTE_FICHIER SEPAREE PAR RC
    SI fFichierExiste(RepDonC+[fSep]+"Asoc"+CourDos+[fSep]+TMP_NOMFIC+".FIC") OU fFichierExiste(RepDonC+[fSep]+TMP_NOMFIC+".FIC") OU sMODE_CS OU Data.ConnexionGestionActive ALORS
    SI _MODE_="SAUV"
    HContexte_Hyperfile_[_NOM_CONTEXTE_+TMP_NOMFIC]=HSauvePosition(TMP_NOMFIC,"",hSauveRubriques)
    SINON SI _MODE_="REST"
    SI HContexte_Hyperfile_[_NOM_CONTEXTE_+TMP_NOMFIC]<>-1 ALORS
    HRetourPosition(HContexte_Hyperfile_[_NOM_CONTEXTE_+TMP_NOMFIC],hRPDéfaut+hRPFiltre)
    FIN
    FIN
    FIN
    FIN
     
    elhacene, suenodesign et aminej76 aiment ça.
  • chfuchs

    chfuchs New Member

    Inscrit:
    Jan 28, 2018
    Messages:
    3
    J'aime reçus:
    6
    HContexte_Hyperfile("CONTEXT_CLIENT","SAUV","CLIENT")

    Traitement CLIENT

    HContexte_Hyperfile("CONTEXT_CLIENT","REST","CLIENT")

    Cela permet de lancer un traitement client dans le contexte principale et de parcourir le même fichier avec le même curseur puis restaurer le contexte à la fin
     
    #16 chfuchs, Fev 14, 2018
    Dernière édition: Fev 14, 2018
    suenodesign et aminej76 aiment ça.
  • suenodesign

    suenodesign Well-Known Member
    MEMBRE WX

    Inscrit:
    Jan 1, 2018
    Messages:
    507
    J'aime reçus:
    732
    Excellent, je vais absolument tester. Merci

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

     
  • abdelhalim

    abdelhalim New Member

    Inscrit:
    Jan 6, 2018
    Messages:
    3
    J'aime reçus:
    1
    Moi personnellement j ai constaté que les requetes sont très rrapides en client serveur paraport au filter
     
  • gapplicat

    gapplicat Well-Known Member
    MEMBRE WX

    Inscrit:
    Mar 8, 2018
    Messages:
    399
    J'aime reçus:
    707
    Au lieu de sauvegarder le contexte, traiter un nouveau contexte et restaurer l'ancien contexte, il vaut mieux une requête SQL (1 seule requête au lieu de ... trois)

    A mon avis, le véritable problème de windev lorsque l'on débute c'est les erreurs de contexte.
    Si vous ne voulez pas d'erreur de contexte, utilisez les requêtes SQL...
    10 fois plus rapide en C/S selon nos tests

    Un petit mémo qui nous aide particulièrement :

    RQ_ est une Source de Données
    sTxtRequete est une chaîne

    //-------- SELECT ---------------------------------------------------------------------------------

    sTxtRequete = "SELECT * FROM MONFICHIER WHERE CRITERE = '"+XXXX+"' "
    SI PAS HExécuteRequêteSQL(RQ_,sTxtRequete) ALORS
    Ouvre(FEN_INFO_MINI,cErreurInitialisationRequete+RC+sTxtRequete+RC+HErreurInfo())
    SINON
    HLitPremier(RQ_)
    TANTQUE PAS HEnDehors(RQ_)

    HLitSuivant(RQ_)
    FIN
    HAnnuleDéclaration(RQ_)
    FIN

    //-------- DELETE --------------------------------------------

    sTxtRequete = "DELETE FROM MONFICHIER WHERE XXXXXX >= '"+XXXXXX+"' AND DATELIGNE <= '"+XXXXXX+"' "
    SI PAS HExécuteRequêteSQL(RQ_,sTxtRequete) ALORS
    Erreur("Erreur d'initialisation de la requête"+RC+sTxtRequete+RC+HErreurInfo())
    Ferme
    FIN

    //-------- UPDATE ---------------------------------------------------------------------------------

    SI PAS HExécuteRequêteSQL(RQ_,"UPDATE MONFICHIER SET VARIABLE='"+XXXXXX+"' WHERE SELEC='"+XXXXXX+"'") ALORS
    Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo())
    RETOUR
    FIN

    //-------- INNER JOIN ---------------------------------------------------------------------------------

    sTxtRequete = "SELECT * FROM FICHIER1 INNER JOIN FICHIER2 ON FICHIER1.ID = FICHIER2.ID WHERE CRITERE='"+SansEspace("")+"' "
    SI PAS HExécuteRequêteSQL(RQ_,sTxtRequete) ALORS
    Ouvre(FEN_ERREUR,cErreurInitialisationRequete+RC+sTxtRequete+RC+HErreurInfo())
    SINON
    HLitPremier(RQ_)
    TANTQUE PAS HEnDehors(RQ_)

    HLitSuivant(RQ_)
    FIN
    HAnnuleDéclaration(RQ_)
     
    elhacene et charlie aiment ça.
  • gapplicat

    gapplicat Well-Known Member
    MEMBRE WX

    Inscrit:
    Mar 8, 2018
    Messages:
    399
    J'aime reçus:
    707
    La suppression du bon de commande peut être largement plus rapide en codant :
    Supposons que ta commande ai 10 enregistrements, le Hsupprime fait 10 requêtes à ta base alors qu'une fonction SQL n'effectuera qu'une seule requete...

    Idem pour l'ajout des enregistrements.

    Code (Text):

    sTxtRequete =  "DELETE FROM BON_LIVRAISON_COM WHERE CLE='"+CLERECHERCHE+"' "
    SI PAS HExécuteRequêteSQL(RQ_DEL,sTxtRequete) ALORS   Erreur("Erreur d'initialisation de la requête"+RC+sTxtRequete+RC+HErreurInfo())
     



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

    Bonjur

    Voila comment je procède:

    Hlitrecherchepremier(BON_LIVRAISON_COM,CLE_B,CLERECHERCHE)
    TANTQUE HTROUVE ALORS
    HSUPPRIME(BON_LIVRAISON)
    SI HErreurIntégrité() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN

    HLITSUIVANT(BON_LIVRAISON_COM,CLE_B)
    FIN

    POUR i=1 _A_ Table..Occurrence
    SI Table.TQT <>0 ALORS
    HRAZ(BON_LIVRAISON_COM)
    BON_LIVRAISON_COM.CLE_B = AN+NUM
    BON_LIVRAISON_COM.NUM_LIGNE = Table.TNUM_LIGNE
    BON_LIVRAISON_COM.DES_ART = Table.TDESART
    BON_LIVRAISON_COM.COD_ART = Table.TREFAR
    BON_LIVRAISON_COM.COD_CLI= COD_CLI
    BON_LIVRAISON_COM.DATE = DATE
    BON_LIVRAISON_COM.P_U_HT= Table.TPUHT
    BON_LIVRAISON_COM.QT = Table.TQT
    BON_LIVRAISON_COM.REM= Table.TRemise
    BON_LIVRAISON_COM.TVA= Table.TTVA
    HAjoute(BON_LIVRAISON_COM)
    SI HErreurDoublon() ALORS
    Info(HErreurInfo())
    renvoyer faux
    FIN
    Cliquez pour agrandir...
     
  • Partager cette page

    Chargement...