FoxPro/Visual FoxPro - Funciones SUBSTR y AT combinadas

 
Vista:

Funciones SUBSTR y AT combinadas

Publicado por ludigova (2 intervenciones) el 22/12/2010 15:17:49
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 que 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.

D icho 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 las primeras letras como si no encontrará el espacio en blanco en la Descripcion. Por lo que que ejecute el siguiente SQL para comprobarlo

SELECT Descripcion, AT(" ",Descripcion) as DondeFROM 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.
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:Funciones SUBSTR y AT combinadas

Publicado por ludigova (2 intervenciones) el 12/01/2011 17:09:00
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.
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

RE:Funciones SUBSTR y AT combinadas

Publicado por David L (1 intervención) el 18/05/2022 07:54:02
Hola, amigo, te respondo más de 11 años después a tu pregunta, que yo recién tuve al intervenir algunos programas antiguos. La respuesta está en [1], lo que ocurre es que en ese lenguaje de programación, en las funciones de tipo string se truncan en un select porque toma el "max length" de la primerísima fila que encuentra en la consulta. Así que para lograr que esa fila sea del tamaño del campo, hace por ello un "padr" para llenar con espacios en blanco y lograr la misma longitud del campo (en el caso de tu ejemplo es 35), para forzar a que la longitud del campo de esa primera fila sea 35. Y luego de lograr esa longitud de campo con padr, ya logra modificar internamente el max-length que queda registrado en la función. Así que ya en ese punto puede aplicar alltrim para eliminar esos espacios en blanco.

Por supuesto, interpreto yo que el rebuscado truco se debe a que algún "hacker interno" de FoxPro descubrió este bug, y estableció la manera de sortearlo, y difundió ese truco.

[1] https://stackoverflow.com/a/71144678 , citado en https://stackoverflow.com/questions/71130278/why-would-sql-truncate-the-right-side-of-a-string-when-using-the-right-function
[2] https://www.tek-tips.com/viewthread.cfm?qid=1706948
[3] https://grupos.emagister.com/debate/breve_explicacion_sobre_las_funciones_de_cadena_vfp/6950-504027

Saludazo,
https://investigacionyprogramacion.com
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