Tabla

Hola expertos, una consulta, tengo una tabla con el campo idcomp este campo es una llave primaria y se tiene que autogenerar conforme voy ingresando nuevos registros.
En este campo dentro de la estructura de la tabla en la parte regla de campos de validación he colocado lo siguiente:
LEFT(idcomp,1)="0".AND.LEN(ALLTRIM(idcomp))=5 y en lo que es valores por defecto he colocado lo siguiente:
"0"+REPLICATE("0",4-LEN(ALLTRIM(STR(RECCOUNT()+1,4))))+ALLTRIM(STR(RECCOUNT()+1,4)). Cada vez que pulso el botón nuevo en la caja de texto txtAUto aparece 00001,00002, etc. Tengo que ingresar en esta tabla registros por cada mes. Como haría para que el próximo mes el campo idcomp regrese a 00001 ya que por cada mes los registro tienen que comenzar con 00001. ¿Tengo qué crear otra tabla?. Espero su ayuda y gracias de antemano.

1 respuesta

Respuesta
1
Espero poder ayudarte...
Como fundamento de todos tus sistemas tienes que tener que la clave primaria de una tabla es única e irrepetible, ya que es la identificación del dato..
Por eso, como sugerencia si me permitís, te diría que el campo primario sea del tipo i(4) autoinc..
De esa manera te olvidas de tener que pensar en el reccount() que tampoco es seguro, porque existe el comando pack que borra físicamente los registros marcados con delete y achica la cantidad de registros..
Quizás más adelante, en algún procedimiento de mantenimiento u otro usas ese comando y deja de funcionar esta parte de tu sistema..
Entonces, para la clave primaria un campo integer autoinc..
Ahora, lo que seguiría poner el campo añoMes c(6) y el campo numero en tu tabla y hacer un indice de búsqueda.
En el campo mesaño deberías poner algo como 200711 porque recordá que sino, cuando el mes sea 1 del nuevo año, vas a tener el mismo problema
El indice de búsqueda lo crearíamos así:
Index on añomes+str(numero, 8,0) to miTablaAN
Ahora, dentro de fox esta la tecnología rushmore que trabaja sobre los indices entonces, estaría bueno también crear un indice solo de añoMes y ya veremos por qué:
Index on añomes to miTablaA addi
En tu textbox, donde se pone el numero de referencia, podrías poner, en el valid algo como:
this.value=right(replicate('0',5)+transf(this.value),5)
Esto también te dará un resultado con ceros.. en un campo tipo caracteres..
Para traer el valor nuevo, suponiendo que sabes el mes y el año actual y que funcione rapido harías algo así..:
Se le miTabla
set order to miTablaA &&el indice de añomes
calculate max(numero) for añoMes='200711' to mElUtimo
mElUtimo=mElUtimo+1
En lugar de '200711' pones la variable que hace referencia al año y mes actual, que incluso puede ser un combobox o un textbox dentro de formulario, yo pongo como ejemplo el contenido de la variable para que se entienda
Si el usuario pone un numero existente en el valid deberías poner lo siguiente para recuperarlo..
Se le miTabla
set order to miTablaAN && el indice de los dos campos
if seek('200711'+str(123,8,0),'miTabla','miTablaAN')
* lo encontro y lo traigo..
else
thisform.botonNuevo.click &&para que traiga el nuevo..
Endif
Bueno, espero que mi respuesta haya sido de utilidad y cualquier cosa estoy a tu disposición..
Keystone - Christian
www.keystone.com.ar
Gracias por la respuesta, lo estoy poniendo en practica, en todo caso como haría para que el usuario no digite el numero ni el año ni el mes, si no que automáticamente se grabe estos campos por que estas dos cajas de texto estarían como readonly, el campo mesaño lo jalaría de esta manera year(date())+month(date()) de esa menera se llenaría la caja de texto mesaño automáticamente pero para el campo numero que seria 00001 como lo haría para que se llene automáticamente, por que en el reporte tuviera que mostrar el campo mesaño más el campo numero 2007110001.
Bueno el ejemplo year(date())+month(date()) no es posible dado que los dos resultados son numéricos y se sumarían, por ejemplo para este mes y año te daría 2019.
Hace así mejor:
mAñoMes=left(dtos(date()),6)
La función dtos(date()) te da '20071204' para hoy..
Con left() extraes los primeros 6 dígitos.
En el programa principal de tu aplicación podes poner la variable como publica, así la tienes disponible en cualquier ámbito..
public mAñoMes
mAñoMes=left(dtos(date()),6)
De esa manera, ya podes sumarle el valor de la propiedad value del numero porque son todos caracteres..
El el report, en la referencia al campo, pones mAñoMes+miCampoNumero
De todas maneras, te es conveniente que en el valid del numero, actualices la variable porque puede cambiar el día..
Otro tema para ver es el de validar el numero nuevamente al momento de guardarlo porque puede ser que en un sistema multiusuario, lo ocupen mientras estas llenando los datos..
Espero haberte ayudado y estoy a tu disposición..
Keystone - Christian
www.keystone.com.ar

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas