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 19-03-2008
marilinspi marilinspi is offline
Miembro
 
Registrado: ene 2007
Posts: 136
Poder: 18
marilinspi Va por buen camino
Consultas con TRIM

hola a todos, les cuento tengo una base de datos Firebird y lenguaje Delphi 7, tengo una tabla camiones y otra acoplados cada una con un campo Patente, lo que necesito es que al cargar un nuevo camion o acoplado no me deje repetir la patente, pero el tema es que la patente entre las letras y los numeros hay un espacio por lo que necesito quitarlo para poder comparar, no se si me explique, pero eso lo tengo que hacer mediante una consulta SQL y creeria que se puede hacer mediante el TRIM pero e probado y no me funciona. Espero su ayuda y desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 19-03-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Exclamation

Saludos.

No dices que versión de FB tienes, pero FB 2.x tiene la función TRIM de forma nativa y funciona a la perfección; para evitar duplicidad pon el (o los) campo(s) UNIQUE o PK y así te FB te mandara una excepción en caso de que se trate de duplicar.

Si TRIM no funciona piensa entonces en hacer una UDF.

Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #3  
Antiguo 19-03-2008
marilinspi marilinspi is offline
Miembro
 
Registrado: ene 2007
Posts: 136
Poder: 18
marilinspi Va por buen camino
hola, utilizo la version 1.5 de Firebird, y quisiera que me ejemplifiques como lo haces vos, para poder comparar. Gracias desde ya
Responder Con Cita
  #4  
Antiguo 19-03-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Yo que vos lo haría la comprobación de que la patente tenga el formato correcto (sin espacios) antes de grabarlo en la base de datos. Esto se hace desde Delphi en el BeforePost.

Ejemplo:

Código Delphi [-]
procedure TDataModule.TCamionBeforePost(DataSet: TDataSet);
var 
   i : integer;
   s : string;
begin
  {Inicializo s. La utilizo como temporal para quitar espacios}
  s := '';
  {solo compruebo si estoy insertando}
  if (DataSet.State = dsInsert) then 
     {si hay un espacio dentro de PATENTE entonces pos > 0}
     if (pos(' ',TCamionPATENTE.AsString)>0) then
     begin
        {Recorro PATENTE caracter a caracter}
        for i := 1 to Length(TCamionPATENTE.AsString) do 
           {Si no es espacio agrego el caracter a s, por lo tanto los espacios no pasan}
           if (TCamionPATENTE.AsString[i]<>' ') then
              s := s + TCamionPATENTE.AsString[i];
           {Ahora que s no tiene espacios la utilizo como PATENTE}
           TCamionPATENTE.AsString := s;
     end;
end;

Última edición por duilioisola fecha: 19-03-2008 a las 17:30:16.
Responder Con Cita
  #5  
Antiguo 19-03-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Tembién podrías pasar toda la patente a mayúsculas, para evitar duplicados
B1234567 no es igual a b1234567

Código Delphi [-]
procedure TDataModule.TCamionBeforePost(DataSet: TDataSet);
var 
   i : integer;
   s : string;
begin
  {Inicializo s. La utilizo como temporal para quitar espacios}
  s := '';
  {solo compruebo si estoy insertando}
  if (DataSet.State = dsInsert) then 
     {si hay un espacio dentro de PATENTE entonces pos > 0}
     if (pos(' ',TCamionPATENTE.AsString)>0) then
     begin
        {Recorro PATENTE caracter a caracter}
        for i := 1 to Length(TCamionPATENTE.AsString) do 
           {Si no es espacio agrego el caracter a s, por lo tanto los espacios no pasan}
           if (TCamionPATENTE.AsString[i]<>' ') then
              s := s + TCamionPATENTE.AsString[i];
           {Ahora que s no tiene espacios la utilizo como PATENTE}
           TCamionPATENTE.AsString := UpperCase(s);
     end;
end;
Responder Con Cita
  #6  
Antiguo 19-03-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Firebird 1.5 no tiene el trim de forma nativa, para usarlo se tiene que definir una udf (o dos creo yo) que son


Código SQL [-]
DECLARE EXTERNAL FUNCTION ltrim 
    CSTRING(80)
    RETURNS CSTRING(80) FREE_IT
    ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';

DECLARE EXTERNAL FUNCTION rtrim 
    CSTRING(80)
    RETURNS CSTRING(80) FREE_IT
    ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';


despues de declarar las anteriores udfs puede hacer un query similar a:
Código SQL [-]

select ltrim(rtrim(campoConEspacios)) as CampoSinEspacios from LaTabla
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #7  
Antiguo 19-03-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Cita:
... la patente entre las letras y los numeros hay un espacio ...
Sinceramente no sé exactamente si todo lo que se está comentando sobre el Trim es correcto.

Para mi Trim (o lTrim / rTrim) quita los espacios al principio y/o al final de la cadena de caracteres. Pero no los de enmedio. A lo mejor me estoy equivocando.

Por lo que la única manera que veo de solucionar el problema que plantea marilinspi es manipulando el String antes y/o después de grabarlo en la base de datos. Algo así como está exponiendo duilioisola.

En cualquier caso, propongo una solución adicional y alternativa. Yo grabo los datos en mi base de datos tanto con los espacios (y posibles caracteres especiales que puedan ser necesarios o que indique el usuario), así como en otro campo adicional de la tabla donde se hayan eliminado previamente todos esos caracteres especiales.

Y siempre realizaré la búsqueda por ese campo adicional que no contiene ningún carater especial (y teniendo en cuenta el tema del UpperCase), y por otro lado tendré siempre disponible el string original que haya introducido el usuario.

__________________
Piensa siempre en positivo !
Responder Con Cita
  #8  
Antiguo 19-03-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
ups, si, el trim, ltrim o rtrim no quita espacios al interior, solo en los extremos, en Firebird se me ocurre haciendo un procedimiento almacenado con una variable Input TextoEntrada de tipo Varchar(xxx), una Auput TextoSalida de tipo Varchar(xxx) otra variable c de tipo Varchar(1)y dos variables de tipo Entero "i" "j"

Código SQL [-]
     j=1;
     i = strlen(:textoEntrada);
     while(j<=i) do
        begin
          c = substr(:textoEntrada,j,j);
          if (c <> ' ') then
             begin
                TextoSalida = TextoSalida || c;
             end
          j=j+1;
        end
     suspend;

y la puede consultar algo así como:
Código SQL [-]
select c.id, (select p.TextoSalida From Procedimiento(c.patente) p) as Pantente from Camiones
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"

Última edición por RONPABLO fecha: 19-03-2008 a las 20:08:19.
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
consultas con like Choclito Firebird e Interbase 1 02-01-2008 21:11:44
Consultas SQL V.S. Consultas Clipper AGAG4 SQL 7 20-12-2005 15:59:31
trim en campos varchar galmacland SQL 3 12-03-2005 02:40:23
Consultas agilaberte SQL 1 04-04-2004 13:42:54
Consultas NickName Firebird e Interbase 1 27-11-2003 05:37:27


La franja horaria es GMT +2. Ahora son las 12:00:14.


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