Campo autoincrementable

Saludos.
Deseo contar todos los registros de una tabla y pasarle el valor a una variable para de esa forma poder incrementarle en un valor. Lo que en realidad deseo es hacer una campo autoincrementable (ya que no he visto que en las tablas de fox existe una variable de ese tipo) en donde sea de la forma "0001","0002", "0003", etc
Te agradecería mucho me pudieras ayudar en ello
Muchas gracias
Respuesta
Bueno no existe un campo de autonumérico bueno esto ya lo sabes el problema que para esto necesitas crear una rutina y para poner 0001, 0002
Ningún campo numérico guarda 0 ceros a la derecha así que lo que tines que hacer es una rutina que convierta el reusltado de una suma en un cuadro de texto ... de todas manera te recomiendo lawebdelprogramador.com

3 respuestas más de otros expertos

Respuesta
1
No olvides valorar la respuesta.
Nunca he trabajado con los grids de esa forma pero se ve interesante aunque me temo que entre alternar en el recordsource entre tabla y cursor te esta generando conflicto. No entiendo porque alternas entre tabla y cursor si de todos modos las operaciones las estas haciendo directamente sobre la tabla. Vamos hacer un seguimiento a cada botón y pondré el código que utilizaría yo.
Primero en el evento activate:
ThisForm.GridResp.RecordSourcetype=1
ThisForm.GridResp.RecordSource="responsable"
En el botón eliminar: Pones el puntero en el registro del grid que quieres eliminar y escribes este código delete in responsable
Si la tabla lo estas usando en modo exclusivo puedes incluir el pack, sino simplemente quedara deleteado.
En el botón agregar
select responsable
insert into responsable values('"+ NueCodi +"','"+ thisform.text1.value +"')"
Excelente tu respuesta amigo, ya solucione el primer problema, pero ahora se me presento un error, te explico:
Cuando cargo el formulario tengo un grid donde carga todos los registros de una tabla (responsable.dbf), para cargar el grid en el formulario en el evento activate cargo el sgt código:
ThisForm.GridResp.RecordSource="select * from responsable into cursor Cresponsable"
tambien tengo un boton q dice eliminar, cuando elimino registros q se cargaron al momento de cargar el formulario todo funciona normal, el codigo es el comando eliminar evento click es el sgt:
thisform.gridresp.RecordSource="delete from responsable where codi_resp=Cresponsable.codi_resp"
pack
thisform.gridresp.RecordSource="select * from responsable into cursor Cresponsable"
thisform.refresh
ahora tambien tengo otro boton q dice agregar donde tengo q ingresar el dato de la persona y el campo primario se autogenera (gracias al codigo q me enviastes esto funciona ok), el codigo q le puse en el boton agregar evento click es el sgt:
select val(max(codi_resp)) as codmax from responsable into cursor Cresponsable
NueCodi=padl(alltrim(str(Cresponsable.codmax+1)),3,'0')
thisform.text3.value=NueCodi
thisform.gridresp.recordsource= "insert into responsable values('"+ NueCodi +"','"+ thisform.text1.value +"')"
thisform.gridresp.recordsource="select * from responsable into cursor Cresponsable"
thisform.refresh
hasta aca todo bien, PERO cuando agrego registros con el boton agregar y de ahi quiero borrarlos con el boton eliminar me sale un mensaje de error, el cual es el siguiente:
"la operación no es valida para el operador cursor"
¿A qué se debe este error?
¿Y cómo hago para solucionarlo?
Muchas gracias de antemano
Saludos, la verdad son nuevo programando en foxpro y desearía que me aclares otro asunto que diferencia o para se emplearía más el trabajar con cursores y en que beneficiaria emplearlos. Muchas gracias
Los cursores y las tablas las puedes utilizar en diferentes objetos pero todo depende de la finalidad. Si lo único que quieres es mostrar datos yo te recomiendo usar cursores. Si ademas quieres modificar datos, en el caso por ejemplo de un grid puedes usar las tablas. Ahora también por simplicidad puedes utilizar la tabla original directamente y trabajar sobre ella, como se ha hecho en el caso que me has presentado, o también hacer una copia de la tabla con solo los campos que deseas y luego volcar los cambios en la tabla original. También puedes hacer uso del controlsource en el caso de combox, grids, etc, de eso modo solo seleccionas las columnas que deseas de una tabla. Como te darás cuenta puedes usar diferentes formas y métodos.
Para que aparezca de la forma que dices el campo de la tabla debe ser de tipo carácter con extensión 4. En cuanto al calculo del valor vas a tener problemas en el conteo del registro si utilizas funciones como reccount o recno ya que si hay registros deleteados en tu tabla los considerara en el cálculo si no hiciste un pack. Empieza por ingresar algunos registros comenzando con '0001'. Ahora vamos a suponer que tu campo incrementable se llama código haz lo siguiente:
select max(val(codigo)) as codmax from tabla into cursor curcod
El nuevo codigo sería l siguiente:
nuevocod=padl(alltrim(str(curcod.codmax+1,4,0)),4,'0')
Espero haberte ayudado. Si tienes otra duda espero tu consulta.
Respuesta
1
* Abre o selecciona la tabla
use tabla1
* Cuenta el número de registros que hay
count to a
* Forma una cadena con 0s menos la longitud del número de registros y
* concatena el número de registros mas 1 (Concatenar es pegar dos cadenas)
b=replicate('0',5-len(alltr(str(a))))+alltr(str(a+1))
* Muestro el nuevo código en un label o en lo que necesite
* Recuerde que el código se almacena con un tipo de datos string o caracter
* Para conservar los 0s
thisform.label2.caption=b
Respuesta
1
Tiens que crear una rutina que lo haga, vas a necesitar una tabla de contadores:
con los sig. campos:
Llave, ultimoval
El proc. Seria más o menos así:
PROCEDURE GeneraID
Parameters cLlave
cLlave = ALLT(UPPER(cLlave))
Local nDevuelve,cAlias
nDevuelve = 0
cAlias = Alias()
if !Used('ContadorADMIN')
AbreTabla('ContadorADMIN')
endif
Select ContadorADMIN
IF !(allt(Llave) == cLlave)
Locate for allt(Llave) == cLlave
if !Found()
Append blank
Replace LLave with cLlave
endif
ENDIF
replace ContadorADMIN.UltimoVal with ContadorADMIN.UltimoVal + 1
Store ContadorADMIN.UltimoVal to nDevuelve
use in ('ContadorADMIN')
If !EMPTY(cAlias)
SELECT(cAlias)
endif
Return nDevuelve
Endproc
Lo llamas cada vez que necesitas de un nuevo contador.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas