In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Crear archivo indice

Foro público de Xailer en español
Elias
Posts: 15
Joined: Sat Jun 21, 2008 11:12 pm

Crear archivo indice

Postby Elias » Mon Nov 10, 2008 9:01 am

Saludos a todos
Alguien podría indicarme como crear en archivo índice con
TDbfDataSet, utilizo archivos Dbf con índices Cdx y MultiTags.
Lo que quiero es crear una rutina para reindexar los archivos índices
que utilizo en la aplicación, que los que existan los elimine antes de
volver a crearlo. En Clipper utilizaba algo así:
IF FILE( cPath + "Invoic.Cdx" )
FERASE( cPath + "Invoic.Cdx" )
ENDIF
IF !NET_USE( "Invoic.Dbf" , FALSE, 5, "Invoic", cPath )
BREAK
ENDIF
EVAL( bStartGauge, "Invoic.Cdx", "1", "5" )
ORDCONDSET( 'Invoic->Invo_Stat == "F"', {|| Invoic->Invo_Stat == "F" },,,
{|| Gauge() },, RECNO(),,,, )
ORDCREATE( "Invoic.Cdx", "Facturas", "Invoic->Invoic_Id", { || Invoic->Invoic_Id
} )
EVAL( bEndGauge )
....
....
....
Como hago lo mismo con TDbfDataSet ?????
De antemano Gracias.
jrcpoli
Posts: 240
Joined: Wed Oct 25, 2006 8:55 pm

Crear archivo indice

Postby jrcpoli » Mon Nov 10, 2008 12:45 pm

Saludos:
Según la ayuda de Xailer la función equvalente a las dos funciones OrdConSet
y OrdCreate es TDbfDataSet:AddTag.
Por si te sirve de orientación y empleando otra forma de hacerlo te adjunto
parte de un metodo, se basa en un fichero de base de datos que contiene
todos los indices a utilizar en una aplicación y que se llama Indices.dbf.
METHOD Crear_ind(bases_dbf, cDirBases) CLASS TFormCompdbf
*
LOCAL nombre_dbf := ALLTRIM(UPPER(bases_dbf))
LOCAL nombre_ind := ""
LOCAL fichero_ind:= ""
LOCAL fichero_tag:= ""
LOCAL clave_ind := ""
LOCAL nVeces := 0
LOCAL n := 0
LOCAL estruc_ind := {}
LOCAL oDSLocal
*
** Cursor reloj arena
Application:lBusy := .T.
*
** Trabajar con la base de datos de Indices
WITH OBJECT ::oDSIndices := TDbfDataSet():Create()
IF (:lOpen == .T.)
:lOpen := .F.
ENDIF
*
:cName := "INDICES.DBF"
:lShared := .F.
:oDataSource := ::oDataSource
*
IF (:lOpen := .T.)
*
** Selecciona el indice
:OrdSetFocus("INDICES")
*
** Recorrer la base de datos indices
:Seek(ALLTRIM(UPPER(nombre_dbf)))
DO WHILE ALLTRIM(UPPER(:NOMB_DBF)) == nombre_dbf .AND. !:EoF()
*
** Comprobar que existe el indice "CDX"
nombre_ind := cDirBases + Alltrim(:NOMB_DBF) + ".CDX"
IF FILE(nombre_ind) .AND. nVeces = 0
** Borrar el indice
FERASE(nombre_ind)
*
ENDIF
*
** Aumentar el contador para no borrarlo
nVeces++
*
** Crear un array con los datos de los indices a crear
AADD(estruc_ind, { ALLTRIM(:NOMB_DBF), ALLTRIM(:NOMB_IND),;
ALLTRIM(:EXPR_IND), :UNICO, :DESCEND })
*
:Skip()
*
END DO
*
ENDIF
*
:End()
END
*
** Si el array contine datos
IF Len(estruc_ind) > 0
*
nombre_dbf := cDirBases + bases_dbf + ".DBF"
*
** Abrir base de datos que estamos procesando
WITH OBJECT oDSLocal := TDbfDataSet():Create(Self, ::oDataSource,
nombre_dbf)
IF (:lOpen == .T.)
:lOpen := .F.
ENDIF
*
:lShared := .F.
*
IF (:lOpen := .T.)
*
FOR n := 1 TO LEN(estruc_ind)
*
fichero_ind := estruc_ind[ n, 1]
Fichero_ind := cDirBases + fichero_ind
fichero_tag := estruc_ind[ n, 2]
clave_ind := estruc_ind[ n, 3]
*
DO CASE
** La clave es UNICO = .T. y DESCEND = .F.
CASE estruc_ind[ n, 4] == .T. .AND. estruc_ind[ n, 5] ==
..F.
*
INDEX ON &clave_ind TAG &fichero_tag ;
TO &fichero_ind UNIQUE
*
** La Clave es UNICO = .F. y DESCEND = .F.
CASE estruc_ind[ n, 4] == .F. .AND. estruc_ind[ n, 5] ==
..F.
*
INDEX ON &clave_ind TAG &fichero_tag ;
TO &fichero_ind
*
** La clave es UNICO = .T. y DESCEND = .T.
CASE estruc_ind[ n, 4] == .T. .AND. estruc_ind[ n, 5] ==
..T.
*
INDEX ON &clave_ind TAG &fichero_tag ;
TO &fichero_ind UNIQUE DESCENDING
*
** La clave es unico = .F. y DESCEND = .T.
CASE estruc_ind[ n, 4] == .F. .AND. estruc_ind[ n, 5] ==
..T.
*
INDEX ON &clave_ind TAG &fichero_tag ;
TO &fichero_ind DESCENDING
*
END CASE
NEXT
ENDIF
:End()
END
*
ENDIF
*
** Cursor Normal
Application:lBusy := .F.
*
RETURN Nil
José Ramón Castro
"Andrade" <tecnicom_2000@yahoo.com> escribió en el mensaje de noticias
news:4917ea50$1@ozsrv2.ozlan.local...
>
> Saludos a todos
>
> Alguien podrí­a indicarme como crear en archivo í­ndice con
> TDbfDataSet, utilizo archivos Dbf con í­ndices Cdx y MultiTags.
> Lo que quiero es crear una rutina para reindexar los archivos í­ndices
> que utilizo en la aplicación, que los que existan los elimine antes de
> volver a crearlo. En Clipper utilizaba algo así­:
>
> IF FILE( cPath + "Invoic.Cdx" )
> FERASE( cPath + "Invoic.Cdx" )
> ENDIF
>
> IF !NET_USE( "Invoic.Dbf" , FALSE, 5, "Invoic", cPath )
> BREAK
> ENDIF
>
> EVAL( bStartGauge, "Invoic.Cdx", "1", "5" )
> ORDCONDSET( 'Invoic->Invo_Stat == "F"', {|| Invoic->Invo_Stat == "F" },,,
> {|| Gauge() },, RECNO(),,,, )
> ORDCREATE( "Invoic.Cdx", "Facturas", "Invoic->Invoic_Id", { ||
> Invoic->Invoic_Id
> } )
> EVAL( bEndGauge )
> ...
> ...
> ...
>
> Como hago lo mismo con TDbfDataSet ?????
>
> De antemano Gracias.
>
José Ramón Castro.
Elias
Posts: 15
Joined: Sat Jun 21, 2008 11:12 pm

Crear archivo indice

Postby Elias » Thu Nov 13, 2008 2:43 am

Gracias por tu respuesta.
=?iso-8859-1?Q?Jos=E9_Ram=F3n_Castro?= <jrcpoli@terra.es> wrote:
>Saludos:
>
>Según la ayuda de Xailer la función equvalente a las dos funciones OrdConSet
>y OrdCreate es TDbfDataSet:AddTag.
>
>Por si te sirve de orientación y empleando otra forma de hacerlo te adjunto
>parte de un metodo, se basa en un fichero de base de datos que contiene
>todos los indices a utilizar en una aplicación y que se llama Indices.dbf.
>
>METHOD Crear_ind(bases_dbf, cDirBases) CLASS TFormCompdbf
> *
> LOCAL nombre_dbf := ALLTRIM(UPPER(bases_dbf))
> LOCAL nombre_ind := ""
> LOCAL fichero_ind:= ""
> LOCAL fichero_tag:= ""
> LOCAL clave_ind := ""
> LOCAL nVeces := 0
> LOCAL n := 0
> LOCAL estruc_ind := {}
> LOCAL oDSLocal
> *
> ** Cursor reloj arena
> Application:lBusy := .T.
> *
> ** Trabajar con la base de datos de Indices
> WITH OBJECT ::oDSIndices := TDbfDataSet():Create()
> IF (:lOpen == .T.)
> :lOpen := .F.
> ENDIF
> *
> :cName := "INDICES.DBF"
> :lShared := .F.
> :oDataSource := ::oDataSource
> *
> IF (:lOpen := .T.)
> *
> ** Selecciona el indice
> :OrdSetFocus("INDICES")
> *
> ** Recorrer la base de datos indices
> :Seek(ALLTRIM(UPPER(nombre_dbf)))
> DO WHILE ALLTRIM(UPPER(:NOMB_DBF)) == nombre_dbf .AND. !:EoF()
> *
> ** Comprobar que existe el indice "CDX"
> nombre_ind := cDirBases + Alltrim(:NOMB_DBF) + ".CDX"
> IF FILE(nombre_ind) .AND. nVeces = 0
> ** Borrar el indice
> FERASE(nombre_ind)
> *
> ENDIF
> *
> ** Aumentar el contador para no borrarlo
> nVeces++
> *
> ** Crear un array con los datos de los indices a crear
> AADD(estruc_ind, { ALLTRIM(:NOMB_DBF), ALLTRIM(:NOMB_IND),;
> ALLTRIM(:EXPR_IND), :UNICO, :DESCEND })
> *
> :Skip()
> *
> END DO
> *
> ENDIF
> *
> :End()
> END
> *
> ** Si el array contine datos
> IF Len(estruc_ind) > 0
> *
> nombre_dbf := cDirBases + bases_dbf + ".DBF"
> *
> ** Abrir base de datos que estamos procesando
> WITH OBJECT oDSLocal := TDbfDataSet():Create(Self, ::oDataSource,
>nombre_dbf)
> IF (:lOpen == .T.)
> :lOpen := .F.
> ENDIF
> *
> :lShared := .F.
> *
> IF (:lOpen := .T.)
> *
> FOR n := 1 TO LEN(estruc_ind)
> *
> fichero_ind := estruc_ind[ n, 1]
> Fichero_ind := cDirBases + fichero_ind
> fichero_tag := estruc_ind[ n, 2]
> clave_ind := estruc_ind[ n, 3]
> *
> DO CASE
> ** La clave es UNICO = .T. y DESCEND = .F.
> CASE estruc_ind[ n, 4] == .T. .AND. estruc_ind[ n, 5]
==
>.F.
> *
> INDEX ON &clave_ind TAG &fichero_tag ;
> TO &fichero_ind UNIQUE
> *
> ** La Clave es UNICO = .F. y DESCEND = .F.
> CASE estruc_ind[ n, 4] == .F. .AND. estruc_ind[ n, 5]
==
>.F.
> *
> INDEX ON &clave_ind TAG &fichero_tag ;
> TO &fichero_ind
> *
> ** La clave es UNICO = .T. y DESCEND = .T.
> CASE estruc_ind[ n, 4] == .T. .AND. estruc_ind[ n, 5]
==
>.T.
> *
> INDEX ON &clave_ind TAG &fichero_tag ;
> TO &fichero_ind UNIQUE DESCENDING
> *
> ** La clave es unico = .F. y DESCEND = .T.
> CASE estruc_ind[ n, 4] == .F. .AND. estruc_ind[ n, 5]
==
>.T.
> *
> INDEX ON &clave_ind TAG &fichero_tag ;
> TO &fichero_ind DESCENDING
> *
> END CASE
> NEXT
> ENDIF
> :End()
> END
> *
> ENDIF
> *
> ** Cursor Normal
> Application:lBusy := .F.
> *
>RETURN Nil
>
>José Ramón Castro
>
>"Andrade" <tecnicom_2000@yahoo.com> escribió en el mensaje de noticias
>news:4917ea50$1@ozsrv2.ozlan.local...
>>
>> Saludos a todos
>>
>> Alguien podría indicarme como crear en archivo índice con
>> TDbfDataSet, utilizo archivos Dbf con índices Cdx y MultiTags.
>> Lo que quiero es crear una rutina para reindexar los archivos índices
>> que utilizo en la aplicación, que los que existan los elimine antes de
>> volver a crearlo. En Clipper utilizaba algo así:
>>
>> IF FILE( cPath + "Invoic.Cdx" )
>> FERASE( cPath + "Invoic.Cdx" )
>> ENDIF
>>
>> IF !NET_USE( "Invoic.Dbf" , FALSE, 5, "Invoic", cPath )
>> BREAK
>> ENDIF
>>
>> EVAL( bStartGauge, "Invoic.Cdx", "1", "5" )
>> ORDCONDSET( 'Invoic->Invo_Stat == "F"', {|| Invoic->Invo_Stat == "F" },,,
>> {|| Gauge() },, RECNO(),,,, )
>> ORDCREATE( "Invoic.Cdx", "Facturas", "Invoic->Invoic_Id", { ||
>> Invoic->Invoic_Id
>> } )
>> EVAL( bEndGauge )
>> ...
>> ...
>> ...
>>
>> Como hago lo mismo con TDbfDataSet ?????
>>
>> De antemano Gracias.
>>
>

Return to “Spanish”