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()