DBF - índice no detecta un campo

DBF - índice no detecta un campo

Postby rolando » Thu Jul 16, 2009 4:55 pm

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
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

Postby jrestojeda » Thu Jul 16, 2009 6:33 pm

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
jrestojeda
 
Posts: 583
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: DBF - índice no detecta un campo

Postby rolando » Thu Jul 16, 2009 7:39 pm

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

Re: DBF - índice no detecta un campo

Postby ADBLANCO » Thu Jul 16, 2009 8:16 pm

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

Re: DBF - índice no detecta un campo

Postby rolando » Thu Jul 16, 2009 8:46 pm

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
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

Postby Armando Picon » Thu Jul 16, 2009 10:33 pm

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

Re: DBF - índice no detecta un campo

Postby rolando » Thu Jul 16, 2009 11:55 pm

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

Re: DBF - índice no detecta un campo

Postby Armando Picon » Fri Jul 17, 2009 12:12 am

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

Re: DBF - índice no detecta un campo

Postby rolando » Fri Jul 17, 2009 12:51 am

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

Re: DBF - índice no detecta un campo

Postby MauroArevalo » Fri Jul 17, 2009 12:51 pm

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 FTDN, xHarbour 1.2.1, Pelles C, Fivedit, Visual Studio Code, Borland 7.30, Mysql, Dbfs
http://www.hymplus.com http://www.hymlyma.com
Tratando de retomar la programación....
User avatar
MauroArevalo
 
Posts: 105
Joined: Thu Jan 19, 2006 11:47 pm
Location: Bogota DC. Colombia

Re: DBF - índice no detecta un campo

Postby FranciscoA » Fri Jul 17, 2009 1:07 pm

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

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DBF - índice no detecta un campo

Postby rolando » Fri Jul 17, 2009 1:11 pm

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
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

Postby surGom » Fri Jul 17, 2009 1:33 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: DBF - índice no detecta un campo

Postby rolando » Fri Jul 17, 2009 2:46 pm

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
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

Postby Willi Quintana » Fri Jul 17, 2009 2:57 pm

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 84 guests