Ver Mensaje Individual
  #4  
Antiguo 03-05-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Reputación: 23
ContraVeneno Va por buen camino
Bueno, expertos, expertos, lo que se dice expertos, pues no... Bueno, la mayoría si, yo no soy experto. Pero entre todos nos ayudamos un poco y espero llegar a ese nivel.

En fin. Según veo, tu primer consulta y la segunda consulta son exactamente lo mismo, solo que en la segunda haces una suma. Esa suma es la que podrías hacer en el reporte; en otras palabras, no habría necesidad de hacer la segunda consulta.

Luego en tu primer consulta, estas agrupando, pero no utilizas ninguna función de agrupación; es decir, tienes el Group By por todos los campos en el select, pero no tienes ningún Sum, Avg o Max.

Ahora, en tu código podrías ahorrarte las variables cSQL y cSQL2 y podrías agregar tu consulta directo con la función Add.
Así como lo tienes, si quisieras extraer la consulta a un archivo o un stream, toda la consulta estaría en una sola línea. En tu código la ves en varias linéas, pero realmente (al utilizar +) lo estas haciendo en una sola línea. Si utilizas directamente la función Add, la consulta estará dividida en líneas (como un TStringList) y es mucho más fácil hacer otras cosas.

Y por último, realizas la consulta en el evento BeforePrint, lo cuál puede funcionar, pero no te lo recomendaría. Sería mejor realizar la consulta antes de mandar la vista previa. Y en el evento BeforePrint, hacer ajustes menores en el reporte. Pero no es recomendable ejecutar la consulta en ese evento.

En resumen, lo que yo haría, sería lo siguiente:
Código Delphi [-]
Procedure TfrmRepNominaOperador.UnBotonOnClick(Sender as TObject);
begin
  inherited;
  with Datos.qryBuscar do begin
   If active then close;
   SQL.Clear;
   SQL.Add('select NO.n_registro, O.nombre, I.nombre_inspector,');
   SQL.Add('L.nombre_labor, M.descripcion,  NO.ano,');
   SQL.Add('NO.numero, DNO.superficie, DNO.tarifa, DNO.total_operador');
   SQL.Add('from det_nomina_operador DNO,');
   SQL.Add('join nomina_operador NO on (DNO.n_registro = NO.n_registro)');
   SQL.Add('join Operador O on O.clave_operador = DNO.clave_operador');
   SQL.Add('join labores L on L.clave_labor =  DNO.clave_labor');
   SQL.Add('join maquinas M on M.clave_sociedad = DNO.clave_sociedad AND M.clave_maquina = DNO.clave_maquina');
   SQL.Add('join inspectores I on I.clave_inspector = NO.clave_inspector');
   SQL.Add('Where NO.numero =  :Numero and  NO.ano =  :Year');
   SQL.Add('Order BY NO.n_registro');
   ParamByName('Numero').AsInteger := tryStrtoInt(frmNominaOperador.Semana.Text);
   ParamByName('Year').AsInteger := tryStrtoInt(frmNominaOperador.edzafra.Text);
   Open;
  end; //with
end;

La idea es que en la consulta traigas todos los datos que necesites, sin agrupar, sin sumar. Y ya en el reporte hacer todas las agrupaciones y/o sumatorias necesarias.
__________________

Responder Con Cita