DBF - índice no detecta un campo
DBF - índice no detecta un campo
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
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
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: DBF - índice no detecta un campo
Hola amigo...
Probaste eliminar el índice y crearlo desde cero nuevamente??
Espero te sirva la idea...
Saludos!
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
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: DBF - índice no detecta un campo
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
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
PUEDES PRESENTAR EL CODIGO DE GENERAR INDICES Y TAMBIEN EL SEEK
Saludos
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Re: DBF - índice no detecta un campo
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 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
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"
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
- Armando Picon
- Posts: 448
- Joined: Mon Dec 26, 2005 9:11 pm
- Location: Lima, Peru
Re: DBF - índice no detecta un campo
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
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
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
Re: DBF - índice no detecta un campo
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
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
- Armando Picon
- Posts: 448
- Joined: Mon Dec 26, 2005 9:11 pm
- Location: Lima, Peru
Re: DBF - índice no detecta un campo
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)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
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
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
Re: DBF - índice no detecta un campo
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
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
- MauroArevalo
- Posts: 98
- Joined: Thu Jan 19, 2006 11:47 pm
- Location: Bogota DC. Colombia
- Contact:
Re: DBF - índice no detecta un campo
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.
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....
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....
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: DBF - índice no detecta un campo
Hola Rolando:
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)
Saludos.
Lo hago asi, y nunca he tenido problemas cuando el operador introduce el año en digitos incompletos: 009,09,9.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".
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)
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.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.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Re: DBF - índice no detecta un campo
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
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
Re: DBF - índice no detecta un campo
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
Luis
Re: DBF - índice no detecta un campo
Gracias Francisco y Luis.
Entonces, no debería cambiar mis índices. Actualmente indexo así:
Gracias.
Rolando
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
Rolando
- Willi Quintana
- Posts: 859
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Re: DBF - índice no detecta un campo
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
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