SoloCodigo
Programación General => Visual FoxPro => Mensaje iniciado por: ludigova en Martes 4 de Enero de 2011, 18:09
-
Buenos Días
Tengo un pequeño problema que no he sabido como resolver con el uso de las funciones SUBSTR y AT, cuando las uso combinadas directamente en un SQL.
Les pongo un ejemplo de lo que se y de lo que necesito resolver
Se que puedo usar estas funciones de las siguiente manera
Cadena = 'Hola como Estan'
MiCadena = substr(Cadena,1,AT(" ",CADENA)-1)
Entonces MiCadena contendría la palabra "Hola"
Esto funciona perfectamente, no tengo problemas con esto
Ahora bien supongamos que tengo una tabla llamada Productos con estos datos
Codigo_____________________ Descripcion
12345 _____________________Tornillo para gypson
12346 _____________________Tornillo infinito
12347 _____________________Clavos de Acero
12348 _____________________Clavos de 2 pulgados
12349 _____________________Gypson 3x2x0.5
Necesito obtener la primer palabra, es decir hasta el primer espacio en blanco, del campo Descripcion.
A simple vista se ve que la primer palabra es de longitud variable por lo que utilizo la función AT para saber donde esta el primer espacio es blanco y el valor devuelto lo uso como el tercer parámetro de la función SUBSTR.
Dicho lo anterior yo hago una consulta de la siguiente manera:
SELECT DISTINCT SUBSTR(Descripcion, 1,AT(" ",Descripcion)-1) FROM Productos
Al ejecutarlo yo esperaría que me retornara:
Tornillo
Clavos
Gypson
Pero me esta regresando solo la primer letra de la palabra como si no encontrará el espacio en blanco en la Descripcion. Por lo que ejecute el siguiente SQL para comprobarlo:
SELECT Descripcion, AT(" ",Descripcion) as Donde FROM Productos y me regresa la siguiente informacion:
Descripcion_____________________Donde
Tornillo para gypson__________________9
Tornillo infinito______________________9
Clavos de Acero______________________7
Clavos de 2 pulgados__________________7
Gypson 3x2x0.5______________________7
Al ejecutar esto compruebo que la función AT hace lo que tiene que hacer. Nuevamente compruebo con una consulta similar
SELECT Descripcion, AT(" ",Descripcion) as Donde, SUBSTR(Descripcion,1, AT(" ",Descripcion)-1) Palabra FROM Productos
Descripcion____________Donde____________Palabra
Tornillo para gypson_________9________________T
Tornillo infinito_____________9________________T
Clavos de Acero_____________7________________C
Clavos de 2 pulgados_________7________________C
Gypson 3x2x0.5_____________7________________G
Como pueden ver el al usar estas funciones combinadas DIRECTAMENTE en una CONSULTA, el resultado no es el esperado. Sin embargo fuera de una consulta funciona perfectamente.
Si alguien me puede ayudar o dar alguna explicación que me aclare porque fox se comporta de esta manera y que puedo hacer para solucionarlo.
Les agradezco la atención y la ayuda.
-
Hola, bienvenido al foro.
Si es un comportamiento normal.
Pero la explicación a detalle la puedes saber leyendo en la ayuda sobre SET EXACT y SET ANSI ON.
Para tú caso, si logré comprender bien, creo que se corrige con SET ANSI ON.
Saludos y feliz año nuevo.
-
Hola Juez gracias por la Bienvenida, Mis mejores deseos para usted también.
Primero que nada gracias por su pronta respuesta. Le comento que visual fox pro 6.0 fue mi primer lenguaje en entorno gráfico pero lo deje de usar por mucho tiempo por lo cual perdí un poco de práctica, pero siempre me gusto y ahora lo retomo para ayudar a un amigo con un programa.
Busque el ayuda del SET ANSI y SET EXACT tal como me recomendó, por lo que entendí activar o desactivar estas propiedades SOLO afecta la forma en como se realizan las comparaciones de cadenas haciendo que el operador "=" se comporte como el "==". Hice algunas pruebas y logre comprender el funcionamiento de estos comandos. Sin embargo mi problema persistía, y no lograba el resultado que esperaba.
Seguí buscando información y encontré una solución, que sin embargo no comprendo del todo, y es usando la función de relleno PADR, de la siguiente manera:
SELECT DISTINCT ALLTRIM(PADR(SUBSTR(Descripcion, 1,AT(" ",Descripcion)-1),35)) Palabra FROM Productos
Al ejecutar esta consulta obtengo el resultado esperado, es decir:
Palabra
Tornillo
Clavos
Gypson
Uso 35 por que es la longitud original del campo Descripcion y luego la función ALLTRIM para quitar los caracteres que sobran.
Con esta solución me doy por satisfecho, pero me queda la espinita de porque simplemente no puedo usar SUBSTR(Descripcion, 1,AT(" ",Descripcion)-1) en el SELECT para retornar hasta el primer espacio en blanco.
Si tiene alguna información al respecto le agradezco la comparta con migo.
-
Buenos días
Considero que este tema se puede cerrar, a menos que algún Administrador o miembro activo este investigando algo más.