DBF - índice no detecta un campo

Post Reply
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

DBF - índice no detecta un campo

Post by rolando »

Buenas tardes,

Tengo un problema relativamente grave y es que esporádicamente y, supongo que al editar _, 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
User avatar
jrestojeda
Posts: 543
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: DBF - índice no detecta un campo

Post by jrestojeda »

Hola amigo...
Probaste eliminar el índice y crearlo desde cero nuevamente??
Espero te sirva la idea...
Saludos!
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post 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
User avatar
ADBLANCO
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: DBF - índice no detecta un campo

Post by ADBLANCO »

PUEDES PRESENTAR EL CODIGO DE GENERAR INDICES Y TAMBIEN EL SEEK
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post 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

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
User avatar
Armando Picon
Posts: 448
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: DBF - índice no detecta un campo

Post 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
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post 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
User avatar
Armando Picon
Posts: 448
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: DBF - índice no detecta un campo

Post 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
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post 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
User avatar
MauroArevalo
Posts: 98
Joined: Thu Jan 19, 2006 11:47 pm
Location: Bogota DC. Colombia
Contact:

Re: DBF - índice no detecta un campo

Post 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.
Edgar Mauricio Arévalo Mogollón.
Bogotá DC. Colombia
FWH 19.06 xHarbour 1.2.1, Pelles C, Fivedit, Borland 7.30
http://www.hymplus.com
Tratando de retomar la programación....
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DBF - índice no detecta un campo

Post 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 _, 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.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post 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 _ de fecha hay que indexarlos con DTOS(). Pregunto: A los numéricos,

¿Hay que indexarlos con STR()?

Gracias.

Rolando :D
surGom
Posts: 624
Joined: Wed Oct 19, 2005 12:03 pm
Contact:

Re: DBF - índice no detecta un campo

Post 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
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: DBF - índice no detecta un campo

Post by rolando »

Gracias Francisco y Luis.

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

Code: Select all

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
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: DBF - índice no detecta un campo

Post 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 _ 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
Post Reply