Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   filtrar RXMEMORYDATA1 (https://www.clubdelphi.com/foros/showthread.php?t=46782)

Marchd 08-08-2007 16:12:28

filtrar RXMEMORYDATA1
 
Buenos estoy iniciandome como programador delphi, vengo de visual basic.

Tengo un problema con el filtrado de un componente RXMEMORYDATA1

Tengo varios clientes de un banco con la informacion de Cedula, Apellido, Nombre, Tipo y Monto.

Toda esta informacion se m pide ser vaciada en un RXMEMORYDATA1 y luego mostrada en un dbgrid, todo bien hasta el momento en que me piden mostrar solo la informacion de los clientes que sean Tipo 0,1,2,3 o 4 y al momento de seleccionar el tipo me debeb mostrar solo la lista de clientes que cumplan con ese filtro

investigando hice lo siguiente:
caso1:

Código Delphi [-]
procedure Tform2.BFiltrarClick(Sender: TObject);
begin 
  RXMEMORYDATA1.Filter:='Tipo=''1''';
  RXMEMORYDATA1.Filtered:=true;
end;

Caso 2:

RxMemoryData1.Filtered:= FALSE;
RxMemoryData1.Filter:= 'Apellido='''+EditBusqueda.Text+'%''';
RxMemoryData1.Filtered:= TRUE;
RxMemoryData1.Refresh;

ninguno de los dos casos me funciona


por ahora hago una busqueda directa del los clientes Tipo 1 para prueba y esto me funcion con un componente tTable perfectamante pero al usar el RXMEMORYDATA1 no ocasiona ningun resultado

jhonny 08-08-2007 16:55:03

Mira el siguiente Link, http://www.clubdelphi.com/foros/showthread.php?t=40171, allí explico como hacer filtros con las TRxMemoryData. Espero te sirva. ;)

jhonny 11-08-2007 00:43:47

Recuerdo que ayer, antes de la caida del foro hiciste una pregunta que decia algo como:

"Necesito filtrar, para que cuando tenga dos registros como sanchez y salazar, al colocar 'sa' queden estos dos, porque ambos comienzan por 'sa'"...

La respuesta es:

Si, quieres usar CaseSensitive hazlo asi:

Código Delphi [-]
//En el evento OnFilterRecord...
Accept := AnsiStartsStr('sa', RxMemoryData1.FieldByName('Apellido').AsString);

Si no te importa el case-sensitive, sino que al contrario sea caseinsensitive, hazlo asi...
Código Delphi [-]
//En el evento OnFilterRecord...
Accept := AnsiStartsText('sa', RxMemoryData1.FieldByName('Apellido').AsString);

Espero te sirva ;)

Marchd 11-08-2007 01:03:36

Ok
 
De verdad Agradezco mucho tu ayuda me ha servido de mucho pero tengo un problema.

Me da error solo quisiera saber con que libreria trabaja esta funcion me imagino que el problema debe ser ese.

Por otro lado ciertamente tiene mucha logica tu respuesta para los casos que envie si busco 'sa' me deberia aparecer (sanchez, salcedo) ok pero existe una forma de que tambie aparezca (hernandez salcedo) tomando en cuenta de que ya salcedo no es la primera posicion en la cadena?

Muchas gracias por tu ayuda.

Marchd 11-08-2007 01:11:59

Avance
 
Investigue y encontre la funcion que lo realiza:

function AnsiContainsStr( const AText, ASubText: string ): Boolean;

Comprueba si la cadena ASubText esta dentro de la cadena AText. Por ejemplo:

AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True
AnsiContainsStr( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve False


function AnsiContainsText( const AText, ASubText: string ): Boolean;

Esta función es igual a AnsiConstainsStr salvo que no diferencia mayúsculas de minúsculas. Veamos un ejemplo:


AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITE' ) devuelve True
AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITe' ) devuelve True
AnsiContainsText( 'DELPHI AL LIMITE', 'LIMITES' ) devuelve False

jhonny 11-08-2007 01:12:34

Ahhh, cierto, la función es de la unidad llamada StrUtils

En cuanto a tu otra duda, la cosa quedaria muy parecida, asi:

Con CaseSensitive

Código Delphi [-]
//En el evento OnFilterRecord...
Accept := AnsiContainsStr('sa',RxMemoryData1.FieldByName('Apellido').AsString);

Con CaseInSensitive

Código Delphi [-]
//En el evento OnFilterRecord...
Accept := AnsiContainsText('sa',RxMemoryData1.FieldByName('Apellido').AsString);

Marchd 11-08-2007 01:19:26

Upps!
 
Bueno realmente la funcion que me diste solo busca al principio de la cadena y necesito que busque en cualquier palabra de la cadena .

la que coloque yo solo busca la palabra completa date cuenta que si busca limite y esta limites genera falso tampoco me sirve seguire buscando

Gracias

jhonny 11-08-2007 01:31:02

Cita:

Empezado por Marchd (Mensaje 222000)
Bueno realmente la funcion que me diste solo busca al principio de la cadena y necesito que busque en cualquier palabra de la cadena .

la que coloque yo solo busca la palabra completa date cuenta que si busca limite y esta limites genera falso tampoco me sirve seguire buscando

Gracias


Yo creo que estas confundido, quiza, crees que el parametro 1, hace lo del parametro 2 y viceversa, yo hice el siguiente ejercicio y me funciona correctamente:

Código Delphi [-]
var
  a, b :string;
begin
  a := 'Montaño Sanchez';
  b := 'sa';
  ShowMessage(BoolToStr(AnsiContainsText(a, b), True));
end;

Como vez, solo busco 'sa', dentro de 'Montaño Sanchez' y el ShowMessage me muestra un True, de manera que funciona correctamente.

Marchd 13-08-2007 14:48:49

Listo
 
Ok tenias razon Muchas Gracias
El Codigo quedo asi

RBCedula, RBApellido y RB NOmbre, son Radio Button
Dato_Buscado: es donde guardo lo que el usuario quiere buscar
s: Guardo la seleccion de la columna a buscar

Código Delphi [-]
procedure Tform2.RxMemoryData1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
  var Dato_Buscado,s:string;
begin
  if not RBCedula.Checked and not RBApellido.Checked and not RBNombre.Checked then
  begin
    showmessage('Debe Seleccionar la Columna donde Desea Buscar');
    RxMemoryData1.Filtered:=false;
  end
  else
  begin
    if  EditBusqueda.Text<>'' then
    begin
      if RBCedula.Checked then
       s:='Cedula'
       else
       if RBApellido.Checked then
         s:='Apellido'
       else
        if RBNombre.Checked then
        s:='Nombre';
          Dato_Buscado:=(EditBusqueda.text);
          Accept := AnsiContainsText(RxMemoryData1.FieldByName(s).AsString,Dato_Buscado);
    end
    else
      showmessage('Introducir Busqueda');
  end;
end;


Todo funcion muy bien Gracias de verdad muchas gracias. Muy bueno este foro


La franja horaria es GMT +2. Ahora son las 19:37:34.

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