¿Cómo generar un consecutivo automático de las claves de clientes en una tabla?

Un favor estoy iniciando en esto del fox pro estoy creando un programa de captura de información, ya cree un prg que me manda llamar a mi formulario en este caso es alta de clientes en el campo de la tabla clave tengo como clv_clie esta clave seria así 00001, 00002,00003, etc. Lo que requiero es que el texbox no lo capture manualmente si no que cada que le de un click al botón nuevo me genere el consecutivo de la clave.

1 respuesta

Respuesta
1

Lo puedes implementar de varias maneras, dependiendo de la funcionalidad de tu formulario.

Si tu formulario tiene una opción de DESHACER o UNDO o CANCELAR, es decir que el usuario puede apretar un botón y deshacer la alta, entonces tienes que generar el consecutivo al momento de guardar los datos y no al momento de COMENZAR la alta.

En cambio si en tu formulario sólo puedes GUARDAR la información después de iniciar una alta, entonces puedes generar el consecutivo al PRINCIPIO de la ALTA.

Para hacer esto tienes dos formas:

1.- Hacerlo con un campo en la tabla de tipo AUTOINCREMENT. Este campo es numérico y fox controlará automáticamente el siguiente consecutivo. Cada vez que agregues un registro, fox pondrá en este campo el siguiente consecutivo disponible.

Si usas esta opción, y en tu formulario puedes CANCELAR la alta, debes tener cuidado de hacer el INSERT o el APPEND sólo cuando vayas a guardar y no antes, porque de otra manera perderás el consecutivo (tendrás huecos).

Por otro lado si tu formulario no tiene la opción de deshacer, puedes hacer el insert o el append desde el inicio y luego actualizar los datos con REPLACE o UPDATE.

2.- Lo puedes hacer con un campo numérico normal, en donde el consecutivo lo controlas tú manualmente. Personalmente yo uso esto porque me da el control del consecutivo en el momento preciso en que yo lo deseo.

Para usar esto, el consecutivo se asigna sólo al momento de GUARDAR los datos de la alta y no antes.

En ese momento se hace algo así:

* Bloqueas la tabla

lock clientes

select max(num_cli) +1 as consec_cte into cursor consecutivo

select consecutivo

if eof()

* esto hay que ponerlo si usas VFP 8 o MENOR

num_cliente = 1

else

* aquihay que poner el NVL para fox 9,

num_cliente = nvl(consecutivo.consec_cte,1)

endif

*

* insertas los datos en la tabla con append o insert

*

Unlock in 'clientes'

Recuerda que los CEROS delante del consecutivo no existen, por lo que para efectos de los reportes y demás, deberás poner en el formato o máscara que le agregue los CEROS a la izquierda (leading zeros).

muchas gracias por la ayuda.

mi formulario tiene 4 botones uno de nuevo, uno de guardar, el de cancelar y el de salir.

yo creo que la primera opción me parece mejor. lo que quiero hacer es lo que me comentas

cuando de click en el botón nuevo se activen todas las cajas de texto y en ese momento me de un consecutivo por ejemplo el 5 pero si doy click en cancelar me deshaga los cambios y no cambie de numero, lo de la mascara ya lo comprendi para que me aparescan los ceros, un favor me podrias explicar un poco mas de como poder hacerlo. estoy usando el visual foxpro 9. disculpa una pregunta el codigo que me proporcionaste es del ejemplo 1 o el 2?

Gracias. Saludos

El ejemplo que te puse es para la opción 2. Lo que tú quieres hacer (asignar el numero cuando le den al botón de alta y si le dan cancelar que no lo ocupe) está bien, pero sólo funciona si tu sistema es MONOUSUARIO. Si estas preparando para que tu sistema sea MULTIUSUARIO (que es el ejemplo que te mande), definitivamente no funcionaría, ya que forzosamente tendrías que asignar el número al momento de guardar.

Por lo que entendí, puedes hacer lo siguiente:

En el botón de nuevo, en el evento click agrega algo como lo siguiente:

Thisform. SetAll('enabled',.t.,'Textbox')
Thisform. SetAll('enabled',.t.,'Editbox')
Thisform. SetAll('enabled',.t.,'Combobox')
Thisform. SetAll('enabled',.t.,'Checkbox')
Thisform. SetAll('enabled',.t.,'Optiongroup')
Thisform. SetAll('enabled',.t.,'grid')

Este código habilitará todos los campos de tu formulario para los tipos de campos indicados, sin necesidad de hacerlo uno por uno. Debes poner lo mismo pero con .f. cuando guardes o canceles para deshabilitarlos

Como el numero de cliente es automático, ese campo lo debes deshabilitar:

thisform. campo_num_cliente.enabled = .f.

Luego permites que se capture toda la información del cliente, y al guardar pones el ejemplo que te mande, asignado el numero de cliente siguiente al campo de la tabla.

Para enmascarar el numero de cliente con los ceros a la izquierda, en tu formulario en las propiedades del campo del numero de cliente, en la propiedad FORMAT ponle una L para que te despliegue los ceros a la izquierda.

Hola Perdón por no poder contestar antes.

muchas gracias por la solución me ayudo realice lo que me comentaste y ya pude realizarlo.

nuevamente gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas