En este grupo En todos

Foro de Visual FoxPro

No permitir Registros con el mismo Nombre

Dario
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 12/12/2010

Saludos Foxreros..

Tengo una aplicacion que es un control de Notas, quisiera validar para no permitir asignaturas con el mismo nombre; este es el codigo del Boton Guardar:

DO CASE

CASE LEN(alltrim(thisform.txtNom_mat.Value)) < 4
MESSAGEBOX('Nombre de la Materia erroneo. Modificalo',0+64,'Adveretencia')
thisform.txtNom_mat.SetFocus


OTHERWISE && de otra manera entonces guardamos los cambios
IF TABLEUPDATE(1,.t. ) && si tableupdate() devuelve.t. No encuentra errores guarda los cambios
MESSAGEBOX('Datos Guardados',0+64,'Guardando',3000)
* si estamos guardando un registro nuevo, habilitamos los botones correspondientes
IF thisform.cmdNuevo.Enabled =.f.
thisform._DATANAVBTNS1.Enabled =.T. && habilita los botones de navegacion de registros
thisform.cmdEliminar.Enabled =.T.
thisform.cmdNuevo.Enabled =.T.
ENDIF
thisform. Refresh
ELSE && si tableupdate devuelve.f. Encuentra errores enviamos un mensaje
MESSAGEBOX('No se puede guardar los cambios. '+CHR(13)+'El codigo de Asignatura ya esta registrado',0+16,'Error')
thisform.cmdcancelar.Click
ENDIF
ENDCASE

Si tienen algunas orientaciones referente lo agradeceria.


Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 13/12/2010

Dario

necesitas crear un indice unico para el campo nombre de asignatura. Con esto no la data valida que no se repita el valor.
luego tu capturas el codigo de error y muestras tu mensaje

Dario Loreto
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 13/12/2010

Saludos Luis,..

El Indice principal de la tabla materias. Dbf es Cod_mat; en ella no pueden haber dos Indices principales, yo coloque el campo nom_mat como indice regular.

Estaba tratando de validarlo en el valid de la caja de Texto txtnom_mat pero no me funciona este codigo:

select materia

set order to nom_mat

if seek ( alltrim ( thisform . Txtnom_mat. value )) then

MESSAGEBOX ('Materia Existe, No se permite duplicar Registro')

thisform . TxtNom_mat. Value =''

ENDIF

Pero no me funciona....

Esta es la estructura de la tabla Materia. Dbf:

cod_mat (N) Indice principal

Nom_mat (C) Indice Normal.

Se me viene algo asi como de agrupar el indice principal con el normal....


Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 14/12/2010

Si es tabla libre :
cod_mat indice candidato
nom_mat indice candidato

si la tabla pertenece a una base de datos :
cod_mat indice principal
nom_mat indice candidato

pruebalo ingresando registros con el brows, veras que no te permite ingresar duplicados

Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 14/12/2010

Acabo de probar tu codigo y si funciona

select material
set order to nom_mat
if seek ( alltrim ( thisform.Txtnom_mat.value )) then
MESSAGEBOX ('Materia Existe, No se permite duplicar Registro')
thisform. TxtNom_mat. Value =''
ENDIF

Dario Loreto
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 14/12/2010

Saludos Luis..

Gracias por tu atencion; bueno te digo que es una tabla asociada a una Base de Datos, ahora bien cod_mat esta como principal y nom_mat como normal ya que no me permite colocarlo como candidato, cuando lo intento me genera el siguiente error:

" Se infringe la unicidad del indice nom_mat", y no me permite cambiarlo a candidato.

Por otro lado el codigo valida pero queda anclado aun asi no me deja ingresar ninguna asignatura porque se repite a cada instante el mensaje "Materia existe, no se permite duplicar Registro"


Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 14/12/2010

Si al momento de poner el campo nom_mat como candidato te sale el error es por que en un tabla existen registros duplicados. Lo que hace la base de datos primero es verificar que no existan duplicados y recien crea el indice candidato.

para saber que registros estan duplicados ejecuta esta consulta

select count(nom_mat) repetidos, nom_mat from materia group by nom_mat

Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 14/12/2010

En el init del formulario pones :
Set Multilocks On
=CURSORSETPROP('Buffering', 5, 'material' )

boton grabar :
select material
lccodigo = thisform.txtcodigo.value
lcnombre = alltr(thisform.Txtnom_mat.value)
insert into material(codigo, nom_mat) values(lccodigo, lcnombre)
x=tableupdate(.t.)
if x =.f.
MESSAGEBOX('No se grabo',16,'Aviso')
=tablerevert(.t.)
else
MESSAGEBOX('grabo con exito',16,'Aviso')

ENDIF

Dario Loreto
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 15/12/2010

Saludos Luis...

Coloque en el Init del Formulario el Codigo que me indicaste y cambie el Codigo del boton guardar por el que me indicaste, pero cuando ejecuto el formulario me sale que no tengo ninguna tabla abierta......

Por otro lado; como tengo pocos registros de prueba, realice las correciones pertinentes y elmine los registros duplicados, esto me permitio crear el indice candidato para el campo nom_mat, de tal forma que con el boton guardar que tenia me funciona la validacion, de tal forma que tenias razon con tu explicacion y la valoro con 100 puntos.....

Ahora vamos a corregir el eror que me da para probar la otra sugerencia: al init del formulario yo le tenia el siguiente codigo:

SELECT materia
* Si tabla esta en fin de archivo es porque no tiene registros, debemos deshabilitar el boton eliminar
IF EOF() && si fin de archivo
this.cmdEliminar.Enabled =.t.
ENDIF
this.txtCod_mat.Enabled =.F.

Y en el Unload del form el siguiente codigo:

SELECT materia
TABLEREVERT(.T.)

Que podemos hacer alli?



Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 15/12/2010

Disculpa me falto validar si la tabla no estaba abierta
con esto ya no deberia de salirte el mensaje de error de que no hay tabla abierta.
codigo del boton grabar :
*** primero verificas si la tabla esta en uso
if used('material')
select material
else
use material
endif
*
lccodigo = thisform.txtcodigo.value
lcnombre = alltr(thisform.Txtnom_mat.value)
insert into material(codigo, nom_mat) values(lccodigo, lcnombre)
x=tableupdate(.t.)
if x =.f.
MESSAGEBOX('No se grabo',16,'Aviso')
=tablerevert(.t.)
else
MESSAGEBOX('grabo con exito',16,'Aviso')
ENDIF

Dario Loreto
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 17/12/2010

Saludos Luis Medina...

Ya resolvi, gracias a tus orientaciones...

Exitos...

Una pregunta? , quisiera unas orientaciones sobre filtros para un formulario que tengo, pero cierro este debate y abro otro?

Luis Medina
Bases de datos con firebird en videotu...
Escrito por Luis Medina
el 17/12/2010

Ok.

cierra el debate

Dario Loreto
Sistemas de información instituto univ...
Escrito por Dario Loreto
el 18/12/2010

Gracias al Foxrero Luis Medina por las orientaciones dadas la cual me sirvieron para solucionar el debate planteado.

Felicito al este excelente equipo que conforma la Comunidad de Emagister, cierro el Debate por obtener con exitos la solucion de mi problematica.

Exitos Luis y gracias por tu sabiduria...