Indexer à la volée
Par Fox74, dimanche 18 mai 2008 à 19:02 :: Expert :: #7 :: rss
Ou comment utiliser la puissance de VFP pour trier en temps réel nos données
La création d'un index simple IDX (monoclef de 100 caractères maxi) a été améliorée en version 8 par l'option COMPACT. Contrairement aux fichiers d'index composés CDX (multiclefs), le fichier IDX peut être créé en pleine session réseau, en mode partagé. De plus l'objet qui crée le fichier d'index le détruit automatiquement... Attention cependant à ne pas être en bufférisation optimiste de table mais seulement d'enregistrement (Buffering=3) Exemple d'application: Comment ordonner automatiquement une grille en double-cliquant sur l'en-tête d'une colonne: Placer dans le DBLClick Event de l'objet Header de la colonne le code suivant: (On peut bien sûr classer ce code pour être dans toutes les colonnes automatiquement, ou utiliser la commande BINDEVENT) LOCAL lcControlSource, lcTypeControlSource, lnLenControlSource LOCAL lcClef, lnIndex, lnOldBuffering, lcRemplace IF Thisform.lModified OR EOF() && Vider le buffer avant toute indexation ELSE lcControlSource = This.Parent.ControlSource && On récupère le champ courant lcTypeControlSource = TYPE("&lcControlSource") * Récupération de la taille du champ pour remplacer les valeurs nulles DO CASE CASE m.lcTypeControlSource = "D" && Date lnLenControlSource = 8 CASE m.lcTypeControlSource = "L" && Logique lnLenControlSource = 1 CASE m.lcTypeControlSource = "N" && Numérique lnLenControlSource = 0 OTHERWISE lnLenControlSource = LEN(&lcControlSource) ENDCASE IF ISNULL(m.lnLenControlSource) && Le premier enreg est NULL - On ne peut pas indexer lcTypeControlSource="U" ENDIF IF m.lnLenControlSource>100 && Limites de la taille pour l'indexation lcControlSource='LEFT(&lcControlSource,100)' ENDIF IF INLIST(m.lcTypeControlSource,"M","U") && Pas d'indexation ELSE IF PEMSTATUS(This,"cClef",5)=.F. && Ajoute les propriétés cClef et nIndex à l'objet Header This.AddProperty("cClef","") This.AddProperty("nIndex",0) ENDIF lnIndex = This.nIndex This.cClef = This.Parent.Parent.Column1.ControlSource && récupération de la clef lcClef = This.cClef lcOldClef = &lcClef && Sauvegarde le pointeur lnOldBuffering = CURSORGETPROP("Buffering") IF lnOldBuffering!=1 && Pas de bufferisation CURSORSETPROP("Buffering",3) && Bascule en optimiste d'enreg ENDIF IF m.lnIndex = 0 && première indexation This.Parent.Parent.SetAll("nIndex",0) && Désactive l'ordre de toutes les colonnes This.nIndex = 1 && Active cette colonne DO CASE CASE lcTypeControlSource="C" lcRemplace="'"+REPLICATE("$",MIN(lnLenControlSource,100))+"'" INDEX ON UPPER(NVL(&lcControlSource,&lcRemplace)) TO (SYS(2015)) && Le buffer en mode 3 CASE lcTypeControlSource="N" INDEX ON NVL(&lcControlSource,0) TO (SYS(2015)) && Le buffer en mode 3 CASE lcTypeControlSource="L" INDEX ON NVL(&lcControlSource,.F.) TO (SYS(2015)) && Le buffer en mode 3 CASE lcTypeControlSource="D" INDEX ON NVL(&lcControlSource,{}) TO (SYS(2015)) && Le buffer en mode 3 ENDCASE ELSE && nIndex!=0 IF m.lnIndex=1 && Trié ascendant This.nIndex=2 SET ORDER TO 1 DESCENDING This.parent.Parent.DoScroll(2) && PageUp ELSE This.nIndex=1 SET ORDER TO 1 ASCENDING ENDIF ENDIF && lnIndex!=0 IF lnOldBuffering =1 && Pas de bufferisation This.parent.parent.Refresh() ELSE CURSORSETPROP("Buffering",lnOldBuffering) && Etat initial ENDIF LOCATE FOR &lcClef = m.lcOldClef This.parent.Parent.Columns[1].Text1.SetFocus() ENDIF && INLIST(lcTypeControlSource,"M") ENDIF && Thisform.lModified OR EOF()
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.