Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   ADOQuery y consulta con LIKE (https://www.clubdelphi.com/foros/showthread.php?t=96857)

lugotrujillo 26-09-2024 16:39:14

ADOQuery y consulta con LIKE
 
buenos dias, estoy retocando un programa antiguo desarrollado en Delphi 6 y me sucede, ahora, antes no sucedia, que cuando le asigno la sentencia SQL a un ADOQuery y esta contiene una condicion LIKE para filtrar los campos que va a obtener de la base de datos, siempre devuelve vacio, es como si no funcionara el LIKE, la base de datos esta en microsoft Access version 2003, utilizo las comillas ' y el comodin de * ya que el campo a comprara es texto, por ejemplo, una consulta que me devuelve vacio es esta SELECT Inicial FROM PremisasAcc WHERE Codigo LIKE 'CPSV_2025*', sin embargo coloco su codigo en access y si devuelve correctamente los resultados

Código SQL [-]
SELECT Inicial FROM PremisasAcc WHERE Codigo LIKE 'CPSV_2025*'

pgranados 26-09-2024 17:42:23

Nunca he usado MSAccess pero la sentencia LIKE utiliza '%' y no '*'

Puedes checar este articulo.

Casimiro Notevi 26-09-2024 17:52:23

Creo que con msaccess es con asterisco en lugar de % y el guión subrayado en lugar de ?

lugotrujillo 26-09-2024 18:33:59

Cita:

Empezado por Casimiro Notevi (Mensaje 557464)
Creo que con msaccess es con asterisco en lugar de % y el guión subrayado en lugar de ?

quizas sea eso, en la codificacion de las tablas utilizo el guion bajo, y puede que access lo interprete diferente, verificare esas cosas

marco3k 26-09-2024 19:16:49

Muestra tu código para revisar lo que dices, quizas el error este en las comillas, en código debes usar "QuotedStr" para reemplazar las comillas.

lugotrujillo 26-09-2024 19:30:17

Cita:

Empezado por marco3k (Mensaje 557469)
Muestra tu código para revisar lo que dices, quizas el error este en las comillas, en código debes usar "QuotedStr" para reemplazar las comillas.

es que da igual, todo lo que vayas a asignar al SQL.Text de un ADOQuery y contenga LIKE 'cualquiertexto*' devolvera 0 registros, uso QuotedStr y todo, y no devuelve ni un registro

marco3k 26-09-2024 20:46:30

Pues si no muestras un poco de código de esa búsqueda, bueno no hay como ayudarte.

lugotrujillo 26-09-2024 21:53:35

Cita:

Empezado por marco3k (Mensaje 557475)
Pues si no muestras un poco de código de esa búsqueda, bueno no hay como ayudarte.

en un procedimiento cualquiera declaro una variable string
Código Delphi [-]
STemp: String;
    begin
//le asigno su valor a una lista q usare posteriormente, mediante una funcion que abre un adoquery (aqui es donde no 
//devuelve ningun registro, y deberia devolver) y me devuelve esa lista
      STemp:= DM.DevolverListaCodigos('SELECT Inicial FROM PremisasAcc WHERE Codigo LIKE '+QuotedStr('CPSV_2025*'),'Inicial');


Código Delphi [-]
function TDM.DevolverListaCodigos(Consulta, Codigo: String): String;
  var
    QLista: TADOQuery;
  begin
    QLista:= TADOQuery.Create(Self);
    QLista.Connection:= DM.ADOConn;
    ActivarQuery(QLista,Consulta,True,False);
    Result:= '';
    if not QLista.IsEmpty
    then
    begin
      QLista.First;
      Consulta:= TipoCampo(QLista.FieldList.Find(Codigo));
      while not QLista.Eof do
      begin
        if (Consulta='String') OR (Consulta='WideString')
        then
          if Result=''
          then Result:= QuotedStr(QLista.FieldByName(Codigo).AsString)
          else Result:= Result+','+QuotedStr(QLista.FieldByName(Codigo).AsString)
        else
          if Result=''
          then Result:= QLista.FieldByName(Codigo).AsString
          else Result:= Result+','+QLista.FieldByName(Codigo).AsString;
        QLista.Next;
      end;
      Result:= '('+Result+')';
    end;
    QLista.Free;
  end;

marco3k 26-09-2024 22:05:57

Ya vi tu problema, es el query que lo liberas y al hacerlo se pierden los registros, trata de hacerlo como una variable de formulario.

lugotrujillo 26-09-2024 22:32:33

Cita:

Empezado por marco3k (Mensaje 557479)
Ya vi tu problema, es el query que lo liberas y al hacerlo se pierden los registros, trata de hacerlo como una variable de formulario.

no que va, traceo el programa para ir evaluando el comportamiento y en esta comprobacion es que me doy cuenta

if not QLista.IsEmpty //=>la lista esta vacia, no se obtuvieron registros, cambio la consulta de seleccion eliminando el LIKE y me devuelve registros, verifico la consulta con el LIKE en access y esta bien, devuelve los registros que son segun sea la condicion LIKE

antes el LIKE funcionaba, ahora no, algo mas paso y no me di cuenta

marco3k 26-09-2024 23:04:20

Hice un pequeño ejemplo con una bd de access y el problema es el * y debes usar %
Código Delphi [-]
procedure TForm1.btnBuscaClick(Sender: TObject);
var busca :string;
begin
  try
    try
      busca:= '%'+trim(self.edtBusca.Text)+'%';
      self.Conexion.Connected:= true;
      self.DataSetPrueba.CommandText :='select * from prueba where nombre like :busca';
      self.DataSetPrueba.Parameters.ParamByName('busca').Value := busca;
      self.DataSetPrueba.Active:= true;
      if self.DataSetPrueba.RecordCount>0 then
      begin
        showmessage('Se encontró ' + inttostr(self.DataSetPrueba.RecordCount) + ' registro(s)');
      end;
    except
      abort;
    end;
  finally
    self.Conexion.Connected:= false;
  end;
end;


Use access 2013 proveedor "Provider=Microsoft.ACE.OLEDB.12.0" y una tabla con campo texto nombre. Funciona lo de arriba.

lugotrujillo 27-09-2024 15:46:07

Cita:

Empezado por marco3k (Mensaje 557481)
Hice un pequeño ejemplo con una bd de access y el problema es el * y debes usar %
Código Delphi [-]procedure TForm1.btnBuscaClick(Sender: TObject); var busca :string; begin try try busca:= '%'+trim(self.edtBusca.Text)+'%'; self.Conexion.Connected:= true; self.DataSetPrueba.CommandText :='select * from prueba where nombre like :busca'; self.DataSetPrueba.Parameters.ParamByName('busca').Value := busca; self.DataSetPrueba.Active:= true; if self.DataSetPrueba.RecordCount>0 then begin showmessage('Se encontró ' + inttostr(self.DataSetPrueba.RecordCount) + ' registro(s)'); end; except abort; end; finally self.Conexion.Connected:= false; end; end;



Use access 2013 proveedor "Provider=Microsoft.ACE.OLEDB.12.0" y una tabla con campo texto nombre. Funciona lo de arriba.


voy a probar a ver, no recuerdo si usaba % anteriormente en los LIKE o siempre use *, incluso cambie el proveedor entre ese q usaste y "Provider=Microsoft.Jet.OLEDB.4.0" y obtenia el mismo resultado

lugotrujillo 27-09-2024 15:57:46

gracias marcos3k, era eso, el %, vaya q clase de pifia, es q hacia tiempo no retocaba esos programas


La franja horaria es GMT +2. Ahora son las 11:20:27.

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