16 de marzo de 2017

El registro está fuera de rango (#5)

Artículo original: Record is out of range (#5)
http://www.foxpert.com/KnowlBits_200609_3.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York


A veces trata de acceder a un registro que no existe en la tabla seleccionada.

Causa: Corrupción de índice

Cuando se corrompe el índice de una tabla, pudiera contener números de registros que ya no existan en la tabla. Cuando usted intenta acceder a este registro, recibe el mensaje de error que típicamente se refiere a la función o comando como tal. Si el error aparece en un comando que no accede a registros, puede ser una condición de filtro que es evaluada por detrás, por ejemplo, en un grid. REINDEX normalmente se ocupa de este problema durante el desarrollo. En tiempo de ejecución se debe utilizar un código para reordenar índices.

Causa: Listbox y Requery

Un control listbox está enlazado a un cursor utilizando RecordSourceTypes #2 (Alias) o #6 (Campos) y su valor apunta a un registro. Ahora reduce la cantidad de registros en su RecordSource. Típicamente el error aparece cuando emplea ZAP; pero ocasionalmente aparece cuando se re ejecuta una instrucción SELECT o al emplear REQUERY().

Una vez que esto ocurra, el error puede aparecer en varias situaciones. Ocurre cuando accede a una propiedad en el listbox. Pero también ocurre cuando Visual FoxPro refresca internamente el listbox. LA razón es simple, Visual FoxPro almacena el número de registro actual y navega hasta ese registro cuando usted intenta acceder al listbox, o cuando necesita repintarlo. Cuando elimina registros y no hay registros con el viejo número, entonces usted recibe un error. Lo mismo se aplica también a controles Combobox.

Persiste la pregunta de porqué no ocurre siempre un error. Parece que Visual FoxPro contiene mucho código que notifica a los controles de un cambio en la tabla. Esto explica, por qué el grid se queda completamente en blanco, incluso cuando no es necesario repintarlo. Estas notificaciones de eventos son necesarias para evadir los errores de este tipo. Cuando cambia la cantidad de registrosdel Recordsource desde un método Requery(), no tendrá ningún problema. Esto es obvio, debido a que VFP conoce que el RecordSource tiene que cambiar. Pero, incluso cuando ejecute SELECT ...FROM en alguna parte del programa, parece que se le notifica al listbox y no dispara ningún error. Al parecer ZAP es el comando menos cooperativo, y causa la mayoría de los problemas.

Causa: GOTO o LOCATE RECORD

La razón más obvia para este error es la cantidad no válida de registros utilizada por el GOTO o el comando LOCATE RECORD. Los números de registros válidos van desde 1 a RECCOUNT() y los números negativos para los registros agregados. LOCATE RECORD puede también obtener RECORD()+1 como un parámetro y posicionar la tabla en este caso en EOF()

No hay comentarios. :

Publicar un comentario