Ayuda con ADO

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Ayuda con ADO

Post by edufloriv »

Saludos mis amigos,

Se me está presentando un problema, el cual ocurre muy pero muy de vez en cuando, pero me gustaría consultar a todos aquellos que tienen experiencia trabajando con ADO.

El código que pongo a continuación busca el tipo y serie del documento de venta a emitir en la tabla MAESFORM donde he puesto todos los documentos de venta que se generan y sus respectivos correlativos (lease FACTURAS,NOTAS DE CREDITO,GUIAS, etc), el proposito de la función es asegurar el registro, calcular el nuevo numero de documento, liberar el registro y devolver ese nuevo numero de documento.

Code: Select all

FUNC VentaSumarDocumento

LOCAL cNewDoc
LOCAL cNuevo  := TEMPC->VC_DOCSER+'-00000000'
LOCAL cQuery  := "SELECT * FROM MAESFORM "+;
                 "WHERE FM_TIPO = '"+TEMPC->VC_DOCTIP+"' AND FM_SER = '"+TEMPC->VC_DOCSER+"'"
LOCAL oFormNum

   oFormNum := TOleAuto():New('ADODB.Recordset')
   oFormNum:CursorLocation = adUseClient
   oFormNum:Open( cQuery , oConexion , adOpenDynamic , adLockPessimistic )
   IF oFormNum:RecordCount() > 0
      DO WHILE .T.
         IF oFormNum:Fields("FM_LOCKER"):Value = 0
            oFormNum:Fields("FM_LOCKER"):Value := 1
            cNewDoc := STRZERO( VAL(oFormNum:Fields("FM_NUME"):Value)+1 , 8 )
            cNuevo  := oFormNum:Fields("FM_SER"):Value+'-'+cNewDoc
            oFormNum:Fields("FM_NUME"):Value   := cNewDoc
            oFormNum:Fields("FM_LOCKER"):Value := 0
            oFormNum:Update()
            EXIT
         ENDIF
      ENDDO
   ENDIF
   oFormNum:Close()

RETURN( cNuevo )
El error ocurre en el oFormNum:Update() (linea 674) y me aborta la operación:
Date:25/11/14 Time: 18:16:14
Error WINOLE/1007 No se puede encontrar la fila para su actualización: algunos valores han cambiado desde la última vez que se leyó. (0x80040E38): Microsoft Cursor Engine (DOS Error -2147352567)

Called from TOLEAUTO:UPDATE(0)
Called from VENTASUMARDOCUMENTO(674)
Yo intuyo que esto se produce cuando 2 operaciones realizadas en estaciones distintas pasan exactamente al mismo tiempo el IF oFormNum:Fields("FM_LOCKER"):Value = 0


Mucho agradeceré su valiosa colaboración.




Un saludo cordial a todos,

Eduardo Flores Rivas


LIMA - PERU
User avatar
luisvasquezcl
Posts: 1259
Joined: Thu Jul 31, 2008 3:23 am
Location: Chile
Contact:

Re: Ayuda con ADO

Post by luisvasquezcl »

Hola Eduardo,
Leyendo un manual de ado, éste indica que el bloqueo adLockPessimistic sólo funciona cuando el cursor location se define como adUseServer, en caso contrario no hace nada por lo tanto el AdLockOptimistic debería funcionar bien.

Creo que el error pasa por lo siguiente:
Al asignar el valor 1 al campo FM_LOCKER deberías hacer un update para que efectivamente se grabe en la tabla y sea visible a los otros usuarios, luego el resto de la operación:

Code: Select all

IF oFormNum:Fields("FM_LOCKER"):Value = 0
            oFormNum:Fields("FM_LOCKER"):Value := 1
            [b][i]*- Agregar este update para que refresque la tabla y los otros usuarios no puedan bloquear.[/i][/b]
            oFormNum:Update()

            cNewDoc := STRZERO( VAL(oFormNum:Fields("FM_NUME"):Value)+1 , 8 )
            cNuevo  := oFormNum:Fields("FM_SER"):Value+'-'+cNewDoc
            oFormNum:Fields("FM_NUME"):Value   := cNewDoc
            oFormNum:Fields("FM_LOCKER"):Value := 0
            oFormNum:Update()
            EXIT
Endif           
Me pregunto, que pasa si por algún motivo el campo FM_LOCKER no vuelve a cero: la aplicación se cuelga en el loop?
faltaría poner un número de intentos o algo por el estilo para que pueda salir del loop.
Espero te sea un aporte.
Saludos cordiales,
Luis Vásquez.
User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: Ayuda con ADO

Post by edufloriv »

Luis,

Es cierto, vaya, a veces no vemos la solución en frente nuestro. Voy a realizar tus cambios sugeridos y a ver como va.

Mil gracias por tu tiempo amigo,

Eduardo Flores Rivas


LIMA - PERU
Post Reply