Page 1 of 1

DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 4:55 pm
by rolando
Buenas tardes,

Tengo un problema relativamente grave y es que esporádicamente y, supongo que al editar los campos, se agrega un registro con los mismos datos de uno que ya existe.

Esto debe hacerlo, reitero que es una suposición, cuando lo edito.

En realidad es muy difícil que sea un fallo de la aplicación, ya que lo hizo dos veces en los últimos tres meses.

Lo peor es que, cuando hace esto, el índice parece que no se "enterara" que estos registros existen y no los encuentra cuando busco por uno de sus campos indexados. Sí puedo "verlos" cuando listo sin usar índice (set order to 0).

Si borro uno de los dos registros duplicados y reindexo, tampoco lo reconoce el indice. ¿Extraño no?.

Lo que uso son DBF con indices CDX en tres pc's en red.

¿Alguna sugerencia?

Gracias.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 6:33 pm
by jrestojeda
Hola amigo...
Probaste eliminar el índice y crearlo desde cero nuevamente??
Espero te sirva la idea...
Saludos!

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 7:39 pm
by rolando
Esteban, Gracias por responder.

Sí, siempre que reindexo, primero borro el archivo índice.

Sigo buscando, es rarísimo. Haciendo pruebas me encuentro que por uno de los índices si lo encuentra, este índice es el único que está hecho a partir de un campo numérico.

Rolando

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 8:16 pm
by ADBLANCO
PUEDES PRESENTAR EL CODIGO DE GENERAR INDICES Y TAMBIEN EL SEEK

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 8:46 pm
by rolando
Encontré algo.

En realidad el índice y la dbf estaban ok. (a Deus Gracias).

Lo que ocurrió es que hace un par de meses reformé la toma de fechas de los get's de data. Antes se introducían en el formato DD/MM/AA y le agregué un
Code: Select all  Expand view
set date format "dd/mm/yyyy"
y ahora toma DD/MM/AAAA.

Lo que pasó es que uno de los que operan el sistema le introdujo "09" en el año en lugar de "2009" y tomó "1909".

Cuando hace la busqueda por índice, primero hago un "seek" y, si lo encontró, pasa por una serie de filtros con fechas y antes de entrar a este filtro, si las fechas del filtro no fueron completadas, para poder pasar el sistema le adjudica unas fechas automáticamente, por ejemplo para un filtro de fecha "DESDE" le pone la fecha de iniciación de actividades y como fecha "Hasta" le pone la fecha del date(). Como tenía cargado el año "1909" en lugar del "2009", NO PASABA EL FILTRO.

No se si me expliqué. FUE UN ERROR MIO. Ahora veré como hacer para que si ponen "16/07/09" no quede "16/07/1909".

Aunque queda el otro problema que aleatoriamente se "DUPLICA" un registro cuando es editado. MUY SEGURAMENTE es falla de la programación del sistema, pero lo muy raro es que lo hizo dos o tres veces en tres meses y al sistema se lo usa en forma permanente diez horas por día.

¿Podría ser un problema de la red?.

Gracias.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 10:33 pm
by Armando Picon
Es posible que tu rutina de indexaciòn por fecha no sea el adecuado. La recomendaciòn es que los indices sobre fechas se deben hacer mediante el uso de DTOS(). Fijate si tu codigo responde a las dos formas que abajo menciono:

Primera forma:
============
a) establecer SET DATE TO BRITISH
b) establecer SET CENTURY ON, y
c) generar el ìndice mediante: INDEX ON SUBS(DTOC(CAMPOFECHA),7,4) ) + SUBS(DTOC(CAMPOFECHA),4,2) ) + SUBS(DTOC(CAMPOFECHA),1,2) ) TO lo_que_sea_tu_indice

Segunda forma:
=============
a) igual que la primera forma
b) igual que la primera forma, y
c) generar el indice mediante: INDEX ON DTOS(CAMPOFECHA) TO lo_que_sea_tu_indice

Re: DBF - índice no detecta un campo

PostPosted: Thu Jul 16, 2009 11:55 pm
by rolando
Hola,

Gracias por responder.

La DTOS() la uso únicamente cuando combino campos para un mismo índice (ej. uno de fecha + uno de caracteres).

Los índices de fecha siempre los indexé como fecha (sin la DTOS()) y nunca me dieron problemas. Si hiciera lo que sugieres, para hacer una búsqueda por fecha debería luego hacer un SEEK conviertiendo la fecha a buscar en cadena de caracteres a lo cual no le veo utilidad.

Saludos.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 12:12 am
by Armando Picon
rolando wrote:Hola,

Gracias por responder.

La DTOS() la uso únicamente cuando combino campos para un mismo índice (ej. uno de fecha + uno de caracteres).

Los índices de fecha siempre los indexé como fecha (sin la DTOS()) y nunca me dieron problemas. Si hiciera lo que sugieres, para hacer una búsqueda por fecha debería luego hacer un SEEK conviertiendo la fecha a buscar en cadena de caracteres a lo cual no le veo utilidad.

Saludos.

Rolando :D

Amigo Rolando, cometes una ligera equivocaciòn. Si usas DTOS() no tienes nada que convertir!!!! La rutina es tan poderosa que solamente tienes que escribir tu dato y la rutina lo convierte en "CADENA". Los indices hechos con "fechas puras" SIEMPRE tuvo esos inconvenientes, desde la epoca de Clipper. La razòn es que el dato tipo fecha, en el fondo es un valor numèrico (donde lo puedes ver mejor es cuando experimentas en EXCEL escribir fechas sin que tengan formato de fecha y tratas de ordenarlo por ese campo) :D

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 12:51 am
by rolando
Armando,

Gracias por el dato. Realmente nuca tuve problemas indexando así pero siempre estoy dispuesto a aprender de los que saben más que yo (casi todos).

Voy a reindexar como sugieres y a probar un tiempo.

De nuevo, gracias por contestar.

Saludos.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 12:51 pm
by MauroArevalo
Rolando:

Comentas que sigues con el problema de la duplicación de registros aleatoriamente, te voy a comentar mi experiencia a ver si es eso lo que te sucede.

Las DBFs cuando estan en RED y por algún motivo se apaga alguna PC o se cierra mal el programa sufren aleatoriamente el daño de registros fisicos en las DBf produciendo el duplicado de registro.

Te preguntaras ¿como se detecta? Y aqui viene mi solución que puede sonar arcaica pero me ha servido para mantener y descubir errores de las DBF en RED. Utilizo el DBASE III Plus en 16 bits para revisar las DBF. ¿Como lo hago ? la explicación:

Yo trabajo con FWH + xHabour, las bases de datos abiertas con xHarbour no se pueden abrir directamente con DBASE ya que la cabezera de la DBF es diferente, entonces previamente las abro con el DBU de Clipper para que cambie la cabezera de la DBF y se pueda abrir con DBASE. Abro e DBASE y hago lo siguiente:

Como ejemplo supungamos que DBF se llama PRUEBA con 50.000 registros

1. Abrimos la base datos
2. Hacemos una copia de la base, en este proceso es cuando se detecta si la DBF esta dañada o no. Si se copia todos los 50000 regsitros la DBF esta correcta.

**Correcto tu base***
.USE PRUEBA
.COPY TO DBFCOPIA
.50000 records copied

Si presenta alguna falla en algún registro no se copia todo los 50.000 registros sino hasta el registro que esta dañado.

***DBf Dañada
.USE PRUEBA
.COPY TO DBFCOPIA
.35153 record copied

En este caso quiere decir que el registro 35153 esta duplicado con el registro 35154. El registro 35154 esta dañado.
Para arreglar la DBF y borrar el registro se tiene que hacer los siguiente:

.USE PRUEBA
.COPY TO DBFCOPIA
.35153 record copied
.GO 35155
.COPY NEXT 14845 TO DBFOTRA
.USE DBFCOPIA
.APPE FROM DBFOTRA
.COPY TO PRUEBA

Y listo tu DBF quedo corregida sin el registro duplicado..

Espero que me haya explicado bien y si no escribeme a mi correo y con mucho gusto en lo que te pueda ayudar.

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 1:07 pm
by FranciscoA
Hola Rolando:

Rolando wrote:Lo que pasó es que uno de los que operan el sistema le introdujo "09" en el año en lugar de "2009" y tomó "1909".


Lo hago asi, y nunca he tenido problemas cuando el operador introduce el año en digitos incompletos: 009,09,9.
SET DATE BRITISH
SET EPOCH TO 1995
SET CENTURY ON
Siempre he indexado como tú explicas. (sólo uso Dtos() cuando combino campos de diferentes tipos con campos fechas)

rolando wrote:Tengo un problema relativamente grave y es que esporádicamente y, supongo que al editar los campos, se agrega un registro con los mismos datos de uno que ya existe.


Sobre este segundo caso, yo también tuve el mismo problema hace tiempo, y todo se debía a un bug mío, durante la edición de datos (modificación). Si puedes mostrar el código donde modificas, quizás podamos ayudarte.
Saludos.

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 1:11 pm
by rolando
Gracias Mauro por tu respuesta.

Hata ahora lo he solucionado porque dentro de la aplicación tengo una sección que hace un listado con ORDER 0 y, en ella se ven los registros duplicados que tienen distinto recno(). Así voy al recno() de uno de ellos y lo elimino.

De cualquier modo me parece interesante tu sistema.

UNA ULTIMA PREGUNTA SOBRE INDICES CDX:

Ya que aprendí que a los campos de fecha hay que indexarlos con DTOS(). Pregunto: A los numéricos,

¿Hay que indexarlos con STR()?

Gracias.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 1:33 pm
by surGom
Hola Rolando me parece que la mejor solución es la que te da Francisco poner set epoch to, yo lo utilizó así y nunca tuve problemas. Y cuando tenés problemas de índices y no se solucionan (borrando con delete tag namedel tag) y reordenando. Borrar el archivo .cdx directamente y ordenar de nuevo.

Luis

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 2:46 pm
by rolando
Gracias Francisco y Luis.

Entonces, no debería cambiar mis índices. Actualmente indexo así:

Code: Select all  Expand view
INDEX ON TALON TAG TALON TO TRABAJOS    // campo numérico                                               
                oMtr:nPosition :=5
INDEX ON RETIRO TAG RETIRO TO TRABAJOS    // campo fecha                                 
                oMtr:nPosition :=10
INDEX ON FECHAIN TAG FECHAIN TO TRABAJOS    // campo fecha                               
            oMtr:nPosition :=15
INDEX ON DEALER+DTOS(FECHA_COM) TAG DEALER TO TRABAJOS   // combina campo caracteres+campo fecha


Gracias.

Rolando :D

Re: DBF - índice no detecta un campo

PostPosted: Fri Jul 17, 2009 2:57 pm
by Willi Quintana
Hola,,,
hace mucho tiempo que no uso DBFs (le doy a MySQL full), pero por experiencia con Clipper y Harbour, lo mejor es indexar lo campor tipo numerico convirtiendo a cadena, y los campos tipo igual :

SELECT("VENTAS")
IF !FLOCK()
RETURN(.f.)
ENDIF
IF !FERASE("VENTAS.CDX")
RETURN(.F.)
ENDIF
INDEX ON C_VENDEDOR TAG VEND TO VENTAS // C_VENDEDOR campo tipo cadena
INDEX ON STR(VENTA_TOT) TAG VENT TO VENTAS // VENTA_TOT campo tipo numerico
INDEX ON DTOS(FECH_VENTA) TAG FEVEN TO VENTAS // FECH_VENTA campo tipo fecha
....
Para el DBSEEK con campo tipo numerico.
DBSEEK(STR(n_Monto))

Para el DBSEEK con campo tipo fecha.
DBSEEK(DTOS(d_Fecha))

Salu2