INDICE - CREAR NUEVO
Moderator: Rathinagiri
- SALINETAS24
- Posts: 667
- Joined: Tue Feb 27, 2018 3:06 am
- DBs Used: DBF
- Contact:
INDICE - CREAR NUEVO
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
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. 

Re: INDICE - CREAR NUEVO
Hi,
Please take a look for the ADDITIVE clause in the command INDEX ON.
Code sample:
Hope that helps. 
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

Kind Regards,
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
- SALINETAS24
- Posts: 667
- Joined: Tue Feb 27, 2018 3:06 am
- DBs Used: DBF
- Contact:
Re: INDICE - CREAR NUEVO
Muchas gracias Gfilatov.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:
Hope that helps.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
![]()
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. 

Re: INDICE - CREAR NUEVO
Try the command


Sample code:DELETE TAG <indexfile>
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())

Kind Regards,
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
Grigory Filatov
"Everything should be made as simple as possible, but no simpler." Albert Einstein
- SALINETAS24
- Posts: 667
- Joined: Tue Feb 27, 2018 3:06 am
- DBs Used: DBF
- Contact:
Re: INDICE - CREAR NUEVO
Hola gfilatov y muchas gracias.gfilatov wrote: ↑Fri Jan 29, 2021 7:07 pm Try the command
Sample code:DELETE TAG <indexfile>Code: Select all
use test shared new alias simpsons cAlias := Alias() .... / ....
![]()
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.

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".

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

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. 

- 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
Hola... para eliminar el archivo físico debes usar Ferase ()
OrdDestroy () sólo quita un indice de dentro del archivo cdx.
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
WhatsApp / Telegram: +54 911-63016162
- SALINETAS24
- Posts: 667
- Joined: Tue Feb 27, 2018 3:06 am
- DBs Used: DBF
- Contact:
Re: INDICE - CREAR NUEVO
Hola Claudio, agradecido por contestar...,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.
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. 

- 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
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.
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
WhatsApp / Telegram: +54 911-63016162
Re: INDICE - CREAR NUEVO
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.
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
Franco
Canada