FoxPro/Visual FoxPro - URGENTE, Validar Database

   
Vista:

URGENTE, Validar Database

Publicado por Pablo (Argentina) (433 intervenciones) el 04/07/2009 01:09:48
Hola Amigos, necesito solucionar esto urgente y no se como, resulta ser que no se porque alguien me envio a la papelera de reciclaje un archivo CDX y se ve que cuando lo restaure se daño o algo asi.

Y me dice que tengo que validar la base de datos porque la clave principal del archivo dbc esta dañado

quiero validar la base de datos con validate databse y no me deja la abro en modo exclusivo y tampoco puedo

me dice todo esto:

Valida la Base de Datos ALTAUNI:
Necesita acceso EXCLUSIVE con permiso de escritura para volver a generar el indice estructural.
Objeto Nº 19 (table ´codterminal´) La propiedad de clave principal no es valida
Objeto Nº 338 (index Wizar_1): No se encuentra la etiqueta CDX en el estructural para la tabla (y todo lo que sigue de la tabla)

bueno para todo eso, tengo que validar la base de datos pero no puedo y ya probe de todo

Alguien Por Favor me puede pasar escrito como seria para poder solucionar

Desde ya Muchas Gracias a Todos

Pablo - Argentina
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauricio

URGENTE, Validar Database

Publicado por Mauricio (1367 intervenciones) el 04/07/2009 01:22:13
Pablo, hay por lo menos 2 maneras de validar una tabla:
1 - una es este escrito que lo encontre en PORTALFOX:
El error que Visual Foxpro regresa cuando se corrompe el encabezado de una tabla y no podemos abrirla.
*
La siguiente rutina calcula el número de registros que contiene la tabla y los compara con el contenido del encabezado de la misma y de ser necesario, lo repara.
*-----------------
*- Reparar tabla -
*-----------------
FUNCTION _ReparaEncabezado(cTabla)
*
LOCAL nArea,nTamañoTabla,nRegistros,nTamañoencabezado,;
nTamañoRegistro,nRegistrosCalculados
*
nArea=FOPEN(cTabla,12)
nTamañoTabla=FSEEK(nArea,0,2)
*
nRegistros=_Lee(nArea, 4,4)
nTamañoEncabezado=_Lee(nArea, 8,2)
nTamañoRegistro=_Lee(nArea,10,2)
*
nRegistrosCalculados=FLOOR((nTamañoTabla-nTamañoEncabezado)/;
nTamañoRegistro)
IF nRegistrosCalculados#nRegistros
_Escribe(nArea,4,4,nRegistrosCalculados)
ENDIF

=FCLOSE(nArea)

ENDFUNC

*------------------
*- Lee encabezado -
*------------------
FUNCTION _Lee(nArea,nPosicion,nTamaño)

LOCAL cCadena,nValor,nSubInd

=FSEEK(nArea,nPosicion,0)
cCadena=FREAD(nArea, nTamaño)
nValor = 0
FOR nSubInd=0 TO nTamaño-1
nValor=nValor+ASC(SUBSTR(cCadena,nSubInd+1))*256^nSubInd
ENDFOR

RETURN INT(nValor)

ENDFUNC

*------------------------
*- Reescribe encabezado -
*------------------------
FUNCTION _Escribe(nArea,nPosicion,nTamaño,nNumero)

LOCAL cCadena,nSubInd

cCadena=''
FOR nSubInd=0 TO nTamaño-1
cCadena=cCadena+CHR(nNumero/256^nSubInd%256)
ENDFOR

=FSEEK(nArea, nPosicion,0)

RETURN FWRITE(nArea,cCadena)

ENDFUNCEs recomendable que en las rutinas de mantenimiento de archivos se elimine primero el indice (CDX), se revise el encabezado con la rutina anterior y posteriormente se generen los indices de nuevo.
*--------------------------------
2 - En la ventana de comando escribes:
SET
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauricio

URGENTE, Validar Database

Publicado por Mauricio (1367 intervenciones) el 04/07/2009 01:24:41
Pablo, hay por lo menos 2 maneras de validar una tabla:
1 - una es este escrito que lo encontre en PORTALFOX:
El error que Visual Foxpro regresa cuando se corrompe el encabezado de una tabla y no podemos abrirla.
*
La siguiente rutina calcula el número de registros que contiene la tabla y los compara con el contenido del encabezado de la misma y de ser necesario, lo repara.
*-----------------
*- Reparar tabla -
*-----------------
FUNCTION _ReparaEncabezado(cTabla)
*
LOCAL nArea,nTamañoTabla,nRegistros,nTamañoencabezado,;
nTamañoRegistro,nRegistrosCalculados
*
nArea=FOPEN(cTabla,12)
nTamañoTabla=FSEEK(nArea,0,2)
*
nRegistros=_Lee(nArea, 4,4)
nTamañoEncabezado=_Lee(nArea, 8,2)
nTamañoRegistro=_Lee(nArea,10,2)
*
nRegistrosCalculados=FLOOR((nTamañoTabla-nTamañoEncabezado)/;
nTamañoRegistro)
IF nRegistrosCalculados#nRegistros
_Escribe(nArea,4,4,nRegistrosCalculados)
ENDIF

=FCLOSE(nArea)

ENDFUNC

*------------------
*- Lee encabezado -
*------------------
FUNCTION _Lee(nArea,nPosicion,nTamaño)

LOCAL cCadena,nValor,nSubInd

=FSEEK(nArea,nPosicion,0)
cCadena=FREAD(nArea, nTamaño)
nValor = 0
FOR nSubInd=0 TO nTamaño-1
nValor=nValor+ASC(SUBSTR(cCadena,nSubInd+1))*256^nSubInd
ENDFOR

RETURN INT(nValor)

ENDFUNC

*------------------------
*- Reescribe encabezado -
*------------------------
FUNCTION _Escribe(nArea,nPosicion,nTamaño,nNumero)

LOCAL cCadena,nSubInd

cCadena=''
FOR nSubInd=0 TO nTamaño-1
cCadena=cCadena+CHR(nNumero/256^nSubInd%256)
ENDFOR

=FSEEK(nArea, nPosicion,0)

RETURN FWRITE(nArea,cCadena)

ENDFUNCEs recomendable que en las rutinas de mantenimiento de archivos se elimine primero el indice (CDX), se revise el encabezado con la rutina anterior y posteriormente se generen los indices de nuevo.
*--------------------------------
2 - En la ventana de comando escribes:
SET (aca te abre una ventana para abrir las tabla de una base de datos como una tabla libre, trata de abrirla como tabla libre (hacer una copia de la tabla)
alli te dira que pertenece a una ODBC, le dices que quieres eliminar el vinculo y listo, la abres como tabla libre y le creas el CDX Puedes probar la que mas te guste......
Saludos!!!!!!!!!!!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:URGENTE, Validar Database

Publicado por Martín (16 intervenciones) el 07/07/2009 18:45:19
Es bárbaro lo que posteaste, Mauricio... me sirve y de mucho, gracias, ya me lo copio entre las herramientas. Igualmente, agrego algo.

En la validación yo suelo utilizar otra cosa, que por ahí les puede ser útil. Normalmente, cuando hay algún problema con la validación (sobre todo tratándose de índices pinchados) el índice hay que regenerarlo sí o sí, pero siempre nos topamos con que los índices de Visual Fox son compuestos (esto es, que pertenecen a la misma tabla, y que si está pinchado a veces no te la deja abrir).

Una solución es SIEMPRE tener un directorio con todas las estructuras peladas (base de datos y tablas). Entonces, cuando sucede alguna pinchadura, simplemente copiamos la base de datos y las tablas en cuestión a un directorio de backup, traemos del directorio de estructuras el DBC y las tablas vacías, y después hacemos un APPEND FROM desde el directorio de backup en cuestión... o sea, supongamos:

Yo tengo la base de datos "MisDatos.DBC" y se me pinchó la tabla "MiTabla.DBF"

Y tengo este árbol:

C:MiSistemaDatos
C:MiSistemaDatosBackUp
C:MiSistemaDatosStruct

Entonces, copio los archivos "MisDatos.DBC, MisDatos.DCX, MisDatos.DCT, MiTabla.DBF y MiTabla.CDX (y MiTabla.FPT de existir)" al directorio BackUp, mediante el explorador de Windows. Luego, desde el directorio Struct traigo los archivos "MisDatos.DBC, MisDatos.DCX, MisDatos.DCT, MiTabla.DBF y MiTabla.CDX (y MiTabla.FPT de existir)". Estas estructuras están vacías, sin datos.

Luego, simplemente, hago:

USE MisDatos!MiTabla EXCLUSIVE IN 0
SELECT MiTabla
APPEND FROM C:MiSistemaDatosBackUp

Esto tiene tres ventajas: primero, si tengo muchos tags de índices en el CDX, no me olvido de crear ninguno, ya que en la estructura vacía tiene todos los tags creados. Segundo, me olvido de las reindexaciones, que nunca me han dado buenos resultados con los archivos compuestos de datos... cuando un DBF se pincha lo mejor es reconstruirlo de cero, nos ahorramos un montón de tiempo de trabajo y sufrimiento. Y tercero, lo más importante: no pierdo ninguna referencia de la tabla en el DBC.

No olvidemos que cuando una tabla pertenece a un DBC, en el DBC se graban un montón de cosas: las descripciones de la tabla, creo que también la de los campos, y otra más importante: los TRIGGERS (o DESENCADENANTES, en castellano) que tengamos en las tablas. Si nosotros la convertimos en tabla libre y luego la devolvemos al DBC, vamos a tener que crear todas esas cosas manualmente, y nos va a demandar mucho tiempo.

Con un directorio con las estructuras en blanco, en cuanto suceda un problema, en cinco minutos salimos andando nuevamente.

Abrazos.

Martín.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:URGENTE, Validar Database

Publicado por Martín (16 intervenciones) el 07/07/2009 18:48:31
Me corrijo, la instrucción APPEND FROM quedó incompleta, debería ser:

APPEND FROM C:/MiSistema/Datos/BackUp/MiTabla

No sé por qué no me salieron las contrabarras tampoco, el árbol es:

C:/MiSistema/Datos/
C:/MiSistema/Datos/BackUp/
C:/MiSistema/Datos/Struct/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauricio

URGENTE, Validar Database

Publicado por Mauricio (1367 intervenciones) el 08/07/2009 17:09:48
Gracias Martin!!!!!!!!!!!!!!!!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:URGENTE, Validar Database

Publicado por Martín (16 intervenciones) el 08/07/2009 21:42:18
Faltaba más, maestro... ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar