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 )
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 = 0Date: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)
Mucho agradeceré su valiosa colaboración.
Un saludo cordial a todos,