Ir al contenido


Foto

[RESUELTO] ¿Cómo sacar informes mensuales , osea poder filtrar datos de solo 1 mes ?


  • Por favor identifícate para responder
23 respuestas en este tema

#21 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 enero 2011 - 05:43

Ahora llendo al propósito y objetivo de tu código se aprecia que lo que buscas es que filtrar esa consulta inicial.

Algo que comentó Felipe, como para tirar la idea al aire, es que se puede hacer ese filtrado sin estar lanzando consultas.

Los datasets tienen dos propiedades que permiten trabajar con el filtrado: Filtered y Filter. La primera es de valor booleano (true/false) y permite activar o desactivar el filtro. En Filter se pone la condición de filtro.

El filtro es casi equivalente a hacer una consulta SQL con WHERE, como la que tu haces. La diferencia es que esto se aplica sobre el conjunto de datos que devuelve el query y se realiza en forma local (y no en el motor de base de datos).

Cuando activas el filtro, verás en tu dbgrid (por ejemplo) como se "ocultan" el resto de los registros y sólo se ven los que cumplen el filtro. Una vez que desactivas el filtro todo vuelve al estado original.

Por ejemplo, digamos que tu consulta inicial sobre ADOQuery3 es:


sql
  1. SELECT * FROM Clientes



Esto te mostrará todos los registros (y con todos los campos de la tabla).

Hagamos de cuanta que ahora de ese total quieres filtrar los del mes de enero. Fácil:



delphi
  1. ADOQuery3.Filter := 'MES = 1';
  2. ADOQuery3.Filtered := True;



Como se aprecia, en Filter tenemos que añadir las condiciones del filtro, como si se tratase de una sección WHERE de un SQL. Eso sería algo equivalente a ejecutar el SQL:



sql
  1. SELECT * FROM Clientes WHERE Mes = 1



Y, más tarde, para desactivarlo:



delphi
  1. ADOQuery3.Filtered := False;
  2. ADOQuery3.Filter := ''; // preventiva



Ahora bien. Déjame decir que esto del filtrado tiene sus límites... Ten en cuenta que este filtrado se hace a nivel local y no aprovecha las bondades y velocidad que ofrece el motor de base de datos. Hay que usar esta técnica cuando los registros sean pocos. Además las condiciones que puede aceptar Filter son básicas, no intentes con algo complicado.

Lo mejor es emitir la consulta SQL con los datos filtrados (es decir con condiciones WHERE) lo más pronto posible y dejarle el trabajo duro a quien sabe hacer el trabajo eficazmente: el motor.
En tu caso debes evaluar si es tan necesario devolver de forma inicial todos los registros... Piensa si tal vez no sea más conveniente, efectivo y productivo, devolver de una sola vez los datos ya pre-filtrados.

Saludos,
  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 04 enero 2011 - 07:37

Hola

Ya que el tema está prácticamente solucionado, porque no hacemos una "depuración" de código, mi propuesta es esta:



delphi
  1. procedure TForm1.Button13Click(Sender: TObject);
  2. begin
  3.   //Validaciones.
  4.   if (combobox1.Text = '') and
  5.     (combobox2.Text = '') then
  6.       showmessage('Debe seleccionar mes y año para continuar')
  7.   else if combobox1.Text = '' then
  8.           showmessage('Debe seleccionar mes para poder obtener resultados')
  9.   else if combobox2.Text = '' then
  10.           showmessage('Debe seleccionar un año para poder obtener resultados')
  11.   else begin
  12.         //Consultas para sumatorias de campos de ganancias.
  13.         adoquery3.SQL.Text := 'select sum(Costo) as F_COSTO from Clientes where Mes = '+
  14.                                 QuotedStr(inttostr(combobox1.ItemIndex+1)) +
  15.                                 ' and Año = '+QuotedStr(combobox2.Text);
  16.         adoquery3.Open;
  17.         //Asignar resultado  de la consulta.
  18.         edit3.Text:=adoquery3.FieldByName('F_COSTO').AsString;
  19.   end;
  20. end;



Salud OS
  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 04 enero 2011 - 08:00

Yo propondría los siguientes cambios:

1) Cambiar el tipo de los campos Mes y Año por el tipo numérico. Aunque lo más aconsejable es que se trabaje con el tipo Fecha o Fecha/Hora.
2) Aprovechando el cambio anterior, trabajaría con el uso de parámetros y no estar haciendo esos revuelos con simples y doble comillas:



sql
  1. SELECT SUM(Costo) AS F_Costo
  2. FROM Clientes
  3. WHERE (Mes = :DatoMes) AND (Anio = :DatoAnio)



Y luego pasaría los datos en forma numérica a los parámetros.

3) Sacar la conexión fuera del Form1, y trabajar de forma limpia aprovechando el uso de los módulos de datos. Esto por dos motivos:
3.1. En primer lugar, independizamos mejor la interfaz de la lógica
3.2. Un form no debería crear conexiones. Lo habitual es que la conexión recaiga en el módulo de datos, que ya Delphi solito se encarga de crearlo en primer lugar y para después crear los forms.

Saludos,
  • 0

#24 Master23

Master23

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 230 mensajes
  • LocationSanto Domingo

Escrito 05 enero 2011 - 09:37

Yo propondría los siguientes cambios:

1) Cambiar el tipo de los campos Mes y Año por el tipo numérico. Aunque lo más aconsejable es que se trabaje con el tipo Fecha o Fecha/Hora.
2) Aprovechando el cambio anterior, trabajaría con el uso de parámetros y no estar haciendo esos revuelos con simples y doble comillas:



sql
  1. SELECT SUM(Costo) AS F_Costo
  2. FROM Clientes
  3. WHERE (Mes = :DatoMes) AND (Anio = :DatoAnio)



Y luego pasaría los datos en forma numérica a los parámetros.

3) Sacar la conexión fuera del Form1, y trabajar de forma limpia aprovechando el uso de los módulos de datos. Esto por dos motivos:
3.1. En primer lugar, independizamos mejor la interfaz de la lógica
3.2. Un form no debería crear conexiones. Lo habitual es que la conexión recaiga en el módulo de datos, que ya Delphi solito se encarga de crearlo en primer lugar y para después crear los forms.

Saludos,

Muchas gracias Delphius por prestar tu tiempo  y responder a estas inquietudes, te lo agradezco profundamente,igual a los demás amigos como Felipe y Egostar,gracias.
  • 0




IP.Board spam blocked by CleanTalk.