Como controlar registros duplicados en un FORM

Jisko
20 de Agosto del 2003
Como hacer para controlar registros duplicados cuando se agrega un registro, ejemplo la llave es la IDENTIFICACION, y quiero que no ingresen una identificacion repetida. GRACIAS

osvaldo
20 de Agosto del 2003
bueno: primero tienes que tener un indice en la tabla por el campo ese: IDENTIFICACION.
cuando se escribes el nuevo codigo me imagino que en un control de texto: Puedes en el evento lostfocus, escribir algo como esto:
SELECT tabla
SET ORDER TO identificacion
SEEK (THISFORM.txtidentificacion.value)
IF FOUND()
WAIT WIND "EL REGISTRO EXISTE"
ELSE
append blank
etc, etc, etc.....
ENDIF

EL CODIGO TAMBIEN LO PUEDES CONTROLAR A LA HORA DE GRABAR: IS EL REGISTRO EXISTE MANDAS UN
MENSAJE, DE NO SER ASI GRABAS EL NUEVO REGISTRO.
ESPERO TE SIRVA DE ALGO...cualquier duda me avizas

nICA
20 de Agosto del 2003
Osvaldo yo tambien tengo el mismo problema...
Ahora yo tengo un formulario con PageFrame... y este codigo lo tengo en una caja de texto en el evento valid.
El valida bien, no te deja pasar a la siguiente caja de texto mientras encuentre dato repetido, el problema es, como puede hacer para que se me reemplace el valor que va tomar la variable en la tabla recibo...

Ahi te dejo el codigo....dime donde poner el replace...


SELECT RECIBO
ESTASEN=RECNO()
SET ORDER TO 8 && CODREC

SET FILTER TO RECNO()ESTASEN .and. NREC#0
SEEK nrec

SET FILTER TO
GOTO ESTASEN
RETURN IIF(FOUND(),.F.,.T.)

Muchas gracias de antemano....

saludes .. Moran

osvaldo
20 de Agosto del 2003
Bueno a ver:
el codigo que tienes en el evento valid no lo entiendo muy bien: yo lo que hacia seria.
buscar el valor del cuadro de texto en la tabla a ver si existe:

select tabla
seek this.value
if found()
&& aplicas el codigo de retorno.
&& reviertes todo para quedar parado en el registro
else
&& rellenas los datos de la tabla con los valores nuevos y
grabas
endif

Hay algo importante a la hora de crear registros nuevos. si tu tienes una tabla con un campo principal, que sera el indice principal. a la hora de crear un mantenimiento en un forma. debes crear todos los botones del mantenimiento.

Lo que usualmente hacenmos cuando presionamos el boton NUEVO REGISTRO: abrir la tabla y hacer un APPEND BLANK, para introducir un registro, si este existe se debe revertir los cambios y sino existe entonces se reemplazan los datos nuevos.
YO prefiero tenet un control de texto(si fuera el caso) y cuando presiono NUEVO: habilito ese texto: y ahi escribo el codigo a agregar, luego verifico en la tabla si existe: de ser haci solo hago un refesh() y apago todos lo botones porque el registro existe; si no existe entonce hago el append blank y le paso el valor del texto al comapo de la tabal antes de grabar.
Espero te sirva de algo... ok.

nICA
20 de Agosto del 2003
Gracias por responder ..Osvaldo.

Entiendo la logica que me explicas... ahora lo he hecho de esta forma...lo hace bien inclusive el replace ,,,pero el problema ahora es el siguiente:

Cuando digite un codigo que ya existe...envia el mensaje, ahora cuando digito otro codigo para poder pasar a la siguiente caja de texto,,,lo que hace es presentarme el registro correspondiente al codigo que digite inicialmente (erroneo)...me explico..

Que conste este codigo lo estoy haciendo en la caja de texto(txtcodigo) en el evento valid.

Ahi te dejo la otra forma que lo hice

estasen = RECNO()
SELECT recibo
SET ORDER TO 8 && CODREC

SEEK nrec
IF FOUND() = .T.
MESSAGEBOX("CODIGO DE RECIBO ya EXISTE...",0+48,"Error.- Dato ya Ingresado")
RETURN .F.
ENDIF

GOTO estasen
replace recibo.codrec WITH nrec
RETURN .T.
THISFORM.REFRESH

Espero me haya explicado....

osvaldo
20 de Agosto del 2003
me imagino que es que ya hiciste la promera veS un append blank, cuando presionas el boton NUEVO, para agregar un registro y se ha quedado el registro en blanco en la abse de datos: como te explique anteriormente si uno Presiona el boton Nuevo y el registro existe, lo recomendable seria mostar el registro y revertir(ose el registro que agregastes en blanco debe desaparecer) y si el usuario desea agrera otro debe ir Nuevamente al Boton Nuevo.
Te digo esto porque a mi me pasaba lo mismo con algunas formas, te explico: yo presionaba Nuevo, se bria un registro con append blank, pero si el registro existia tenia que hacerle a la tabla un TEBLEREVERT(.T.), para que eliminara el registro en blanco, y si no existia entonces procedia a llenar los campos y luego en el boton grabar: escribia TABLEUPDATE(.t.) Y ASI ME FUNCIOBABA.

para utilizar TABLEUPDATE Y TABLEREVERT tinees que tener la tbla en buffer = 5.
esto es bueno: porque cuando haces un append blank, el registro se crea en buffer y solo se graba cuando haces TABLEUPDATE(.t.) y si prefires revertir los cambios haces TABLEREVERT(.T.) ok...

ESPERO NO TE ENREDE MAS DE LO QUE ESTABAS...

nICA
20 de Agosto del 2003
Tranquilo hermano....

Me ha quedado muy clara tu idea.

Muchas gracias

nICA
20 de Agosto del 2003
Osvaldo.... ya lo solucione hermano...gracias por tratar de ayudarme..

lo hice de la siguiente forma:

SELECT recibo
SET ORDER TO 8 && CODREC

SEEK nrec
IF FOUND() = .T.
MESSAGEBOX("CODIGO DE RECIBO ya EXISTE...",0+48,"Error.- Dato ya Ingresado")
RETURN .F.
ENDIF

GOTO TOP
replace recibo.codrec WITH nrec
RETURN .T.
THISFORM.REFRESH

gracias....por ayudar