PDA

Ver la Versión Completa : filtrar RXMEMORYDATA1


Marchd
08-08-2007, 16:12:28
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:


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:


//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...

//En el evento OnFilterRecord...
Accept := AnsiStartsText('sa', RxMemoryData1.FieldByName('Apellido').AsString);


Espero te sirva ;)

Marchd
11-08-2007, 01:03:36
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
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

//En el evento OnFilterRecord...
Accept := AnsiContainsStr('sa',RxMemoryData1.FieldByName('Apellido').AsString);


Con CaseInSensitive

//En el evento OnFilterRecord...
Accept := AnsiContainsText('sa',RxMemoryData1.FieldByName('Apellido').AsString);

Marchd
11-08-2007, 01:19:26
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
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:

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
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


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