INDICE - CREAR NUEVO

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

INDICE - CREAR NUEVO

Post by SALINETAS24 »

Hola a todos.

En mi aplicación tengo las DBF con sus indices abiertos, pero en un momento determinado necesito crear un INDICE TEMPORAL, pero que no me cierre los que tengo abiertos, ni que me los modifique. Seria como añadir un nuevo indice.

Imaginate, tengo la DBF de los clientes con un indice por código, pero para un listado necesito obtener un nuevo orden, necesito crear un nuevo indice por Nombre, o por Calle, o por PAIS.., ETC. Este indice solo se usa esta vez, después se elimina. Y necesito que sea un indice, no puedo usar tablas.

He utilizado DBCREATEINDEX e INDEX ON pero ambas opciones me cierran los indices abiertos de la DBF seleccionada, lo cual me trastorna, ya que no puedo estar abriendo y cerrando.
También he intentado usar ORDCREATE pero ha sido negativo.

Alguien conoce la forma de crear un nuevo indice sobre una DBF y que no afecte a los demás Indices.

Muy agradecido
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
gfilatov
Posts: 1090
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: INDICE - CREAR NUEVO

Post by gfilatov »

Hi,

Please take a look for the ADDITIVE clause in the command INDEX ON.

Code sample:

Code: Select all

   INDEX ON INDEX_KEY_CHAR TO test_c.idx
   INDEX ON INDEX_KEY_NUM  TO test_n.idx ADDITIVE
   INDEX ON INDEX_KEY_DATE TO test_d.idx ADDITIVE
   INDEX ON INDEX_KEY_LOG  TO test_l.idx ADDITIVE 
Hope that helps. :idea:
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: INDICE - CREAR NUEVO

Post by SALINETAS24 »

gfilatov wrote: Fri Jan 29, 2021 9:56 am Hi,

Please take a look for the ADDITIVE clause in the command INDEX ON.

Code sample:

Code: Select all

   INDEX ON INDEX_KEY_CHAR TO test_c.idx
   INDEX ON INDEX_KEY_NUM  TO test_n.idx ADDITIVE
   INDEX ON INDEX_KEY_DATE TO test_d.idx ADDITIVE
   INDEX ON INDEX_KEY_LOG  TO test_l.idx ADDITIVE 
Hope that helps. :idea:
Muchas gracias Gfilatov.
Otra cuestión.
¿Es posible cerrar un indice .., solo un indice?
En el ejemplo anterior, seria posible cerrar el segundo indice sin necesidad de cerrar la DBF.
Agradecido de antemano.., vamos con una cervecita bien fresquita!!
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
gfilatov
Posts: 1090
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: INDICE - CREAR NUEVO

Post by gfilatov »

Try the command :arrow:
DELETE TAG <indexfile>
Sample code:

Code: Select all

    use test shared new alias simpsons
    cAlias := Alias()
    index on age to agId
    index on state to stId additive
   
    ? "Active RDD:", rddName()
    ? "----------------------------------------------"
   
    ? PadR("Active Work Area", 40, "."), hb_ntos(Select())
    ? PadR("Table name (ALIAS):", 40, "."), cAlias
    ? PadR("Controling index", 40, "."), (cAlias)->(ordBagName())
    ? PadR("Index Key", 40, "."), (cAlias)->(ordKey())
 
    DELETE TAG stId
    ? "----------------------------------------------"
    (cAlias)->( ordSetFocus(1) )
    ? PadR("Controling index", 40, "."), (cAlias)->(ordBagName())
    ? PadR("Index Key", 40, "."), (cAlias)->(ordKey())
:idea:
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: INDICE - CREAR NUEVO

Post by SALINETAS24 »

gfilatov wrote: Fri Jan 29, 2021 7:07 pm Try the command :arrow:
DELETE TAG <indexfile>
Sample code:

Code: Select all

    use test shared new alias simpsons
    cAlias := Alias()
	.... / ....
:idea:
Hola gfilatov y muchas gracias.

Sabia que estaba en el camino correcto, yo estaba usando ORDDESTROY pero no conseguía que funcionara. Ahora y gracias a su ejemplo he podido compararlos y ya funciona, PERO no obstante y bajo mi humilde opinión creo que hay un BUG en HARBOUR. :roll:

Mire mi ejemplo, basado en el suyo, defino dos variables cFichero1 y cFichero2, funciona correctamente, cuando termina la ejecución si se comprueba en el directorio verá que el indice "fichero2" ha sido borrado. OK!

Ahora bien, si usamos las variables que tienen directorio "GetCurrentFolder()+"\fichero1" verá que el fichero no se borra, el fichero persiste, de hay que yo no pudiera eliminarlo ya que todos los ficheros temporales yo los creo en un directorio "TEMP". :evil:

Por eso amigo, creo que salvo que yo este equivocado, hemos pillado a HARBOUR. 8-)

Y ahora si, vamos con una cervecita fresquita que invito yo !!!!

Code: Select all


#include "hmg.ch"


Function Main

Local aarq := {} 
* LOCAL cFichero1:=GetCurrentFolder()+"\fichero1"
* LOCAL cFichero2:=GetCurrentFolder()+"\fichero2"
  LOCAL cFichero1:="fichero1"
  LOCAL cFichero2:="fichero2"

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 640 ;
		HEIGHT 400 ;
		TITLE 'PROBATURA' ;
		MAIN
		If ! FILE( "test.DBF" )
			Aadd( aArq , { 'CODIGO'  , 'C'   , 04    , 0 } )
			Aadd( aArq , { 'NOME '       , 'C'   , 40    , 0 } )
			Aadd( aArq , { 'ENDERECO'    , 'C'   , 40    , 0 } )
			Aadd( aArq , { 'BAIRRO'      , 'C'   , 25    , 0 } )
			Aadd( aArq , { 'CEP'         , 'C'   , 08    , 0 } )
			Aadd( aArq , { 'CIDADE'      , 'C'   , 25    , 0 } )
			Aadd( aArq , { 'ESTADO'      , 'C'   , 02    , 0 } )
			Aadd( aArq , { 'FONE1'       , 'C'   , 10    , 0 } )
			Aadd( aArq , { 'FONE2'       , 'C'   , 10    , 0 } )
			Aadd( aArq , { 'EMAIL'       , 'C'   , 40    , 0 } )
			DBCreate( "test.DBF" , aArq  )     
		EndIf

		
		use test shared new alias simpsons
		cAlias := Alias()

		index on NOME to (cfichero1)
		index on ENDERECO to (cfichero2) additive
	
		MSGBOX("Active RDD:", rddName() )
		
		MSGBOX( PadR("Active Work Area", 40, "."), hb_ntos(Select()) )
		MSGBOX(PadR("Table name (ALIAS):", 40, "."), cAlias )
		MSGBOX(PadR("Controling index", 40, "."), (cAlias)->(ordBagName()) )
		MSGBOX(PadR("Index Key", 40, "."), (cAlias)->(ordKey()) )
	
		ORDDESTROY(cfichero2)
		
		(cAlias)->( ordSetFocus(1) )
		MSGBOX( PadR("Controling index", 40, "."), (cAlias)->(ordBagName()) )
		MSGBOX( PadR("Index Key", 40, "."), (cAlias)->(ordKey()) )
		
		
	END WINDOW

	CENTER WINDOW Form_1

	ACTIVATE WINDOW Form_1
	

Return

Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: INDICE - CREAR NUEVO

Post by Claudio Ricardo »

Hola... para eliminar el archivo físico debes usar Ferase ()
OrdDestroy () sólo quita un indice de dentro del archivo cdx.
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: INDICE - CREAR NUEVO

Post by SALINETAS24 »

Claudio Ricardo wrote: Sat Jan 30, 2021 3:38 am Hola... para eliminar el archivo físico debes usar Ferase ()
OrdDestroy () sólo quita un indice de dentro del archivo cdx.
Hola Claudio, agradecido por contestar...,

OrdDestroy() y DELETE TAG eliminan físicamente el fichero del disco duro.

Ejecuta el programa que he puesto para comprobarlo. El problema lo tengo en que no puedo asignar un Directorio de Trabajo.

Una cervecita fresquita para empezar el dia !!
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: INDICE - CREAR NUEVO

Post by Claudio Ricardo »

Hola... Me fije en la doc de Harbour para asegurarme de no haberme equivocado, y reza asi:

Remove an Order from an Order Bag
ordDestroy( <cOrderName> [, <cOrderBagName> ] )
<cOrderName> Name of the order to remove
<cOrderBagName> Name of the order bag from which order id to be removed

This function attempts to remove the order named <cOrderName> from the
file containing the order bag name <cOrderBagName>. If <cOrderBagName>
is not specified, then the name of the file will be based on the value
of the ordName() function. If the extension is not included with the
name of the order file, then the extension will be obtained from the
default extension of the current and active RDD.

The DBFNTX driver do not support multiple order bags; therefore, there
cannot be an order to "destroy" from a bag. This function only works
for those drivers with support multiple orders bags (e.q. DBFCDX
and RDDADS drivers).

No dice nada de eliminar el archivo fisico, solo indices dentro del archivo CDX...
en este caso el bug sería que borrara el archivo y no el indice contenido en él (según la doc)
Igual en tu prg la orden "Index On xcampo To xarchindice" crea uno nuevo sobreescribiendo el viejo.
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
franco
Posts: 877
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: INDICE - CREAR NUEVO

Post by franco »

How I do This is in my tbrowse example.
At start of main program i create a temp folder on this computer *****BEING SERVER OR TERMINAL FOR SPEED OF INDEX ON NETWORKS
createfolder('C:\MYINDTEMP') // or what ever
Local oldrec1, nord
use test shared new alias simpsons
cAlias := Alias()
index on NOME to (cfichero1)
index on ENDERECO to (cfichero2) additive
set index to cfichero1, cfichero2

SELECT test or cAlias
************************************** new area
oldrec1 := recno()
nord := indexord()
index on *somthing* to C:\MYINDTEMP\TEMP.NTX ** could add for something = something EVEN $ something
*** IF YOU WANT TO UPDATE YOUR OTHER INDEXES WITH NEW INFOMATION
*** SOMETIMES I CREATE A VARIABLE FOR THE TEMP INDEX IN DECLARATIONS LOCAL TMP := 'C:\MYINDTEMP\TEMP' THEN I CAN USE &TMP
SET INDEX TO &tmp, cfichero1, cfichero2
or SET INDEX TO C:\MYINDTEMP\TEMP, cfichero1, cfichero2
*** OTHERWISE I DO NOT USE THIS STATEMENT.
SET INDEX TO &TMP OR YOU DO NOT NEED THIS IF NOT UPPDATING OTHER INDEXES AS WHEN YOU INDEX IT SETS THE INDEX TO &TMP
*** AT END OF PROCEDURE
set order to nord
oldrec := recno()
dbgoto(oldrec) //PUTS YOU BACK WHERE YOU WHERE
********* YOU COULD ERASE OLD TEMP INDEX I MOSTLY DON`T AS I JUST OVERWRITE IT NEXTIME.
********* ALSO SOMETIMESI USE DIFFERENT TEMP INDEX NAMES CORRESPONDING TO THE FILE I AM USING.
All The Best,
Franco
Canada
Post Reply