Ver Mensaje Individual
  #1  
Antiguo 29-06-2012
Pedro-Juan Pedro-Juan is offline
Miembro
 
Registrado: ago 2006
Ubicación: Barcelona - España
Posts: 315
Reputación: 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