Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-06-2012
Pedro-Juan Pedro-Juan is offline
Miembro
 
Registrado: ago 2006
Ubicación: Barcelona - España
Posts: 315
Poder: 18
Pedro-Juan Va por buen camino
Seleccionar registros que comiencen por un valor string

Hola a tod@s

Delphi7, Interbase, Zeos. Controles externos a Delphi AlphaControls.

Estoy intentando hacer una consulta para que se muestre en un DBGrid el resultado a medida que se teclea en un Edit. Cuando lo que se busca tiene que estar contenido en el campo, todo va bien, pero si lo que se requiere es que sólo seleccione los registros que comienzan con lo tecleado en el Edit, la cosa no sale.

Tengo esto en el OnChange del Edit:

Código Delphi [-]
procedure TF_Main.sEdit_BuscarTitChange(Sender: TObject);
var cCadena: String;
    nChar: Integer;
begin
cCadena := Trim(F_Main.sEdit_BuscarTit.Text);
nChar := Length(cCadena);

  if (F_Main.sRG_BuscarTit.ItemIndex = 0) then begin
  end;

  //Que el texto esté contenido (funciona bien)
  if (F_Main.sRG_BuscarTit.ItemIndex = 1) then begin
      if (F_Main.sEdit_BuscarTit.Text <> '') then begin
          DM_Libros.Q_TITULOS.Close;
          DM_Libros.Q_TITULOS.SQL.Clear;
          DM_Libros.Q_TITULOS.SQL.Add('Select * From TITULOS');

           //Mayúsculas/minúsculas
           if (F_Main.sCheckB_MayMinBuscarTit.Checked) then begin
               cCadena := '%' + cCadena + '%';
               DM_Libros.Q_TITULOS.SQL.Add('Where (NomTit like :cCadena)');
               DM_Libros.Q_TITULOS.Parambyname('cCadena').AsString := cCadena;
           end
           else
               DM_Libros.Q_TITULOS.SQL.Add('where UPPER(NomTit) like ''%' + AnsiUpperCase(cCadena) + '%''');

          DM_Libros.Q_TITULOS.Open;
      end
      else //.........
  end;

  //Que el campo comience con el texto introducido (no funciona)
  if (F_Main.sRG_BuscarTit.ItemIndex = 2) then begin
      if (F_Main.sEdit_BuscarTit.Text <> '') then begin
          DM_Libros.Q_TITULOS.Close;
          DM_Libros.Q_TITULOS.SQL.Clear;
          DM_Libros.Q_TITULOS.SQL.Add('select * from TITULOS where SUBSTR(NomTit, 1, :nChar) = :cCadena');
          DM_Libros.Q_TITULOS.Parambyname('nChar').AsInteger := nChar;
          DM_Libros.Q_TITULOS.Parambyname('cCadena').AsString := cCadena;
          DM_Libros.Q_TITULOS.Open;
      end
      else //.........

      //También lo he probado con estas opciones:
      DM_Libros.Q_TITULOS.SQL.Add('Select * From TITULOS SUBSTRING(NomTit,1,nChar) = :cCadena');
      DM_Libros.Q_TITULOS.SQL.Add('Select * SUBSTRING(NomTit,1,nChar) = cCadena From TITULOS');
      DM_Libros.Q_TITULOS.SQL.Add('select * from TITULOS (where NomTit = substring(cCadena FROM 1 FOR strlen(cCadena)))');

      //Sustituir nChar por un número, con y sin los dos puntos, sin Parambyname, no funciona

      //He declarado esto en la BD:
      DECLARE EXTERNAL FUNCTION SUBSTR
        CSTRING(80) CHARACTER SET ISO8859_1,
        SMALLINT,
        SMALLINT
      RETURNS CSTRING(80) CHARACTER SET ISO8859_1 FREE_IT
      ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';

      //Ninguna de ellas funciona
  end;
end;

Yo de SQL algo menos de lo justito y lo que he encontrado en el foro no me funciona, así que no soy capaz de solucionar el asunto.

Muchas gracias de antemano y un saludo.
__________________
Este mundo es el camino para el otro, que es morada sin cesar. Mas cumple tener buen tino para andar esta jornada sin errar. (J. Manrique)
Responder Con Cita
  #2  
Antiguo 29-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No veo que le pongas comodín a la consulta como en el primer caso:

Código Delphi [-]
// contiene cCadena
cCadena := '%' + cCadena + '%';

// Comienza con cCadena
cCadena := cCadena + '%';

// Saludos
Responder Con Cita
  #3  
Antiguo 29-06-2012
Pedro-Juan Pedro-Juan is offline
Miembro
 
Registrado: ago 2006
Ubicación: Barcelona - España
Posts: 315
Poder: 18
Pedro-Juan Va por buen camino
Hola, roman, muchas gracias, no funciona.

En el mensaje Dubugger Exception Notification dice ... Invalid token The SQL: select * from TITULOS where SUBSTRING(NomTit, 1, ?) = ?;'. Process ...

Ahora lo tengo así:

Código Delphi [-]
  
  if (F_Main.sRG_BuscarTit.ItemIndex = 1) then begin
      if (F_Main.sEdit_BuscarTit.Text <> '') then begin
          cCadena := cCadena + '%';
          DM_TitAnd_PUIP.Q_TITULOS.Close;
          DM_TitAnd_PUIP.Q_TITULOS.SQL.Clear;
          DM_TitAnd_PUIP.Q_TITULOS.SQL.Add('select * from TITULOS where SUBSTR(NomTit, 1, :nChar) = :cCadena');
          DM_TitAnd_PUIP.Q_TITULOS.Parambyname('nChar').AsInteger := nChar;
          DM_TitAnd_PUIP.Q_TITULOS.Parambyname('cCadena').AsString := cCadena;
          DM_TitAnd_PUIP.Q_TITULOS.Open;
      end
      else  ActualizarQueryTitulos;
  end;

También he probado lo mismo con SUBSTRING:

Código Delphi [-]
  
DM_TitAnd_PUIP.Q_TITULOS.SQL.Add('select * from TITULOS where SUBSTRING(NomTit, 1, :nChar) = :cCadena');

Pero no funciona, ni con las otras opciones. Parece que los signos "?" del mensaje de error indiquen que no reconoce las variables, pero no lo sé.

Seguiré probando y buscando...

Gracias.
__________________
Este mundo es el camino para el otro, que es morada sin cesar. Mas cumple tener buen tino para andar esta jornada sin errar. (J. Manrique)
Responder Con Cita
  #4  
Antiguo 29-06-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Es algo extraño el error, pero lo cierto es que ahora que veo con más detalle, noto que estás usando el operador = en lugar de like como debería ser. Además, lo del substring no es necesario.

Veamos. Fíjate que en tu primer caso (que el campo contenga un texto determinado) tienes una consulta así (obviando la parte de mayúsculs/minúsculas):

Código SQL [-]
select * from TITULOS where (NomTit like :cCadena)

Y que busque el texto contenido lo logras rodeando de comodines el parámetro:

Código Delphi [-]
ParamByName('cCadena').AsString := '%' + cCadena + '%':

Ahora bien, para el segundo caso (que el campo comience con un texto determinado) tu consulta puede ser la misma:

Código SQL [-]
select * from TITULOS where (NomTit like :cCadena)

La diferencia está al sustituir el parámetro. Ahí sólo usas el comodín final:

Código Delphi [-]
ParamByName('cCadena').AsString := cCadena + '%':

Con esto no deberías tener problema.

// Saludos
Responder Con Cita
  #5  
Antiguo 29-06-2012
Pedro-Juan Pedro-Juan is offline
Miembro
 
Registrado: ago 2006
Ubicación: Barcelona - España
Posts: 315
Poder: 18
Pedro-Juan Va por buen camino
Muchas gracias roman, ya funciona. Ha quedado así:

Código Delphi [-]
 if (F_Main.sCheckB_MayMinBuscarTit.Checked) then begin
     cCadena := cCadena + '%';
     DM_TitAnd_PUIP.Q_TITULOS.SQL.Add('Where (NomTit like :cCadena)');
     DM_TitAnd_PUIP.Q_TITULOS.Parambyname('cCadena').AsString := cCadena;
 end
 else
     DM_TitAnd_PUIP.Q_TITULOS.SQL.Add('where UPPER(NomTit) like ''' + AnsiUpperCase(cCadena) + '%''');

Qué claro cuando se sabe!

Un saludo.
__________________
Este mundo es el camino para el otro, que es morada sin cesar. Mas cumple tener buen tino para andar esta jornada sin errar. (J. Manrique)
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
Seleccionar primer registro en la Clausula WHERE para Actualizar Valor. Adrian Murua MySQL 3 28-05-2012 22:52:14
Seleccionar valor en un rango de datos jourdan Firebird e Interbase 4 19-05-2010 07:59:54
Sql para seleccionar registros diferentes odrack SQL 3 10-12-2008 00:49:20
Seleccionar un campo dependiendo de su valor Alexis De la Cr MySQL 2 13-11-2008 20:58:44
seleccionar registros de hace un mes o año m8estrella83 Varios 6 24-06-2006 10:48:13


La franja horaria es GMT +2. Ahora son las 00:46:11.


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