Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-11-2010
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 17-11-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
¿Mayúsculas y minúsculas? Lo digo porque en un sitio usas "I" y en otro "i". Claro que teóricamente SQL no diferencia...
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 17-11-2010
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
Hola.

Parece que la i minúscula se pone al aplicar la etiqueta SQL, en el procedimiento está siempre en mayúsculas.
Responder Con Cita
  #4  
Antiguo 17-11-2010
Avatar de Combat-F2D
Combat-F2D Combat-F2D is offline
Miembro
 
Registrado: may 2003
Ubicación: Toletum
Posts: 454
Poder: 21
Combat-F2D Va por buen camino
mira la:

http://freeadhocudf.org

creo que te pueden valer y tiene soporte para IB7.5
__________________
online
Responder Con Cita
  #5  
Antiguo 17-11-2010
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 17-11-2010
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 17-11-2010
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por Gallosuarez Ver Mensaje
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
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.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #8  
Antiguo 17-11-2010
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
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?

Última edición por Gallosuarez fecha: 17-11-2010 a las 18:01:13.
Responder Con Cita
  #9  
Antiguo 17-11-2010
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Talking 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
Responder Con Cita
  #10  
Antiguo 18-11-2010
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
Mimi

Cita:
Empezado por kikecg Ver Mensaje
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
Responder Con Cita
  #11  
Antiguo 23-11-2010
kikecg kikecg is offline
Miembro
 
Registrado: feb 2006
Ubicación: Madrid
Posts: 39
Poder: 0
kikecg Va por buen camino
Unhappy 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...
Responder Con Cita
  #12  
Antiguo 23-11-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Substring es una función definida en Firebird, lo siento no conozco su equivalente en Interbase.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
capturar el caracter "enter" en caja de texto NuncaMas Varios 5 12-03-2010 18:07:15
leer caracter por caracter, una linea de un memo douglas OOP 1 05-10-2007 06:59:31
Comparar un caracter de una caja de texto con un rango chux OOP 2 24-10-2005 23:24:25
Ayudaaaa!!! Tabla ASCII: El carácter Ñ vs. carácter ¥ Berto2003 Varios 5 26-07-2005 15:37:48
busqueda caracter a caracter Irina SQL 3 20-05-2003 13:12:53


La franja horaria es GMT +2. Ahora son las 15:37:32.


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
Copyright 1996-2007 Club Delphi