cs_Django1
Messages postés9Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention 2 février 2010
-
30 sept. 2009 à 16:56
AbaqueInside
Messages postés16Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention14 novembre 2009
-
2 oct. 2009 à 14:52
Bonjour,
J'aimerai avoir un exemple de code pour éviter le REPLACE ALL qui fait défiler tout les enregistrements.
J'ai entendu parler d'un codage qui travail ligne par ligne et non colonne par colonne.
Voilà un petit exemple de code utiliser (j'utilise des .prg pas de form) :
(Tout les champs sont en char)
REPLACE ALL NUMCARTE WITH NO_CM
REPLACE ALL NUMCARTE WITH '2090000000009' FOR ALLTRIM (NUMCARTE) = ''
REPLACE ALL CODEBARRE WITH ALLTRIM (NO_CODE49)
REPLACE ALL MAG_NUM WITH ALLTRIM (SUBSTR (vNUM_MAG,2,2)) FOR LEFT (vNUM_MAG,1) = '0'
REPLACE ALL MAG_NUM WITH ALLTRIM (SUBSTR (vNUM_MAG,3,1)) FOR LEFT (vNUM_MAG,2) = '00'
REPLACE ALL MAG_NUM WITH ALLTRIM (vNUM_MAG) FOR LEFT (vNUM_MAG,1) <> '0'
REPLACE ALL PAYS WITH '' FOR PAYS = 'FRANCE'
michelatoutfox
Messages postés828Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention 7 mai 20131 30 sept. 2009 à 20:05
Bonjour,
Je ne comprends pas ce que tu veux dire: "ligne par ligne" ou "faire défiler tous les enregistrements", c'est la même chose.
Ce que tu peux faire, si tu dois faire un replace sur une table pour plusieurs champs avec la même condition FOR, c'est écrire REPLACE champ1 WITH savaleur1, champ2 WITH savaleur2, ... FOR ...
si ton code est réellement ce que tu nous montres, alors tu ne gagneras rien à utiliser une syntaxe différente (UPDATE matable SET...).
Mais tu peux améliorer ton code, en regardant la syntaxe de EMPTY pour remplacer ton alltrim='', et aussi en utilisant des variables préfixées, et aussi en regardant le == à la place du = (surtout si tu ne nous précises pas ton SET NEAR et ton SET EXACT).
Alors, quel est ton code réel, et quel est ton problème?
(et ta version de VFP?)
AbaqueInside
Messages postés16Date d'inscriptionmardi 5 octobre 2004StatutMembreDernière intervention14 novembre 20091 1 oct. 2009 à 17:47
Bonjour
Tu peux faire tous les REPLACE sans FOR en une seule instruction
REPLACE ALL NUMCARTE WITH NO_CM, CODEBARRE WITH ALLTRIM (NO_CODE49) && parcourt toute la table une seule fois
Pour les REPLACE FOR, si l'expression de filtre correspond à l'expression d'un index, REPLACE trouve directement les enrgistrements à modifier sans balayer la table (technologie d'optimisation Rushmore)
Note : avec REPLACE FOR, la clause ALL est inutile
En clair, pour optimiser
REPLACE ALL NUMCARTE WITH '2090000000009' FOR ALLTRIM (NUMCARTE) = ''
il faut écrire
REPLACE NUMCARTE WITH '2090000000009' FOR Empty(NUMCARTE)
et que la table correspondante ait un index regular (ou mieux binary avec VFP >=8) sur Empty(NUMCARTE)
INDEX ON Empty(NUMCARTE) TAG NUMCARTE_E BINARY
Même principe pour les autres conditions FOR
REPLACE MAG_NUM WITH ALLTRIM (SUBSTR (vNUM_MAG,2,2)) FOR LEFT (vNUM_MAG,1) = '0'
INDEX ON LEFT (vNUM_MAG,1) TAG vNUM_MAG1
REPLACE MAG_NUM WITH ALLTRIM (SUBSTR (vNUM_MAG,3,1)) FOR LEFT (vNUM_MAG,2) = '00'
INDEX ON LEFT (vNUM_MAG,2) TAG vNUM_MAG2
REPLACE MAG_NUM WITH ALLTRIM (vNUM_MAG) FOR LEFT (vNUM_MAG,1) <> '0'
INDEX ON LEFT (vNUM_MAG,1) TAG vNUM_MAG1 && cf. ci-dessus
REPLACE ALL PAYS WITH '' FOR PAYS = 'FRANCE'
INDEX ON PAYS TAG PAYS && cf. ci-dessus
Communauté Francophone des Professionnels FoxPro
news://news.AtoutFox.org/AtoutFox.association
www.AtoutFox.org
cs_Django1
Messages postés9Date d'inscriptionlundi 11 août 2008StatutMembreDernière intervention 2 février 2010 1 oct. 2009 à 09:11
Bonjour et merci de l'interet porté,
Donc oui c'est mon code réel, la question est que pour une table de 10 000 enregistrements tout fonctionne bien mais si je passe sur une table de 150 000 enregistrements là ça rame, c'est pour cela que j'aurais voulu optimiser mon code.
En ce qui concerne le SET NEAR et SET EXACT je ne sais pas utiliser (100% 'je me débrouille comme je peux', pas de formation de dev juste de l'intution en parcourant internet) donc je prend toutes les infos.