Campo autoincremental en Visual Foxpro 9.0

Revise la respuesta que le diste a Mcdaniels sobre campos autoincrementales, aplique tu código en un PRG, al ejecutarlo me sale el siguiente mensaje :

CLEAR ALL
OPEN DATABASE C:\ProyectoASV\BD_planillas\admi_planilla.dbc
USE plani_dia
GO TOP
SELECT MAX(ide)+1 As consec_cte INTO CURSOR consecutivo * aquí dice "commans is missing required clause"
SELECT consecutivo
IF EOF()
ide=NVL(consecutivo.consec_cte,1)
ENDIF

Respuesta
2

Tienes Razón, hay un error en la sintaxis del comando. Debe ser:

Select max(ide)+1 as consec from plani_dia into cursor consecutivo

Gracias Amarunh por tu ayuda, funciono el código, pero no corre, es decir dentro del cursor solo hay el numero 1 y ahí se queda; dentro del campo ide no realiza ningún cambio, todo aparece 0, como hacer para que corra y dentro del campo ide se numere desde el 1 hasta el ultimo registro, gracias anticipadas por tu atención

La solución que te di (y a Mcdaniels) era para INSERTAR un registro nuevo en la tabla asignado alcampo (IDE en este caso) el siguiente numero consecutivo.

Por lo que me pones, me parece que tu estás tratando de hacer algo diferente, ¿no?

El código que te puse hará lo siguiente: buscará en la tabla plani_dia el numero máximo que se encuentra en todos los valores del campo IDE y a ese número máximo le incrementará 1, ese valor es el numero siguiente disponible en tu tabla para INSERTAR un registro nuevo.

Tal vez si me explicaras un poco lo que quieres hacer te puedo ayudar más allá.

Gracias Amarunh por tu respuesta y tu interés, tengo una tabla Plani_dia, en la que cada día voy a ingresar nuevos registros o eliminar alguno de ellos, queria identificar la posición de un registro dentro de la tabla para acceder a el y hacer un EDIT, para esto queria como antes. utilizar el Recno(), pero ya no se usa, revisando encontre lo del campo incremental que viene desde el VFP 8.0, alli hay dos formas de hacerlo una automatica generada por el propio VFP, pero no me convence para lo que quiero desarrollar, entonces la segunda alternativa es crear un campo IDE numerico, en el cual voy a numerar los registros desde el 1 hasta el último, cada vez que elimine o aumente un registro, mediante un PRG volver a renumerar el campo IDE, de tal manera que cada fin de jornada diaria la tabla quede actualizada. Como hago para realizar esta tarea. Gracias de antemano

OK. Me imagino que actualmente tiene registros en la tabla, ¿no? Lo primero que tiene que hacer es poner el campo IDE un consecutivo. Para eso usa el siguiente código:

CLEAR ALL
OPEN DATABASE C:\ProyectoASV\BD_planillas\admi_planilla.dbc
USE plani_dia
GO TOP

vl_consecutivo = 1

do while !eof()

replace IDE with vl_consecutivo

vl_consecutivo = vl_consecutivo + 1

Skip

Enddo

Close tables all

Close databases

De ahí en adelante, coloca el código que ya te había dado en el momento en que des de ALTA un registro nuevo. Con eso mantendrás actualizado el consecutivo cada vez que insertes un registro nuevo, se registrará un nuevo consecutivo.

En cuanto a las modificaciones, Por definición, cuando identificas a un registro con una clave (o un consecutivo, ese consecutivo NO SE PUEDE CAMBIAR, por lo que lo que tu quieres hacer (de renumerar cada vez el consecutivo ) no es correcto (salvo excepciones muy específicas).

En el caso de las modificaciones, debes evitar que el campo IDE se modifique, ya que el consecutivo no depende del usuario. Si un registro se BORRA de la tabla, el consecutivo SE PIERDE.

Una estrategia para no perder los consecutivos, es manejar un campo de STATUS en donde si quieres BORRAR un registro, en vez de borrarlo, sólo marcas el campo STATUS con algún valor (por ejemplo CAN o DEL), que te indique que se borró. De esta manera tu consecutivo siempre está actualizado.

1 respuesta más de otro experto

Respuesta

Calculate max(ide) to xnro_ide
m.ide=xnro_ide+1

con esto solucionas el problema

SELECT MAX(ide)+1 As consec_cte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas