Indice con clave duplicada

Indice con clave duplicada

Postby miarcod » Fri Feb 06, 2015 6:42 am

Hola,

A ver si alguien me puede ayudar. El caso es que de un tiempo a esta parte a uno de mis sistemas se le producen errores y al actualizar algunos ficheros me encuentro que faltan datos.
El proceso guarda en un fichero datos que se están introduciendo en otro. Normalmente estos datos se actualizan correctamente, pero aleatoriamente se producen estos errores.

Analizando los ficheros me doy cuenta de que falta un registro. Al activar el indice de control en el momento de añadir los datos me doy cuenta que el índice me muestra el siguiente registro dos veces.
El fichero tiene 7 indices, y 4 muestran el registro dos veces y los otros no.

Nunca me habia pasado algo parecido y no tengo ni idea de por donde buscar.
Ya he revisado la seleccion de ordenes y es correcta.

Utililzo indices CDX.

Graicas
miarcod
 
Posts: 197
Joined: Tue Oct 11, 2005 2:17 pm

Re: Indice con clave duplicada

Postby karinha » Fri Feb 06, 2015 12:25 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Indice con clave duplicada

Postby miarcod » Sun Feb 08, 2015 10:15 am

Gracias por contestar, pero no encuentro nada que me ayude.

El caso es que tengo un codigo que hace lo siguiente

Code: Select all  Expand view

...
// Ahora hay que añadir las líneas de detalle
SELECT TERMINAL
GOTO TOP
DO WHILE !TERMINAL->(EOF())
      ...
      // Bloqueamos el registro y lo añadimos al fichero de albaranes
      If !MkBloqReg("TERMINAL")
         AvisarTmp( oTerminal:oDialg, "NO SE PUEDE ACCEDER A LA LINEA SELECCIONADA" + CRLF + ;
                                                       "OTRO USUARIO TIENE BLOQUEADO EL REGISTRO",,1 )
          SemUnLock( nSmf )
          oTerminal:lProcesando := .F.
          Select(nAreaActual)
          return .f.
      EndIf

      SELECT LVENTAS
      If !AddRec()
          MkEnlaLVta(DLIBERAR)
          SemUnLock( nSmf )
          oTerminal:lProcesando := .F.
          return .f.
      EndIf
      GrabarCmp( "CODALM", TERMINAL->CODALM, "LVENTAS" )
      GrabarCmp( "NUMALB", cNumAlbCtdo,      "LVENTAS" )
      GrabarCmp( "ENLACE", cEnlace,          "LVENTAS" )
      GrabarCmp( "FECALB", dFecAlbCtdo,      "LVENTAS" )
      GrabarCmp( "CODCLI", TERMINAL->CODCLI, "LVENTAS" )
      GrabarCmp( "TPUVEN", TERMINAL->TPUVEN, "LVENTAS" )
      MkEnlaLVta(DLIBERAR)
      UnbloqReg("LVENTAS")
      SELECT TERMINAL
      GrabarCmp( "ESTADO", "L", "TERMINAL")
   ENDIF

   SELECT TERMINAL
   If oEntorno:lBorTerm
     If lHayDatos
        SELECT TERMINAL
        DELETE
     EndIf
   EndIF
   UnbloqReg("TERMINAL")
   SKIP
ENDDO


El caso es que los datos que se encuentran en el fichero de terminal se copian en otro fichero que se llama LVENTAS, y aleaotriamente se produce un error y NO aparece una de las lineas que se tienen que grabar en el fichero de datos, cuando esto se produce, algunos de los indices de LVENTAS, que tendría que tener los datos, tiene claves duplicadas en algunos de los TAGS (es como si se hubiese agregado con los datos del registro siguiente)

Es decir si selecciono el fichero y activo el indice incorrecto me aparece DOS VECES el mismo registro, sin embargo en otro de los indices no aparece directamente.

Este es el estado del area despues de producirse el error.

Area 14 => LVENTAS [X:\CLIENTES\DISTEA\DATOS\LVENTAS.DBF]
Indices: [X:\CLIENTES\DISTEA\DATOS\LVENTAS.CDX]
==> [LVENTAS1] NUMALB FOR !DELETED()[ 22903]
[LVENTAS2] ENLACE FOR !DELETED()[ 22904]
[LVENTAS3] CODCLI+NUMALB FOR !DELETED()[ 22903]
[LVENTAS4] CODART FOR !DELETED()[ 22904]
[LVENTAS5] DTOS(FECALB) FOR !DELETED()[ 22903]
[LVENTAS6] CODCLI+ CODART+DTOS(FECALB) FOR !DELETED()[ 22904]
[LVENTAS7] CODART+STR(DESCEND(FECALB),10) FOR !DELETED()[ 22904]
Reg. 19096 de 22903
Bloqueos: (0)

Los índices LVENTAS2, LVENTAS4, LVENTAS6 Y LVENTAS7 tienen una clave mas que el fichero de datos (no hay registros borrados) y esa clave apunta dos veces al mismo registro.

Yo nunca habia visto esto, estoy perdido.

Gracias
miarcod
 
Posts: 197
Joined: Tue Oct 11, 2005 2:17 pm

Re: Indice con clave duplicada

Postby karinha » Mon Feb 09, 2015 11:36 am

Code: Select all  Expand view

SELECT TERMINAL
GOTO TOP

SEEK...

IF FOUND()

és alteración

ELSE

és inclusión

ENDIF
 


y el COMMIT?

Cambia el modo de grabar.

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Indice con clave duplicada

Postby miarcod » Wed Feb 11, 2015 7:04 pm

Gracias,

El commint lo ejecuto posteriormente, despues de actualizar otros ficheros.

Lo extraño es que el proceso lee secuencialmente los datos de un fichero y los va grabando en otro
De momento lo que se me ocurre es contar los registros grabados y dar un aviso cuando no coinciden.
Voy a investigar a ver si es un fallo de hardware.


Hoy a vuelto a suceder y en este caso al fichero le faltan cinco registros
Cuando activo uno de los indices erroneos los numero de registro que aparecen son: .... 23325, 23326, 23327, 23328, 23328, 23329, 23329, 23330, 23330, 23331, 23331, 23332, 23332

De nuevo gracias por tu colabaración

¿Alguien sabe como provocar que un indice apunte dos veces al mismo registro?

Un saludo
miarcod
 
Posts: 197
Joined: Tue Oct 11, 2005 2:17 pm

Re: Indice con clave duplicada

Postby karinha » Wed Feb 11, 2015 7:09 pm

Last edited by karinha on Wed Feb 11, 2015 7:14 pm, edited 1 time in total.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Indice con clave duplicada

Postby miarcod » Wed Feb 11, 2015 7:13 pm

ESTA EN OFF
LA APERTURA DE LOS CDX LA REALIZO YO
Code: Select all  Expand view

TRY
   DBUSEAREA( .T., cRdd, cFichero, cAlias, lCompartido )    // Abrir los ficheros
   SetPathDBF(Select(), cFichero)
   If NETERR()
      lSalida := .F.
   Else
      dbSetIndex( cIndice )                 // Abrir los ¡ndices
      sysrefresh()
   EndIf
CATCH
   WindAviso("Error en la apertura del fichero " + CRLF +;
                                        cFichero + CRLF +;
             "Alias " + cAlias)
   lSalida := .F.
END
 
miarcod
 
Posts: 197
Joined: Tue Oct 11, 2005 2:17 pm

Re: Indice con clave duplicada

Postby karinha » Wed Feb 11, 2015 7:23 pm

Code: Select all  Expand view

SET UNIQUE ON|OFF|(.T.)/(.F.)
 


Está ON ó OFF

Code: Select all  Expand view

SET UNIQUE
Propósito: Ligar ou desligar a inclusão de chaves duplicadas em um Ìndice.

Sintaxe: SET UNIQUE ON|OFF|(.T.)/(.F.)
 


se no comprender, use google translator porfa.

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Indice con clave duplicada

Postby miarcod » Wed Feb 11, 2015 7:37 pm

Image
Image
miarcod
 
Posts: 197
Joined: Tue Oct 11, 2005 2:17 pm

Re: Indice con clave duplicada

Postby karinha » Wed Feb 11, 2015 7:45 pm

Usted antes de la indexación, Elimina los índices .CDX?
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7214
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 78 guests