Claves duplicadas al indexar ....

Claves duplicadas al indexar ....

Postby ACC69 » Thu Nov 03, 2011 5:38 pm

Hola buenos dias a todos,alguien sabe o darme una idea, de como crear una rutina para al momento de estar indexando los registros, que en mi rutina,me marque error de mensaje que tengo llaves duplicadas o registro duplicado ? un ejemplo como ese en la cabecera CVECODIGO...:

CVECODIGO
-----------
0101
0102
0103
0104
0105
0105 **Aqui es donde me genera la duplicidad de la la misma clave, eso es debido a la caida de red o corte de energia electrica y mientras otro usuario, abrio el folio consecutivo...
0106
0107
0108

Gracias espero haberme explicado y sobre todo desde que punto de partida, generaria mi funcion de rutina antes mencionado.

Saludos y buen dia a todos.

William,que se recupere pronto tu hijo, es un alivio que ya paso lo peor, es cuestion de recuperacion, que Dios los bendiga Willi.

Atte: Adriano C. C.
acc69@hotmail.com
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Claves duplicadas al indexar ....

Postby Patricio Avalos Aguirre » Thu Nov 03, 2011 7:31 pm

Hola

Como le propones el número al usuario?

Yo lo hago de la siguiente manera..

1. tengo en una base los correlativos parame
2- Le propongo un numero, pero no es el definitivo
3.- Al grabar verifico que no exista el numero en la base
4.-grabo y luego le envio el numero al usuario, luego actualizo el numero en parame

Code: Select all  Expand view  RUN
    DEFINE TIMER oTmr INTERVAL 5000 ACTION ;
                    ( Parame->( dbSkip(0) ), ;
                      _numdocu := Parame->GDes+1,;
                      aGet[id_numdocu,1]:Refresh() )
   ACTIVATE TIMER oTmr
    Eval( oTmr:bAction )
 


en grabar
Code: Select all  Expand view  RUN


if !parame->( NetRLock() )
   return( .f. )
endif

Eval( oTmr:bAction )
oTmr:DeActivate()
nDocu := _numdocu

if Docu_BF->( dbSeek( upper(left(_tipdocu,3)) + str( nDocu,10 ) ) )
    nOldFactu := nDocu
    while Docu_BF->( dbSeek(upper(left(_tipdocu,3)) + Str(++nDocu, 10 ) ) )
    enddo
    if Valtype( oTmr ) <> "O"
        if !MsgNoYes( "La "+_tipdocu +" nº "+ltrim(str(nOldFactu))+" ya existe, desea reemplazarla"+CRLF+;
                        "por esta nueva "+_tipdocu + " nº "+ltrim(str(nDocu)) )
            dbUnlockAll()
            aGet[id_numdocu-20,1]:Refresh()
            if Valtype( oTmr ) = "O"
                oTmr:Activate()
            endif
            return( .f. )
        endif
    endif
endif

..
..
aqui se graba todo la info

parame->Num... := nDocu

dbUnlockAll()

 
Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: Claves duplicadas al indexar ....

Postby ACC69 » Thu Nov 03, 2011 7:59 pm

Patricio Avalos Aguirre wrote:Hola

Como le propones el número al usuario?

Yo lo hago de la siguiente manera..

1. tengo en una base los correlativos parame
2- Le propongo un numero, pero no es el definitivo
3.- Al grabar verifico que no exista el numero en la base
4.-grabo y luego le envio el numero al usuario, luego actualizo el numero en parame

Code: Select all  Expand view  RUN
    DEFINE TIMER oTmr INTERVAL 5000 ACTION ;
                    ( Parame->( dbSkip(0) ), ;
                      _numdocu := Parame->GDes+1,;
                      aGet[id_numdocu,1]:Refresh() )
   ACTIVATE TIMER oTmr
    Eval( oTmr:bAction )
 


en grabar
Code: Select all  Expand view  RUN


if !parame->( NetRLock() )
   return( .f. )
endif

Eval( oTmr:bAction )
oTmr:DeActivate()
nDocu := _numdocu

if Docu_BF->( dbSeek( upper(left(_tipdocu,3)) + str( nDocu,10 ) ) )
    nOldFactu := nDocu
    while Docu_BF->( dbSeek(upper(left(_tipdocu,3)) + Str(++nDocu, 10 ) ) )
    enddo
    if Valtype( oTmr ) <> "O"
        if !MsgNoYes( "La "+_tipdocu +" nº "+ltrim(str(nOldFactu))+" ya existe, desea reemplazarla"+CRLF+;
                        "por esta nueva "+_tipdocu + " nº "+ltrim(str(nDocu)) )
            dbUnlockAll()
            aGet[id_numdocu-20,1]:Refresh()
            if Valtype( oTmr ) = "O"
                oTmr:Activate()
            endif
            return( .f. )
        endif
    endif
endif

..
..
aqui se graba todo la info

parame->Num... := nDocu

dbUnlockAll()

 


Hola Patricio, gracias por responder, mas o menos asi lo hago,pero...sin el timer, ya que cada registro, se va grabando pero antes esta una rutina, de por ejemplo ocupado(), pero creo que al parecer, es el indice que se corrompio, al momento de la caida de energia electrica, del primer usuario, que al segundo usuario, reconocio como consecutivo del ultimo folio, es por eso que estoy viendo la manera de saber o crear una rutina, al momento de generar mi indice, me marque error, que existe una clave duplicada, pero no tengo ni idea, si alguien ya tiene implementado algo parecido, se los agradecere mucho.

Gracias y saludos
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Claves duplicadas al indexar ....

Postby RSalazarU » Fri Nov 04, 2011 3:42 pm

Adriano:

Yo tengo unas rutinas que las llamo: Control de Integridad
VerificaDuplicados()
VerificaCabecerasDinDetalle()
VerificaDetallesSinCabecera()
VerificaCamposNulos()


Ahí hago la revisión y emito un informe.

Sin embargo no son automáticas, tiene que hacerlo el usuario.

Ahora, tb, estoy trabajando sobre un proceso automático de mantenimiento, es decir que cada cierto tiempo se ejecute un proceso de mantenimiento al iniciar el programa :
RecrearIndices()
ReprocesarSaldos()

Acá también se podría incluir la rutina de revisión de duplicados

Otra tarea también seria el de ejecutar la rutina de mantenimiento cuando ocurra situaciones extrañas: Crash, etc., en entornos multiusuario.

Atentamente,

Rolando.
Saludos desde Cochabamba, Bolivia
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: Claves duplicadas al indexar ....

Postby ACC69 » Fri Nov 04, 2011 6:18 pm

RSalazarU wrote:Adriano:

Yo tengo unas rutinas que las llamo: Control de Integridad
VerificaDuplicados()
VerificaCabecerasDinDetalle()
VerificaDetallesSinCabecera()
VerificaCamposNulos()


Ahí hago la revisión y emito un informe.

Sin embargo no son automáticas, tiene que hacerlo el usuario.

Ahora, tb, estoy trabajando sobre un proceso automático de mantenimiento, es decir que cada cierto tiempo se ejecute un proceso de mantenimiento al iniciar el programa :
RecrearIndices()
ReprocesarSaldos()

Acá también se podría incluir la rutina de revisión de duplicados

Otra tarea también seria el de ejecutar la rutina de mantenimiento cuando ocurra situaciones extrañas: Crash, etc., en entornos multiusuario.

Atentamente,

Rolando.
Saludos desde Cochabamba, Bolivia


Hola Rolando gracias por contestar, el chiste es al momento de estar indexando se muestre un mensaje de error : "Codigo duplicado o ID duplicado, como se entienda...aunque no siempre se estara indexando, es de vez en cuando,dependiendo del usuario, que quiera reindexar sus archivos en forma semanal,mensual, etc etc , pero que se muestre que exista claves duplicadas, ese es el chiste,imaginate sino sabemos que dentro de la base de datos esten duplicados,todo por la caida de energia electrica o red ,que se yo,yo tengo esa funcion asi ....

Code: Select all  Expand view  RUN
MsgMeter({|oMeter,oText,oDlg,lEnd | BuildIndex(oMeter,oText,oDlg,@lEnd ,;
                                                Dbf05,"S05","STR(CVEIVA,1)",;
                                                Dbf05,.F.,.F.)},;
                                                "Generando indice ..."+Dbf05,;
                                                "Espera por favor..." )

Y aqui la rutina...

Code: Select all  Expand view  RUN
//------------------------------------------------------------------------------
Static Function BuildIndex(oMeter, oText, oDlg, lEnd, cDbf, cAlias, cCpo, cInd, lExclus, lRut)
 LOCAL DirEmp:= "EMP"+TSTR(nNUMEMP)+"\"

 CursorWait()

 IF lRut
     cDbf := DirEmp+cDbf
     cInd := cInd
 ENDIF

 IF lExclus
     Use &(cDbf) Alias &(cAlias) Exclusive
     Pack
 ELSE
     Use &(cDbf) Alias &(cAlias)
 ENDIF

 oMeter:nTotal := RecCount()

 INDEX ON &(cCpo) TAG &(cInd) FOR !DELETED() EVAL (oMeter:Set(RecNo()), SysRefresh(), !lEnd )   //....aqui es desde donde o como poner esa rutina de verificar claves duplicadas ...al momento de estar indexando la base de datos..espero que me entiendan, y ver desde donde poner la funcion,ando buscando y buscando y nada...pero en fin.

 (DbCloseArea(cDbf))
RETURN NIL


Ah y las ultimas 3 rutinas como es la funcion que hace Rolando....

Saludos y buen dia Rolando.

Atte: Adriano C. C.
acc69@hotmail.com
ACC69
 
Posts: 632
Joined: Tue Dec 12, 2006 7:34 pm

Re: Claves duplicadas al indexar ....

Postby RSalazarU » Fri Nov 04, 2011 10:15 pm

Adriano:

Realmente es una gran idea, pero lo veo un poco difícil, se tendría que trabajar con el código HARBOUR de REINDEX/CREATE INDEX y añadir los parámetros que se pasara a EVAL <bBlock>.

Bueno acerca del proceso que te comente: mantenimiento() este se lo debería ejecutar al iniciar el programa bajo los siguientes criterios.

- Se debe indicar con alguna variable de configuración del sistema que se puede hacer mantenimiento en esta terminal
- Se debe indicar cada cuanto se va a realizar el reindexado de la Base de Datos completa.
En este punto, yo tengo una función que realiza el reindexado de TODAS la tablas obligadamente
- Se debe indicar cada cuanto se va a realizar el Reproceso de Saldos.
En algunos de mis sistemas: Almacenes, Ventas, tengo una tabla que maneja los saldos mensuales,
este se actualiza automáticamente, pero puede suceder que por alguna razón no este con la información correcta,
por lo que el reproceso coloca los saldos correctos nuevamente.
También, se debe indicar cada cuanto se realiza el reproceso: diario, semanal o mensual.

Hasta acá lo llevo implementado actualmente

La parte de Control de integridad también se la debería hacer en este punto:
- Verificar si existe duplicados (tu problema)
- Verificar si hay datos nulos (registros sin ID)
- Verificar maestro/detalle (cabeceras sin detalle y detalles sin cabecera)
- Informar de esto en un reporte

Es bastante trabajo, que se lo tiene que hacer poco a poco, es decir ir incorporando estas propiedades a los programas en cada nueva versión.

Atentamente,

Rolando.
Saludos desde Cochabamba, Bolivia
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: Claves duplicadas al indexar ....

Postby Armando Picon » Fri Nov 04, 2011 10:21 pm

Adriano
El problema que tienes no es tu rutina de index. El problema se te origina, estoy casi seguro, porque tu rutina de ingreso de datos no verifica la existencia previa de la clave. Verifica eso reviamente antes de intentar corregir el eval cuando generas el indice. En el clipper habia la posibilidad de generar indices unicos pero en Harbour no hay esa posibiidad asi que la unicidad la debes asegurar en tu codigo.
Saludos
Armando
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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 95 guests