FoxPro/Visual FoxPro - Ayuda

 
Vista:

Ayuda

Publicado por Luis Sarabia (1 intervención) el 30/06/2007 02:05:54
Tengo un problema con un código que estoy desarrollando a mi parecer esta correcto pero algo pasa que no me esta dando los resultados correctos ya e probado de varias formas pero sigo sin tener éxito.

Para esto tengo una tabla con la cual estoy trabajando los campos en los cuales me estoy centrando para esta función son 36 ( 9 son para calificaciones de 9 materias de forma regular esta) , 9 muestran la situación de cada alumno ejem: C.R. (Curso de Repetición) o Nada si es que es regular. Se cuenta con esta informasion y es la que se va a usar para comparar, 9 siguientes son para extraordinarios, Tambien se cuenta con esta informasion y 9 para situación del extraordinario que es la que se reuiere ejem: EXT, EXT C.R. ( Si en el periodo normal tiene un C.R. en situación de la calificación correspondiente mas o menos el código para k me de este resultado es el siguiente:

Para las nueve materias:

SET DEFAUL TO "c:\registros\data"
CLEAR
CLOSE TABLES
LOCAL sit_est

sit_est1 = "EXT"
sit_est2 = "EXT C.R."

STORE 0 TO gnCount


GO TOP
DO WHILE .NOT. EOF()
IF se_01 = "C.R." AND ical_01 > "0" && se_01 = situacion, si es regular o no
gnCount = gnCount + 1 && Solo un contador
REPLACE ise_01 WITH sit_est2 WHILE ical_01 > "0" && Toma la informasion
ENDIF
IF se_01 <> "C.R." AND ical_01 > "0"
gnCount = gnCount + 1
REPLACE ise_01 WITH sit_est1 WHILE ical_01 > "0"
ENDIF
SKIP 1
ENDDO
WAIT WINDOW "Registros Coincidentes :"+LTRIM(STR(gnCount)) NOWAIT

GO TOP
DO WHILE .NOT. EOF()
IF se_02 = "C.R." AND ical_02 > "0"
gnCount = gnCount + 1
REPLACE ise_02 WITH sit_est2 WHILE ical_01 > "0"
ENDIF
IF se_02 <> "C.R." AND ical_02 > "0"
gnCount = gnCount + 1
REPLACE ise_02 WITH sit_est1 WHILE ical_01 > "0"
ENDIF
SKIP 1
ENDDO
WAIT WINDOW "Registros Coincidentes :"+LTRIM(STR(gnCount)) NOWAIT

El mismo código es para los siguientes 7 campos y uso la misma estructura el problema es que en algunos no me respeta la condición " ical > "0"" o bien si se_01 = "C.R." por consiguiente me tendría que dar "EXT C.R." pero en algunos casos no lo hace.

Si alguien tiene idea que es lo que esta pasando o en donde estoy cometiendo el error y que me pueda ayudar a resolver este caso se lo voy a agradecer.

Saludos

L. Sarabia
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda

Publicado por Luighi (105 intervenciones) el 30/06/2007 11:12:59
bueno antes deberias ser un poco mas claro al explicar el problema
asi como estan las cosas mas de uno aqui va a tener que decifrar lo que escribes
a ver intentare hacerlo mas sencillo:

tenemos 36 campos
18 campos me informan sobre materias irregulares y
18 siguientes, los irregulares o extraordinarios
...........en los primeros 18 campos tenemos que...
9 son para guardar calificaciones de 9 materias regulares
y 9 mas me dicen el estado de cada una de estas materias, osea, si no tiene nada es un curso regular y si tiene "C.R." es una materia repetida
...........ahora en los 18 campos restantes....
9 serviran para guardar calificaciones de 9 materias irregulares
y 9 mas me diran el estado de cada una de estas materias irregulares, vale decir que si es "EXT" es extraordinario solamente y si es "EXT C.R." sera extraordinario repetido

ahora bien en el codigo veo que:
se_01 es situacion de la materia
imagino que por ahi debe haber un campo cal_01 referido a la calificacion pero que aqui no se usa
ical_01 supongo que es la calificacion de la materia irregular o extraordinaria
e ise_01 la situacion de la materia extraordinaria

atendiendo a la solicitud y sobre la base de la informacion que ya tienes, llego a suponer que deseas saber si se trata de "una materia extraordinaria solamente" o de "una materia extraordinaria repetida", algo que verificas con un contador, codigo que entonces no devuelve los resultados esperados

bueno la verdad no se que decirte, pues tampoco se que hacer
jaja mentira, es solo una broma
a ver veamos......

analizemos el codigo que estas utilizando.......
****
contador=0
nos vamos al principio del archivo && go top
hacer mientras no sea el final del archivo && do while !eof()
---if SituacionDelCurso=CursoRepetido y CalificacionIRREGULAR>0
--------contador=contador+1
--------reemplazar SituacionIRREGULAR con "Curso Extraordinario Repetido"
------------------------mientras CalificacionIRREGULAR>0
---final de este primer if
---*********
---if SituacionDelCurso es diferente a CursoRepetido y CalificacionIRREGULAR>0
-----contador=contador+1
-----reemplazar SituacionIRREGULAR con "Curso Extraordinario solamente"
---------------------mientras CalificacionIRREGULAR>0
---final del segundo if
---*****
---avanzar un registro
final del bucle && enddo
******
lo anterior jamas devolvera los resultados esperados
por ejemplo: empecemos con el primer registro y entremos al bucle....
supongamos que la situacion del curso es CURSO REPETIDO y a la vez la calificacion irregular es MAYOR QUE CERO, la condicion se cumple entonces le estamos diciendo a foxpro que reemplaze el campo ise_01 con "EXT C.R." pero a la sentencia REPLACE le estas agregando la clausula WHILE, con esto le estas diciendo a foxpro que reemplace ADEMAS los siguientes registros que cumplan con la condicion ical_01>0... pero yo te pregunto... y que tal si el siguiente registro dice que la situacion del curso es curso normal osea nada en el campo... segun la sentencia le pondra al campo isel_01 el valor "EXT C.R.", grave error.
lo que pasa es que no puedes poner el WHILE despues del REPLACE porque en verdad hace que todo el codigo jamas funcione y como todos sabemos, el WHILE avanza el registro mientras la condicion se cumpla.

y bueno sin ir muy lejos mejor reemplaza lo que hasta entonces haz hecho por lo siguiente
*esto claro esta que es solo una vez
sit_est1 = "EXT"
sit_est2 = "EXT C.R."
gnCount=0
*esto lo repetiras para cada uno de los 9 campos...
*los guiones los puse solo para que sea vea mejor, debes quitarlos
SCAN FOR ical_01>0
---------REPLACE isel_01 WITH IIF( EMPTY( se_01 ) , sit_est1 , sit_est2 )
---------gnCount=gnCount+1
ENDSCAN
WAIT "Registros Coincidentes :"+LTRIM(STR(gnCount)) WINDOW NOWAIT

lo anterior se resuelve en una sola linea:
REPLACE isel_01 WITH IIF( EMPTY( se_01 ) , sit_est1 , sit_est2 ) FOR ical_01>0
pero veo que necesitas del contador, entonces es necesario anidar la sentencia dentro de un SCAN / ENDSCAN

aqui le decimos a foxpro que recorra la tabla de principio a fin evaluando en cada registro la condicion ical_01>0
si cumple con eso entonces entra al replace y le asignara al campo isel_01 uno de los dos siguientes datos... si el campo se_01 esta vacio entonces le pondra a isel_01: "EXT", y si el campo se_01 no esta vacio entonces entendemos que se_01contiene "C.R." por lo tanto le asignaremos al campo isel_01: "EXT C.R."
asi de sencillo.

espero haberte ayudado colega
saludos desde peru
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar