PDA

Ver la Versión Completa : ¿Cuanto de potente puede ser un filtro en una ADOTable?


zerelho
10-02-2005, 22:37:20
Hola a todos, tengo una tabla de pedidos y quiero filtrarla mediante una serie de condiciones que tampoco es que sean muy complejas pero no hay manera, me sale el siguiente msje de error:
"Argumentos incorrectos, fuera del intervalo permitido o en conflicto con otros"


TbPedidos.Filter:=Format('( %s = %s ) AND ( ( %s = %d ) OR ( %s = %d ) )',
['CodProveedor',QuotedStr(getProveedorAlbaran(TbLinAlb_idAlbaran.Value)),
'EstadoPedido',stPedConfimado,
'EstadoPedido',stPedParcial]);



TbPedidos en una TADOTable, los campos CodProveedor y EstadoPedido existen y las variables y constantes utilizadas tambien.

para esta condición en cuestion, la podria replantear utilizando solamente ANDs, pero en la aplicación permito a los usuarios que creen sus propios filtros y por lo que se ve los de este estilo no funcionan

y pregunto, no se pueden utilizar condiciones de "2 niveles" como filtros en la propiedad filter de un dataset?

zerelho
11-02-2005, 12:33:39
Hola otra vez, por lo que pude ver en los foros, hay mas gente que tiene este mismo problema, pero no veo ninguna solución al respecto.
Por lo que veo, el problema se da al tener una condición multiple formada por varias condiciones unidas por OR y combinar esta condición compuesta con otra mediante AND, es decir,
ADOTable.Filter:='(X OR Y) AND Z'

Es una limitación de los filtros con ADO?

Desisto entonces de hacerlo de esta manera y voy a intentarlo con una ADOQuery...

me gustaria saber que forma es mas eficiente de las dos:
filtrando una tabla con FILTER o haciendo una QUERY 'select * from where...'?

Lepe
12-02-2005, 14:58:06
Los filtros estan muy bien para cosas simples, no los fuerces más de lo necesario.

Indiscutiblemente el query es más eficiente y flexible, a menos que tengas 200 campos en la misma tabla y la restricción del where deje pasar millones de registros.;)

Hablando en serio, si te parece engorroso andar con objetos Tquery prueba algo tan simple como:


procedure CambiaQryA(qry:Tquery; sql: String);
begin
if qry = NIL then
qry := createqry(DTM.DtbPPal, sql)
else
begin
if qry.Active then
qry.Close;
qry.SQL.Clear;
qry.SQL.Text := sql;
qry.Open;
end;

end;
function CreateQry(dtb: TDatabase; SQL: String): TQuery;
begin
Result := Tquery.Create(NIL);
try
Result.DatabaseName := dtb.DatabaseName;
Result.SessionName := dtb.SessionName;
Result.SQL.Clear;
Result.SQL.Text := SQL;

Result.Prepare;
Result.Open;
except
FreeAndNil(Result);
raise;
end;
end;

Solamente tienes que llamar a 'CambiaQry' y despues asociar el Datasource del grid a esta query.

Acuerdate de usar Freeandnil(qry) al cerrar la ventana en cuestion.

Saludos

zerelho
14-02-2005, 19:41:51
gracias por la ayuda Lepe, me pondré al tema.

Me fastidia porque lo tenia todo preparado para utilizar el FILTER de las tablas, pero equivocandose es como se aprende :(