PDA

Ver la Versión Completa : Problema con filtro en IBDataset


senpiterno
30-01-2005, 00:48:17
Hola amigos
Tengo el siguiente problema. creo un Ibdateset en tiempo de ejecucion al cual le asigno diferentes propiedades tales como SelectSQL, InsertSQL,ModifySQL y DeleteSQL, dentro de un bucle voy efectuando diferentes operaciones con la tabla que enlaza al dateset (insertar, modificar, eliminar, borrar) una de esas operaciones realiza un filtro para poder ubicar un registro y modificarlo, el problema es que dicho filtro no funciona, es decir nunca se posiciona en el registro buscado, siendo que dicho registro si existe....Le he dado bastantes vueltas al problema y no logro encontrar en donde esta el error....aqui le muestro el trozo de codigo que me esta volviendo loco...

......
TObrasClientes.Filtered:=False;//Desactivamos el filtro
TObrasClientes.Filter:='CODIGOOBRA = ' + QuotedStr(CodigoObra);
TObrasClientes.Filtered:=True;//Activamo el filtro
TObrasClientes.FindFirst;

//Vemos si el registro fue encontrado
If TObrasClientes.FieldValues['CODIGOOBRA'] = CodigoObra Then Begin
//El registro fue encontrado
//Lo modifacamos
TObrasClientes.Edit;
TObrasClientes.FieldValues['NOMBREOBRA']:=TxtNombreObra;
TObrasClientes.FieldValues['ESTADO']:=TxtEstado;
TObrasClientes.FieldValues['FECHAULTIMAMODIFICACION']:=CSFechaDeSistema+Time;
TObrasClientes.FieldValues['ULTIMOUSUARIOQUEMODIFICO']:=CSUsuarioActivo.CodigoU;
//Quien lo modifico por ultima vez
TObrasClientes.Post;
End Else Begin//El registro fue borrado, lo volvemos a grabar
TObrasClientes.Filtered:=False;//Desactivamo el filtro
//Asignamos los valores correspondientes
TObrasClientes.Insert;
TObrasClientes.FieldValues['CODIGOOBRA']:=CodigoObra;
TObrasClientes.FieldValues['RUT']:=VRutCliente;
TObrasClientes.FieldValues['NOMBREOBRA']:=TxtNombreObra;
TObrasClientes.FieldValues['ESTADO']:=TxtEstado;
TObrasClientes.FieldValues['FECHACREACION']:=CSFechaDeSistema+Time;
TObrasClientes.FieldValues['FECHAULTIMAMODIFICACION']:=CSFechaDeSistema+Time;
TObrasClientes.FieldValues['USUARIOCREADOR']:=CSUsuarioActivo.CodigoU;//Quien lo creo
TObrasClientes.FieldValues['ULTIMOUSUARIOQUEMODIFICO']:=CSUsuarioActivo.CodigoU;
//Quien lo modifico por ultima vez
TObrasClientes.Post;
End;//If

..............

Cualquier ayuda se agradece

Saludos...

marcoszorrilla
30-01-2005, 11:25:00
Pues yo creo que te estás liando con algún concepto, porque yo acabo de hacer una prueba y funciona perfectamente, tanto haciendo la comprobación que tu haces como ver si devuelve registros el filtro que me parece más lógica.

Ahora bien tu mencionas un IbDataset, pero luego filtras una tabla, no veo la relación.

Yo he utilizado un IbDaset conectado a un Tdatasource1 y este a una rejilla1 y luego un IbTable conectado a un Tdatasource2 y este a una rejilla2 al aplicar el filtro al IbTable1, la Rejilla2 me muestra solamente 1 registro y el mensaje que me da es que se encontró el registro, la rejilla1 que esta conectada al Ibdataset sigue con todos los registros ya que su propiedas SQL es la que hace que muestre los registros, así que tendrás que aclarar que tiene que ver el IbDataset con lo que propones.

Buen este es el código que como digo funciona sin ningún problema:


procedure TForm1.Button1Click(Sender: TObject);
begin
ibTable1.Filtered:=False;
ibTable1.Filter:='Last_Name = '+QuotedStr(Edit1.Text);
ibTable1.Filtered:=True;
//Primera Prueba
if ibTable1.FieldValues['LAST_NAME'] = Edit1.Text then
ShowMessage('Encontrado')
else
ShowMessage('No se encontro ningún Registro');

//Segunda
if IbTable1.RecordCount > 0 then
ShowMessage('Registro Encontrado.')
else
ShowMessage('No se encontro ningún Registro');
end;


Un Saludo.

senpiterno
31-01-2005, 00:19:51
Primero que todo gracias por tu respuesta marcoszorrilla, el punto de mensionar al IbDataset en el problema es que con el recolecto a un conjunto de datos que obedesen a cierto criterio, datos a los cuales le aplico el filtro. Te lo mensiono ademas porque aparte de realizar un filtro con los datos devueltos por el IbDataset tambien realizo con el inserciones, modificaciones y eliminaciones, cuestiones que me parecieron pudieren alterar el funcionamiento del filtro que estoy efectuando ya que realizo todo esto en un mismo procedimiento y bucle. Respecto a la forma de efecruar el filtro y comprovar si esto surtio efecto se que existen muchas y creeme las he probado todas y ninguna me ha dado resultado, primero pense que podia estar armando de forma errada la cadena que informa el filtro que se va a realizar, pero no era eso, despues pense que el ibDataset estaba configurado como unidireccional, pero tampoco era eso, ya que si fuera asi al momento de efectuar el filtro me lansaria una excepcion. La verdad no se que pueda estar haciendo mal, he mirado debugeado y revisado el codigo muchas veces y no encuentro que esta errado....
Agradeceria me dieras tu punto de vista respecto a que cosas no podria estar haciendo bien....quizas pueda ser algo tan obvio que lo he este dando por sentado que esta bien...

Saludos...