Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Leer texto caracter a caracter (https://www.clubdelphi.com/foros/showthread.php?t=70883)

kikecg 17-11-2010 11:50:20

Leer texto caracter a caracter
 
Hola a todos.

Estoy creando un procedimiento almacenado en Interbase 7.5 y me encuentro con el siguiente problema:

Necesito generar una cadena de texto de un máximo de 160 caracteres. Generar la cadena no es problema, comprobar la longitud de la misma, tampoco, pero una vez que localizo que tiene más de 160 caracteres (cuando se da el caso), necesito "recortarla" a dicha longitud.

Mi idea era utilizar SUBSTR, pero está función solo soporta una cadena de 80 caracteres. Me pregunto si existe otra función que me permita tomar solo una parte de la cadena original, un equivalente al LeftStr de Delphi, por ejemplo.

Otra solución que me han propuesto es meterme en un bucle e ir copiando la cadena caracter a caracter, pero no me funciona:

Código SQL [-]
if (STRLEN(TEXTO) > 160) then
  BEGIN
    I = 1;
    V_AUX = '';
    WHILE (I <= 160) DO
      BEGIN
        V_AUX = V_AUX || TEXTO[i];
        I = I + 1;
      END
    TEXTO = V_AUX;
  END

Al compilar el procedimiento me indica "Invalid array reference", supongo que refiriendose a:
Código SQL [-]
TEXTO[i]
.

TEXTO está definida como VARCHAR de 160, quizá el problema esté ahí.

¿Alguien me puede dar una idea?

Muchas gracias, saludos a todos.

Ñuño Martínez 17-11-2010 12:07:19

¿Mayúsculas y minúsculas? Lo digo porque en un sitio usas "I" y en otro "i". Claro que teóricamente SQL no diferencia...

kikecg 17-11-2010 12:14:26

Hola.

Parece que la i minúscula se pone al aplicar la etiqueta SQL, en el procedimiento está siempre en mayúsculas.

Combat-F2D 17-11-2010 12:25:28

mira la:

http://freeadhocudf.org

creo que te pueden valer y tiene soporte para IB7.5

kikecg 17-11-2010 15:29:10

Hola.

Gracias por la respuesta.

Le echare una ojeada, pero no se si me van a permitir utilizarlas.

A ver si localizo alguna otra solución.

Saludos.

Gallosuarez 17-11-2010 17:27:04

Prueba...
 
Kikecg:

¿Como utilizas la función? En Firebird yo la utilizo así y me funciona perfectamente:
Código SQL [-]
SUBSTRING(CADENA FROM 1 FOR 160)

Se que dices que estás utilizando Interbase 7.5, pero aún así se me hace raro que está función la reduzcan a solo 80 caracteres (como lo mencionas).

Saludos,
Gerardo Suárez Trejo:confused:

RONPABLO 17-11-2010 17:54:36

Cita:

Empezado por Gallosuarez (Mensaje 382579)
Kikecg:

¿Como utilizas la función? En Firebird yo la utilizo así y me funciona perfectamente:
Código SQL [-]SUBSTRING(CADENA FROM 1 FOR 160)


Se que dices que estás utilizando Interbase 7.5, pero aún así se me hace raro que está función la reduzcan a solo 80 caracteres (como lo mencionas).

Saludos,
Gerardo Suárez Trejo:confused:

solo se puede usar "SUBSTRING(CADENA FROM 1 FOR 160)" en firebird desde la versión 2.0 (creo), en la versión 1.5 (y me imagino que en Interbase ocurrirá lo mismo), la UDF SubString solo permite hasta los 80 caracteres.

Gallosuarez 17-11-2010 17:54:58

Kikecg:

Deja intento hacer lo que tu quieres utilizando un procedimiento almacenado. Voy primero a tomar un baño y cuando regrese intento el procedimiento almacenado.

Atte:
Gerardo Suárez Trejo

PD. Si la reducen a 80 caracteres, entonces se podría hacer en dos paso, ¿o no?

Gallosuarez 17-11-2010 20:01:33

Posibles soluciones ...
 
Kikecg:

¿Puedes verificar si esto de sirve?

Solución 1

Código SQL [-]
cadena1 = SUBSTRING(CADENA FROM 1 FOR 80);
cadena1 = SUBSTRING(CADENA FROM 81 FOR 80);
result = cadena1 || cadena2;

Solución 2

Código SQL [-]
if (STRLEN(TEXTO) > 160) then
  BEGIN
    I = 1;
    CADENA = TEXTO;
    V_AUX = '';
    WHILE (I <= 160) DO
      BEGIN
        V_AUX = V_AUX || SUBSTRING(CADENA FROM 1 TO 1);
        I = I + 1;
        CADENA = SUBSTRING(CADENA FROM 2);
      END
    TEXTO = V_AUX;
  END

Me parece, que esto resuelve tu problema...

Saludos,
Gerardo Suárez Trejo

bulc 18-11-2010 12:53:23

Mimi
 
Cita:

Empezado por kikecg (Mensaje 382545)
Hola a todos.

Estoy creando un procedimiento almacenado en Interbase 7.5 y me encuentro con el siguiente problema:

Necesito generar una cadena de texto de un máximo de 160 caracteres. Generar la cadena no es problema, comprobar la longitud de la misma, tampoco, pero una vez que localizo que tiene más de 160 caracteres (cuando se da el caso), necesito "recortarla" a dicha longitud.

Mi idea era utilizar SUBSTR, pero está función solo soporta una cadena de 80 caracteres. Me pregunto si existe otra función que me permita tomar solo una parte de la cadena original, un equivalente al LeftStr de Delphi, por ejemplo.

Otra solución que me han propuesto es meterme en un bucle e ir copiando la cadena caracter a caracter, pero no me funciona:

Código SQL [-]if (STRLEN(TEXTO) > 160) then BEGIN I = 1; V_AUX = ''; WHILE (I <= 160) DO BEGIN V_AUX = V_AUX || TEXTO[i]; I = I + 1; END TEXTO = V_AUX; END


Al compilar el procedimiento me indica "Invalid array reference", supongo que refiriendose a: Código SQL [-]TEXTO[i]

.

TEXTO está definida como VARCHAR de 160, quizá el problema esté ahí.

¿Alguien me puede dar una idea?

Muchas gracias, saludos a todos.


Prueba con StringList

kikecg 23-11-2010 17:11:03

No hay manera
 
Hola.

Agradezco las opciones presentadas, debo decir que aún no he podido conseguir lo que necesito. Parece que no puedo utilizar SUBSTRING dentro de un procedimiento almacenado, al tratar de compilarlo obtengo un "Function unknown. SUBSTRING". No me acepta ni

Código SQL [-]
V_AUX = SUBSTRING(TEXTO FROM 1 FOR 80)

ni

Código SQL [-]
V_AUX = SUBSTRING(TEXTO, 1, 80)

En el primer caso me indica: "Token unknown - line 368, char 29. FROM.", y en el segundo función desconocida.

Empiezo a pensar que no se va a poder...

Gracias por las opciones, seguiré investigando...

guillotmarc 23-11-2010 17:44:44

Substring es una función definida en Firebird, lo siento no conozco su equivalente en Interbase.


La franja horaria es GMT +2. Ahora son las 11:44:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi