Ici :Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!
-
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.
Page 1 sur 2
Merci pour cette explication technique !
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.
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
![]()
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
C'est une nouvelle technique. Pouvez nous eclairir un peu et nous donner un script.
Merci d'avance.
suenodesign apprécie ceci.
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.
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
suenodesign et aminej76 aiment ça.
Moi personnellement j ai constaté que les requetes sont très rrapides en client serveur paraport au filter
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_)
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())
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
FINCliquez pour agrandir...
Page 1 sur 2