Ciclo FOR e IF para Busqueda

Realmente aquí me han ayudado mucho ya tengo tiempo de no tocar un programa de visual fox, pero ahora me toco darle unos toques a uno que ya hice jejej y no me acuerdo mucho me esta dando unos errores.
Lo que tengo es una base de datos de alumnos con nombre y numero de carne, tiene más campos pero para explicárselos se los pondré solo con estos dos datos.
El campo de carne tiene que ser único, y lo que quiero es que aparezca un mensaje cuando ingresen un numero de carne que ya existe diciendo de que ya existe y si no existe indicando que puede seguir ingresando datos del nuevo alumno, realmente no lo veo difícil pero se me anda complicando. El código que tengo es.

PUBLIC X
x = thisform.txtCarne.Value  **/ Es una Caja de texto donde ingreso el numero de carne


public i as integer
SELECT nombre, count(carne) as registros from alumnos;
into cursor regis
i = 1      *** / La idea de esto es para que cuente cuantos registros estan existentes y hacer un For para que pase buscando durante toda la tabla.


FOR i =  1 to regis.registros
if not eof()
 GO top
SELECT alumnos.carne,alumnos.nombre FROM alumnos WHERE alumnos.carne == X;
 INTO CURSOR consulta    
  IF (alumnos.carne = X)
     WAIT WINDOW "Este Número de Carné Ya Pertenece a Alguien Mas"
  ELSE
    MESSAGEBOX("Puede Seguir Ingresando Datos, GRACIAS!!", 0+16,"Mensaje de Prohibición del Sistema...")
   ENDIF
Endif
Endfor
Thisform. Refresh

Espero alguien me pueda ayudar, me super urge no me funciona esta cosa

1 Respuesta

Respuesta
1
Te haz complicado mucho, lo que necesitas en primer lugar es un indice en el campo carnet
luego
SELECT alumnos
SEEK(alltrim(thisform.txtCarne.Value)) &&seek funciona solo si hay un indice
IF FOUND()
MESSAGEBOX("Este Carnet Ya existe")
ELSE
MESSAGEBOX("Este Carnet No existe, puede continuar")
ENDIF
con Seek lo haces de forma mas rapida, te lo recomiendo mucho, pero si no quieres crearle un indice a la tabla puedes hacerlo con LOCATE pero cuando sean demasiados registros es sistema sera lento, con LOCATE seria asi
SELECT alumno
LOCATE FOR carne=(alltrim(thisform.txtCarne.Value))indice
IF FOUND()
MESSAGEBOX("Este Carnet Ya existe")
ELSE
MESSAGEBOX("Este Carnet No existe, puede continuar")
Endif
Gracias por haber contestado, pero fíjate que no me funciona bien ya que no me busca en todos los registros y si tiene indice no es el principal pero si tiene indice el campo carne.
Pero lo tuyo me dio una idea para hacerlo pero se me encicla el FOR.
Y = INPUTBOX("Ingrese el numero de Carne del Alumno")
SELECT  count(carne) as total from alumnos;
into CURSOR regis
X = regis.total
i = 1
FOR i =  1 to X
    IF  (alumnos.carne == y ) THEN
        MESSAGEBOX("Este Carnet Ya existe")
        THISFORM.CARNE1.value =" "
    ELSE
        MESSAGEBOX("Este Carnet No existe, puede continuar")
        THISFORM.CARNE1.value =y
    ENDIF
Endfor
THISFORM.Refresh()
¿No me busca en toda la tabla? Y la idea seria que pase registro por registro revisando, y el ciclo FOR se me Encicla, por ejemplo encuentra un carne que si esta, me dice "Este Carnet Ya Existe" pero de igual manera pasa por el Else y me indica que No Existe o a veces me indica que ya existe el numero de veces que tenga de registros, ¿osea no se sale al encontrar la primera coincidencia? Yo lo que quiero es que me busque en todo los registros el carne que indico en el variable Y, y cuando la encuentre me diga que Ya existe y si no la encuentra me deje seguir y se salga de los ciclos y pueda seguir agregando la demás información del alumno, ademas quiero que no acepte campo repetido, osea que el Carne no se repita por nada del mundo, espero me podas apoyar y gracias por haberme contestado
Saludos!
El FOR continua porque no tiene un EXIT que rompa el ciclo una vez lo haya encontrado, lo que veo es que has omitido el GO i como lo tenias al comienzo (para recorrer todos los registros).
SEEK o LOCATE es la mejor opción, ellos buscan por ti, y SEEK lo hace super veloz cuando son millones de registros.
Hagamos una cosa, entiendo perfectamente lo que quieres hacer, si quieres puedes darme lo que tienes enviándolo acá [email protected] y yo lo reviso, y sino, créeme que LOCATE o SEEK es lo único que necesitas y estos recorren toda la tabla no importa en que registro este el puntero, ellos recorren desde el primer registro hasta encontrar alguna coincidencia (en el caso de que exista más de una vez), y no importa si el indice carne no sea el primario, es indiferente.
Para darte un ejemplo del uso de SEEK y LOCATE lo haré con una de las tablas que trae como muestra visual fox
escribe este código en un archivo de programa (. Prg) o en la ventana de comandos
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE customer
SET ORDER TO POSTALCODE
GO BOTTOM && solo para moverme de registro, me muevo al ultimo
SEEK("01-012")
BROWSE &&busca el campo postalcode, veras que estas posicionados en el, osea que lo encontró
ahora, probemos alrevez,
GO TOP
SEEK("WX3 6FW")
BROWSE &&nuevamente lo encontro y estamos posicionados en el
lo mismo seria con LOCATE
solo que seria LOCATE FOR postalcode ="WX3 6FW"
Cualquier cosa avisame
Como estas, realmente muchas gracias por el tiempo te cuento ya me funciono solo que ahora tengo otro problema lo que estoy poniendo es esto.
Y = INPUTBOX("Ingrese el numero de Carne del Alumno")
SELECT alumnos
LOCATE FOR carne=(Y)
  IF FOUND()
            MESSAGEBOX("Este Carnet Ya existe")
            THISFORM.CARNE1.value =" "
   ELSE
             MESSAGEBOX("Este Carnet No existe, puede continuar")
             thisform.carnE1.Value = Y
             thisform.nomBRE1.GotFocus
Endif
Todo Super, pero lo estoy haciendo en un formulario de ingreso de datos, con la barrita que trae predeterminado cuando se crea formularios en Visual. FOx.
Y si no le doy Add y verifico perfecto, pero si le doy Add y luego presiono el botón de verificar el carne, cuando por ejemplo me dice que no existe el carne y puede continuar me saca de nuevo al formulario pero como que se trabara, me imagino que es porque con el Add abro la tabla en un registro específicamente y listo para teclear la info pero al darle en el botón de verificar carne se mueve el registro de posición o algo pasa, y lo que yo quisiera es por ejemplo darle add que lo primero que me pida es verificar el carne, si existe pedirlo de nuevo si le doy cancelar que no me deje abiertos los registros no me deje agregar, ¿y si pongo un carnet nuevo que me coloque ese carne de una vez en el campo carne justamente en el registro que se abre cuando le doy add y ya los demás campos los lleno tranquilamente? Media vez tenga carne existente que no me deje agregar nuevo ya que el carne es único.
Espero tus comentarios, y en verdad gracias por reslverme lo anterior, ahora seria con este pequeño detalle y listo GRACIAS:
¿Estas usando el formulario que se hace con el asistente?, ¿Dices qué usas un botón para verificar y otro para ingresar?, la verificación la tienes que hacer en el mismo botón de add, si es como me lo estoy imaginando (con asistente) seria un código parecido a este
Y = INPUTBOX("Ingrese el numero de Carne del Alumno")
SELECT alumnos
LOCATE FOR carne=(Y)
  IF FOUND()
            MESSAGEBOX("Este Carnet Ya existe")
            THISFORM.CARNE1.value =" "
   ELSE
             MESSAGEBOX("Este Carnet No existe, puede continuar")
            Dodefault()
Endif
Para comprenderte bien debería de ver el código del formulario que estas usando

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas