FoxPro/Visual FoxPro - EVALUAR NUMEROS DE CAMPO DE TEXTO

   
Vista:

EVALUAR NUMEROS DE CAMPO DE TEXTO

Publicado por Amado (66 intervenciones) el 05/06/2014 01:06:25
HOLA BUENAS TARDES...
TENGO UN CAMPO LLAMADO VALORES VARCHAR(45) EN ESTE SE CAPTURAN RANGO DE VALORES Y DESEO OBTENER UNA COMPARACION CON UN VALOR

DENTRO DEL CAMPO LLAMADO REFERENCIA EXISTE UN VALOR EN TEXTO QUE DICE:

-------- VALORES NORMAL----------
DE 5-10 CUCHARADAS DE ACEITE DE OLIVA
QUIERO EVALUAR EN EL REPORTE EL RANGO QUE DICE 5-10


----VALORES DE SALIDA ------
SI LO QUE SE CAPTURO ES MENOR A 5 o sea 2,3 y 4 QUE DIGA EL REPORTE... *** muy poco aceite fuera de rango...
SI SE CAPTURO MAS DE 10 O SEA 11, 12, 13, 14 O MAS DIGA EL REPORTE *** exedido en aceite fuera de rango..

SALUDOS
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

EVALUAR NUMEROS DE CAMPO DE TEXTO

Publicado por Saul (676 intervenciones) el 05/06/2014 06:05:48
Se me hace que te estas complicando

Crea otros dos campos Numeros

Numero Inicial
Numero Final

Luego haramas si gustas tu texto a partir de estos campos

Y esos campos son los que utilizas para hacer tu consulta o lo que estes haciendo para mostrar tu reporte.

Saludos
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

EVALUAR NUMEROS DE CAMPO DE TEXTO

Publicado por Fidel José (558 intervenciones) el 05/06/2014 13:56:51
Como dice Saúl, lo mejor es tener, o un campo con el rango, o dos campos (inferior y superior), aun cuando mantengas el texto tal como lo tienes. Y por qué?. Porque de lo contrario, deberías tener una exacta conciencia de la correcta estructuración de los campos. Por ejemplo
lcCadena="DE 5-10 CUCHARADAS DE ACEITE DE OLIVA Y 3 CUCHARADAS DE VINAGRE DE MANZANA"
Este caso será un problema, porque el rango obtenido sería "5-103", dando un resultado incorrecto.
Se puede solucionar parcialmente cortando en el segundo espacio:
lcCAdena=Substr(lcCAdena,1,at(chr(32),lcCadena,2)-1 ) && ? lcCadena -> "DE 5-10"
Pero se sigue manteniendo la posibilidad del error de estructuración

Con la rutina que sigue, puedes hacer algo. El tercer parámetro del Procedure es una lista de situaciones posibles. Si tus casos son todos iguales, puedes poner una definición por Default, p. ej:
if vartype(tcListaResp)#"C" or empty(tcListaResp)
tcListaResp="Muy Poco,Nivel Adecuado,Nivel Excesivo"
endif
con lo cual, solo envías la lista cuando requiere un cambio de respuesta. Fijate que la respuesta se analiza con GEtWordNum(), por lo que el orden es decisivo: el primero es bajo, el segundo es valor esperado y el tercero Exceso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
* Botón de Prueba para el PROCEDURE Aceitoso()
* Suponiendo que Aceitoso es un Método de Usuario del Formulario.
 
*<TestButton>
LOCAL lcCadena,lnObt,lcListaResp,lcResp
 
lcCadena="DE 5-10 CUCHARADAS DE ACEITE DE OLIVA"
lnObt=7
lcLIstaREsp="Bajo,Correcto,Excesivo"
 
lcResp=thisform.aceitoso(lcCadena,lnObt,lcListaResp)
MESSAGEBOX(lcResp)
 
lnObt=1
lcResp=thisform.aceitoso(lcCadena,lnObt,lcListaResp)
MESSAGEBOX(lcResp)
 
lnObt=15
lcResp=thisform.aceitoso(lcCadena,lnObt,lcListaResp)
MESSAGEBOX(lcResp)
 
lnObt=0
lcResp=thisform.aceitoso(lcCadena,lnObt,lcListaResp)
MESSAGEBOX(lcResp)
*</TestButton>
 
 
* !* ---------------------------------------------------------------
PROCEDURE Aceitoso
LPARAMETERS tcCadena,tnCaptura , tcListaResp
*!*	--------------------------------------------------------------------
*!*	tcCadena:		"DE 5-10 CUCHARADAS DE ACEITE DE OLIVA"
*!*	tnCaptura: 		Cantidad obtenida en el sistema
*!*	tcListaResp		Lista Respuesta: ej="Muy poco","Correcto","Excesivo"
*!*	--------------------------------------------------------------------
*<TestParameters>
IF VARTYPE(tcCadena)#"C" or empty(tcCAdena)
	* Parámetro incorrecto
	RETURN ""
ENDIF
IF VARTYPE(tnCaptura)#"N"
	MESSAGEBOX("Parámetro tnCaptura incorrecto")
	RETURN ""
ENDIF
IF VARTYPE(tcListaResp)#"C" OR EMPTY(tcListaResp)
	MESSAGEBOX("Debe indicar la lista de resolución (3 items)")
	RETURN ""
ENDIF
IF OCCURS(",",tcListaResp)<2
	MESSAGEBOX("La lista de respuesta debe tener 3 items")
	RETURN ""
ENDIF
*</TestParameters>
 
*<LocalDefine>
LOCAL lcRango,lnRango,lnInferior,lnSuperior,lcREspuesta
LOCAL ARRAY gaRango(1)
*</LocalDefine>
 
*<Proceso>
lcRango=CHRTRAN(tcCadena,CHRTRAN(tcCadena,"1234567890-",""),"")
* Puede serlcRango="5-10",
* pero necesitamos saber si lcRango tiene algún número.
lcComprueba=CHRTRAN(lcRango,CHRTRAN(lcRango,"1234567890",""),"")
if empty(lcComprueba)
	*No hay números
	RETURN ""
endif
*Ahora determinamos el rango numérico, Ya sabemos que hay algún número
lnRango=Alines(gaRango,lcRango,1,"-")
Store 0 to lnInferior,lnSuperior
if lnRango=1
	Store Val(gaRango[1]) to lnInferior,lnSuperior
else
	lnInferior=VAL(gaRAngo[1])
	lnSuperior=VAL(gaRango[lnRango])
ENDIF
*</Proceso>
 
*<Respuesta>
DO CASE
	CASE tnCaptura = 0
		lcREspuesta="Nulo"
	CASE tnCaptura < lnInferior
		lcREspuesta=GETWORDNUM(tcListaREsp,1,",")
	CASE Between(tnCaptura , lnInferior , lnSuperior)
		lcRespuesta=GETWORDNUM(tclistaREsp,2,",")
	CASE tnCaptura > lnSuperior
		lcREspuesta=GETWORDNUM(tcListaResp,3,",")
 
ENDCASE
*</Respuesta>
 
RETURN lcRespuesta
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