La Web del Programador: Comunidad de Programadores
 
    Pregunta:  62913 - NUMERO CORRELATIVOS EN TABLAS
Autor:  Patrick Ramirez
Buenas tardes a todos, me estoy iniciando en visual fox, he creado unas tablas que tienen el campo llamado "codproveedor", como puedo hacer para generar un numero correlativo cada vez que quiera ingresar un nuevo registro en la tabla.

  Respuesta:  Marga del Pino
Si tienes un boton Nuevo, y un campo ReadOnly cod donde reflejas el nuevo valor calculado del articulo, pon en el evento valid del boton Nuevo
algo como esto. Hay botones alta,baja,cambios y nuevo en el formulario que responden a la funcion que realizan , la tabla que se va a llenar se ordena por nombre para visualizarla en un campo grid o rejilla del formulario, pero en la funcion creacodnum hay que ordenar temporalmente por el campo cod, para poder encontrar numeros vacios y darlos

WITH THISFORM
STORE " " TO .nomb.VALUE
.cod.VALUE=creacodnum() && se ordena por tag cod
.cod.REFRESH
set order to tag nomb
STORE .F. TO .baja.ENABLED,.cambios.ENABLED
.alta.ENABLED=.T.
ENDWITH

Debajo tienes la funcion que debes poner en el fichero de procedimientos de la aplicacion, para poder utilizarla en otro formulario

FUNCTION creacodnum
PARAMETERS caralf
* Debe utilizarse para ficheros con pocos artículos, con campo COD numérico,
* o alfabético pero que solo contenga números y en ese caso incluir el
* parametro caralf indicando cuantos caracteres tiene la cadena (1 a 3)
SET ORDER TO TAG cod
GOTO TOP
m.num=RECCOUNT()
esta=.T.
m.cad=" "
*Si no hay artículos en m.esta debe ser .T
FOR i=1 TO m.num
esta=.F.
SCAN WHILE NOT esta
IF PARAMETERS()=1 && cod es de tipo CHARACTER
IF i=VAL(cod)
esta=.T.
EXIT
ENDIF
ELSE && cod es de tipo NUMERIC
IF i=cod
esta=.T.
EXIT
ENDIF
ENDIF
ENDSCAN
IF NOT esta
EXIT
ENDIF
ENDFOR
m.num=IIF(NOT esta,i,m.num+1)
IF PARAMETERS()=0
RETURN m.num
ELSE
DO CASE
CASE caralf=1 OR (caralf=2 AND m.num>9) OR (caralf=3 AND m.num>99)
m.cad=STR(m.num,caralf)
CASE (caralf=2 AND m.num<10) OR (caralf=3 AND m.num>9 AND m.num<100)
m.cad="0"+STR(m.num,caralf-1)
CASE (caralf=3 AND m.num<10)
m.cad="00"+STR(m.num,1)
ENDCASE
RETURN m.cad
ENDIF