FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Indice con clave duplicada
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Indice con clave duplicada
Posted: Fri Feb 06, 2015 06: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

Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Indice con clave duplicada
Posted: Fri Feb 06, 2015 12:25 PM
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Indice con clave duplicada
Posted: 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 (fw): Select all Collapse
...
// 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
Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Indice con clave duplicada
Posted: Mon Feb 09, 2015 11:36 AM
Code (fw): Select all Collapse
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
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07: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
Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07:09 PM
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07:13 PM
ESTA EN OFF
LA APERTURA DE LOS CDX LA REALIZO YO
Code (fw): Select all Collapse
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
Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07:23 PM
Code (fw): Select all Collapse
SET UNIQUE ON|OFF|(.T.)/(.F.)


Está ON ó OFF

Code (fw): Select all Collapse
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
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07:37 PM

Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Indice con clave duplicada
Posted: Wed Feb 11, 2015 07:45 PM

Usted antes de la indexación, Elimina los índices .CDX?

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341

Continue the discussion