OPTIMISATION de code [Résolu]

Signaler
Messages postés
9
Date d'inscription
lundi 11 août 2008
Statut
Membre
Dernière intervention
2 février 2010
-
Messages postés
16
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
14 novembre 2009
-
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'

Merci de vos réponses

5 réponses

Messages postés
828
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
7 mai 2013
1
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?)
Messages postés
16
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
14 novembre 2009
1
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
Messages postés
9
Date d'inscription
lundi 11 août 2008
Statut
Membre
Dernière intervention
2 février 2010

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.

Merci
Messages postés
9
Date d'inscription
lundi 11 août 2008
Statut
Membre
Dernière intervention
2 février 2010

Merci beaucoup pour ton aide
Messages postés
16
Date d'inscription
mardi 5 octobre 2004
Statut
Membre
Dernière intervention
14 novembre 2009
1
De rien ... ;-)

Tu peux aussi éviter un index et un REPLACE FOR en groupant les deux REPLACE MAG_NUM

REPLACE ALL NUMCARTE WITH NO_CM;
, CODEBARRE WITH ALLTRIM (NO_CODE49);
, MAG_NUM WITH Iif(LEFT (vNUM_MAG,1) = '0';
, ALLTRIM(SUBSTR(vNUM_MAG,2,2));
, ALLTRIM (SUBSTR (vNUM_MAG,3,1));
)

Communauté Francophone des Professionnels FoxPro
news://news.AtoutFox.com/AtoutFox.public.association
www.AtoutFox.org