cómo hacer un mantenimiento de índices de tablas

198 views
Skip to first unread message

Hitiel Hernández

unread,
May 4, 2015, 5:26:59 PM5/4/15
to publice...@googlegroups.com
buen día compañeros foxeros.

Resulta que la otra vez se me arruinaron algunos IDX de mis tablas (nativas) y quiero hacer un mantenimiento para que el admninistrador del sistema al correrlo no tenga nada más que hacer que esperar.

he intentado haciéndolo tabla por tabla pero me parece muy engorroso.

Existe alguna forma de hacerlo más rápido, es decir que se lea cada tabla y sus índices y que los recree todos nuevamente?

Espero sus aporte, de antemano, muchas gracias

--
Sabiduría ante todo; adquiere sabiduría

Allan Raúl Acuña

unread,
May 4, 2015, 5:55:36 PM5/4/15
to publice...@googlegroups.com
Pruebas con estas lineas.

Set Talk Off
Set Safety Off
Set Exclusive Off
Close Databases
Set Deleted Off
Open Database vigilar.Dbc Shared
cNomTablas = Adbobject(dbcTablas, "TABLE")
*!* ====================================================================
cNomTablas = Adbobject(infVector, "TABLE")
For Each cNomTablas In infVector
Set Exclusive Off
bandera = .T.
On Error bandera = .F.
Use &cNomTablas Exclusive
On Error
If bandera
select (&cNomTablas)
reindex 
Endif
Endfor

Saludos cordiales.

Lic. Allan Raúl Acuña
Analista Programador
msn= allan...@hotmail.com
skype= NicEasySoft
            +(505) 8 999 8950
Managua, Nicaragua
Centroamérica



Date: Mon, 4 May 2015 15:26:55 -0600
Subject: [vfp] cómo hacer un mantenimiento de índices de tablas
From: hiti...@gmail.com
To: publice...@googlegroups.com

Luis Santander

unread,
May 4, 2015, 6:07:14 PM5/4/15
to publice...@googlegroups.com
Ese codigo esta muy bueno (uso algo similar para las nativas), pero antes
debes establecer el porque de la perdida de indices para introducir las
correciones necesarias para que esto no vuelva a ocurrir.

No estaria de mas si muestras un poco del codigo en donde accesas las
tablas nativas, quizas por ahi te den las soluciones.

Si es por cortes de fluido electrico eso solo se soluciona con los UPSs.

Y por ahi hay muchos tipos de fallas que te pueden llevar a perder los
indices.

Saludos

Hitiel Hernández

unread,
May 4, 2015, 7:30:24 PM5/4/15
to publice...@googlegroups.com
- Este es e Entorno de Datos que utilizo en uno de mis formuarlios (compras), pero se manejan de varios centros, entonces cree una carpeta para cada centro, ejemplo: 001- Central, 002-Predio, 003-Cuba....

Imágenes integradas 1
 y para direccionar  individualmente cada tabla de cada carpeta utilizo el siguiente código:

this.cursor1.cursorsource     = _data+'\centros\'+_centro+'\compra_c.dbf'
this.cursor2.cursorsource     = _data+'\centros\'+_centro+'\moviprod.dbf'
this.cursor3.cursorsource     = _data+'\centros\'+_centro+'\producto.dbf'
this.cursor4.cursorsource     = _data+'\centros\'+_centro+'\compra_d.dbf'
this.cursor5.cursorsource     = _data+'\sys\tablas\medidas.dbf'
this.cursor6.cursorsource     = _data+'\sys\tablas\equipos.dbf'
this.cursor7.cursorsource     = _data+'\sys\tablas\empleado.dbf'
this.cursor8.cursorsource     = _data+'\sys\tablas\proveed.dbf'
this.cursor9.cursorsource     = _data+'\centros\'+_centro+'\orden_c.dbf'
this.cursor10.cursorsource     = _data+'\centros\'+_centro+'\orden_d.dbf'
this.cursor11.cursorsource     = _data+'\sys\tablas\config.dbf'
this.cursor12.cursorsource     = _data+'\centros\'+_centro+'\avisos.dbf'





Carlos Miguel FARIAS

unread,
May 5, 2015, 8:36:21 AM5/5/15
to Grupo Fox
Conviene usar CDX estructural y no IDX.
Los idx se actualizan solo si están abiertos, pero si no, se desactualizan y te fuerzan a recrearlos o reindexarlos cada vez que los abris.
Saludos: Miguel, La Pampa (RA)

panchimancuso

unread,
May 7, 2015, 3:41:33 PM5/7/15
to publice...@googlegroups.com, hiti...@gmail.com
ESTO USO YO EN UN FORM DE MANTENIMIENTO DE INDICES EN UN BOTON REINDEXAR

set talk off
SET NOTIFY ON
set safe off

set exclu on
@ 05,15 say "Reordenando Ingresos         (1)" size 1,52 picture "@"
select ingresos 
pack
index on socio tag socio
index on fecha tag fecha
index on codigo tag codigo
index on descrip tag descrip
reindex
set exclu on
@ 05,15 say "Reordenando Egresos         (2)" size 1,52 picture "@"
select egresos 
pack
index on fecha tag fecha
index on descrip tag descrip
index on codigo tag codigo
reindex

@ 05,15 say "Reordenando socios           (3)" size 1,52 picture "@"
set exclu on
sele socios 
pack
reindex

@ 05,15 say "Reordenando cuotas           (4)" size 1,52 picture "@"
set exclu on
sele cuotas 
pack
reindex

@ 05,15 say "Reordenando cobradas         (5)" size 1,52 picture "@"
set exclu on
sele cobradas 
reindex

@ 05,15 say "Reordenando colonos          (6)" size 1,52 picture "@"
set exclu on
sele colonos 
reindex

@ 05,15 say "Reordenando pagos            (7)" size 1,52 picture "@"
set exclu on
sele pagoscolo 
reindex

@ 05,15 say "Reordenando recibos          (8)" size 1,52 picture "@"
set exclu on
sele recibo 
reindex

@ 05,15 say "Reordenando promociones      (9)" size 1,52 picture "@"
set exclu on
sele promocolo 
reindex

@ 05,15 say "Reordenando Rev. Médicas     (10)" size 1,52 picture "@"
set exclu on
sele rmedica 
reindex

@ 05,15 say "Reordenando pileta           (11)" size 1,52 picture "@"
set exclu on
sele pileta 
reindex
@ 05,15 say "Reordenando categorias       (12)" size 1,52 picture "@"
sele categ
reindex
sele soc_dep
reindex
@ 05,15 say "Reordenando roperos          (13)" size 1,52 picture "@"
sele roperos
reindex
sele devol
reindex
sele morosos
set exclu on
pack
reindex
MESSAGEBOX("PROCESO TERMINADO","AVISO")
set exclu off
close databases
release thisform

SALUDOS

Hitiel Hernández

unread,
May 7, 2015, 4:10:05 PM5/7/15
to publice...@googlegroups.com
Gracias

panchimancuso

Similar es el código que yo utilizo, tabla por tabla e índice por índice.

Yo quería más bien saber si alguien ha sistematizado un procedimiento que sea mucho más facil de hacer y ejecutar.

ya sea por medio de una clase o por código.

De cualquier manera se te agradece el tiempo que te tomaste en responder.

Carlos Miguel FARIAS

unread,
May 7, 2015, 5:30:46 PM5/7/15
to Grupo Fox
El mecanismo que instrumente no dependia del usuario.
El sistema, cada vez que habría una tabla "contaba" en un archivo de control (por ejemplo un tipo .mem que se guarda variables de memoria.). Sumar 1 a un contador por archivo o tabla abierto.
Ese archivo de control se accedía exclusivo, se actualizaba (conteo de "abiertos") y se cerraba (operación casi instantánea), luego cuando se cerraba la tabla, el sistema actualizaba el archivo de control, descontando.
Cuando se producia una caida de la red (corte de luz) o algún problema planche del sistema. El archivo de control quedaba con "contadores" de archivos abiertos en positivo.
Al arrancar el equipo donde están las tablas dbc. Se dispara un programa que chequea si hay "contadores positivos" por archivos abiertos chequeando en el archivo de control. Si es así, automaticamente, pone todos los archivos que figuraban con contadores distintos de cero con -1.
Luego cuando la/s aplicacione/s accedian a una tabla y en el archivo de control encontraban la marca -1, intentan obtener el uso exclusivo del archivo, si lo logran, cambian la marca a -2, y hacen reindex de sobre esa tabla, avisando al usuario que está reorganizando la bd, al terminar de reindexar, cierra y pone el contador (en control) en cero; si no puede obtener uso exclusivo, mandan un mensaje al usuario que no puede trabajar, por tareas administrativas. Si encuentra la marca -2, directamente avisa que no puede usar el sistema por razones administrativas.
Cuando un usuario recibe un mensaje de que el sistema esta en administrativo, puede dispararse un timer, para que para los casos de contador -2, pueda haber quedado el contador en 0 o más.
Con ese mecanismo (aclaro que ya con fox p/dos, tenía centralizado la apertura y cierre de tablas) era muy dificil que una tabla quedara con indices rotos. Por un mal cierre.
Igual mecanismo se puede utilizar para controlar o retrotraer transacciones con problemas.
En mi caso, para el tema de transacciones, que Fox2 no contaba, usaba lógica de estado. Toda tabla contaba con un campo (un caracter) que al empezar la transacción, se ponía por ejemplo en 0, cuando terminaba la transacción, pasaba el estado a 1 y así, si había una caida en el medio. El programa, al arrancar y detectar que debía reindexar, además chequeaba todos aquellos registros que tenían una marca de "en proceso" y deshacia operaciones, o avisaba al operador que debía corregir a mano el proceso interrumpido (a veces no era facil instrumentar un rollback, y el operador, podía eliminar las incompletas y reprocesarlas.
En fin, por suerte aparecieron las SGBD con transacciones y demás sin tener que codificarlo.
Saludos: Miguel, La Pampa (RA)
Reply all
Reply to author
Forward
0 new messages